『サイバーセキュリティプログラミング』学習メモ

Ch01 Python環境のセットアップ

  • pipのインストール
    • これを参照
    • aptだとpython3の方のpip3しか入れられなかった
  • github3.py
    • python -m pip install github3.py==1.0.0
    • バージョンを指定しないとSyntaxError(最新版はPython 2.7は対象じゃないらしい)
  • Wing IDE
    • ダウンロードしてdpkg -i (ファイル名)
    • Stack Data
    • Debug Probe
      • personalにはない?

Ch02 通信programの作成: 基礎

  • ネットワークを介して攻撃を行うためのツールが,target companyにはない
    • 一方,Pythonがインストールされていることはよくある
    • Pythonを足がかりにする
  • Pythonによる通信programについて
    • Pythonでserver client communicationを行うthird_partyのツールはたくさんあるが,そのすべての核となっているのがsocket library
    • socket library: TCP, UDPで通信するclient, serverのprogramを素早く書いたり,raw socketを利用したり,その他さまざまな通信programを作成したりするうえで,必要不可欠なもの
      • このモジュールを使えば,target terminalへの侵入やメンテナンスなど,必要なことはすべて実現できる
  • TCP_client
    • penetration_testでは,サービスの検査やゴミデータの送信,fuzzingやその他のさまざまなことを行うためのTCP_clientを手早く作ることがたびたび必要になる
      • 制約によっては,コピペやネット接続すらできないこともある
    • 重要な仮定
      • このスクリプトを使った接続は常に成功する
      • 接続先のサーバが常にデータを先に送ると想定している
      • 接続先のサーバはいつでもうぐさまデータを返信してくる
  • UDP_client
    • TCP_clientとほとんど変わらない
      • socket type がSOCK_DGRAM
      • sendtoのみ(connect()は不要)
  • TCP_server
    • 簡単なコードだが,Netcatの自作やTCP proxyの作成を行う以降の節で拡張していくことになる,便利なコード
  • Netcatの置き換え
    • Netcatは攻撃者にとって非常に便利なツール
    • Web applcationに対する攻撃で侵入したときは,侵入に成功した後の接続経路を確保したいと考える
    • subprocess library
      • process generateで役立つinterface
      • processを立ち上げたり子processとやりとりしたりするのに利用される
      • このコードでは,渡したコマンドをそのままローカルのOSに渡して実行させている
        • 実行結果はサーバに接続してきているクライアントに送信する
        • 例外処理では,一般的なエラーを補足し,コマンド実行が失敗したことを伝えるメッセージをクライアントに送るようにしている
    • ファイルのアップロード,コマンド実行,コマンドシェルの実行を行う処理を実装
    • 試してみる
      • サーバとして動作するスクリプトUnixホスト上で動作しているため,SSHでログインしているときやUnixホストのローカルで作業をしているときにコマンドを実行しているかのような出力になっている
      • 技術的にはまったく高度ではないが,Pythonで複数のclientやserverのソケットを一度にハックして悪さしようとするときの基本的なやり方
  • TCP_proxyの構築
    • toolboxにTCP_proxyを入れておくべき理由
      • あるホストから別のホストにデータを転送したり,ネットワークを利用するソフトウェアの検査をしたりといった作業に必要になる
    • 詳細がわからないプロトコルを解き明かしたり,applcationに送る通信データを改変したり,ファジングテストのためのデータを作ったりといった,様々な場面で使える簡単なPythonのproxy script
    • proxy_handler()
      • response_handler()の中で,パケットの書き換え,ファジングテストの実施,認証における問題のテストなど,リモートから受信したパケットに対してやりたいことをなんでも実施できる
        • request_handler()も同様
        • 認証情報が平文でやりとりされるapplcationの通信で,一般ユーザの情報の代わりに管理者の情報を送ることで権限昇格を試みるときなどに便利
    • hexdump()
      • 16進数表記およびASCIIの表示可能文字で画面に出力する関数を作る
      • 詳細がよくわからないプロトコルを解き明かす場合や,平文でやりとりされるプロトコルにおいてユーザの認証情報を取得する場合など,多くの場面で役立つ
    • 試してみる
      • 内容と返還後の文字列が表示される
  • Paramikoを用いたSSH通信programの作成
    • 検知から逃れるために通信の暗号化が〇
    • ParamikoというPyCryptoを使ったlibraryを使えば,SSH2 protocolを簡単に扱える
    • 実装
    • SSHサーバに接続して複数のコマンドを実行させたり,複数のSSHサーバに接続してコマンドを実行させたりできる
    • Windowsには誰でもすぐに使えるSSHサーバは備えられていないので,独自に作ったSSHサーバからSSHクライアントにコマンドを送るようにする必要がある
    • 試してみる
      • コマンドがSSHサーバに送られ実行され,結果をサーバ上で表示
  • SSH_tunneling
    • 目的: SSH clientで入力されたコマンドを遠隔地のSSH server上で動かすこと
    • SSH_tunnelingを使う場合,送信データはまとめられてSSHで送信され,SSHサーバ上でその中身が取り出され,サーバの処理に引き渡される
    • 状況
      • internetを介してアクセスできるSSH_serverがあり,そのSSH_serverと同じネットワーク内にあるWebサーバにアクセスしたい
      • Webサーバに直接アクセスはできないが,SSH_serverからはアクセスできる
      • SSH_serverには使いたいツールがインストールされていない
    • → 手段1: SSH_forward_tunneling
      • ssh -L 8008:web:80 justin@sshserverというコマンドを実行すると,justinというユーザでSSH_serverに接続し,ローカルシステムの8008番ポートの準備が行われる
    • 多くのWindowsシステムではSSH_serverが動作していないが,そのような状況でも,SSH_tunnelingを逆向きに設定することで解決できる
    • → 手段2: SSH_reverse_tunneling
      • reverse_forward_tunnel()
        • transport()
          • 暗号化された接続の作成や設定
        • channel
          • 暗号化されたセッションを通じてデータの送受信を行うためのソケットのようなもの
    • 試してみる
      • Windowsの環境からSSH_serverとの接続を確立し,そのサーバの8080ポートを待機状態にする
        • 8080ポートへの通信はWebサーバの80番ポートに転送される
        • Linuxでブラウザからhttp://127.0.0.1:8080にアクセスすると,SSH_tunnelを通じてWeb_serverに接続することになる
    • SSHSSH_tunnelingを理解し,利用するのは重要
      • 使いどきや使い方の把握
    • Paramikoを使えば既存のPythonツールにSSHの機能を追加できる
  • まとめ
    • とても単純だが非常に役立つツールの作成
    • 目標: penetration_testを行うときや攻撃が成功した後の活動を行うとき,バグ探しのときなどに使うツールを作成するのに十分な,Pythonのネットワークプログラミング技術を身につけること

