🙆‍♀️

CTFに使ったツールとメモ

に公開

CTFに初めて参加したので、使ったツールやノウハウを記録する。随時更新する。

ネットワーク

パケットキャプチャ

  • Wiresharkでパケットファイルを見たり、プログラム起動してパケットをキャプチャしたりする
  • Windowsのパケットキャプチャ形式の場合は、etl2pcapngでpcapng形式に変換する
  • 通信データの抽出
    • [File]->[Export Objects]でHTTPやFTPで送信したデータをエクスポート可能
    • パケットの一部を抽出したい場合は、左下のペインで右クリックして[Export Packet Bytes...]
  • パケットが多い場合はStatisticsで統計を取ってみる
    • [Protocol Hierarchiy]でプロトコルごとのパケット数を表示できる
    • [Conversations]で通信元と通信先のペアごとのパケット数を表示できる
  • 特定のパケット(ex. サイズ)などで時系列にソートして、数バイトずつくっつけるとフラグになる場合も
  • [Telephony]->[VoIP Calls]で通話データをリストアップし、再生することができる。
  • TLSの解読
    • RSA暗号でPFSではなく、秘密鍵を持っている場合は解読できる
    • [Preferences]->[Protocols]->[TLS]->RSA key listsに秘密鍵を登録する
      • 解読したい通信先、ポート番号、想定するプロトコル(httpsならばhttp)、秘密鍵のファイル(PEM)を登録する
      • 以下の設定にチェックを入れる必要がある
        • [Reassemble TLS records ...]
        • [Reassemble TLS Application Data ...]
    • TLSの証明書から暗号に対する攻撃を利用して秘密鍵を取得することもある
      • 証明書はTLSハンドシェイクのパケットのCertificateを右クリックしてエクスポートすればよい
    • TLS
  • USBのキーボードのパケットはctf-usb-keyboard-parserで解析できる

ポートスキャン

nmapを使う

TCPの全ポートをスキャンし、ポートを利用しているソフトも推測して出力する

$ nmap -sV -p- <hostname>

UDPの全ポートをスキャンする

$ sudo nmap -sU <hostname>

FTP

anonymousでログインできる可能性がある

$ftp <hostname> <port>
Connected to <hostname>.
220 Welcome to FTP service.
Name (localhost:user): anonymous
331 Please specify the password.
Password: 
230 Login successful.

SNMP

publicコミュニティの情報を取得する

$ snmpwalk -c public -v1 <hostname>

マルウェアのパケット解析

Web

  • とりえあえずHTMLソースを見る
  • Chrome Developer Toolsを使ってネットワーク通信やcookieの値を見て書き換えられそうなところがないか探す
  • JSが難読化されている場合がある
  • Postmancurlで改ざんしたリクエストを送る

curl

-bでcookieを指定

curl -b 'key=value' https://www.example.com/

-dでフォームデータを指定

curl -d 'key=value' https://www.example.com/

-aでUser-Agentヘッダを指定

curl -a dummy-ua https://www.example.com/

-Hでヘッダを指定

curl -H 'Host: www.dummy-host.com' https://www.example.com/

コマンドインジェクション

  • Webアプリの中でOSのコマンドを実行している場合、適切なエスケープを実施していないと、意図しない処理を実行してしまう。
  • ;(セミコロン)繋げてlsしたりcatでファイルを出力する

Directory Traversal

  • ファイルを読み込むときに外部から指定されたパスをそのまま利用すると、想定外のファイルを読み込まれてしまう
  • 取得できるデータ
    • ../../../etc/passwdのようなパスでユーザの存在やパスワードのハッシュ値を取得
    • ../../../proc/self/environのようなパスで環境変数を取得
    • そのほかPayloadsAllTheThingsを参照

