2021年12月10日(星期五),一个针对 Java 库 'log4j' 2 中远程代码执行(RCE)漏洞的概念验证 1 被发布。此漏洞并未提前向软件开发者披露。该漏洞被追踪为 CVE-2021-44228 3。更多关于该漏洞的信息可在 Northwave Threat Response 4 中找到。
Northwave 创建了一个测试脚本,通过在常见 HTTP 头部中注入 payload 以及作为 HTTP GET 请求的一部分来检查存在漏洞的系统。通过监听包含为目标特制 UUID 的入站 DNS 请求来检测存在漏洞的系统。通过监听入站 DNS 而非部署(例如)LDAP 服务器,我们提高了检测到存在出站流量过滤的漏洞系统的可能性。在实践中,出站 DNS 通常是允许的。预计会有较高的假阴性率,请阅读免责声明。
以下 HTTP 头部被覆盖:
X-Api-VersionUser-AgentRefererX-Druid-CommentOriginLocationX-Forwarded-ForCookieX-Requested-WithX-Forwarded-HostAccept对于每次注入,检查以下 JNDI 前缀:
jndi:rmijndi:ldapjndi:dnsjndi:${lower:l}${lower:d}ap请注意,该脚本仅执行两个特定检查:HTTP 头部 和 HTTP GET 请求。这在需要针对其他头部、特定输入字段等情况触发漏洞时会导致假阴性。这种情况非常可能发生。
重要提示: 如果检测工具返回“未检测到漏洞”,请按照 Northwave Threat Response 4 中的描述进行文件系统检查。仅运行此检测工具不足以判断系统是否存在漏洞。
首先,我们需要一个子域来接收入站 DNS 请求。在本例中,我们使用区域 log4jdnsreq.northwave.nl,并将脚本部署在 log4jchecker.northwave.nl 上。按如下方式配置 DNS 条目:
log4jdnsreq 3600 IN NS log4jchecker.northwave.nl.
现在,我们在 Debian 系统上使用 apt install bind9 设置 BIND DNS 服务器,并将以下内容添加到 /etc/bind/named.conf.options 文件中:
recursion no;
allow-transfer { none; };
这会禁用递归,因为我们不希望运行开放式 DNS 服务器。通过在 /etc/bind/named.conf.local 中添加以下配置来配置日志:
logging {
channel querylog {
file "/var/log/named/query.log";
severity debug 3;
print-time yes;
};
category queries { querylog;};
};
不要忘记使用 systemctl restart bind9 重启 BIND。通过执行针对 xyz.log4jdnsreq.northwave.nl 的 DNS 查询来检查日志记录是否正常工作。一个或多个查询应出现在 /var/log/named/query.log 中。
验证名称服务器查询确实被记录下来非常重要。除非您的名称服务器能记录请求,否则此脚本无法检测存在漏洞的站点
通过执行一次测试查询(最好从另一台机器)来测试您的服务器:
dig test.log4jchecker.northwave.nl
您不应期望收到响应,但应期望日志文件中出现条目(cat /var/log/named/query.log)。该条目可能类似于:
14-Dec-2021 13:36:01.402 client @0x7f8b180a9b30 requester-ip#58755 (test.log4jchecker.northwave.nl): query: test.log4jchecker.northwave.nl IN A -E(0)DC (your-ip)
除非在日志中看到响应,否则不要继续。没有它,脚本将无法检测漏洞。
使用 pip install -r requirements.txt 安装任何 Python 依赖项。编辑脚本,将以下行更改为您配置的 DNS 区域:
HOSTNAME = "log4jdnsreq.northwave.nl"
现在,您可以通过 -u 参数提供单个 URL,或通过 -l 参数提供 URL 列表来运行脚本:
usage: nw_log4jcheck.py [-h] [-l LIST] [-u URL] [-w WAIT] [-t TIMEOUT]
optional arguments:
-h, --help 显示此帮助信息并退出
-l LIST, --list LIST 包含要检查的 URL 列表的文本文件(每行一个 URL)
-u URL, --url URL 要检查的 URL(例如:http://yoururl.com)
-w WAIT, --wait WAIT 在检查 DNS 日志之前等待的秒数(默认:15)
-t TIMEOUT, --timeout TIMEOUT
HTTP 超时秒数(默认:5)
输出的最后一行显示系统是否被发现存在漏洞:
NO VULNERABILITY DETECTED. Proceed with on-server checking. No incoming DNS request to 3414db71-309a-4288-83d4-aa3f103db97c.log4jdns.northwave.nl was seen
如果未检测到漏洞,请按照 Northwave Threat Response 4 中的描述进行文件系统检查。再次强调,仅运行此检测工具不足以判断系统是否存在漏洞。
Log4jcheck 是采用 MIT 许可证的开源软件。