Ch03 network: raw_socketと盗聴

  • network_sniffer: target machineが送受信するパケットの観測を可能にするため,攻撃の前後でよく利用される
  • network通信を観測したりでコードしたりするスニッファーを即席で作る方法を知る
    • 手軽で成熟したツールに関して深い理解
    • Pythonの新しいテクニックの学習
    • 低レイヤーのネットワークの動きを理解
  • 生のIPヘッダやICMPヘッダのような低レベルのネットワーク情報にアクセスするには,raw socketを使う
  • UDPを用いたホスト発見ツールの作成
    • target networkで動作中のホストを発見するUDPベースのスニッファーの作成
    • 攻撃者は事前調査を行ったり,攻撃対象を絞り込んだりするために,ネットワーク上に潜むすべての標的を見つけようとする
    • 特定のIPアドレスでホストが稼働しているか判断するために,UDP portにパケットが届いた時の処理方法を利用する
      • 一般的には,UDPデータグラムをホスト上の閉じたポートに送ると,当該ポートに到達できないことを示すICMPメッセージが返信される
      • UDPデータグラムに対する応答を受信できなければ,ホストは存在しない
      • ICMPメッセージを受信できる → ホストが稼働していることを意味
    • UDPを選ぶ理由: overheadなし
    • scannerで,発見したすべてのホストに対してNmapによる完全なポートスキャンを開始させるような処理の追加もできる
  • WindowsLinuxにおけるパケット盗聴
    • 試してみる
      • pingを実行したときのrequestをキャプチャ
  • IP_layerのデコード
    • ctypes構造体の定義
    • protocolとIPアドレスを読みやすい形式に変換
    • 試してみる
      • IPヘッダがデコードされる
  • ICMPのデコード
    • type=3: 宛先到達不可能クラス
    • code=3: ポート到達不可能エラーが発生
    • 元のデータグラムの先頭8バイトがICMPメッセージに含まれるため,照合できる
    • netaddr libraryを使うコードを追加し,ホスト発見用のスキャンをサブネット全体に対して実施できるようにする
      • netaddr module
        • subnet maskを入力として受付,適切に処理
        • subnet, addressをとても簡単に処理できるようになる
    • 試してみる
      • 対象のサブネット内をスキャンできる

