一次從jmx到rce
滲透過程
發現了一個集成的環境,開了jmx服務

service:jmx:rmi:///jndi/rmi://1.1.1.157:9003/jmxrmi jconsole連上去之后發現一些敏感的賬號密碼

在http://localhost:8983/solr 發現了solr,但是歷史洞都打不了,log4j是高版本的jdk,并且不出網,所以整個思路就圍繞在jmx的利用上。
jmx已知的利用方式有javax.management.loading.MLet加載遠程類rce,但是目標不出網必須用其他方式了。
考慮到tomcat,想起來陳師傅寫過的《幾個Jolokia RCE 的“新”利用方式》
通過tomcat的createStandardHost配合AccessLogValue進行rce。
利用如下
先創建Host為test.com Catalina:type=Host,host=test.com

然后tomcat的valve中就有了test.com的部署之后的結果

修改host為test.com之后就可以訪問根目錄下的任意文件

那么只需要寫入一個jsp文件就可以getshell了。寫入文件需要用AccessLogValue

修改AccessLogValue的屬性
suffix .jspprefix aafileDateFormat .yyyy-MM-ddpattern %h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i"directory /tmp/
最終文件路徑為/tmp/aa.2022-09-20.jsp
pattern會進行格式化,%{User-Agent}i表示引用請求頭中User-Agent字段
然后發包寫入日志文件

然后訪問shell即可

如果訪問shell不存在可以執行一下AccessLogValve#rotate()重新格式化日志文件名,確保日志文件名修改為我們想要的值。

打完記得把配置屬性改回去,不然日志文件會越來越大,訪問shell比較卡。
參考
看起來簡單,但是實際上涉及的知識點很多。比如陳師傅的文章中是在Jolokia中利用,jmx和Jolokia大同小異。另外陳師傅提到的jfr和vmLog寫文件在實際環境中不存在,所以用到了spring4shell中的一環即AccessLogValue。
具體不詳細寫了,直接看參考鏈接吧。
- https://articles.zsxq.com/id_h4mjj2ktw352.html
- https://sec.lz520520.com/2022/04/714/
- https://xz.aliyun.com/t/11450
- https://www.cnblogs.com/0x28/p/15685164.html