SQLi

  • 色々チートシートがあるのでそれを読む
  • テーブルからデータを取得したい場合
    • 現在のアクセス対象のテーブルからシンプルに取得する場合、' or 1 = 1 を使う
    • テーブル名を取得する→カラム数を求める→カラム名を取得する→unionしてデータを取得する
    • テーブル名、カラム名は各データベースのシステムテーブル的なものから取得する。MySQLの場合はinformation_schemaデータベースの各テーブル

テーブル名の取得

' union select table_name from information_schema.tables#

カラム名の取得

' union select column_name from information_schema.columns#

カンマが使えなくて複数カラム選択できない場合はjoinで代用できる

' union (select column_name from information_schema.columns) t1 join (select 1) t2
  • WAFのバイパス
    • 論理演算子は2通りある場合があるので、or→||、and→&&、not→!を試す
    • 空白はMySQLだったら/**/のコメントで代用できる

XXE

  • XMLの外部参照を使って外部のファイルを読みこむことができる
  • 外部のファイルというのはfile:///を指定するとローカルファイルであるが、http:// などを指定するとリモートファイルをインクルードすることができる
    • XMLの妥当性を確保するためにbase64でエンコードする方法がある
    • FTPやSMTPアクセスも場合によっては可能らしい

JWT

  • jwt.ioでJWTのエンコード、デコードをすることができる。
  • jwt_toolで、JWTのエンコード、デコード、改ざん、既知の攻撃をすることができる。

JWTをデコードする

python jwt_tool.py <JWT>

JWTを対話式で改ざんする

python jwt_tool.py <JWT> -T

JWTをalg:none攻撃する

python jwt_tool.py <JWT> -X a

SSTI

サーバサイドのテンプレートエンジンのテンプレートでコードが書けてしまう

一番シンプルな例(Python)

{{open('/path/to/flag.txt').read()}}

参考

Serialization/Deserialization

  • プログラミング言語にオブジェクトをシリアライズして保存したり読み込む機能がある場合がある。
    • このデータをcookieなどにそのまま入れていると、盗聴したり改ざんすることができる
    • オブジェクトにファイルパスを入れており、読み込み時にそのパスにアクセスしている場合、サーバ上のデータの取得や改ざんができる
  • PHP
    • 型:長さ:値の形式でシリアライズされる。(ex. s:5:"hello")
    • デシリアライズ時に__destructが呼ばれる。ここでフラグを読み込んでいると漏洩できるかも

Python

Django

  • SECRET_KEYが漏洩すると、署名の正当性が担保されない
    • 例えば、cookieにセッションを保存する設定にしていた場合、cookieを改ざんすることでセッションの乗っ取りが可能

暗号/エンコード

  • CyberChefなどで各種エンコード/デコードできる

base64

  • wikipediaの解説
  • 最後に=が出てくるとbase64を疑う
  • コマンドラインでエンコード/デコードする場合はbase64コマンドがある

base64エンコード

base64 -i 入力ファイル -o 出力ファイル

base64デコード

base64 -d -i 入力ファイル -o 出力ファイル
  • wikipediaの解説にあるようにbase64の変形版がある
    • URLに+/を使えないので、+/を別文字に置き換える
  • base64の亜種を求められる場合がある
    • base64後にシフト暗号や換字暗号をかけるなど

uuencode

  • begin xxx〜で始まるとuuencodeを疑う
  • uudecodeでデコードする

難解プログラミング言語

ステガノグラフィで抽出した結果がBrainf*ckWhitespaceなど難解プログラミング言語になっている場合がある。

換字暗号

  • 文字を別の文字に交換する暗号
  • EnigmatorのCrypto SolverFrequency Analysisを使えば少し楽に変換できるかも
  • 手動の場合はtrコマンドで徐々に変換させた
  • subbreakderで解いてもらう
$ subbreaker break --lang EN --ciphertext <(cat encrypted.txt)
Key: ..... ←出てきたキーを$keyとする
$ subbreaker decode --key $key --ciphertext <(cat encrypted.txt)

