[レポート]あなたのプリンターはあなたのものではない!Pwn2Ownでプリンターをハッキング – CODE BLUE 2022 #codeblue_jp

CODE BLUE 2022で行われた「あなたのプリンターはあなたのものではない!Pwn2Ownでプリンターをハッキング」というセッションのレポートです。
2022.10.28

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、臼田です。

今回は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
    • 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メソッドを実行
    • 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週間だった
      • 似ている文字を使ってプリントできた
      • バックドアを変更してデバッグコンソールにして色々できるようにした
  • Pwn2Own Austin 2021で2位になった
    • メッセージをプリントする他に秘密情報を盗むことができる
    • 水平展開もできる
    • 検知が難しい
  • 対策
    • プリンタをセットアップするときに何をすればいいか
    • 定期的にアップデート
      • 数年間アップデートされていないこともある
    • 使わないサービスをオフ
      • 殆どのプリンタはデフォルト有効になっている
      • ディスカバリすらオフにすると良い
      • ファイアウォールも入れたほうが良い
  • 結論
    • ディスカバリとDNSが脆弱になっている
    • Red Teamにとってプリンタは良い標的

感想

EDRなどの統制しやすいPCに対するセキュリティだけでなく、全てのデバイスの管理をしっかりしていかないとですな。