java asm jndi_GitHub - Q1ngShan/JNDI: JNDI 注入利用工具
JNDI 注入利用工具
介紹
本項(xiàng)目為 JNDI 注入利用工具,生成 JNDI 連接并啟動(dòng)后端相關(guān)服務(wù),可用于 Fastjson、Jackson 等相關(guān)漏洞的驗(yàn)證。
本項(xiàng)目是基于 welk1n 的 JNDI-Injection-Exploit,在此項(xiàng)目的基礎(chǔ)服務(wù)框架上,重新編寫了攻擊利用代碼,支持更多更強(qiáng)大的功能,并加入了多種方式進(jìn)行回顯的支持。
本項(xiàng)目為學(xué)習(xí)性項(xiàng)目,目前本人 Java 水平依然處于 hello world 的水平,建議各位師傅報(bào)著批判的眼光觀看,不吝指導(dǎo)。QAQ
功能
本工具支持了利用 JNDI 注入構(gòu)造多種惡意 payload,其中包括:
名稱
功能
簡介
BasicInfo
獲取服務(wù)器基礎(chǔ)信息
打印出 System.getProperties() 中的信息
Command
命令執(zhí)行
反射調(diào)用 forkandexec 執(zhí)行命令
DataSourceHack
獲取Spring DataSource 明文
獲取緩存在上下文中的 DataSource
DirList
目錄遍歷
使用 File 對象列目錄
FileDelete
文件刪除
使用 File 對象刪除文件
FileRead
文件讀取
使用 FileInputStream 讀取文件
FileWrite
文件寫入
使用 FileOutputStream 寫文件
SQL Query
執(zhí)行SQL語句
使用 JDBC 發(fā)出查詢
SSRF
訪問內(nèi)網(wǎng)應(yīng)用
發(fā)送 HTTP 請求,并將結(jié)果返回
對于具體功能的構(gòu)建比較簡單,幾乎就是正常的功能性編程,只不過部分功能使用了反射,可能不易于閱讀。
對這部分功能實(shí)現(xiàn)有疑問的同學(xué)可以在 Javasec 上找到相關(guān)的文章。
對于各項(xiàng)參數(shù)的配置使用了配置文件的方式,由于是在調(diào)用時(shí)會(huì)讀取文件,并未將值進(jìn)行緩存,所以可以隨時(shí)修改配置文件中 payload 的值,無需重啟服務(wù)。
除去基本功能,本工具加入了多種回顯方式,使 JNDI 注入的結(jié)果能夠返回,這樣在研究或測試中可以更方便的看到結(jié)果,本攻擊支持了如下回顯方式:
名稱
功能
簡介
ExceptionEcho
報(bào)錯(cuò)回顯
throw 一個(gè)異常,message 是我們執(zhí)行的結(jié)果
OOBEcho
帶外回顯
向 dnslog 平臺(tái)發(fā)送數(shù)據(jù)包攜帶執(zhí)行結(jié)果
TomcatEcho
Tomcat 回顯
通過 Tomcat 獲取 response 將結(jié)果寫入
WebLogicEcho
WebLogic 回顯
通過 WebLogic 獲取 response 將結(jié)果寫入
有了這些功能,我們就可以把 JNDI 注入活活玩成 webshell。
使用
使用源代碼執(zhí)行:
下載項(xiàng)目源代碼:
git clone git@github.com:JosephTribbianni/JNDI.git
執(zhí)行 org.su18.server.ServerStart 的 main() 方法,可以在控制臺(tái)中看到啟動(dòng)消息。
使用 jar 文件執(zhí)行:
在 release 下載打包好的文件,解壓壓縮包,確保配置文件與 jar 文件位于同一目錄下,請根據(jù)自定義需求修改端口號及其他配置項(xiàng),運(yùn)行 jar 文件:
java -jar JNDI-1.0-all.jar
查看生成的惡意類
可以使用 org.su18.asm.frame.Frame 類的 main() 方法生成 .class 文件進(jìn)行查看。
執(zhí)行后,會(huì)在項(xiàng)目根目錄生成文件,使用任意手段 decompile 后可查看邏輯。
使用展示
這里利用 fastjson 結(jié)合 jndi 來進(jìn)行部分功能使用展示:
命令執(zhí)行 id :
基礎(chǔ)信息:
獲取 Spring 數(shù)據(jù)源信息:
對我電腦上的 /Users/phoebe/PycharmProjects 進(jìn)行目錄遍歷:
文件讀取 /etc/passwd
等等,剩余的就不展示了,自測吧。
上面使用了 TomcatEcho 進(jìn)行回顯,其他回顯展示:
報(bào)錯(cuò)回顯:
OOB 回顯:
技術(shù)細(xì)節(jié)
服務(wù)端
服務(wù)器端完全基于原項(xiàng)目,未進(jìn)行大改動(dòng),將服務(wù)監(jiān)聽端口加入了配置文件中,方便修改。
payload 細(xì)節(jié)
由于原項(xiàng)目僅執(zhí)行了命令執(zhí)行,并且是使用 Runtime.getRuntime.exec() 這種非常表面的接口調(diào)用,功能較為單一,且容易被防護(hù)阻斷,因此這里我增加了多個(gè)功能模塊,并對于多數(shù)模塊,直接使用反射調(diào)用 native 方法執(zhí)行功能,這可以在某種情況下完全繞過流量層或應(yīng)用層的安全防護(hù)。對于其他功能則是正常的邏輯代碼調(diào)用,基本不會(huì)觸發(fā)任何規(guī)則。
回顯細(xì)節(jié)
回顯主要分為幾類:
報(bào)錯(cuò)回顯:直接拋出異常,這種方式能否回顯完全取決于服務(wù)端對異常的處理情況。
OOB回顯:這里使用了 ceye.io,由于這個(gè)域名可能會(huì)被各大安全防護(hù)產(chǎn)品拉入黑名單,所以可以尋找小眾的 dnslog 平臺(tái)或自行搭建。
response 回顯:這里支持了 Tomcat 和 Weblogic 的回顯,獲取當(dāng)前訪問的 response 對象,并寫回結(jié)果。
字節(jié)碼拼接
在惡意類的字節(jié)碼生成上,原項(xiàng)目使用編譯好的 jdk7、jdk8 的 class 文件,使用 asm 加載并加入執(zhí)行命令代碼;本項(xiàng)目則直接使用 asm 完全生成類字節(jié)碼。由于要實(shí)現(xiàn)模塊化,這里設(shè)計(jì)了一個(gè)簡單的代碼結(jié)構(gòu):
public class Template {
private String result;
public Template() throw Exception{
// insert payload here
this.echo();
}
public void echo() throw Exception{
// how would you like to echo the result
}
}
由于 JNDI 注入的特性是會(huì)執(zhí)行類的構(gòu)造方法或 static 語句塊,因此將惡意 payload 織入構(gòu)造方法中,在執(zhí)行完 payload 后,構(gòu)造出響應(yīng)的返回結(jié)果,放在 this.result 中,在構(gòu)造方法的最后一行執(zhí)行 this.echo() 方法,進(jìn)行回顯的邏輯。
未完成
由于時(shí)間有限,ASM 生成的代碼十分簡陋,后期會(huì)改為使用 AdviceAdapter 的 onMethodEnter、onMethodExit更優(yōu)雅的生成代碼。
由于 JNDI 注入本身需要出網(wǎng),所以一些漏洞利用方式和回顯方式顯得有些雞肋,后期會(huì)繼續(xù)優(yōu)化,添加新功能。
僅使用了 jdk 1.8 進(jìn)行測試,部分利用代碼“可能”使用了 1.8 之后的新特性,在低版本上可能失效。
加入 linux 文件描述符回顯:本來想加的,根據(jù)幾位師傅給出的思路經(jīng)過了一下午的調(diào)試,還是沒有做到通用有效的尋找文件描述符 id 的方法,后續(xù)有時(shí)間再弄吧。
參考文章
交流
Java 安全技術(shù)交流微信群:javasec,請前往網(wǎng)站添加管理員微信邀請您入群。
Javasec 項(xiàng)目是由 安百科技-凌天實(shí)驗(yàn)室 發(fā)起,是一個(gè)免費(fèi)、開源的 Java Web 安全相關(guān)知識歸納總結(jié)、培訓(xùn)的項(xiàng)目,相關(guān)問題可以在交流群內(nèi)提出討論或 Github 上提出 issues。
總結(jié)
以上是生活随笔為你收集整理的java asm jndi_GitHub - Q1ngShan/JNDI: JNDI 注入利用工具的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言数码管的动态显示时间,8位数码管动
- 下一篇: php new static,PHP中n