Ch04 Scapyによるネットワークの掌握

  • e_mailの平文の認証情報の窃取,同一ネットワーク内の通信を傍受するための標的マシンに対するARPポイズニングの体験
  • Scapyのpcap処理を拡張してHTTP通信から画像を切り出し,その画像に人が含まれているかを判断するために顔検出を行うデモを実施
  • e_mailの認証情報の窃取
    • Scapyのinterfaceを使って,パケットを傍受しその内容を詳細に分析する方法を見る
    • SMTP, POP3, IMAPの認証情報を窃取する簡単なスニッファーの構築
      • あらゆるprotocolに適用できる
    • ARP_poisoningによる中間者攻撃(MITM)を組み合わせて,ネットワーク上のほかのマシンから容易に認証情報が窃取可能なことを示す
    • sniff()
      • 傍受用の関数
      • store=0: Scapyはメモリ上にパケットを保持しないようになる
        • 長時間スニッファーを動作させておくならこれを使う
    • 試してみる
      • メールクライアントが平文の認証情報を送っていることが分かる
  • Scapyを使ったARP_cache_poisoning
    • ARP_cache_poisoning: ハッキング用ツールキットに含まれるものの中で最も古い技術の1つだが,いまだに最も効果的な技術の一つでもある
    • target machineには自分のマシンをゲートウェイと思わせ,ゲートウェイにも自分のマシンを通す必要があると思わせる
    • network上のすべてのコンピュータが持っているARP_cacheを,攻撃用に用意したエントリーで汚染する
    • ipconfigでARP_cacheを確認
      • ゲートウェイのIP_addressと,関連付けられたARP_cacheのエントリーが持っているMAC_addressを確認
    • 試してみる
      • scriptを動かす前に,ローカルホストのマシンを,ゲートウェイと標的のIP_addressの両方に対してパケットの転送が可能な状態にする必要がある
      • ARP_cacheが汚染される(ゲートウェイMAC_addressが攻撃者のMAC_addressと同じになっている)
  • pcap fileの処理
    • キャプチャーされたネットワーク通信に基づいたファジング用のテストケースの生成や,以前にキャプチャーした通信を再生するような単純な作業に,PythonやScapyを使ってさまざまな観点でpcapを分析する
    • HTTP通信からの画像ファイルの切り出し
    • pcapの解析
    • 画像の判定と出力
    • 試してみる
      • target画見ている内容の種類の確認や,ソーシャルエンジニアリングを用いた面白いアプローチの八景に役立つ
      • Web_crawlingや解析の処理と連携することもできる

Ch05 Web_serverへの攻撃

  • Web_applicationの解析は,攻撃者にとってもペネトレーションテストをする者にとっても非常に重要
    • 最も攻撃にさらされ,侵入に最もよく使われている
  • Pythonを使ったWeb_serverとのやりとりについて,事前調査と総当たり攻撃のツールを作成しつつ見ていく
    • 総当たり攻撃や調査ツールの作成,テキスト量の多いサイトでの検索において,HTMLのパースがいかに大事か分かる
  • Webのソケットライブラリ: urllib2
    • Requestクラスを使って捜査する
  • open_sourceのWeb_applicationのインストール
    • セキュリティ対策やインストール手順の誤りが,攻撃者のWeb_serverへの侵入につながる
    • インストールすればファイルやディレクトリの構成がすべてわかるので,特定のターゲット専用のスキャナーを作成できる
    • thread safeなPythonのQueueオブジェクトを使って,多数のスレッドを起動して複数のアイテムを処理 → 素早くスキャナーを実行
    • 試してみる
      • ファイルを取得できる
  • ディレクトリとファイルの総当たり攻撃
    • Web_server上のアクセス可能なファイルを全て知るのは難しい
      • → 通常は,Burp Suiteにも含まれるスパイダーを使い,ターゲットとなるWeb_siteをクロールし,可能な限り情報を集めることになる
      • → 設定ファイルや消し忘れの開発途中のファイル,デバッグ用のスクリプトやセキュリティに関係するその他のファイルなどを見つけ,重要な情報やソフトウェア開発者が意図せず稼働している機能を把握できる
      • 総当たり攻撃ツールを使ってよくあるファイル名やディレクトリ名をしらみつぶしに探すしかない
    • 実装
      • DirBuster project, SVNDiggerのような一般的な総当たり攻撃用の辞書
      • threadを作ってファイルを探索する
      • network接続が切断した場合やターゲットのサイトがダウンした場合に備えて,途中から再開できる機能も作っておく
      • リクエストを作る際に使う拡張子のリスト
      • status_codeが404の場合以外もURLを表示する → File not found以外のstatus_codeが攻撃の助けになる可能性があるため
    • 試してみる
      • OWASP(Open Web Application Security Project)は,ツールのテスト用にオンラインやオフラインで脆弱なWeb_applicationのリストを公開している
      • target Web_serverから興味深い情報を取得
      • Web_applicationをターゲットとする場合,総当たり攻撃による情報収集がなにより重要
  • HTML_formの認証を総当たり攻撃で破る
    • CAPTCHAトークンの使用など,Webシステムの総当たり攻撃対策は日に日に一般的になってきている
    • Joomlaに対する総当たり攻撃
      • パスワード入力の前にログインフォームからログイントークンを取得する
      • urllib2でCookieを使えるようにすることが↑と合わせて必要
      • ログインフォームのパース
        • HTMLParser libraryを使って行う
      • 総当たり攻撃に必要ないくつかの情報(例)
        • 宛先のパスに対してPOSTリクエストを送ること
        • すべての項目に入力する必要がある
        • hidden fieldでname attributeに長くてランダムな文字列が設定されている
          • ランダムな文字列はCookieに格納されたうえでセッション管理に使われている
      • → 手順
        • ログイン画面を取得し,Cookieをすべて受け入れる
        • HTMLからフォームの要素を取り出す
        • ユーザ名やパスワードを辞書から推測し設定する
        • すべてのフォームのフィールドを設定し,CookieとともにPOSTリクエストとして送信する
        • Web_applicationにログインできたかどうか確認する
      • 実際のターゲットで試しながらツールを作るべきではない
    • HTMLParserクラスの使い方の基礎を押さえれば,将来攻撃するであろうWeb_applicationについての情報収集に応用できる
      • 最初に,結果の一覧を保存する辞書を作る
      • パースして,タグを見つける度にhandle
        • 特にinputタグが重要で,見つかった時はメインの処理を行う
        • name, value属性が見つかった時はtag_resultsという辞書に保存
      • パースが終わったら,総当たり攻撃のクラスでユーザ名とパスワードのフィールドの値を置き換える
    • HTMLParserの基礎
      • handle_starttag
      • handle_endtag
      • handle_data
      • フォームのパースやリンクの収集,データの解析のためのテキストの取得,ページ内の画像の検索など,さまざまなことができるようになる
    • 試してみる
      • ターゲットのJoomlaに対してログインできる

