Telnet経由でBrotherプリンターのデバッグアクセスを取得する
Getting debug access on a Brother printer over Telnet (inventor7777.github.io)
要約
この記事では、Brother MFC-L8900CDWプリンターのファームウェアを分析し、Telnet経由でデバッグアクセスを取得する方法を解説しています。プリンターがLinuxではなくT-KernelというリアルタイムOSで動作していることを特定し、特定のコマンドを用いてデバッグモードにアクセスする手順を示しています。
全文翻訳
Telnet経由でBrotherプリンターのデバッグアクセスを取得する
Brother NC-8700wコマンドコンソールは、見た目以上に興味深いものであることが判明しました。
いくつかの背景
私は常に物事がどのように機能するかを知ることに喜びを感じてきました。それはハードウェアから始まり、興味深いデバイスを分解することからでした。そして今ではソフトウェアでも同じことをしています。ソフトウェアがどのように機能するかを学ぶにつれて、私が好む目標の一つは、隠された機能にアクセスすることです。Linuxベースのデバイスでは、それはroot Linuxシェルを取得することです。しかし、プリンターの場合はどうでしょうか?
疑いのない被験者
家族が使っているのはBrother MFC-L8900CDWです。特定の他ブランドのプリンターやモデルの評判とは異なり、このプリンターは毎回問題なく接続・印刷できます。mDNSがランダムに停止したり、紙詰まりが頻繁に発生したり、トナーがすぐに切れたりすることはありません。しかし、ベンダー提供のCLIは、深いシステム情報に関しては限定的です。(これらの機能のうち一つは他と異なります)
旅の始まり
この時代に物事を解明する最初のステップは、ファームウェアバイナリを入手し、AIを使ってあらゆる角度から解析することです。(もちろん、自分でこれを行うのに熟練した人もいますが、私はその一人ではありません。)一部のデバイスではファームウェアイメージを直接ダウンロードできますが、Brotherの場合は、独自のダウンローダーを使用するように求めてきます。私のAIエージェントは、Brotherのファームウェアアップデーターアプリで見つかったリンクに直接アクセスしようとしましたが、サーバーは推測されたXMLリクエストを拒否しました。そこで、ファームウェア更新ツールのさらに奥深くを掘り下げたところ、受け入れられるモデルや情報のリストが見つかりました。この記事を書いている間に、もし知っていればリバースエンジニアリングの手間を省けたかもしれない興味深いツールを発見しましたが、Brotherアプリには手動で作業するのに十分な情報が含まれていました。Brotherはいつでもフォーマットを変更する可能性がありますが、私のプリンターで機能したリクエストは次のとおりです。
curl -sS \
'https://firmverup.brother.co.jp/kne_bh7_update_nt_ssl/ifax2.asmx/fileUpdate' \
-H 'Content-Type: text/xml' \
--data-binary @- <<'XML'
<REQUESTINFO>
<FIRMUPDATETOOLINFO>
<FIRMCATEGORY>MAIN</FIRMCATEGORY>
<OS>MAC</OS>
<INSPECTMODE>0</INSPECTMODE>
</FIRMUPDATETOOLINFO>
<FIRMUPDATEINFO>
<MODELINFO>
<NAME>MFC-L8900CDW series</NAME>
<SPEC>0001</SPEC>
<DRIVER>EWS</DRIVER>
<FIRMINFO>
<FIRM>
<ID>MAIN</ID>
<VERSION>ZU2605160228</VERSION>
</FIRM>
</FIRMINFO>
</MODELINFO>
<DRIVERCNT>1</DRIVERCNT>
<LOGNO>2</LOGNO>
<NEEDRESPONSE>1</NEEDRESPONSE>
</FIRMUPDATEINFO>
</REQUESTINFO>
XML
ファームウェアバージョンを B0000000000 に置き換えても機能します。
応答として、BrotherのAPIは次のように返しました。
<RESPONSEINFO>
<FIRMUPDATEINFO>
<VERSIONCHECK>0</VERSIONCHECK>
<MEMORYVERSION>a</MEMORYVERSION>
<FIRMID>MAIN</FIRMID>
<LATESTVERSION>ZV2608181949</LATESTVERSION>
<PATH>http://update-akamai.brother.co.jp/CS/D009UD_ZV.djf</PATH>
<DLTIME>175000</DLTIME>
</FIRMUPDATEINFO>
</RESPONSEINFO>
非常に説明的なバージョン名ですね…
ファームウェアが着弾
ファームウェアを入手したので、GPT-6.1 Solが作業を開始しました。
以下は、GPT-6.1 Sol自身の言葉による発見です。
結論
メインアプリケーションファームウェアは、32ビットリトルエンディアンARM上でTRONファミリーのT-Kernelリアルタイムオペレーティングシステムを使用しています。確信度:高。正確なT-Kernelのリリース、CPUコア、およびSoCは特定されていません。
これは、Linux文字列がないというだけでなく、肯定的なT-Kernelの証拠です。
抽出された/ZlibRo.bin内の証拠(オフセットは当該ファイルからの相対位置)
0x004b0168: T-Kernel/OS SVCの実行中
0x019c0450: ソフトウェア割り込み(SWI) #6(T-Kernel/OS & 拡張SVC)
0x019c050f: ソフトウェア割り込み(SWI) #9(T-Kernel/DS)
0x019c7d7b: OS_Ver
0x019c7d82: TSysName
0x019c7d8b: T-Kernel
0x019c7d94: TMaxTskId(セマフォ/ミューテックス/その他の設定名の後に続く)
0x0002a624: ITRON用のTASK STACK INFORMATION
0x002b3014: MFC-L8900CDW series(0x00c40f4cおよび0x00c4148cにも存在)
抽出された/KernelRo.bin内の証拠
0x0000e188: T-Monitor Initialize
0x0000e8a5: TM> プロンプト
0x00009154: Undefined Instruction (ARM)
0x00009170: Undefined Instruction (THUMB)
ARM例外レジスタR0-R15/CPSRおよびARMプロセッサモードが存在します。
最初の単語はARMリトルエンディアン命令としてデコードされ、SUB lr, lr, #4 (0xe24ee004) および PUSH {r3,r12,lr} (0xe92d5008) が含まれます。
RTOSカーネルは、0x40100000にロードされる個別の141,932バイトのセクションです。
ストレージとライブラリ:組み込み識別文字列であり、セキュリティ監査ではありません
ZlibRo.bin 0x010050e4: Datalight Reliance Nitro v3.0.6 Build 2306EC
ZlibRo.bin 0x003302e4: RTOS Edition for arm; 2015年12月21日コンパイル
ZlibRo.bin 0x010d6b50: Datalight FlashFX Tera v3.1 Build 2772E
ZlibRo.bin 0x00f391e0: Lua 5.2.3 バージョン識別情報
ZlibRo.bin 0x008ddaa4: OpenSSL 1.0.1c; 他のセクションはOpenSSL 1.0.2を識別します。
ZlibRo.bin 0x005377b8: libpng バージョン1.6.43
ZlibRo.bin 0x00692ec8: gSOAP/2.7
ZlibRo.bin 0x019bb300: wpa_supplicant v0.5.7-Devicescape
バージョンラベルはベンダーのバックポートでも存続する可能性があります。それらは、どの脆弱性が存在するか、またはバンドルされたモジュールがすべてアクティブであるかを示すものではありません。
フラッシュレイアウトと抽出
アップデートラッパーはPJL EXECUTE BRDOWNLOAD / PROGRAM=FIRMで始まります。
このパッケージは、ファイルオフセット0x93をフラッシュアドレス0xe0060000にマップします。
20バイトのラベルと32ビットリトルエンディアン値のテーブルが、パッケージオフセット0x8497から始まります。カーネル、ページテーブル、およびzlibセクションの名前が付けられています。
メインの圧縮ストリームは、その4バイトの長さの後、パッケージオフセット0x2b2e7から始まります。3つのストリームが連続して格納されています。各ストリームはzlibチェックサム/終了チェックに合格し、テーブルの展開サイズと完全に一致します。
RWソースアドレスは、インストールされているフラッシュの宛先を示しています。アップデートパッケージは、これらのストリームをROストリームの直後にパックします。
出力 バイト数 ロードアドレス
PageTable.bin 33,792 0xe0060000
KernelRo.bin 141,932 0x40100000
ZlibRo.bin 28,186,916 0x40222b00
ZlibRw.bin 700 0x41e00d00
Zlib2Rw.bin 1,526,396 0x43cb8f00
Binwalkは展開されたメインセクションに埋め込まれた画像やその他のアセットを見つけましたが、認識可能なLinuxファイルシステム/カーネルイメージは見つかりませんでした。これは、別のチップが他のファームウェアを実行していないことを証明するものではありません。
ハードウェア
Brotherのモデルデータシートは、800 MHzのメインプロセッサ、133 MHzのサブプロセッサ、および512 MBのメモリ(地域モデルのバリエーションの可能性があります)を指定しています。
画像には、SubCPU/プリントエンジンの制御メッセージが含まれています。これは、印刷、スキャン、UI、ネットワーキング、および個別のエンジンコントローラーを調整するRTOSアプリケーションと一致します。私たちはSUB1 1.35を分析していません。
診断テーブルの一般的なCPUベンダー名は、SoCを特定しません。
カーネルにはT-Monitorデバッガー/モニターがありますが、それがネットワークtelnetポートからアクセス可能であることを確立するものではありません。ファームウェアには、Brotherのネットワーク設定telnetコマンドも含まれています。telnetサービス自体がUnixシェルの証拠となるわけではありません。
ソースと比較資料
TRON Forum: T-KernelおよびT-Monitorの役割
https://www.tron.org/tron-project/what-is-t-kernel/t-kernel/
TRON Forum: 公式ソースダウンロード
https://www.tron.org/source-code-download/
Brotherモデルデータシート(プロセッサ/サブプロセッサ/メモリ)
https://www.brother.lt/-/media/product-downloads/devices/printers/mfc/mfcl8900cdw/mfc-l8900cdw.ashx
STAR Labs: 別のBrotherモデルをT-Kernelと類似の名前/圧縮セグメントを使用して独立に検査しました。フォーマットのヒントとして使用されました。私たちのOSの結論は、このパッケージ自身の抽出された証拠に基づいています。
https://starlabs.sg/blog/2025/11-breaking-into-a-brother-mfc-j1010dw-three-security-flaws-in-a-seemingly-innocent-printer/
...
ZlibRo.bin内の設定レコードはそれぞれ20バイトです。
整数値; 名前ポインタ; タイプ; カウント; 自身の値へのポインタ。
TmConsEnable/TmDebugPort/TmBaudRate のレコードは、値 0/0/115200 を持ちます。
0x40109344 のカーネルコードは TmConsEnable を読み込み、0x40109360-0x40109368 では、その値がゼロの場合に初期シリアルコンソールの初期化をスキップします。
これらはコンパイル済みのデフォルトであり、現在のRAM設定の測定値ではありません。
個別のアプリケーションレコード ConsDrvEnable=1 および DEBUGPORT=2 が存在します。これらの名前だけでは、UARTピン番号やリモートルートを確立するものではありません。
T-Monitorの文字I/Oは、メモリマップされたハードウェア0xd0c00000にアクセスします。
0x4010e058: 文字出力ルーチン
0x4010e0d0: シリアル初期化、「T-Monitor Initialize」を書き込みます。
0x4010e1a0: 文字入力ルーチン
0x4010e7c4 および 0x4010e8c0: TM> プロンプトとの対話ループ
入力/出力は、初期コンソール初期化がスキップされた場合でも、シリアルブロックを遅延初期化できるため、TmConsEnable=0 は後続のモニターエントリが不可能であることを証明するものではありません。
0x4010e280 のコマンドディスパッチャーは、テーブルアドレス0x41e00e18をロードします。
これは12バイトのレコード(名前、エイリアス、ハンドラ)をウォークし、ヌル名で停止します。
初期テーブルは、抽出された/ZlibRw.binのオフセット0x118にあります。
Help, H, ハンドラ 0x4010e318
null, null, ハンドラ 0x4010e1f8
ターミネーターのハンドラは「Unsupported command」と表示します。完全なメモリ、レジスタ、ブレークポイント、またはステップコマンドスイートは、この初期テーブルには存在しません。これは、以前の一般的なT-Monitorの説明を絞り込むものです。
個別のBrotherデバッグコンソール
アプリケーションには、telnetddebugおよび/telnetdebug_q識別子、デバッグユーザーモードに入るためのテキスト、デバッグシンボル、タスクスタック、ヒープ使用量、稼働時間、およびコンソール出力のリダイレクトに関するヘルプ文字列が含まれています。それらの存在は手がかりですが、成功したアクセスやT-Monitorへのブリッジングを確立するものではありません。
もしこの部分を飛ばしたとしても、無理はありません。一部の人にとっては興味深いかもしれませんが、だからこそ含めました。
プリンターの技術スタック
プリンターはT-Kernel、TRONファミリーのリアルタイムOSを実行しています。
| コンポーネント | 情報 |
|---|---|
| CPUアーキテクチャ | 32ビットARM、リトルエンディアン |
| ストレージファイルシステム | Datalight Reliance Nitro 3.0.6 |
| フラッシュ管理 | Datalight FlashFX Tera 3.1 |
| スクリプティング | Lua 5.2.3 |
| その他のライブラリ | OpenSSL, gSOAP, libpng, wpa_supplicant |
| ファームウェア構造 | 個別のカーネル、圧縮されたアプリケーションコード、組み込みWeb/UIアセット |
Brotherは800 MHzのメインプロセッサ、133 MHzのサブプロセッサ、および512 MBのRAMを指定しています。ファームウェアには、サブプロセッサとの通信およびプリントエンジンの制御メッセージが含まれています。Brother datasheet
興味深い部分:何も変更せずにデバッグアクセスを取得する
おそらくあなたが求めていた部分でしょう!
プリンターでTelnetが有効になっている場合(Web UIから簡単に有効化できます)、3つのデバッグモードに非常に簡単にアクセスできます。
自己責任でご使用ください!パラメータを誤って変更すると、システムが深刻な問題を引き起こす可能性があります。
管理パスワードを使用してコマンドコンソールにログインし、ユーザー名を尋ねられたらEnterキーを押すだけです。Local>プロンプトが表示されたら、SET USER 640184.571119と入力します。
inventor7777@Mac-Studio - 20:17 ~ % telnet 192.168.50.16
Trying 192.168.50.16...
Connected to 192.168.50.16.
Escape character is '^]'.
Welcome. Type <return>, enter password at # prompt
#
Brother NC-8700w Command Console
Copyright(C) 2000-2017 Brother Industries, Ltd.
KASAGO TCP/IP Copyright (c) 2011 ZUKEN ELMIC, Inc.
Interface 1 : NC-9200h, Ethernet 10/100/1000BASE-T (Inactive)
Interface 2 : NC-8700w, IEEE 802.11b/g/n (Active)
Interface 2 is selected for configuration
Type HELP for command list
Enter username>
Local> SET USER 640184.571119
Enter debug user mode.
Local> HELP
EXIT/^D Exit program
HElp Information on available commands
INitialize Reset unit
CLear Remove configuration item
SET Modify unit parameters
SHow Display unit parameters
ZEro Zero statistical counts
DEbug Execute debug functions
REDirect Redirect printf() output
WATch [<addr>[ <intvl/cond>[ <unit>]]] Watch memory function
SNTPDEBUG SNTP for debug functions
Type 'HElp <cmd>' for more information
ファームウェアには、私が深く調べていないワイヤレスQAおよびワイヤレス開発アクセスモードも含まれています。ワイヤレスQAはSET USER 031227で、ワイヤレス開発はSET USER 031227.040119でアクセスできます。
私はデバッグコンソール(あるいはCLI全般)をあまりいじっていませんが、ファームウェアには大量のコマンドが含まれていることが明らかになりました。この投稿を異常に長くしないために、私のAIが利用可能なすべてのコマンドのHTMLをコンパイルしました。すべてをテストしたわけではないので、参考程度にしてください。しかし、GPT-6.1 Solは実際にかなり賢いです!
繰り返しになりますが、プリンターを正常に動作させたいので、これらのコマンドのいずれも広範囲にテストしていませんが、非常に興味深いです。DEBUG SHOW HEAPを使ってヒープをチェックしたところ、実行中のすべてのタスクとその使用量を示す完全なリストが得られました。素晴らしいです!
もしこの投稿がBrotherプリンターのリバースエンジニアリングへの飢えを満たさなかったなら、もう一つ興味深い読み物として、Star LabsのBrother調査があります。ここでは、これらのプリンターが実際にどのように機能するのかをさらに深く掘り下げています。