[レポート]あなたのプリンターはあなたのものではない!Pwn2Ownでプリンターをハッキング – CODE BLUE 2022 #codeblue_jp
こんにちは、臼田です。
今回はCODE BLUE 2022で行われた以下のセッションのレポートです。
あなたのプリンターはあなたのものではない!Pwn2Ownでプリンターをハッキング
プリンターはここ数年、企業内イントラネットに欠かせないデバイスの1つとなり、その機能性も大きく向上している。印刷やFAXだけでなく、AirPrintなどのクラウド印刷サービスにも対応し、使い勝手が向上している。モバイル端末からのダイレクトプリントは、IoT時代にはもはや基本中の基本。また、会社の内部業務文書の印刷にも使うことがあるので、プリンターの安全性はより重要となっている。
現在、市販されているプリンターの多くは、USBや従来のケーブルで接続する必要がない。イントラネットに接続されたLANケーブルさえあれば、パソコンがすぐにプリンターを見つけ、利用することができる。その多くは、SLPやLLMNRといったプロトコルをベースにしている。しかし、ベンダーがそれらのプロトコルを採用して、本当に安全なのだろうか? さらに、多くのプリンターは従来のLinuxシステムではなく、RTOS(Real-Time Operating System)を使用しているが、このことは攻撃者にどのような影響を与えるのか。
本講演では、Canon ImageCLASS MF644Cdw と HP Color LaserJet Pro MFP M283fdw をケーススタディとして、プリンターの解析と制御アクセスの取得方法を紹介する。また、脆弱性を利用して、未認証の状態でRTOSのRCE(リモートコード実行)を実現する方法を紹介する。
Presented by : アンジエ・ヤン - An-Jie Yang
レポート
- RCEの脆弱性をプリンタで発見した
- どうやって発見するか
- 自己紹介
- DEVCOREの研究員
- CTFやってる
- 概要
- プリンタ初期はケーブルが必要だった
- 多くの人たちにとって不便
- 更にドライバが必要
- 最近はUSBも従来のケーブルもいらない
- イントラネットから見つける
- いろんなサービスを提供している
- ボンジュールなど
- プリントだけでなくハッキングも簡単
- インターネット接続していればいたずらの出力がある
- 今回はそのような話ではない
- Red Team
- プリンタはイントラで使われている
- アップデートがあまり行われていない
- 絶好の標的
- 検知が難しいから
- 大手企業はADと接続している
- 秘密情報の入り口
- Pwn2Ownの主要な標的でもある
- 殆どのIoTデバイスと同じようにOSコマンドインジェクションがある
- しかしRTOSを使っている
- 初めてRTOSに直面
- 挑戦することにした
- 3つのプリンタ全部Pwnできた
- 今回はCanonとHPについて
- プリンタ初期はケーブルが必要だった
- 解析
- ハードウェアの分解
- 分析のために必要
- メモリダンピング
- SONOSを分析
- 最終的には別のやり方にして分解をしなかった
- Canonを見てみる
- v6.03
- binwalkで分析
- 難読化されていて直接解析できなかった
- Synacktivなど昔のリサーチと突き合わせたが全然違った
- 最初はマジックNCFWやファームの大きさをみた
- 特定のバージョンまでは難読化されていないのでは
- 他のバージョンを見てみる
- しかし直接ダウンロードできなかった
- まずダウンロードURLの解析
- オリジナルのURLのidはbase64で復号できる
- 複合したら3つに分割できる
- タイプ
- Ordinalナンバー
- ファームバージョン
- 数字を変えたらすべてのファームをダウンロードできた
- バージョンリストを作れた
- 今後リリースのバージョンも確認できた
- 全て見たがすべて難読化されていた
- 諦めようかと思った
- Canonの他の製品のファームも確認した
- 合計130GB
- NCFWとplanetextでgrep
- 4つのファームをみつけた
- WG7000を対象とした
- 難読化されていなかった
- 難読化を解除する関数もあった
- 多くのplantextがあった
- IDAで特定できるようにイメージベースアドレスが必要
- IDAででコンパイルしたらほとんどデバッグメッセージに対応していない
- 文字列がコードセクションと認識されるなど
- correct functionとdebug messageで調整
- 調整の後オリジナルの関数名が指定できていることを確認
- イメージクラスの環境がわかった
- カスタマイズされたRTOS
- v6.03
- HP
- ファーム入手は簡単
- Binwalkで3-4日でとれた
- RTOSでThreadXから修正されたもの
- ARM11でMixed-endian
- ハードウェアの分解
- 解析の対象領域
- 多くのサービスがデフォルトで有効
- PJLがだいたい有効
- SLP・mDNS・LLMNRが有効
- ディスカバリーとDNSに注目することにした
- ベンダーが実装するこのあたりが脆弱になりやすいという経験があった
- ハッキングの実施
- Canon
- SLP
- ローカルエリアのデバイスを検索できる
- Canonは独自に実装していた
- SLPは多くの通信モードがある
- 簡単な例を紹介
- クライアントのリクエストにレスポンスする
- SLP構造
- 沢山のフィールドがある
- Function-Id
- リクエストタイプとフォーマット
- 属性リクエスト
- 探す範囲などを特定できる
- lengthとvalue
- パーシングは慎重にやる必要がある
- 実際脆弱性があった
- エスケープ文字をアスキーに変換した
- 擬似コードで説明
- 固定サイズのバッファを渡す
- エスケープ文字がない場合最大の長さを超えているか確認する
- エスケープ文字を扱う場合に長さのチェックがない
- 長い文字列があるとStackBOFがおきる
- メモリ関連の保護はなかった
- ハッカーフレンドリー
- 90年代のようだ
- StackBOFで世界をコントロールできる
- シェルを格納して実行する
- BJNPを利用
- Synacktiv
- 詳細は割愛
- ステップ
- BJNPでグローバルバッファにshellcodeを格納
- SLPで書き換えて実行
- LEDに任意の画像を表示してみた
- エクスプロイトより時間をかけた
- メッセージを出すことにした
- どのようにデバッギングするか
- ハードウェアを分解するのは時間がかかる
- sleep debugメソッドを実行
- SLP
- HP
- LLMNR
- ローカルリンクで提供する
- マルチキャストで問い合わせする
- 該当クライアントがレスポンスする
- DNSのフォーマットがベース
- クエリは多くのラベルで構成されている
- メッセージ圧縮のメカニズムがある
- 脆弱性にさらされる
- 実装を見る
- 固定長のバッファをラベルに利用する
- ラベルの長さのチェックはない
- StackBOFがある
- Canonと同様のやりかたができると思った
- もっと保護メカニズムがあった
- DEPとMPUがあった
- 0x100byte
- Nullなし
- ROPは制限された
- 他のメソッドを見つける
- どうやってDEPやMPUを実装しているか
- RTOSを見てみる
- 1つのイメージでリンクされている
- 同じ仮想アドレスをカーネルモードで共有
- MMU
- ワンレベルページテーブル
- 1MBを変換
- 各変換テーブルのエントリーがセクションの許可に対応
- AP/APX/XNが対象
- 特権のあるStackBOFがあればいい
- 書き込もうとしたらMPUで保護されている
- MPU
- メモリをリージョンに分割する
- IoTデバイスでよく見る仕組み
- ブート時に有効にされている
- ページテーブルを操作できない
- メモリフォルトになる
- MPU_CTRLをクリアするとオフにできる事がわかった
- ROPを使って0で上書き
- MPU上書き後
- どんなコードも修正できる
- バックドアを作りシェル取得
- D-cacheとI-cacheをリセット
- シェルコードを実行できた時残り1週間だった
- 似ている文字を使ってプリントできた
- バックドアを変更してデバッグコンソールにして色々できるようにした
- LLMNR
- Canon
- Pwn2Own Austin 2021で2位になった
- メッセージをプリントする他に秘密情報を盗むことができる
- 水平展開もできる
- 検知が難しい
- 対策
- プリンタをセットアップするときに何をすればいいか
- 定期的にアップデート
- 数年間アップデートされていないこともある
- 使わないサービスをオフ
- 殆どのプリンタはデフォルト有効になっている
- ディスカバリすらオフにすると良い
- ファイアウォールも入れたほうが良い
- 結論
- ディスカバリとDNSが脆弱になっている
- Red Teamにとってプリンタは良い標的
感想
EDRなどの統制しやすいPCに対するセキュリティだけでなく、全てのデバイスの管理をしっかりしていかないとですな。