シーザー暗号

  • Wikipedia
  • アルファベットをn文字ずらす換字暗号
  • CyberChefのROT13で総当たりで試すことができる

Atbash暗号

  • Wikipedia
  • a -> z, b -> yのように、アルファベットの最初(a)からn文字目を最後(z)からn文字目に変換する換字暗号
  • CyberChefで変換可能

暗号化ファイルの総当たり解析

適切なツールがなく、候補が限られている場合は総当たりで解析する。例えば、opensslに各種暗号アルゴリズムによるファイルの暗号化機能があるので、各パスワードに対して

openssl 暗号アルゴリズム -d -in 元ファイル -pass pass:${password} > -${password}.txt

を実行し、fileコマンドでまともなテキストファイルになっているかを確認する

パスワード

  • よく利用されるパスワード
  • 製品名がわかっている場合、デフォルトのパスワードが使われていることがある
  • パスワード解析をするはJohn the RipperHashcatを使って辞書攻撃や総当たり攻撃をする

zipのパスワード解析

  • 総当たりや辞書攻撃を使う
    • Lhaplusで総当たり攻撃できる
    • John the Ripperのzip2johnを実行後、総当たり攻撃や辞書攻撃をする
  • 既知平文攻撃する
    • PkCrackを利用する
    • Macだと HomeBrewに入っていないようなので独自にビルドする
pkcrack -C 暗号化zipファイル -c 暗号化zipファイルの既知平文のファイル名 -P 既知平文のzipファイル -p 既知平文のファイル名 -d 暗号化を解いたzipファイルの出力先 -a
* [bkcrack]でも攻撃できる

NTLMハッシュ

ハッシュ

  • md5sumやshaXXXsumでコマンドラインからハッシュ値を生成できる
  • 青空白猫などでも生成できる
  • 既知のハッシュであれば、CrackStationから元データを復元できる
  • sha-1の場合、2つの異なるファイルの最初の320バイトのハッシュ値が衝突していれば、後ろに同じデータ追加することで、任意のサイズの同じハッシュ値のファイルを作成することができる

ブロック暗号

  • ECBモードの場合、未知の暗号文でも、ブロックごとの暗号文ブロックと平文ブロックのペアがあればそれらを組み合わせにより、解読することができる
  • CTRモード
    • カウンターの初期値に同じ値や近い値を使っており、既知の平文と暗号文が取得できた場合、平文⊕鍵ストリーム=暗号文なので、平文⊕暗号文で鍵ストリームを復元することができる。同じ初期値であれば、そのまま利用できるし、近い値であればブロックを少しずらせば復号に利用できる。

証明書関係

  • 秘密鍵、公開鍵、証明書などはPEM形式やDER形式がある
  • PEMはbase64でエンコードされている。DERはバイナリ形式
  • opensslを使って証明書から公開鍵(PEM)の抽出する
openssl x509 -in .crt -pubkey -noout

RSA暗号

  • Wikipediaでアルゴリズムは理解できる
  • 素因数分解が既知である場合は公開鍵から秘密鍵を取得することができる
    • factordbなどの既知の素因数のDBでnを検索し、pとqに素因数分解する
  • 有名な攻撃方法

独自暗号

  • 何らかのルールをASCIIコード表に当てはめる換字暗号
  • アルファベットを図形として書かせるタイプの換字暗号

乱数

  • 暗号化の鍵や初期値として乱数を利用していることがある
  • seedが既知であれば同じ乱数系列を生成できる
    • 時刻をseedに使っているのであれば、乱数が生成された時刻から復元できる。時刻は正確な時刻でなくてもよく、周辺時刻を総当たりできる

Mersenne Twister

フォレンジック/ステガノグラフィ

  • ファイルの種類判別→とりあえず文字列抽出してみる→各フォーマットの仕様を見ていく
  • 青空白猫が便利
  • stego-toolkitでいろんなツールを入れたdockerが提供されている
  • 最終的にバイナリエディタを使う場合がある

