※こちらの記事は2020年10月5日公開note版「ラック・セキュリティごった煮ブログ」と同じ内容です
デジタルペンテストサービス部の魚脳、3dbd、カペルです。
コロナの影響で出社の機会が減った昨今、皆様いかがお過ごしでしょうか。リモートワークが広まってからというもの、ルータをはじめとするネットワーク機器の売り上げが好調らしいですね。いまやAmaz〇nで探せば5000円以下で買える海外製ルータがゴロゴロ見つかります。ポチれば数日後には手元に届く。本当に便利な時代になったものです。
でもそのルータって本当に安全なのでしょうか?
あまりにも安すぎる、何かあるのでは?そもそも海外製のルータってセキュリティ面はどうなの?といった疑問に答えるべく、今回は安価で手に入れた海外製ルータの脆弱性検証を行ってみました。
ルータの役割
そもそもルータって何のための機器か良く分からない、という方のために説明しておきますと、ルータは複数のネットワーク間における通信を中継する機器です。みなさんのご自宅に設置されているルータは、ご自宅のネットワークと契約しているプロバイダのネットワーク間の通信を中継しています。プロバイダは更に別の契約者やプロバイダと接続して...と、こうしたネットワーク同士の接続を繰り返すことでインターネットが成り立っています。
ルータに脆弱性が存在する場合、どのような被害が想定されるのでしょうか。
・通信内容を第三者に傍受される
・ルータの管理者権限が奪われ、設定が勝手に変更される
・ルータ経由で自宅のネットワークへ侵入される(あるいは踏み台にされる)
検証機器一覧
今回調査したルータはこちらです。
Amaz〇nで3000円弱で入手した海外製ルータです。
安い…安すぎる。いかにもな臭いがプンプンします。
検証内容
今回行った検証の大まかなフローです。
ます最初にやるべきことは、調査対象の製品に既知の脆弱性が存在していないか調べることです。すでに先人が発見しているのであれば、二度手間を避けられます。ググりましょう。ひたすらググりましょう。
幸運なことに(?)今回の調査対象には既知の脆弱性があるようで、
CVEが発行されていました!
IoT機器の脆弱性を調査する際によく行うのがファームウェアの解析です。ゲームソフトのROM解析で隠しメッセージが見つかった!とか聞いたことありませんか?イメージとしてはそれに近いです。
早速ルータを分解してROMを取り出します。
取り外したROMはROMライターを使ってファームウェアを吸い出します。
ファームウェアを吸い出した後、ROMははんだ付けして元通りに再実装します。後程行うウェブ管理画面の調査等でルータを動作させる必要があったので、失敗しないよう慎重に作業を進めました。
抽出したファームウェアにbinwalkコマンドを実行すると、以下のような一文が確認できます。
やけにサイズが大きい圧縮ファイルがありますね。怪しい…。
binwalk、dd、7z等のコマンドを使用して解析を進めます。
$ dd if=GD25Q64B_20200806_175501.BIN of=327744.lzma skip=327744 bs=1 $ 7z x 327744.lzma -o”327744” $ cd 327744 $ binwalk 327744 $ dd if=327744 of=5742592.xz skip=5742592 bs=1 $ 7z x 5742592.xz -o”5742592” $ cd 5742592 $ binwalk 5742592 $ 7z x 5742592 -o”cpio-root” $ cd cpio-root
すると…
ファイルシステムですね。以降はこの中をじっくり探索していきます。
見つかった問題点
今回の検証では、以下の問題点が見つかりました。
(1)Wi-Fiの初期設定の不備
(2)バックドアに相当する機能が存在する
(3)認証のバイパスが可能
(4)パスワードの漏洩
(1)Wi-Fiの初期設定の不備
同一機種におけるデフォルトのSSIDが固定となっていました。
また、デフォルトでパスワード認証が設定されておらず、認証不要で当製品のネットワークにアクセスすることが可能でした。
(2)バックドアに相当する機能が存在する
ファイルシステムの中を調べていると、/etc_ro/lighttpd/wwwにwebcmd.shtmlというファイルを見つけました。
ウェブ管理画面側にはこのページへ遷移する箇所が見当たらなかったので、
どうやら正常の遷移ではアクセスできないようです。
webブラウザでアドレスバーに当ファイルのURLを直打ちし、アクセスを試みたところ、以下の図のような任意のコマンドが実行できるバックドアでした。
このバックドアを利用するためには管理者としてログインする必要があります。誰でも好き勝手に悪用できるといった類のものではないので、この時点ではそこまで危険なものではないと判断しました。
一方で、この管理画面へのログイン認証プロセスを回避する方法があるのではないかと考えたため、更に調査を続けました。
(3)管理者認証のバイパスが可能
/etc_ro/lighttpd/www でログインに関係ありそうなファイルを調べていると、多くのファイルに以下の関数が含まれていることに気が付きました。
logincheck(user);
この関数は同一ディレクトリ内にあるlinux.jsというファイルで定義されていました。
function logincheck(user){ var logout = “/login.shtml”; if(applogin==”1”) user=1; if(applogin==“1”){ logout = “/apptimeout.shtml” } if(user==”0”){ window.location=loginout; } }
引数になっているuserは、ログイン状態を示すフラグになっているようです。
変数userが定義されている箇所を探してみると...
// live_getsettings.shtml var user = <!--#exec cmd="web 2860 sys checkUser"--> // check_update.shtmlなど var user = <!--#exec cmd="web 2860 sys checkuser"-->+1;
ダブルクォーテーション内のコマンドを実行し、その結果を変数userに代入しているように見えます。
webコマンドは/bin配下にその実体があり、バイナリをGhidraで確認してみたところ、checkUserという関数が存在していました。この関数は/tmp/loginuserの内容に応じて0か1を返しているようです。
webのバイナリファイル中にある「checkUser」と、shtmlなどに記述されている「checkuser」は別物であり、 webcmd.shtml にて入力を行ってみたところ「checkuser」のほうはうまく機能しないことが判明しました。
管理者認証時の通信を見てみると、logincheckが行われる直前にlogin.shtmlでというコマンドが実行されています。
このコマンドを webcmd.shtml で実行してみると、結果が管理者認証時のレスポンスに含まれている形式と一致しました。
すなわち、ルータ側でユーザのログインの可/不可を判断しているということが分かりました。
ここまでで分かったことをまとめると、管理者認証時のフローは以下のようになります。
この図から、管理者認証のバイパスを行うためには以下の2通りの方法があることが分かります。
[方法1]logincheck関数の実行前に変数userの値を改ざんする(0→1へ改ざん)。
[方法2]logincheck関数そのものを除去する。
(4)パスワードの漏洩
/etc_ro/lighttpd/wwwで パスワードに関係がありそうなキーワードを探していると、live_test.shtmlに以下の記述を見つけました。
<script type="text/javascript"> //var username="<!--#exec cmd="web 2860 nvram Login"-->"; var syspasswd="<!--#exec cmd="web 2860 nvram Password"-->";
ブラウザでアクセスしてみると、このページではlogincheck関数が実行されておらず、同一ネットワーク内からであれば認証不要かつ平文で管理者ユーザ名・パスワードが入手可能であると判明しました。
まとめ
今回の調査では4件の脆弱性が確認できました。
これらはいずれも既に報告されているものであり、残念ながら(?)新規の脆弱性は発見できませんでした。
安価なIoT機器の中にはあえて脆弱な仕様で設計されているものもあり、それらを運用している中小企業の脆弱なネットワークがサプライチェーン攻撃の標的として狙われる場合もあります。
こうした脆弱なIoT機器を使用して情報をやり取りするのは大変危険です。
安価なIoT機器が必ずしも危険なものであるとは限りませんが、リスクを避けるためにも購入前にその製品にCVEが発行されているかどうかや、脆弱性の修正バージョンが提供されているか等の下調べを行うことをお勧めします。