Ch06 Burp Proxyの拡張

  • Burp Suite: スパイダーやプロキシによる通信の閲覧など,攻撃を支援するツール
    • Extensionsを使って,攻撃や詳細な事前調査を行うための便利なツールをBurpに追加する
  • セットアップ
  • Burpを使ったファジング
    • HTTP通信に隠されたバイナリプロトコルや,複雑なJSONリクエストを扱う場合,典型的なWeb_applicationのバグを検査できるということは非常に重要
    • ペイロードを自由に操作できるお手製のファジングツールでリクエスト本体をいじりつつ,認証のためのCookieなどの基本的なHTTP通信の確立はBurpに任せられるようにすると便利
    • BurpはWeb_applicationの検査を行うためのさまざまなツールを持っている
      • 基本的には,すべてのリクエストをプロキシでとらえ,興味深いリクエストを見つけたときは,ほかのツールにそれを渡す
        • Web通信を再現してくれるBurp Repeaterにリクエストを渡して,手動で面白そうな部分を編集するなど
        • query parameterを使った攻撃の自動化
          • requestをBurp Intruderに渡せばHTTP通信の中で変更したいであろう場所を自動的に把握してくれる
            • → エラーメッセージを表示させたり脆弱性を見つけたりするための様々な攻撃に使える
    • まず,BurpのAPIドキュメントを読んで,どのBurpクラスが拡張機能を作成するために必要なのかを探る
      • ExtenderタブのAPIsタブをクリックするとドキュメントを表示
    • Pythonコードの実装
      • IIntruderPayloadGeneratorクラスを追加
      • 3つの関数を含む基底クラスを実装
    • 単純なSQLインジェクションのテスト,クロスサイトスクリプティングのテスト,オリジナルのペイロードからランダムに塊を取り出してランダムな回数分繰り返したものを追加するテスト,という3つのうち1つをランダムで選び出して実行するシンプルなファジングツールを作成
    • 試してみる
      • query parameterがハイライトされる
      • 警告から,SQLインジェクション脆弱性が表示される
      • Web_applicationのエラーを誘発したり,アプリケーションのパスを開示したり,ほかのスキャナーができないようなさまざまなことができる
      • 大事なのは,Intruderによる攻撃で使う拡張機能の操作方法を学ぶこと
  • BurpでBingを使う
    • Bing APIを使ってプログラムでクエリ―を送信し,結果を解析する
      • 発見したターゲットを自動的に追加
    • 実装
      • BingのAPIキーを設定
      • BurpのHTTP APIを使うときは,送信する前に完全なHTTP リクエストの文字列の作成が必要
      • Jython APIPythonの組み合わせで,特定のターゲットを攻撃する際の詳細な事前調査を,Burpの拡張機能で実現
    • 試してみる
      • GetリクエストからBingに送って,自動的に新たなホストがターゲットに追加
  • Web_siteのコンテンツをパスワード作成に利用する
    • セキュリティはしばしばユーザのパスワードに帰結する
    • onlineでのパスワード攻撃の肝は,適切な単語リストの入手
    • 実装
      • BurpのUIにコンテキストメニューを追加する
      • 独自の単語リストをセットに保存し,同じ単語を導入しないようにする
      • BurpからHTTPのトラフィックを選択し単語リストに追加
      • mangle()で,ベースとなる単語を切り出して,一般的なパスワード生成戦略をもとに単語を作成する
    • 試してみる
      • 単語リストの作成と表示