ファイルの種類判別

  • Mac/Linuxだととりあえずfileコマンドを実行する
  • Windowsは青空白猫やTrIDなどを使う

文字列抽出

  • Mac/Linuxはstringsコマンドを使う
    • 10文字以上の文字列を抽出する(オプションなしだと4文字)
strings -n 10 filename
  • Windowsは青空白猫を使う
    • 文字コード指定で日本語の文字列も抽出可能

ファイル共通

  • フォントの種類やサイズ、色に気をつける
    • 特殊なフォントを使っている場合がある。(ex. Electroharmonix)
  • 画像ファイルなどに別のファイルが埋め込まれている場合がある。binwalkや青空白猫で抽出できる場合がある
  • RLOを使ってファイル名や拡張子を偽造することがある

メール

  • 攻撃者を見つける問題など
  • フォーマット
    • eml: テキスト形式で読みやすい
    • msg: Outlookで開く
  • ソースを見てBase64やQuoted Printableをデコードする
  • 主要なヘッダの仕様は覚えておく
    • Receivedなど
  • メーラで開いて添付ファイルを取得する
    • binwalkでも取得できる

Office

  • docx/xlsxの実体はzipファイルなので、解凍して1ファイルずつ見ていくとわかる場合がある
  • 白文字で文字が書いて隠すことができる
    • オブジェクトに対しても同様
  • 隠し文字の機能がある

Excel

PDF

  • Adobe Readerだとあまり操作ができない
  • 文字がファイルに書かれているわけではないので、stringsなどは効果がない
  • 文書のプロパティにフラグが隠されている場合がある
  • LibreOfficeなどで開くと墨消し部分を移動させることができる

zip

  • 簡単な仕様はwikipediaで確認できる
  • 壊れたzipが渡される場合があるが、解凍ツールが自動修復してくれる場合もある
  • ツールで修復できない場合は、バイナリエディタで仕様を見ながら修復する

画像

  • Aperi'Solve
    • exif,steghide,zstegなど色々一通りやってくれるサービス
  • EXIF情報があれば抽出する
  • PNG
    • 簡単な仕様
    • TweakPNGでフォーマットの閲覧や簡単な修正も可能
      • サイズの変更などはできる
    • EXIFはないがtEXtチャンクがありがあるのでそこに情報が書かれている場合がある
    • exiftoolでコメントを抽出できる
  • ファイルの埋め込み
    • 青空白猫のステガノグラフィ解析を使う
    • zstegでチェックする
      • ファイルがでかくて「stack level too deep」と言われる場合は、環境変数RUBY_THREAD_VM_STACK_SIZEに大きな値を設定する
    • StegHide
    • F5-steganography
  • stereogram(立体視)を使っている場合がある。StegSolveStereogram Solverなどで抽出することができる

QRコード

  • 仕様
    • わかりやすい説明
    • JIS規格は「JIS X 0510:2018 情報技術―自動認識及びデータ取得技術―QRコード バーコードシンボル体系仕様」
  • 文字列ではなくバイナリデータも保存できる
    • バイナリデータはZXing Decoder Onlineなどでデコードすることができる(hexが取得できる)
  • エラー訂正の仕組みがあるので最大で30%程度は復元できる
  • エラー訂正しなくてよいのであれば、データの記載されているブロックを直接読むことで復元することができる
    • 参考
    • strong-qr-decoderでデコードできる
      • 誤り訂正レベルとマスクパターンを指定する必要があるが、総当たりしてもよいし、形式情報をQRコードから読み取れそうならば自力で読み取ってもよい
  • 終端パターン(0b0000)の後ろにデータを隠すことがある

Windows

レジストリ

プログラムの実行履歴を見る(regripper)

rip.exe -p userassist -r ハイブファイル

レジストリ一覧

