
Apache Tomcat - CGIServlet enableCmdLineArguments リモートコード実行 (RCE) の脆弱性解析とPoC
脆弱性分析とApache Tomcat - CGIServlet enableCmdLineArguments リモートコード実行 (RCE) のPoC
ビデオPoCはこちら: https://www.youtube.com/watch?v=RA7kzuHOWqA
Apache TomcatはCGIサーブレットに脆弱性があり、リモートコード実行(RCE)を達成するために悪用される可能性があります。これは、Windows上で非デフォルト設定かつバッチファイルと組み合わせて実行されている場合にのみ悪用可能です。 Common Gateway Interface (CGI) は、WebサーバーがWebリクエストを介してコマンドラインプログラムやスクリプトを実行できるようにする標準プロトコルです。このプロトコルでは、URLパラメータを介して実行されるスクリプトやプログラムにコマンドライン引数を渡すことも可能です。プロトコル自体はRFC 3875で定義されています。 enableCmdLineArgumentsが有効な状態でWindows上で実行されている場合、JREがコマンドライン引数をWindowsに渡す方法のバグにより、Apache TomcatのCGIサーブレットはRCEに対して脆弱です。CGIサーブレットはデフォルトで無効になっています。CGIオプションのenableCmdLineArgumentsはTomcat 9.0.xではデフォルトで無効になっており(この脆弱性への対応として、すべてのバージョンでデフォルトで無効になります)。
ビデオPoCはこちら: https://www.youtube.com/watch?v=RA7kzuHOWqA
a. conf/context.xml を修正し、<Context privileged="true"> とします。

b. /conf/web.xml ファイルの366行目と420行目付近で、それぞれ以下の変更を行います。

enableCmdLineArguments は Tomcat 9 を使用しているため、True にする必要があります。
<servlet>
<servlet-name>cgi</servlet-name>
<servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class>
<init-param>
<param-name>cgiPathPrefix</param-name>
<param-value>WEB-INF/cgi</param-value>
</init-param>
<init-param>
<param-name>executable</param-name>
<param-value></param-value>
</init-param>
<init-param>
<param-name>enableCmdLineArguments</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>5</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>cgi</servlet-name>
<url-pattern>/cgi/*</url-pattern>
</servlet-mapping>
webapps\ROOT\WEB-INF\cgi に作成し、以下の内容の ism.bat ファイルを追加します:
@echo off
echo Content-Type: text/plain
echo .
http://localhost:8080/cgi/ism.bat?&dir にアクセスしてサーバーが動作しているか確認します。
cve-2019-0232.py を実行し、サーバーのIPとポートを指定します。
ビデオPoCへのリンク: https://www.youtube.com/watch?v=RA7kzuHOWqA
[[a-zA-Z0-9\Q-_.\\/:\E]+] を実装しました。