Ch07 GitHubを通じた指令の送受信

  • トロイの木馬の堅牢なフレームワークを作るときに最も困難なことの1つは,設置したトロイの木馬の制御やアップデート,データの受信を非同期的に行うこと
  • remoteのトロイの木馬にコードを送信するための普遍的な方法を持つことが重要
    • トロイの木馬ごとに異なる作業をさせる
    • ターゲットのOSにあったコードを追加
  • GitHubを使って,設置したトロイの木馬の設定情報や窃取したデータだけでなく,タスクを実行するために必要なモジュールを保存するようにする
  • Pythonがライブラリをインポートする仕組みをハックすれば,設置したトロイの木馬が,新たに作成したモジュールと必要なライブラリをリポジトリから自動的に取得してくるようにできる
  • GitHubとの通信はSSLで暗号化されており,GitHubがブロックされていることも非常に少ない
  • GitHubのアカウントを設定する
  • moduleの作成
    • 開発する各モジュールは,複数の引数を渡せるようにしたrun関数で実行されるようにするべき
      • → 各モジュールを同じ方法でロードでき,かつ設定ファイルをカスタマイズしてモジュールに引数を渡すようにもできる
    • ローカル環境のトロイの木馬で新たなモジュールを有効にすることで,モジュールが正常に動作するか確認
  • トロイの木馬の設定
    • さまざまな捜査をしつつ長期間にわたってトロイの木馬に仕事をさせるためには,どのような操作を実行するか,どのモジュールがその操作に必要なのかを指示する仕組みが必要
    • ↑ 設定ファイルで操作を制御し,必要ならタスクを与えないことでトロイの木馬を眠らせておくこともできる
    • モジュールの実装の際,実行時間,実行回数,引数などのオプションを追加できると便利
    • トロイの木馬にインポートして実行してほしいモジュールの辞書のリストを渡す
  • GitHubから指令を受信するトロイの木馬の作成
    • GitHubへの接続と認証,APIの操作を行うコードの作成
    • 実際のシナリオでは,認証のやり取りは可能な限り隠すべき
    • 発見されてもデータを削除されないように,トロイの木馬がアクセスするリポジトリにアクセス制限をかけることも一考
  • Pythonのインポート機能をハックする
    • トロイの木馬が必要なlibraryをすべて読み込んでくれるようにする
    • ランダムな時間スリープしてパターン解析によって発見されることを防ぐ
    • ほかの処理を行ってトロイの木馬が何をしているのか隠すのも〇
    • 試してみる
      • 実行結果がGitHubにpushされている → 取得すれば見られる
  • 改善,拡張
    • モジュールや設定,取得したデータをすべて暗号化
    • updateなどの自動か

Ch08 Windowsトロイの木馬がよく悪用するテクニック

  • ウイルス対策ソフトやエンドユーザ自身によって検出される可能性との戦い
  • トロイの木馬を設置した後の標的マシンを注意深くモデル化し,トロイの木馬を本当に標的にマシンに対して送りつける前に,実験環境内でそれらのモジュールをテストする
  • 趣味と実益のためのキーロガー
    • キーロガー: 最も古い物の1つだが,さまざまな隠蔽方法とともにいまだに使われている
      • 認証情報や会話の内容といった機密情報の窃取に非常に効果的
    • pyHookによりキー入力のイベントを容易にトラップできる
      • ネイティブWindows APIであるSetWindowsHookExを活用している
        • 特定のWindowsイベントが発生した際に呼び出されるユーザ定義の関数を設定できる
        • → キー入力のイベントに対してフックを設定
      • どのプロセスに対してキー入力が行われているか正確に知ることで,ユーザ名,パスワード,およびその他の有用な情報がいつ入力されたかも割り出せる
      • pyHookは,キーロガーの中核となるロジックは我々に任せつつ,低レベルプログラミングの部分の面倒を見てくれる
    • イベントに対して別のフックが存在していた場合,コールバック関数は真を返すことで,次のフックにもイベントを処理させることができる
  • 試してみる
    • どのウィンドウで何を入力したか分かる
  • screenshotの撮影
    • パケットキャプチャやキーロガーでは手に入らない,デスクトップの画像やビデオの撮影,その他の機密データの入手に役立つことがある
    • WindowsのGraphics Device Interface(GDI)を使用する
  • Python流のシェルコードの実装
    • ctypesモジュールをスカってメモリ上のバッファをさす関数ポインタを作成して,その関数を呼び出す
    • ここでは,urllib2を使ってWeb_serverからBase64形式でシェルコードを受け取って実行できるようにする
    • ctypesのcastでバッファを関数ポインタに型変換し,シェルコードを通常のPythonの関数と同じように呼び出せる
    • 試してみる
      • カレントディレクトリをWebルートディレクトリとして扱うために,SimpleHTTPServerモジュールを使う
        • → Webのリクエストに対して任意のファイルを提供できる
      • Webサーバからスクリプトがシェルコードを受け取る
  • sandbox検知
    • 最近のウイルス技術ソフトは,疑わしいファイルの振る舞いのチェックに,ある種のサンドボックス技術を取り入れている
      • いくつかの指標を使って,サンドボックス上で動いているかどうかを判断する
    • 今回は,標的マシン上で,キー入力やマウスのクリックといった,利用者の入力が最近あったかを監視する方法を実践
      • パソコンを起動してからの経過時間と利用者が最後にパソコンに入力した時間を確認
      • → この方法は,利用者が使用中かどうかで活動を変更する方法にも活用できる
    • ctypes libraryで実装
    • 一般的な利用ではない発生の仕方の場合もサンドボックスと分かるようにする