パス 説明
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList ネットワーク接続。SSIDや最初に接続した日時などを確認できる
HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces ネットワークアダプタの情報。IPアドレスなど
HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\WordwheelQuery エクスプローラーでの検索文字列
HKCU\Software\Microsoft\Windows\CurrentVersion\Run ログイン時自動実行設定(毎回)
HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce ログイン時自動実行設定(1回のみ)
HKCU\Software\Microsoft\Windows\CurrentVersion\RunServices (旧OS)ログイン時自動実行設定(毎回)
HKCU\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce ログイン時自動実行設定(1回のみ)
HKCU\Software\Microsoft\Windows\CurrentVersion\UnreadMail 未読メール情報。ユーザのメールアドレスがわかる

Amcache

  • プログラムの初回起動時刻、SHA-1ハッシュ値などが保存される
  • C:\Windows\appcompat\Programs\Amcache.hveに保存される
  • Eric Zimmerman's ToolのAmcacheParserなどで解析する

イベントログ

  • WindowsのイベントログはC:\Windows\System32\winevt\Logsに保存される
  • 主要なイベントログファイル
    • Application.evtx: アプリが生成するエラーや通知
    • Microsoft-Windows-PowerShell%4Admin.evtx: PowerShellの実行履歴
    • Security.evtx: ログオン/ログオフ、権限変更など
    • System.evtx: OSの起動終了など
  • イベントビューアでWindowsのイベントログを確認する
    • イベントIDでフィルタををかける
      • ログオン関係
        • 4624: ログオン成功
        • 4625: ログオン失敗
        • 4648: 別のアカウントをもちいてログインしようとした場合(ex. 別のマシンへリモートデスクトップでログインしようとした)
      • 4697: サービスのインストール
  • Eric Zimmerman's ToolのEvtxECmdでCSV形式にすることができる
  • Hayabusaでイベントログの解析ができる
    • logon-summaryでログオン成功したIPアドレス、アカウント名、ログオン回数などを表示することができる
  • イベントログが削除されている場合がある
  • wevtutilで削除できる
    • 全ログ削除(PowerShell)
      • wevtutil el | Foreach-Object {wevtutil cl "$_"}

Prefetch File

  • アプリケーション起動時に読み込んだファイルのパスなどを保存しておくファイル
    • 次回起動時に前回読み込んだファイルを先読みして読み込むことで起動を高速化する
  • C:\Windows\Prefetchに保存される
  • ファイル名は{exe名}-{ハッシュ}.pfになる
  • 前回実行日時や、読み込んだファイル、ディレクトリの情報が記録されている
    • C:\Users\xxx以下のファイル/ディレクトリを参照していると、ユーザ名がxxxである可能性が高い
  • 解析ツール

SRUDB.dat

  • SRUM(System Resource Usage Monitor)がアプリケーションの利用状況を監視して保存したもの
  • C:\Windows\System32\sruに保存される
  • どのexeがどれくらい通信したかなどがわかる
  • 解析ツール

NTFS

  • $MFTでファイルの属性やフルパス、作成日時、最終更新日時などを調べることができる
  • $LogFileで操作履歴を調べることができる。削除日時など調べることができる
  • streamsを使って代替データストリームを取得できる

ブラウザ履歴

  • BrowserHistoryViewで各種のブラウザの履歴を表示させることができる
  • 履歴ファイル
    • Chrome: %LocalAppData%\Google\Chrome\User Data\Default\History
    • Edge: %LocalAppData%\Microsoft\Edge\User Data\Default\History
    • Legacy Edge: %LocalAppData%\Microsoft\Windows\WebCache\WebCacheV01.dat

メモリ

  • メモリのダンプを渡されて攻撃者の行動を推測する
    • コマンドラインの履歴、プログラムの実行履歴、ネットワークへの接続状況、起動プロセス一覧などを確認できる
  • メモリのダンプフォーマット
    • aff4: WinPmemでダンプした形式。zipファイルになっている
    • raw: メモリをそのまま出力したバイナリ形式
  • WinPmemでダンプしたaff4形式の場合はwinpmemで変換する
    • ただし、WinPmemの最新版(v4系)だと変換できなかったりするので、Rekallに付属していたv2系を使う

