CVE-2020-1938の検証をやってみた

セキュリティ

先日IPAから以下の注意喚起が出ましたので、今回は久しぶりに脆弱性の検証をやります。

IPA:Apache Tomcat における脆弱性(CVE-2020-1938)について

すでにPoCはGitHubで公開されており、今回もその公開されているPoCを使用して検証します。

なお、悪用厳禁であり、この記事についても悪用を促すわけではございませんのでご理解ください。

tomcat環境の準備

まずはtomcat環境が必要ですので、準備を行います。

以前作成した記事を参考に構築していきます。

javaインストールの参考:今さらS2-045の検証をしてみる①:LinuxでTomcatを動かす

tomcatのインストールについてはaptでそのままインストールすると最新版(脆弱性が修正されている)がインストールされる可能性があったので、以下を参考にinstall-tomcat9.shを作成しました。

参考:Ubuntu18.04にTomcat9をインストールする方法

記事のようにファイル作成する必要があるのですが、wgetするURLにアクセスできなかったので、以下のようにしました。(もともとのwgetの個所はコメントアウトしています。)

#!/bin/bash
# Declare variables.
TomcatMajorVersion=9
TomcatVersionFull="${TomcatMajorVersion}.0.30"
TomcatDirectory="apache-tomcat-${TomcatVersionFull}"
TomcatInstaller="${TomcatDirectory}.tar.gz"

# Uninstall tomcat.
rm -Rf /opt/$TomcatDirectory
rm /etc/systemd/system/tomcat.service
rm -Rf ./$TomcatDirectory
rm $TomcatInstaller

# Add tomcat user.
useradd -M tomcat

# Tomcat download and deploy.
#wget http://ftp.yz.yamagata-u.ac.jp/pub/network/apache/tomcat/tomcat-$TomcatMajorVersion/v$TomcatVersionFull/bin/$TomcatInstaller
wget https://archive.apache.org/dist/tomcat/tomcat-$TomcatMajorVersion/v$TomcatVersionFull/bin/$TomcatInstaller
tar -xzvf ./${TomcatInstaller}
rm $TomcatInstaller
mv ./$TomcatDirectory /opt
chown -R tomcat:tomcat /opt/$TomcatDirectory

# Service create and registration.
cat << EOS > /etc/systemd/system/tomcat.service
[Unit]
Description=Apache Tomcat $TomcatMajorVersion
After=network.target

[Service]
User=tomcat
Group=tomcat
Type=oneshot
PIDFile=/opt/$TomcatDirectory/tomcat.pid
RemainAfterExit=yes

ExecStart=/opt/$TomcatDirectory/bin/startup.sh
ExecStop=/opt/$TomcatDirectory/bin/shutdown.sh
ExecReStart=/opt/$TomcatDirectory/bin/shutdown.sh;/opt/$TomcatDirectory/bin/startup.sh

[Install]
WantedBy=multi-user.target
EOS

# Change tomcat.service's permission.
chmod 755 /etc/systemd/system/tomcat.service

# Setting tomcat service auto start.
systemctl enable tomcat

# Start tomcat service.
systemctl start tomcat

今回、tomcatのバージョンについては脆弱性のあるギリギリのバージョン「9.0.30」を選択しています。(「9.0.31」からは脆弱性は修正されている)

さて、これでブラウザでアクセスして以下のように表示されれば準備OKです!

 

脆弱性の検証

次はKaliLinuxから実際にできるか試してみます。なお、ローカルの検証環境ではKaliは「192.168.70.142」検証環境のTomcatは「192.168.70.137」となっています。

まずはオープンポートの確認を行います。nmapをフルポート確認してもよかったのですが、簡単に1-10000ポートのチェックだけにしています。sshは環境構築時に入れたものです。

# nmap -p 1-10000 192.168.70.137
Starting Nmap 7.70 ( https://nmap.org ) at 2020-02-26 08:18 EST
Nmap scan report for 192.168.70.137
Host is up (0.000096s latency).
Not shown: 9997 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
8009/tcp open  ajp13
8080/tcp open  http-proxy
MAC Address: 00:0C:29:15:2A:A8 (VMware)

Nmap done: 1 IP address (1 host up) scanned in 0.49 seconds

脆弱性の存在する「8009/tcp open ajp13」にKaliからアクセスできることが確認できました。

実際にGitHubのPoCを試してみます。

ここではPoCのURLは念のため伏せておきますが、検索エンジンで検索すれば簡単に探せます。

GitHubでClone用のURLを取得して以下のコマンドでPoCを取得することができます。

 

#git clone https://github.com/xxxxxxxxxxxxxxxx/xxxxxxxx.git
#URLについてはgithubでコピーしたURLを入力

これで準備はOKです。あとは実際に動かしてみましょう!

上記のように脆弱性が検証することができました。

「/WEB-INF/web.xml」にアクセスできました!!!

なお、ブラウザでは「/WEB-INF/web.xml」にアクセスしても以下のように404が応答されアクセスすることができません。

このため、本来は外部からアクセスできないファイルにアクセスされることで機密情報の漏洩になる可能性があります。

また、ファイルアップロードを悪用して任意のコマンド実行を行われる恐れもあります。

使用しているバージョンを確認の上、至急対応を行うことを推奨します。

最後に

CVE-2020-1938の脆弱性の検証を行いました。

該当の脆弱性ですが、Ghostcatというかわいい名前がついています。(ロゴもかわいい)

しかし、内容についてはかなり大きな問題があるので注意が必要です。

Apache JServ Protocol (AJP)という機能については検証でやったとおり、通常はインストールした時点では動作する状態になっています。(ポート:8009は空いている)

そのため、AJP自体を現在使用していなくても攻撃をされる可能性は大きいです。

tomcatを使用しているサーバをお持ちの方はすぐに状態を確認することをお勧めします。

不明点や要望やこういったこともやって欲しいとの要望があれば、お問い合わせページやコメント、ツイッターからでも結構ですので、気軽にご連絡ください。

久々に検証したから疲れた・・・

コメント