目次
はじめに
以前まではフラッシュのダンプを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になっているはずです。
5. パケットを編集の画面を開く
見つけたものを右クリックして、「編集して再送信」を押します。
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)です。メモしておいてください。ちなみに、ページをリロードするたびに変わるので注意してください。
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でログインができれば成功です!
再起動の問題
再起動すると無効化されてしまいます。コマンドは実行されているっぽいんですけど、;が無効化されているっぽい雰囲気です。以下のシェルスクリプトで実行されているっぽい感じです。なんで、これで;が無視されるのか謎です。
回避方法としては、起動したときに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関係の記事の一覧と概要はこちら