
CVE-2018-14847 の解析と PoC。MikroTik RouterOS Winbox の情報漏えい脆弱性であり、認証なしで資格情報データベースへの読み取りアクセスを許可します。
MikroTikのWinboxプロトコルにおける認証なしのパストラバーサルにより、/flash/rw/store/user.datから管理者認証情報が漏洩します。
CVE-2018-14847 は、MikroTik RouterOSのWinbox管理プロトコル(TCPポート8291)に影響を与えるパストラバーサル脆弱性です。認証されていないリモート攻撃者がルーターのファイルシステムから任意のファイルを読み取ることができ、これにはユーザー資格情報データベース /flash/rw/store/user.dat も含まれます。このデータベースには、弱い静的なXOR鍵で暗号化されたパスワードが保存されています。
この脆弱性は、2018年7月にJacob Baines(Tenable)によってBy the Wayエクスプロイトを通じて最初に公開されました。このリポジトリには、完全なプロトコルドキュメントを備えたスタンドアロンのPython3再実装が含まれています。
| Channel | Versions |
|---|
| Longterm | 6.30.1 - 6.40.7 |
| Stable | 6.29 - 6.42 |
| Beta | 6.29rc1 - 6.43rc3 |
MikroTikは2018年4月にこの脆弱性を修正しました。修正版より古いRouterOSを実行しているデバイスは脆弱なままです。
Winboxは、TCPポート8291で動作するMikroTik独自のバイナリ管理プロトコルです。フレームの構造は次のとおりです:
[total_len - 2][0x01][0x00][total_len - 4]["M2"][fields...]
4バイトのヘッダーはフレーム全体のサイズをエンコードします。これは標準のリトルエンディアンu16ではなく、各バイトがtotal_length - 2およびtotal_length - 4を独立してエンコードします。
各フレーム内のフィールドエンコーディング:
| タイプバイト | 意味 | 値 |
|---|---|---|
| 0xff | 拡張フィールドマーカー | 続いてfield_idと値 |
| 0x09 | u8整数 | 1バイト |
| 0x21 | 文字列 | 1バイト長プレフィックス + データ |
| 0x88 | 応答期待マーカー | 値なし |
| 0xfe | 拡張フィールドID | 3バイトID + タイプ + 値 |
ファイルシステムハンドラはエンドポイント(sys=5, handler=0)に存在し、以下の3つの関連コマンドを公開します:
Winboxファイルシステムハンドラは、ファイルを開くコマンドに渡されるパスをサニタイズしません。'/////./../'シーケンスを埋め込むことで、攻撃者はサンドボックスの境界をエスケープしてルートファイルシステムに到達します:
/////./..//////./..//////./../flash/rw/store/user.dat
各'/////./../'セグメント(10バイト)は1ディレクトリレベル上に移動します。3つのセグメントでルートに到達し、その後flash/rw/store/user.datがRouterOSのユーザー資格情報データベースです。このリクエストには認証は必要ありません。
エクスプロイトは2つのフレームを送信します:
user.datは、nv::messageレコードのシーケンスです。各レコードの前には2バイトのリトルエンディアン長フィールドがあり、マジックバイトM2で始まります。各レコード内のフィールドは3バイトのリトルエンディアンフィールドIDを使用します:
| フィールドID | タイプ | 意味 |
|---|
| 0x01 | 文字列 | ユーザー名 |
| 0x02 | u8 | グループ - 3 = フル管理アクセス |
| 0x11 | 文字列 | 暗号化されたパスワード(未設定の場合は空) |
パスワードは、RouterOSにコンパイルされたハードコードされたソルトから導出された静的なXOR鍵で暗号化されています:
key = MD5(ユーザー名 + "283i4jfkai3389")
password = XOR(encrypted_pass[i], key[i % len(key)]) ヌルバイトまで
これは、影響を受ける任意のデバイスから抽出されたuser.datは、ブルートフォースなしでオフラインで復号できることを意味します。
管理者パスワードを入手した後、攻撃者はWinboxを介して認証し、ファイル作成コマンドを使用して、隠された開発者ログインを有効にする2つのファイルを書き込むことができます:
/pckg/option オプションパッケージをアクティブ化
/flash/nova/etc/devel-login develユーザーを有効化
これらのファイルが存在すると、ルーターはTelnetおよびSSHを介して、管理者のパスワードを使用するdevelユーザーとしてBusyBoxルートシェルを公開します。
一部のRouterOSバージョンでは、SSHが機能するために最初にTelnet接続を行う必要があります。
Exploit_CVE_2018_14847.py は、外部依存関係のない自己完結型のPython3エクスプロイトです。Winboxバイナリプロトコルをゼロから実装し、以下の処理を実行します:
# デフォルトポート8291
python3 Exploit_CVE_2018_14847.py 192.168.1.10
# カスタムポート
python3 Exploit_CVE_2018_14847.py 192.168.1.10 8291
ポストエクスプロイト - 開発者バックドアシェル:
# Telnet(最初に接続する必要あり)
telnet -l devel 192.168.1.10
# SSH(Telnetセッション後)
ssh -oHostKeyAlgorithms=+ssh-dss [email protected]