aff4形式からraw形式への変換

winpmem.exe --export PhysicalMemory --output image.raw image.aff4
  • メモリのダンプを与えられた場合はvolatilityを使う

volatility2

python vol.py -f メモリダンプ --profile プロファイル プラグイン プラグインオプション

の形式で実行する。2系はプロファイルがないと動かない

ので、まずどのOSのメモリダンプかを確認する

python vol.py -f メモリダンプ --profile プロファイル imageinfo

プロファイルの推測値が表示されるので、その推測値を指定して各種プラグインを実行する

プロセスのリスト表示

python vol.py -f メモリダンプ --profile プロファイル pslist

プロセスのコマンドライン表示

python vol.py -f メモリダンプ --profile プロファイル cmdscan

userassistのレジストリを見て、プログラムの起動日時や実行回数を確認する

python vol.py -f メモリダンプ --profile プロファイル userassist

ネットワークの接続状態を確認する

python vol.py -f image.raw --profile プロファイル netscan

ディスク

  • ディスクから消えたファイルを抽出したり、レジストリハイブファイルを取り出す
  • USNジャーナルファイル($J)に残されている場合は、usn_analyticsなどで変更履歴をparseする。
  • .bash_historyを見てコマンドラインの履歴を確認したり
  • フォーマット
    • img: ディスクイメージファイル
    • vdi: VirtualBoxの仮想ディスクイメージ
  • vdiからimgファイルへの変換はVBoxManager clonehd in.vdi out.img --format raw
  • FTK Imagerでディスクイメージを閲覧することができる。
  • Autopsyでディスクイメージの中を調べることができる。こちらの方が高機能
  • Sleuthkitでコマンドラインで解析できる。イメージファイルからパーティション一覧や、フォルダ/ファイル一覧などを確認できる
  • Linux
    • fsckでファイルシステムを修復することができる
    • extundeleteでファイルを復元することができる

RAID

  • RAIDのディスクイメージからフラグを取り出す問題
    • 複数のデバイスを1つのRAIDとしてマウント
      • mdadm --assemble --force /path/to/mnt /path/to/device1 /path/to/device2 ...
    • btrfsでRAIDのマージ
      • btrfs device scan
      • mount -t btrfs -o degraded /path/to/first/device /path/to/mnt

コンテナ

  • httpのレジストリに接続するためにはinsecure-registriesにホスト名:ポート名を設定する
  • imgcryptで暗号化されていることがあるので、その場合はimgcryptで復号する

仮想マシン

  • .ova形式はtar形式である
  • .vmdkから7-zipでディスクイメージのファイルを取り出すことができる

プログラム解析

マルウェア解析

  • VirusTotalでどのようなマルウェアか情報が見つかるかも

実行ファイル形式

  • .exeはPEヘッダにメタデータが書かれている
    • PEViewでみることができる
  • UPXで圧縮されている場合は、解凍した方が解析しやすい

デコンパイル/デバッグ

  • IDA FreeGhidraでデコンパイルする
  • Linuxでdisassembleしたいだけであれば、objdump -dなどで確認することもできる
  • 簡単なものであれば、デコンパイルしたものを修正して、コンパイルし直して実行する
  • デバッグ可能であれば、デバッグ時にレジスタの値を変更してフラグを出力させる
  • デコンパイルした結果からフラグを推測する

Python

デコンパイル

evalのバイパス

  • 特定の文字や文字列をブロックしてevalできない場合は、__import__('base64').b64decode(<base64化した文字列>)のようにbase64を使ってバイパスを防ぐことができる
  • HackTrickを参考