Ch09 Internet Explorerで楽しもう

  • applcationにIEのCOMオブジェクトを埋め込める
  • → ネイティブのIEオートメーションオブジェクトを利用して,ある種のMan_in_the_Browserタイプの攻撃を行い,利用者がWebサイトとやり取りする際に認証情報を窃取する
  • → 拡張して,複数の標的Webサイトに関しても実現可能にする
  • 最後にIEを使用して標的マシンからデータを窃取する
    • 窃取データの保護には公開鍵暗号を使用し,我々しか復号できないようにする
  • (ある種の)Man_in_the_Browser
    • MITMが通信に介在するのに対して,MITBはブラウザそのものに寄生することで認証情報や機密情報を窃取する
    • この種のマルウェアのほとんどが(典型的にはBrowser Helper Objectのような形で)ブラウザに寄生するか,あるいはコードをインジェクションすることで,ブラウザのプロセスそのものを操作する
    • IE用にネイティブCOM interfaceを使用することで,SNSサイトや電子メールサービス用の認証情報をあらゆるIEのセッションから窃取する
      • ロジックの拡張もできる
        • 利用者のパスワードの変更,ログイン時のやり取りに介在,キーロガーモジュールを併用して,再認証を強制的に発生させてキー入力を取得するなど
    • 実装
      • 目的のサイトの認証情報を窃取するための中心となるループ処理
        • すべての動作中のIEオブジェクトを繰り返しチェックすることから始める
        • ログアウトさせる
        • ログインフォームを改ざん
        • 認証情報の送り先WebサーバへのアクセスURLの末尾が標的サイトになっている
          • これにより,用意しておいたWebサーバのログなどを通じて,認証情報の窃取に成功した標的サイトが何かを明らかにできる
        • wait_for_browser()によって,ページのコンテンツがすべて読み込まれてから,ページを編集したりパースしたりするようにしている
    • サーバの作成
      • 窃取した認証情報を集める
    • 試してみる
      • 最初のテスト
        • いろいろなサイトを閲覧して,利用者に見られるべきでない変な挙動を目にすることがないか確認する
        • FacebookまたはGmailにアクセスし,ログインする
      • 利用者の認証情報を入手できる
  • IEのCOM_automationを使用した情報の盗み出し
    • 標的ネットワークに侵入することは戦いの一部でしかない
    • 一般的な目的: データファイルの窃取
    • セキュリティ対策によっては,通信をするプロセスや通信先を確認して,遮断などの措置を行うことがある
      • iexplore.exeは通常信頼されていてホワイトリストに入っているため,情報を外部のネットワークへ盗み出す手口としてIEのCOM_automationを使用するのは非常に優れている
    • ローカルのファイルシステム上からWord文書ファイルを検出するPythonスクリプトの作成
      • 検出したら公開鍵暗号を使ってそのファイルを暗号化し,tumblr.comにあるブログに投稿することを自動化する
        • Tumblrのように一般的に信頼できると認知されているサイトを使うことで,ファイアウォールやプロキシなどが持つブラックリストによるIP_addressのWeb_serverへの情報送信のブロックも回避できる
    • 実装
      • encrypt_string(plain_text)
      • encrypt_post(filename)
      • login_to_tumblr(ie)
        • 正確なタイミングの計測,DOMとの対話,必要なHTML要素を明らかにする必要
      • post_to_tumblr(ie, title, post)
      • exfiltrate(document_path) exfiltrate: こっそり抜け出す
        • Tumblrに保存したい文書ファイルを発見するたびに呼び出される
        • Windowの表示・非表示を指定できる
      • RSA暗号用の鍵の生成スクリプト
      • Tumblrに投稿された暗号化データをペーストして平文に復号するスクリプト
    • 試してみる
      • ファイル名が窃取される
      • オリジナルのファイルサイズを暗号化して記載するのも〇

