URoad-Home2+を分解してみた9~コマンドインジェクションを使用したroot権限奪取とファームウェアダンプ~

投稿者: | 3月 5, 2024

目次

はじめに

以前まではフラッシュのダンプをJTAGを用いて取得していました。しかしながら、JTAGは遅いのでフラッシュ全体のダンプを取るには非常に長い時間がかかっていました。そのため他の方法を模索していました。URoad-Home初代の方でコマンドインジェクションを使っていい感じにできたので、それを真似てみます。

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

URoad-Home関係の記事の一覧と概要はこちら

危険性について

今回使用するのは、webの管理者画面から脆弱性をついて行うOSコマンドインジェクションです。
悪用厳禁
です。他人に迷惑をかけるようなことはやめましょう。
恐ろしいことにwebの管理者画面のログインにも(コマンドインジェクションとは別の)脆弱性があるので、ネットワーク内であれば、本体のパスワードが分からなくてもログイン&コマンドインジェクションができてしまいます。

大まかな流れ

実行したファームウェアバージョンは1.2.9.1です。

Web管理者画面→インターネット設定→ファイアーウォール→コンテンツフィルタ設定→コンテンツフィルタ追加 にて、ブラウザのディベロッパーツールを使用してペイロードを||コマンド||とすると、そのコマンドが実行されます。セッションキーが必要ですが、content_filtering.aspに直接書いてあるので取得します。
それを利用して、/etc/passwdファイルの中身を書き換えてパスワードを無効化、その後tenletを有効化します。

コマンドインジェクションの手順

(0. UARTでログを見れるようにする)
telnetをどっちにしろ有効化するので、行わなくてもいいと思います。

1. FirefoxでWeb管理者画面に入る
192.169.100.254にアクセスします。ユーザはadmin、パスワードは裏に書いてあるKEYです。
FireFoxで開くのは、Web開発ツールが使いやすいからです。

2. Web開発ツールを開く
開いたあとネットワークのタブを開いてください。

3. URoad-Home2+の設定のファイアウォール→コンテンツフィルタ設定で適当なものを送る
設定済みURLフィルタで送った文字が出てたら問題ないです。

4. Web開発ツールで送られたパケットを見つける
流れていくのが早いので頑張って探してください。3を実行した直後にロギングの停止をした方がいいと思います。ファイルの欄がwebsURLFilterになっているはずです。

URoad-Home2+を分解してみた9~コマンドインジェクションを使用したroot権限奪取~
websURLFilter
送られたパケットを見つけたところ

5. パケットを編集の画面を開く
見つけたものを右クリックして、「編集して再送信」を押します。

URoad-Home2+を分解してみた9~コマンドインジェクションを使用したroot権限奪取~
パケットを見つけて編集して再送信を押したところ

6. セッションキーを見つける
Web開発ツールのデバッガーのタブを開きます。
http://192.168.100.254/usr/web/usr/jp/firewall/content_filtering.asp?tv=46027
みたいなフォルダ(最後の46027の部分は違うかも)を展開していくとcontent_filtering.asp?tv=46027というファイルを見れます。この中の10行目
var gSession_Key = "06A5EE6414330624";
がセッションキー(SessionKey)です。メモしておいてください。ちなみに、ページをリロードするたびに変わるので注意してください。

URoad-Home2+を分解してみた9~コマンドインジェクションを使用したroot権限奪取~
var gSession_Key = "06A5EE6414330624";
セッションキーを見つけたところ

7. パケットを書き換えて再送する
ネットワークのタブに戻って、5で現れた左側トレイにある、ボディを書き換えます。

addURLFilter=;sed -i 's/root:x:/root::/g' /etc/passwd;telnetd;&SessionKey=先程メモしたセションキー

そしたら送信を押します。セッションキーのところは数字のみを入れてください。もし、セッションキーが誤っていると400 Page not foundが帰ってきます。(なぜ?400 Bad Requestか404 Not Foundだと思うけど…) 再度6を実行してセッションキーを取得しましょう。

8. 動作確認
TeraTermなどを使ってtelnetに接続します。rootでログインができれば成功です!

URoad-Home2+を分解してみた9~コマンドインジェクションを使用したroot権限奪取~
URoad-TEC101
MODACOM
BusyBox v1.15.0
telnetでのログインに成功したところ

再起動の問題

再起動すると無効化されてしまいます。コマンドは実行されているっぽいんですけど、;が無効化されているっぽい雰囲気です。以下のシェルスクリプトで実行されているっぽい感じです。なんで、これで;が無視されるのか謎です。

回避方法としては、起動したときに3を実行して上げれば大丈夫です。下は、起動時に実行されるシェルスクリプトなんですが、これだと;が無視されてしまいます。謎です。

#!/bin/bash

##
## iptables websURLFilter RUN
##

firewall_WebURLFilterRule=`nv websURLFilters`
if [ "$firewall_WebURLFilterRule" != "" ]; then
    iptables -t filter -F web_filter 1>/dev/null 2>&1
    echo $firewall_WebURLFilterRule > /var/tmpWebURLFilter
    Rule_Count=`sed 's/~/\n/g' /var/tmpWebURLFilter | wc -l`
    for ((i=1; i<$Rule_Count+1; i++)); do
        URL=`cat /var/tmpWebURLFilter | cut -d "~"  -f $i | cut -d "," -f 1`
        iptables -I web_filter -m string --string $URL --algo kmp -j DROP
    done
else
    iptables -t nat -F web_filter 1>/dev/null 2>&1
fi

フラッシュのダンプ

フラッシュメモリのダンプを取ります。URoad-Home2+には便利なことに初めから、All_Dump.shが入っているのでこれを利用します。中身を見ると、

unagidojyou@ud-pc7-ubuntu:~/500GB/uroadhome2$ cat extracted-swapped/kari/etc/All_Dump.sh
#!/bin/sh

usage() {
        echo "Usage : "
        echo "  All_Dump.sh SERVER_IP_ADDRESS"
        exit
}

if [ "$1" == "" ]; then
        usage
fi

if [ "$2" != "" ]; then
        usage
fi

echo "Dumping All mtd(0 to 13) for check..."
echo ""
cd /tmp
echo "Dumping mtd0.img"
nanddump -o -f mtd0.img /dev/mtd0
sleep 1
echo "Sending mtd0.img"
tftp -p $1 -l mtd0.img
sleep 1
echo "Deleting mtd0.img"
rm -f mtd0.img
echo ""

echo "Dumping mtd1.img"
nanddump -o -f mtd1.img /dev/mtd1
・・・

とのことなので、TFTPサーバをPC側で立ててあげて、そのIPアドレスを指定すれば自動でダンプをおいてくれます。今回の場合は、PC(192.168.100.100)で3CDaemonでサーバーを立てて

/etc/All_Dump.sh 192.168.100.100

を実行すれば自動でダンプされます。

おわりに

これで簡単にフラッシュメモリ(ROM)のダンプファイルが取得できます。アップデート周りの解析とかもやりたいなぁ…

URoad-Home関係の記事の一覧と概要はこちら

コメントを残す

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

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