🙆♀️
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>
マルウェアのパケット解析
- NanoCore RAT
Web
- とりえあえずHTMLソースを見る
- Chrome Developer Toolsを使ってネットワーク通信やcookieの値を見て書き換えられそうなところがないか探す
- JSが難読化されている場合がある
- Postmanやcurlで改ざんしたリクエストを送る
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をデコードする
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*ckやWhitespaceなど難解プログラミング言語になっている場合がある。
換字暗号
- 文字を別の文字に交換する暗号
- EnigmatorのCrypto SolverやFrequency 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コマンドでまともなテキストファイルになっているかを確認する
パスワード
- よく利用されるパスワード
- WikipediaのList of the most common passwords
- rockyou.txtはKaggleやKali Linuxで提供される
- 製品名がわかっている場合、デフォルトのパスワードが使われていることがある
- パスワード解析をするはJohn the RipperやHashcatを使って辞書攻撃や総当たり攻撃をする
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
- opensshの秘密鍵の独自フォーマット
RSA暗号
- Wikipediaでアルゴリズムは理解できる
- 素因数分解が既知である場合は公開鍵から秘密鍵を取得することができる
- factordbなどの既知の素因数のDBでnを検索し、pとqに素因数分解する
- 有名な攻撃方法
独自暗号
- 何らかのルールをASCIIコード表に当てはめる換字暗号
- アルファベットを図形として書かせるタイプの換字暗号
乱数
- 暗号化の鍵や初期値として乱数を利用していることがある
- seedが既知であれば同じ乱数系列を生成できる
- 時刻をseedに使っているのであれば、乱数が生成された時刻から復元できる。時刻は正確な時刻でなくてもよく、周辺時刻を総当たりできる
Mersenne Twister
- 32bit*624個の内部状態であるので、624個の出力がわかれば次の乱数を予測できる
- Pythonのrandom.random()を完全に予測してみた
- solver
- mersenne-twister-predictor
- symbolic_mersenne_cracker 一部出力がマスキングされていても推測できる
フォレンジック/ステガノグラフィ
- ファイルの種類判別→とりあえず文字列抽出してみる→各フォーマットの仕様を見ていく
- 青空白猫が便利
- 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
- 空白文字のあるセルを色付けするとフラグが表示されるパターン
- Ctrl+Homeでセルの先頭、Ctrl+Endでセルの最後に移動できるので、どのセルまで値が入っているかがわかる。
- シートの保護のパスワードは解除できる。
- シートを非表示にすることができる。
- 行や列を非表示にすることができる。
- Adobe Readerだとあまり操作ができない
- 文字がファイルに書かれているわけではないので、stringsなどは効果がない
- 文書のプロパティにフラグが隠されている場合がある
- LibreOfficeなどで開くと墨消し部分を移動させることができる
zip
- 簡単な仕様はwikipediaで確認できる
- 壊れたzipが渡される場合があるが、解凍ツールが自動修復してくれる場合もある
- ツールで修復できない場合は、バイナリエディタで仕様を見ながら修復する
画像
-
Aperi'Solve
- exif,steghide,zstegなど色々一通りやってくれるサービス
- EXIF情報があれば抽出する
- PNG
- ファイルの埋め込み
- 青空白猫のステガノグラフィ解析を使う
-
zstegでチェックする
- ファイルがでかくて「stack level too deep」と言われる場合は、環境変数RUBY_THREAD_VM_STACK_SIZEに大きな値を設定する
- StegHide
- F5-steganography
- stereogram(立体視)を使っている場合がある。StegSolveやStereogram Solverなどで抽出することができる
QRコード
- 仕様
- わかりやすい説明
- JIS規格は「JIS X 0510:2018 情報技術―自動認識及びデータ取得技術―QRコード バーコードシンボル体系仕様」
- 文字列ではなくバイナリデータも保存できる
- バイナリデータはZXing Decoder Onlineなどでデコードすることができる(hexが取得できる)
- エラー訂正の仕組みがあるので最大で30%程度は復元できる
- エラー訂正しなくてよいのであれば、データの記載されているブロックを直接読むことで復元することができる
- 参考
-
strong-qr-decoderでデコードできる
- 誤り訂正レベルとマスクパターンを指定する必要があるが、総当たりしてもよいし、形式情報をQRコードから読み取れそうならば自力で読み取ってもよい
- 終端パターン(0b0000)の後ろにデータを隠すことがある
Windows
レジストリ
- レジストリはメモリ上に存在するが、%SystemRoot%\System32\Config以下に保存される。これらのファイルを解析する
- Registry Explorerでハイブファイルをみることができる
- KaniRegやregripperを使って解析できる
プログラムの実行履歴を見る(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: サービスのインストール
- ログオン関係
- イベントIDでフィルタををかける
- Eric Zimmerman's ToolのEvtxECmdでCSV形式にすることができる
-
Hayabusaでイベントログの解析ができる
- logon-summaryでログオン成功したIPアドレス、アカウント名、ログオン回数などを表示することができる
- イベントログが削除されている場合がある
- DanderSpiritzで削除されている場合、復元ツールがある
- エディタで開く(UTF-16)と痕跡が残っているかも
-
wevtutilで削除できる
- 全ログ削除(PowerShell)
- wevtutil el | Foreach-Object {wevtutil cl "$_"}
- 全ログ削除(PowerShell)
Prefetch File
- アプリケーション起動時に読み込んだファイルのパスなどを保存しておくファイル
- 次回起動時に前回読み込んだファイルを先読みして読み込むことで起動を高速化する
- C:\Windows\Prefetchに保存される
- ファイル名は{exe名}-{ハッシュ}.pfになる
- 前回実行日時や、読み込んだファイル、ディレクトリの情報が記録されている
- C:\Users\xxx以下のファイル/ディレクトリを参照していると、ユーザ名がxxxである可能性が高い
- 解析ツール
-
PECmd
- CSVやJSON形式で出力できる
- WinPrefetchView (GUI)
-
PECmd
SRUDB.dat
- SRUM(System Resource Usage Monitor)がアプリケーションの利用状況を監視して保存したもの
- C:\Windows\System32\sruに保存される
- どのexeがどれくらい通信したかなどがわかる
- 解析ツール
NTFS
- $MFTでファイルの属性やフルパス、作成日時、最終更新日時などを調べることができる
- Eric Zimmerman's ToolのMFTECmdやMFTExplorerを使う
- $LogFileで操作履歴を調べることができる。削除日時など調べることができる
- NTFS Log Trackerなどを使う
- 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とvolatility3があり、かなり別物
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
- 複数のデバイスを1つのRAIDとしてマウント
コンテナ
仮想マシン
- .ova形式はtar形式である
- .vmdkから7-zipでディスクイメージのファイルを取り出すことができる
プログラム解析
マルウェア解析
- VirusTotalでどのようなマルウェアか情報が見つかるかも
実行ファイル形式
デコンパイル/デバッグ
- IDA FreeやGhidraでデコンパイルする
- Linuxでdisassembleしたいだけであれば、objdump -dなどで確認することもできる
- 簡単なものであれば、デコンパイルしたものを修正して、コンパイルし直して実行する
- デバッグ可能であれば、デバッグ時にレジスタの値を変更してフラグを出力させる
- デコンパイルした結果からフラグを推測する
- 連立方程式を解く場合は以下が使える
- https://keisan.casio.jp/exec/system/1278931746
Python
デコンパイル
- PyInstallerでexeが生成されている場合がある
- exeからpycファイルの抽出をする
- pycからpyへのデコンパイル
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形式のヘッダ情報などをみることができる
- 作成日を確認することができる
-
PEViewでWindowsの.exe形式のヘッダ情報などをみることができる
- 実行時の解析
- API Monitorで実行時に呼ばれたWindows APIを確認することができる
-
Process Explorerで実行時の情報を出すことができる
- stringsで参照しているファイルが見えるなど
- Sysmonで実行ログを出す
.Net
- .Netであることは青空白猫などで判別可能
- dnSpyなどの.Netのデコンパイラでデコンパイルする
- dnSpyはデバッグも可能
マクロ/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
- sudo -lでsudoできるコマンドがないか調べる
- setuidが立っているコマンドを探す
- find / -perm -4000
- GTFOBinsで、そのコマンドで攻撃できないか調べる
- そのコマンドが他のコマンドを呼んでいる場合、PATHをいじることで同名の別のコマンドを呼ぶことができないか調べる
- /etc/passwdや/etc/shadowのからrootのパスワードを取得できないか確認する
- ワイルドカードインジェクションできないか確認する
- kernelやソフトウェアに権限昇格の脆弱性がないか確認する
OSINT
- Google検索や画像検索を使う
- 場所を調べる
- 現在のネットに存在しない場合、Internet Archiveに残っている場合も
Discussion