ここまで散々体温計付きカメラを分解してきましたが、久しぶりに面白い案件にぶち当たってしまいました。
これにどれだけの何が残ってるかまだわかんないけど、このラベルが貼ってあるガラクタを、「これが検温カメラの型番だと思ってヤフオクに出品するレベルの人間の手に渡ってる」の何かしらの問題だと思う
— ひろみつ (@bakueikozo) 2023年8月8日
どっかのショップ店頭の備品を誰か売ったんかな、と思ってたんだけど... https://t.co/XN1g9XVBwQ pic.twitter.com/vv8Ja9VFL5
大元の所有者に連絡を投げたつもりですが、お盆進行なのか全然返事が来ませんね。
つまんないので、今回入手した検温カメラからどうやって画像を取り出したかを記録しておきましょう。
このカメラ、普通に立ち上げるだけで、ネットワークインターフェイスは有効化され、
192.168.1.18が割り当てられます。同じセグメントからLAN接続すれば、いろいろできそうですが…
まずポートスキャンしてみたところ、23(telnet)、80(http)、554(RTSP)が空いていることがわかりました。
早速ブラウザでアクセスしてみますが…
認証が必要です。思いついたパスワードを入れてみますが、通りませんでした。
このカメラ、いろいろ探してみると、「AM520RT」というのが見つかりました。
メーカーのサイトを見てみます。
みていると、どうやら3月のマスク規制解除のため、ユーザー設定でマスク警報を解除できるようにしてあるとのことです。
そのための管理ソフトが準備してある…と書いてありますが、
なんとリンク切れ。
方法の説明を見ると、アプリをインストールするだけでパスワードなどを入れるところがありませんので、このアプリ内にパスワードが埋まっている可能性があります。
webarchiveなどをみてみましたが、残念ながら見つかりません。
この方法ではダメなようです。
引き続き、telnetアクセスを試してみますが…
同様に、パスワードがわかりません。
はい、まぁ最低限、パスワードで守られているため、
簡単には中のデータが見れないようでした。
では終わらないわけで。
早速本体を分解していきます。
基板をよく見れば、TX,RX,GNDというシルクの書かれた3つの穴があります。
これはシリアル端子、保守UART端子などと呼ばれ、大抵の組み込み機器にはあります。
つけているというよりは、開発やデバッグなどのため、どうしても最後まで削除しにくいセキュリティホールなのです。
ここに配線を取り付け、USBシリアルケーブルでパソコンに接続します。
最近私は作業PCがMacになって今までのTeraTermが使えなくてちょっと不便なのですが、
どうにかやっていきます。
Macのターミナルでscreen コマンドを使用します。
% screen /dev/tty.usbserial-24240 115200
電源を入れると、起動時のメッセージが表示され、本体がLinuxで動作していることがわかります。
(起動時の全メッセージはここにあります)
このまま画面を眺めていると
「ipc login:」というログインプロンプトが現れます。
では、徐に 「root」 Enterターン!!!
…ダメです。ログインパスワードがかかっています。
残念でした。
では、次です。
Linuxが起動する前に、u-bootの起動メッセージが出ています。
u-bootとは Linuxを読み込む前に、本体のRAMの初期化やストレージの初期化を行い、
Linux自体を起動させる「ブートローダ」というプログラムの一つです。
そのu-bootにも実は保守モードがあります。
やはり、この保守モードへの入口もなかなか最後まで削除しにくい穴です。
画面に「Hit any key to stop autoboot: 2 1 0 」と出ている間になにかキーを押すと、
このように、u-boot保守モードのプロンプトが現れます。
helpコマンドをタイプしてみましょう。
このように、使えるコマンドのリストが現れます。
このu-bootのコマンドを使って、本体の穴を広げていきます。
Linuxを起動する際に、Linuxに渡すパラメータリストがあります。
これは環境変数bootargsに入っていますので、printenvコマンドで表示します。
いろいろ渡されています。ここで、ルートファイルシステムはmmcblk0p3であること、などが書かれています。
さて、ここには記されていませんが、Linux Kernelはカーネルの読み込み後、最後に「initプロセス」を起動することになっています。
initプロセスは、ルートファイルシステムに配置された実行ファイルですが、初期設定でいくつかの順番で探し、見つかったものを起動するようになっています。
最近のシステムでは/sbin/initを起動します。このinitがルートファイルシステムやユーザディレクトリなどのマウントを仕上げ、/etc/passwdを参照するloginプロセスを立ち上げます。
ところで、ここでじつはinitパラメータとして、他のプロセスを指定することができます。
init=/bin/sh として値を渡すと、なんと/sbin/init ではなく、パスワードなどを入力する必要のない状態の素のシェルが立ち上がってくれるのです。
さっそくやってみます。
setenv bootargs "mem=512M console=ttyAMA0,115200 root=/dev/mmcblk0p3 rootfstype=ext4 rw rootwait blkdevparts=mmcblk0:1M(boot),4M(kernel),32M(rootfs),256M(appfs),8M(logo),2M(license),6144M(params),1024M(log),6144M(logjpg),-(user) init=/bin/sh"
とすると、環境設定が書き換えられます。
この値をsaveenvコマンドで保存します。
ここで、boot コマンドを実行すると…
#プロンプトが表示されています。さっきまでは起動直後にあれこれ表示が出ていましたが、それも出ていません。
shの正体はbusyboxでした。
使えるコマンドを見てみます。
なんでも使えそうです。
さて、これらを使ってファイルシステムを漁っていきます。
/etc/init.d/の下に起動時のスクリプト類がありますので、ここを確認します。
S02moutfsというのがあります。mountのtypoをほったらかしてますね。
中を見ると
こんな記述があります。eMMCの9thパーティションをjpglogというフォルダにマウントしています。怪しいですね。
そのほかにもいろいろマウントしてそうですので、このスクリプトを実行してしまいましょう。
(先ほど記述した/sbin/initは/etc/init.d/rcSを起動し、そこからSxxが呼び出されるのが普通の起動ですが、今回は直接sh(busybox)を起動したため、そのようなスクリプト実行がされていません。)
マウントされたかな?
大正解!日付ごとに分かれたフォルダが出てきました。
中身入ってるかな? findコマンドでファイル一覧を取得します。
うん、入ってますね。
さて、しかし、現在このシリアルコンソールしか接続されていない状態、
このようなバイナリファイルを取得して確認するのはちょっと面倒。
この機種はUSBコネクタがありませんのでUSBメモリを使うことは…
もう一回基板を見てみましょう。
なんと、本体にはUSBコネクタはありませんが、
基板上にはUSB用のコネクタが実装されていたのです。
たまたま別機種からもぎ取った同等のコネクタがありましたので、その辺にあったUSB延長ケーブルをぶった斬り、配線を合わせてケーブルを作成します。
USBメモリを差し込んでみると…認識しました。
USBメモリをマウントし、cp -r コマンドでjpgファイルを全部コピーします。
あとはこの画像を眺めるだけです。お疲れ様でした。
このように、このような組み込みOSが入っている検温カメラでは、本体UIやWebUIにパスワードがかかっていても、本体を直接分解し、シリアルコンソールなどから制御すればデータの吸い出しが可能になることがあります。
そうでなくても、チップを剥がして読み出せば全部読めてしまうこともあるんですが。
改めて、このようなカメラ付き検温計の処分の際には注意してください。
ヤフオクとか、メルカリに出してしまうと、うっかり私が買いますので。