『サイバーセキュリティプログラミング』学習メモ
Ch01 Python環境のセットアップ
- pipのインストール
- これを参照
- aptだとpython3の方のpip3しか入れられなかった
- github3.py
- Wing IDE
- ダウンロードしてdpkg -i (ファイル名)
- Stack Data
- Debug Probe
- personalにはない?
Ch02 通信programの作成: 基礎
- ネットワークを介して攻撃を行うためのツールが,target companyにはない
- Pythonによる通信programについて
- TCP_client
- UDP_client
- TCP_clientとほとんど変わらない
- socket type がSOCK_DGRAM
- sendtoのみ(connect()は不要)
- TCP_clientとほとんど変わらない
- TCP_server
- 簡単なコードだが,Netcatの自作やTCP proxyの作成を行う以降の節で拡張していくことになる,便利なコード
- Netcatの置き換え
- Netcatは攻撃者にとって非常に便利なツール
- Web applcationに対する攻撃で侵入したときは,侵入に成功した後の接続経路を確保したいと考える
- subprocess library
- process generateで役立つinterface
- processを立ち上げたり子processとやりとりしたりするのに利用される
- このコードでは,渡したコマンドをそのままローカルのOSに渡して実行させている
- 実行結果はサーバに接続してきているクライアントに送信する
- 例外処理では,一般的なエラーを補足し,コマンド実行が失敗したことを伝えるメッセージをクライアントに送るようにしている
- ファイルのアップロード,コマンド実行,コマンドシェルの実行を行う処理を実装
- 試してみる
- TCP_proxyの構築
- toolboxにTCP_proxyを入れておくべき理由
- あるホストから別のホストにデータを転送したり,ネットワークを利用するソフトウェアの検査をしたりといった作業に必要になる
- 詳細がわからないプロトコルを解き明かしたり,applcationに送る通信データを改変したり,ファジングテストのためのデータを作ったりといった,様々な場面で使える簡単なPythonのproxy script
- proxy_handler()
- response_handler()の中で,パケットの書き換え,ファジングテストの実施,認証における問題のテストなど,リモートから受信したパケットに対してやりたいことをなんでも実施できる
- request_handler()も同様
- 認証情報が平文でやりとりされるapplcationの通信で,一般ユーザの情報の代わりに管理者の情報を送ることで権限昇格を試みるときなどに便利
- response_handler()の中で,パケットの書き換え,ファジングテストの実施,認証における問題のテストなど,リモートから受信したパケットに対してやりたいことをなんでも実施できる
- hexdump()
- 試してみる
- 内容と返還後の文字列が表示される
- toolboxにTCP_proxyを入れておくべき理由
- Paramikoを用いたSSH通信programの作成
- SSH_tunneling
- 目的: SSH clientで入力されたコマンドを遠隔地のSSH server上で動かすこと
- SSH_tunnelingを使う場合,送信データはまとめられてSSHで送信され,SSHサーバ上でその中身が取り出され,サーバの処理に引き渡される
- 状況
- → 手段1: SSH_forward_tunneling
- 多くのWindowsシステムではSSH_serverが動作していないが,そのような状況でも,SSH_tunnelingを逆向きに設定することで解決できる
- → 手段2: SSH_reverse_tunneling
- reverse_forward_tunnel()
- transport()
- 暗号化された接続の作成や設定
- channel
- 暗号化されたセッションを通じてデータの送受信を行うためのソケットのようなもの
- transport()
- reverse_forward_tunnel()
- 試してみる
- Windowsの環境からSSH_serverとの接続を確立し,そのサーバの8080ポートを待機状態にする
- 8080ポートへの通信はWebサーバの80番ポートに転送される
- → Linuxでブラウザからhttp://127.0.0.1:8080にアクセスすると,SSH_tunnelを通じてWeb_serverに接続することになる
- Windowsの環境からSSH_serverとの接続を確立し,そのサーバの8080ポートを待機状態にする
- SSHとSSH_tunnelingを理解し,利用するのは重要
- 使いどきや使い方の把握
- Paramikoを使えば既存のPythonツールにSSHの機能を追加できる
- まとめ
- とても単純だが非常に役立つツールの作成
- 目標: penetration_testを行うときや攻撃が成功した後の活動を行うとき,バグ探しのときなどに使うツールを作成するのに十分な,Pythonのネットワークプログラミング技術を身につけること
Ch03 network: raw_socketと盗聴
- network_sniffer: target machineが送受信するパケットの観測を可能にするため,攻撃の前後でよく利用される
- network通信を観測したりでコードしたりするスニッファーを即席で作る方法を知る
- 手軽で成熟したツールに関して深い理解
- Pythonの新しいテクニックの学習
- 低レイヤーのネットワークの動きを理解
- 生のIPヘッダやICMPヘッダのような低レベルのネットワーク情報にアクセスするには,raw socketを使う
- UDPを用いたホスト発見ツールの作成
- WindowsとLinuxにおけるパケット盗聴
- 試してみる
- pingを実行したときのrequestをキャプチャ
- 試してみる
- IP_layerのデコード
- ctypes構造体の定義
- protocolとIPアドレスを読みやすい形式に変換
- 試してみる
- IPヘッダがデコードされる
- ICMPのデコード
- type=3: 宛先到達不可能クラス
- code=3: ポート到達不可能エラーが発生
- 元のデータグラムの先頭8バイトがICMPメッセージに含まれるため,照合できる
- netaddr libraryを使うコードを追加し,ホスト発見用のスキャンをサブネット全体に対して実施できるようにする
- netaddr module
- subnet maskを入力として受付,適切に処理
- subnet, addressをとても簡単に処理できるようになる
- netaddr module
- 試してみる
- 対象のサブネット内をスキャンできる
Ch04 Scapyによるネットワークの掌握
- e_mailの平文の認証情報の窃取,同一ネットワーク内の通信を傍受するための標的マシンに対するARPポイズニングの体験
- Scapyのpcap処理を拡張してHTTP通信から画像を切り出し,その画像に人が含まれているかを判断するために顔検出を行うデモを実施
- e_mailの認証情報の窃取
- Scapyを使ったARP_cache_poisoning
- 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上のアクセス可能なファイルを全て知るのは難しい
- 実装
- 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に対する総当たり攻撃
- 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の検査を行うためのさまざまなツールを持っている
- まず,BurpのAPIドキュメントを読んで,どのBurpクラスが拡張機能を作成するために必要なのかを探る
- ExtenderタブのAPIsタブをクリックするとドキュメントを表示
- Pythonコードの実装
- IIntruderPayloadGeneratorクラスを追加
- 3つの関数を含む基底クラスを実装
- 単純なSQLインジェクションのテスト,クロスサイトスクリプティングのテスト,オリジナルのペイロードからランダムに塊を取り出してランダムな回数分繰り返したものを追加するテスト,という3つのうち1つをランダムで選び出して実行するシンプルなファジングツールを作成
- 試してみる
- query parameterがハイライトされる
- 警告から,SQLインジェクションの脆弱性が表示される
- Web_applicationのエラーを誘発したり,アプリケーションのパスを開示したり,ほかのスキャナーができないようなさまざまなことができる
- 大事なのは,Intruderによる攻撃で使う拡張機能の操作方法を学ぶこと
- BurpでBingを使う
- Web_siteのコンテンツをパスワード作成に利用する
- セキュリティはしばしばユーザのパスワードに帰結する
- onlineでのパスワード攻撃の肝は,適切な単語リストの入手
- 実装
- BurpのUIにコンテキストメニューを追加する
- 独自の単語リストをセットに保存し,同じ単語を導入しないようにする
- BurpからHTTPのトラフィックを選択し単語リストに追加
- mangle()で,ベースとなる単語を切り出して,一般的なパスワード生成戦略をもとに単語を作成する
- 試してみる
- 単語リストの作成と表示
Ch07 GitHubを通じた指令の送受信
- トロイの木馬の堅牢なフレームワークを作るときに最も困難なことの1つは,設置したトロイの木馬の制御やアップデート,データの受信を非同期的に行うこと
- remoteのトロイの木馬にコードを送信するための普遍的な方法を持つことが重要
- トロイの木馬ごとに異なる作業をさせる
- ターゲットのOSにあったコードを追加
- GitHubを使って,設置したトロイの木馬の設定情報や窃取したデータだけでなく,タスクを実行するために必要なモジュールを保存するようにする
- Pythonがライブラリをインポートする仕組みをハックすれば,設置したトロイの木馬が,新たに作成したモジュールと必要なライブラリをリポジトリから自動的に取得してくるようにできる
- GitHubとの通信はSSLで暗号化されており,GitHubがブロックされていることも非常に少ない
- GitHubのアカウントを設定する
- moduleの作成
- 開発する各モジュールは,複数の引数を渡せるようにしたrun関数で実行されるようにするべき
- → 各モジュールを同じ方法でロードでき,かつ設定ファイルをカスタマイズしてモジュールに引数を渡すようにもできる
- ローカル環境のトロイの木馬で新たなモジュールを有効にすることで,モジュールが正常に動作するか確認
- 開発する各モジュールは,複数の引数を渡せるようにしたrun関数で実行されるようにするべき
- トロイの木馬の設定
- GitHubから指令を受信するトロイの木馬の作成
- Pythonのインポート機能をハックする
- 改善,拡張
- モジュールや設定,取得したデータをすべて暗号化
- updateなどの自動か
Ch08 Windowsでトロイの木馬がよく悪用するテクニック
- ウイルス対策ソフトやエンドユーザ自身によって検出される可能性との戦い
- トロイの木馬を設置した後の標的マシンを注意深くモデル化し,トロイの木馬を本当に標的にマシンに対して送りつける前に,実験環境内でそれらのモジュールをテストする
- 趣味と実益のためのキーロガー
- キーロガー: 最も古い物の1つだが,さまざまな隠蔽方法とともにいまだに使われている
- 認証情報や会話の内容といった機密情報の窃取に非常に効果的
- pyHookによりキー入力のイベントを容易にトラップできる
- イベントに対して別のフックが存在していた場合,コールバック関数は真を返すことで,次のフックにもイベントを処理させることができる
- キーロガー: 最も古い物の1つだが,さまざまな隠蔽方法とともにいまだに使われている
- 試してみる
- どのウィンドウで何を入力したか分かる
- screenshotの撮影
- Python流のシェルコードの実装
- sandbox検知
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()によって,ページのコンテンツがすべて読み込まれてから,ページを編集したりパースしたりするようにしている
- 目的のサイトの認証情報を窃取するための中心となるループ処理
- サーバの作成
- 窃取した認証情報を集める
- 試してみる
- IEのCOM_automationを使用した情報の盗み出し
Ch10 Windowsにおける権限昇格
- 必須要素のインストール
- process監視ツールの作成
- Windowsにおけるトークンと権限
- 競合状態に勝つ
- code_injection
- 実装
- マーカーを使って,無限ループを回避
- 監視スクリプトのメイン処理にコードインジェクションの呼び出しを追加する
- 試してみる
- SYSTEM権限でリスナーを起動する
- SYSTEM権限を奪取
- 実装
- 特定の環境下においてローカルのアカウントやアプリケーションへの攻撃に使用する,独自ツールにも換えられる
- いったんネットワーク内部に侵入できれば,WMIだけでもローカルネットワークの調査データのよい供給源となり,そのデータをさらなる攻撃に利用できる
- 権限昇格はあらゆるトロイの木馬にとって必要不可欠な要素
Ch11 forensic attackへの転用と自動化
- forensic: 侵入された後に,またはインシデントが起こったかどうか判断するために必要とされるもの
- メモリに含まれる暗号化の鍵谷その他の情報を得るために,汚染されたマシンのRAMのスナップショットが求められる
- VolatilityというPythonで書かれたforensic frameworkがある
- install
- profile
- profilerにより,メモリダンプから情報を引き出すために必要なシグネチャやオフセットをどのように適用するかを決定する
- imageinfoというpluginで,そのときのターゲットに対してどのprofileを使うべきか判断してくれる
- password_hashを手に入れる
- 直接的なコードインジェクション
- Immunity Debugger
- reverse engineering
- Pycommandを使って,exeのすべての関数を見つけて,一度だけ有効なブレークポイントを設置する
- 複数のステップ
- memoryをスキャン
- exeのプロセスを見つけてシェルコードを挿入する場所を決定
- その場所のRAMイメージの物理アドレスを割り出す
- 指定の操作に割り当てられている関数のアドレスにジャンプ命令を挿入し,シェルコードにジャンプさせてそれを実行する
- 実装
- メモリ上の各ページを調べるとき,まずページの物理的なオフセットを見つける
- そしてRAMイメージを開き,そのページが存在する場所のオフセットを調べ,メモリ上のページ全体に読み込む
- シェルコードを同じサイズのNULLバイトの塊を探す
- ここがRAMイメージ内でシェルコードを書き込む場所
- 挿入したら,シェルコードをアドレスを取得しx86のバイナリコードを作成する
- 操作のオフセットを計算し,トランポリンを仕掛ける
- 試してみる
- Immunity Debugger
Appendix A reverse engineering用framework miasm
- miasm
- setup
- x86_64 assemble
- データ領域から実行権限が排除されているため,Ch08よりコードの追加が必要
- assemble_text()でネイティブコードを生成し,execute_native_code()で実行
- miasmによるエミュレーション
- サンプルコードがDockerイメージ内にあり,それをもとに作る
- 柔軟に命令ごとに解釈を変え,処理を追加したり挙動を変更したりできる
- → 特定の機械語命令が呼ばれた回数を数えるprofilerを作成
- メモリアクセスの頻度の計測や,関数呼び出しの深さを調べたりと応用できる
- symbolic実行
- symbolic実行: レジスタやメモリ内容を具体的な値ではなくシンボルとしてエミュレーションする仕組み
- たとえば,ある実行パスに到達するための入力値の条件を自動的に求められるなど
- symbolic実行: レジスタやメモリ内容を具体的な値ではなくシンボルとしてエミュレーションする仕組み
- miasmはリバースエンジニアリングに必要になるさまざまな機能を持っている
Appendix B さまざまなサンドボックス検知
- サンドボックスによるフックの検知,フックの回避,C言語で書かれた仮想マシン検知プログラムをモジュールとして呼び出す方法
- マルウェアを解析するサンドボックスでは,解析対象の挙動を把握するため,マルウェアが呼び出すライブラリ関数をフック氏,呼び出された関数名やその関数に渡された引数を取得する
- 簡易サンドボックスの準備
- ソフトフックの痕跡を見つける
- サンドボックスを回避する
- runtime環境の特徴を見つける
- その他のサンドボックス検知方法