Ch10 Windowsにおける権限昇格

  • 必須要素のインストール
  • process監視ツールの作成
    • WMIを使用したプロセス監視
      • WMIのAPI群は,システム上での特定のイベントの発生を監視し,そのイベントが発生した際にコールバックを受け取る方法をプログラマーに提供する
    • 試してみる
      • あらゆるプロセス,スケジュール化されたタスク,さまざまなソフトウェアの自動アップデートなどが実行されていることを確認できる
  • Windowsにおけるトークンと権限
    • Windowsにおけるトークン: プロセスまたはスレッドのセキュリティコンテキストを記述するオブジェクト
    • 一般ユーザの権限で動作しているプロセスが誤った権限を持って動作していることを確認できれば,SYSTEM権限またはカーネルレベルでコードを実行する足がかりになる
    • 注目すべき権限
      • SeBackupPrivilege
      • SeDebugPrivilege
      • SeLoadDriver
    • 監視しているプロセスに与えられた権限を自動的に取得するPythonスクリプトの作成
  • 競合状態に勝つ
    • 多くの商用ソフトウェアが,一時フォルダ内にファイルをコピーし,実行したうえでそのファイルを削除する,という動作を行っている
    • ソフトウェアやタスクスケジューラがファイルを作成する際,プロセスがそれを実行する前にそのファイルに攻撃コードを書き込み,そのうえでプロセスに実行させて最後に削除する
    • 実現のカギ: 特定のディレクトリを監視して,ファイルやサブディレクトリの変更を検出するReadDirectoryChangesWという便利なWindows API
      • 潜在的な権限の昇格以外に対しても〇
    • 試してみる
      • ファイルの作成→実行→削除を検出できる
  • code_injection
    • 実装
      • マーカーを使って,無限ループを回避
      • 監視スクリプトのメイン処理にコードインジェクションの呼び出しを追加する
    • 試してみる
      • SYSTEM権限でリスナーを起動する
      • SYSTEM権限を奪取
  • 特定の環境下においてローカルのアカウントやアプリケーションへの攻撃に使用する,独自ツールにも換えられる
  • いったんネットワーク内部に侵入できれば,WMIだけでもローカルネットワークの調査データのよい供給源となり,そのデータをさらなる攻撃に利用できる
  • 権限昇格はあらゆるトロイの木馬にとって必要不可欠な要素

Ch11 forensic attackへの転用と自動化

  • forensic: 侵入された後に,またはインシデントが起こったかどうか判断するために必要とされるもの
    • メモリに含まれる暗号化の鍵谷その他の情報を得るために,汚染されたマシンのRAMのスナップショットが求められる
  • VolatilityというPythonで書かれたforensic frameworkがある
  • install
  • profile
    • profilerにより,メモリダンプから情報を引き出すために必要なシグネチャやオフセットをどのように適用するかを決定する
    • imageinfoというpluginで,そのときのターゲットに対してどのprofileを使うべきか判断してくれる
  • password_hashを手に入れる
    • targetのハードウェアにアクセスすることさえできれば,仮想マシンから情報収集できる
    • Volatilityはpassword_hashの復元処理を非常に容易にする
      • 最初にpassword_hashを取得できそうなメモリ上の場所を見つけ,それからハッシュを実際に取得するために必要なプラグインの操作方法を見る
      • これらの処理を一括で行うスクリプトを作る
    • WindowsはローカルパスワードをSAMレジストリハイブにハッシュの形で保存しており,同時にWindowsのブートキーをシステムレジストリハイブに保存している
      • memory imageからハッシュを取り出すにはこれらのハイブが必要
      • hivelist plugin: 2つのハイブがメモリ内のどこにあるかVolatilityが見つけられるようにする
      • → 情報をhashdump pluginに渡して,実際にハッシュの解析を行う
  • 直接的なコードインジェクション
    • Immunity Debugger
      • reverse engineering
      • Pycommandを使って,exeのすべての関数を見つけて,一度だけ有効なブレークポイントを設置する
    • 複数のステップ
      • memoryをスキャン
      • exeのプロセスを見つけてシェルコードを挿入する場所を決定
      • その場所のRAMイメージの物理アドレスを割り出す
      • 指定の操作に割り当てられている関数のアドレスにジャンプ命令を挿入し,シェルコードにジャンプさせてそれを実行する
    • 実装
      • メモリ上の各ページを調べるとき,まずページの物理的なオフセットを見つける
      • そしてRAMイメージを開き,そのページが存在する場所のオフセットを調べ,メモリ上のページ全体に読み込む
      • シェルコードを同じサイズのNULLバイトの塊を探す
        • ここがRAMイメージ内でシェルコードを書き込む場所
      • 挿入したら,シェルコードをアドレスを取得しx86のバイナリコードを作成する
      • 操作のオフセットを計算し,トランポリンを仕掛ける
    • 試してみる
      • ある操作に対して処理を埋め込める
      • この技術を利用して,kernel objectを操作しrootkitのようなまねをさせることもできる
      • これらの技術は,メモリのフォレンジックに親しむための方法であり,また物理的にマシンにアクセスできる場合や,複数の仮想マシンをホストしているサーバに侵入した際にも使える