Javaのデコンパイル

  • EclipseなどでCFRなどの逆コンパイラを使って解析する
  • 実行しなくて良いのであれば、Decompiler.comなどのWeb上の逆コンパイラを用いて解析できる

Android

  • apkはzipファイルである
  • dex2jarでdexファイルをjarファイルに変換し、Javaのデコンパイルをすれば良い。

Windowsの解析

  • .exeの解析
    • PEViewでWindowsの.exe形式のヘッダ情報などをみることができる
      • 作成日を確認することができる
  • 実行時の解析
    • API Monitorで実行時に呼ばれたWindows APIを確認することができる
    • Process Explorerで実行時の情報を出すことができる
      • stringsで参照しているファイルが見えるなど
  • Sysmonで実行ログを出す

.Net

  • .Netであることは青空白猫などで判別可能
  • dnSpyなどの.Netのデコンパイラでデコンパイルする
  • dnSpyはデバッグも可能

マクロ/VBScript

  • oletoolsのolevbaを利用してofficeファイルからマクロを抽出できる
  • .vbeは難読化されたVBScriptであるが、解除できる

PowerShellの解析

  • マルウェアのスクリプトがPowerShellで書かれていることがある
  • 難読化
    • PowerShellのコマンドライン引数-eでbase64形式でスクリプトを渡すことができる
    • Set-Aliasを使ってコマンドレットに別名をつけて読みづらくすることができる
    • 大文字小文字の違いは無視される
    • スクリプトがbase64で書かれていてSystem.Convert.FromBase64Stringで元に戻していることがある
    • スクリプト文字列が圧縮されておりSystem.IO.Compression.DeflateStreamで展開することもある
    • スクリプトが何らかの暗号化方式をつかって暗号化されていることもある
    • -fをつかって文字列の順番を入れ替える
    • &オペレータを使って文字列をコマンドとして実行
  • PowerShellのログ記録を有効にすると動的に解析できる
  • Sysmonを利用して実行ログを出して、動的に解析することもできる

Buffer Overflow

  • ローカル変数はスタック上に連続して配置されるので、バッファの長さ制限をしていなければローカル変数のデータを上書きすることができる

format string bug

  • Cのprintfなどの関数は、フォーマット文字列を使うことができ、かつ引数の数のチェックをしていない。そのため、%pや%xなどを用いて、スタック上の引数の位置の値を読み込んで出力することができる
  • %nはこれまで出力した文字数を引数のアドレスに書き込む。これにより、読み込みだけでなく書き込みを行うことができる。
  • こちらなどを参考にする

ROP

  • スタックの関数の戻りアドレスを書き換えることによってコードを実行させる
    • buffer over flowを用いて書き換える
  • 簡単なものは直接バッファにシェルコードを書き込んで、戻りアドレスをバッファのメモリアドレスにする
    • shellcodeは検索して探してもよいし、pwntoolsのshellcraftを使ってもよい
  • フラグを出力する関数のアドレスがわかれば、関数のアドレスを戻りアドレスに書き込むことでフラグを出力することができる。
    • フラグを出力する関数が引数をチェックしている場合、スタック上の引数の部分も書き込む必要がある
    • x86-64の場合、レジスタ(rdi,rsi,rdx,rcx,r8,r9)を使う。その場合は、「pop rdi; ret」のようなgadgetを使ってスタックに書き込んだ値をレジスタに書き込むようにする。

権限昇格

Linux

OSINT

  • Google検索や画像検索を使う
  • 場所を調べる
    • 画像の場合、建築物、道路の情報(国道何号線など)などから探す
    • カスタマバーコードから住所がわかる
    • 画像のメタデータ(EXIF)に緯度経度が入っている場合がある
    • 緯度経度がわかっている場合はGoogle Mapなどで調べることができる
    • 2点の緯度経度から距離を用いる方法はいろいろある
  • 現在のネットに存在しない場合、Internet Archiveに残っている場合も

Discussion