Appendix A reverse engineering用framework miasm

  • miasm
    • 用途: バイナリプログラムの解析,編集,生成
    • 機能
      • 実行ファイルの解析,編集,生成
      • プログラムコードのアセンブル,逆アセンブル
      • プログラムコードのエミュレーション
    • x86以外にもさまざまなCPUアーキテクチャに対応している
    • symbolic実行と呼ばれる先進的なソフトウェア解析機能が盛り込まれている点も特徴
  • setup
  • x86_64 assemble
    • データ領域から実行権限が排除されているため,Ch08よりコードの追加が必要
    • assemble_text()でネイティブコードを生成し,execute_native_code()で実行
    • miasmによるエミュレーション
      • サンプルコードがDockerイメージ内にあり,それをもとに作る
      • 柔軟に命令ごとに解釈を変え,処理を追加したり挙動を変更したりできる
      • → 特定の機械語命令が呼ばれた回数を数えるprofilerを作成
      • メモリアクセスの頻度の計測や,関数呼び出しの深さを調べたりと応用できる
  • symbolic実行
    • symbolic実行: レジスタやメモリ内容を具体的な値ではなくシンボルとしてエミュレーションする仕組み
      • たとえば,ある実行パスに到達するための入力値の条件を自動的に求められるなど
  • miasmはリバースエンジニアリングに必要になるさまざまな機能を持っている

Appendix B さまざまなサンドボックス検知

  • サンドボックスによるフックの検知,フックの回避,C言語で書かれた仮想マシン検知プログラムをモジュールとして呼び出す方法
  • マルウェアを解析するサンドボックスでは,解析対象の挙動を把握するため,マルウェアが呼び出すライブラリ関数をフック氏,呼び出された関数名やその関数に渡された引数を取得する
    • フックの実装には,解析対象のプログラムやライブラリを書き換える方法と,ランタイム環境側に手を加える方法がある
    • → 書き換えられた痕跡を見つけることで,前者で実装されたサンドボックスを検知する
    • 仮想マシンを見つけることで,後者の方法で実装されたサンドボックスを間接的に検知する方法もある
  • 簡易サンドボックスの準備
    • ソフトフック
      • 特定のAPI呼び出しをモニタリングする簡易的なサンドボックスを実装する
      • target processにアタッチしINT3に対するブレークポイントハンドラを実装して実行フローを横取りするもの
      • → 具体的にはフック対象の命令をINT3命令に置き換えることで,実行された際,ブレークポイント例外を発生させ,あらかじめブレークポイントハンドラに登録しておいた処理を実行させる
    • 簡易サンドボックス pydbg_sbx.py
      • PyDbgを使い,解析対象が呼び出すAPIをソフトフックにより監視する簡易サンドボックスを実装
    • 実行
      • 引数を伴って関数を呼び出したことがモニタリングできる
  • ソフトフックの痕跡を見つける
    • APIの先頭アドレスにセットされたINT3命令の有無をチェックすることでフックを検出する
    • ハードフックも,jmp命令などの分岐命令がAPIの先頭にあるかをチェックすることで,検知できる
  • サンドボックスを回避する
    • sliding_call
      • APIの先頭アドレスから数命令ずらしてAPIを呼び出す手法
      • Windowsではホットパッチという仕組みがあり,APIの先頭2バイトはホットパッチ用のコードが置かれていることが多い
      • APIの処理に直接影響がないので,実行を飛ばしても基本的に動作に影響しない
    • フックを回避してAPIを呼び出す
    • ハードフックでも.jmp命令のためのバイト分だけずらしてコールすればよい
  • runtime環境の特徴を見つける
    • サンドボックスの中には,解析対象が動作するランタイム環境側(OS,仮想マシンなど)に手を加えてフックを実現しているものも存在する
      • 自身が動作している環境の特徴を見つけることで,間接的にサンドボックスを検知できる
    • 低レイヤへのアクセス → PythonよりC
    • 仮想マシンの検知
      • VMWareで動作するゲストOSは,ホストOS側とやりとりするための通信チャネルが用意されている
        • IN命令の例外の有無を利用して,自身がVMWare上で動作しているか判断できる
    • PythonからC言語で書かれたコードを呼び出す
      • 以下の3つを準備
        • Python用ラッパー関数
        • モジュールのメソッドテーブル
          • メソッド名と実装の対応関係を保持
        • モジュールの初期化関数
    • 実行
  • その他のサンドボックス検知方法
    • debugされているかをWindows APIで確認
    • 特定のプロセス,ファイル,レジストリの有無で確認
    • IP_addressのレンジからクラウド環境で実行されているかなどをもとにして一般的なユーザのデスクトップ環境ではないことを判断し,それに基づいてサンドボックスを検知することもある