CTFtime.org / ångstromCTF 2020
まだサーバが生きてたので、復習がてら、解法まとめ。
と思ったら教育的で昔の年もできるのね。
- 20点 The Magic Word
- The Magic Word [AngstromCTF 2020 Web] - はまやんはまやんはまやん
- htmlはChromeとかを使うと簡単に修正可能
- 50点 Xmas Still Stands
- Xmas Still Stands [AngstromCTF 2020] - はまやんはまやんはまやん
- XSSできそう
- XSSコードがまとまっている所からいくつか試すと通る
- 50点 Consolation
- Consolation [AngstromCTF 2020] - はまやんはまやんはまやん
- javascript難読化。頑張って取り出すとフラグが見える
- 70点 Git Good
- Git Good [AngstromCTF 2020] - はまやんはまやんはまやん
- やってしまいそうだなぁという気持ちもするが、.gitフォルダを置いたままにしとくと、チェックアウトされちゃったりするという話
- 110点 Secrent Agents
- Secret Agents [AngstromCTF 2020] - はまやんはまやんはまやん
- SQLインジェクションする。UserAgentにSQLを入れ込む
- ここが、はまやんはまやんのハッキング力の限界。ここからは未知の世界だ
- 120点 Defund's Crypt
- 題名がよくわからんので、DeepLに食わせると、「デファンドの地下室」だそうだ。誰やねん。
- File Upload Injection 出展
- これを狙うのであれば、フィルター回避をしつつphpファイルをアップロードする必要がある
- mimeタイプチェックをまずはすり抜けよう
- 以下の部分でファイルを実際に読み込んでmimeタイプに変換している。実は先頭部分のみを見ている。
php $finfo = new finfo(FILEINFO_MIME_TYPE); if (false === $ext = array_search( $finfo->file($_FILES['imgfile']['tmp_name']), array( '.jpg' => 'image/jpeg', '.png' => 'image/png', '.bmp' => 'image/bmp', ), true )) { throw new RuntimeException("Your memory isn't picturesque enough to be remembered."); }
- ここにバイパス方法が → Harekaze CTF 2019 で出題した問題の解説 - st98 の日記帳
- なるほどね。先頭にマジックナンバーを置いて、後半にphpコードを書いておけばよさそうだ。
- ここに見事なファイル例が書いてある。 ångstromCTF 2020 Writeups | Joseph Surin | Joseph Surin Personal Blog
- 以下の部分でファイルを実際に読み込んでmimeタイプに変換している。実は先頭部分のみを見ている。
- 拡張子チェックもすり抜けたい
- これ
php if (strpos($_FILES["imgfile"]["name"], $ext) === false) { throw new RuntimeException("The name of your memory doesn't seem to match its content."); }
- strposに.pngが含まれていればいいので、
evil.png.php
としとけば大丈夫
- これ
cat /flag.txt
でも使って取り出してくればいい
- 130点 Woooosh
- 無理ゲーが与えられる。ゲームに熱中する前に与えられているコードを見てみよう
- Socket.ioが使われている。それに、スコアが20を超えると、フラグが見えるようだ
- フロントエンドが既に用意されているが、自動プレイヤーを作って攻略しよう
- 自動プレイヤー実装例
- バックエンドが与えられていれば、フロントエンドを作って悪意のある動作を狙うことができたりすると覚えておけばいいのかな?
- 180点 A peculiar query
- SQLインジェクションだろうなぁという感じ。
- コードを見てみると、「'-\".」が検知されると、それ以降は「*」に変換されるフィルターが用意されている
- GETのクエリに複数回同じkeyを入れると、プログラムには配列で渡される
- Expressだけだろうか? ここが素晴らしいissueを紹介している → HTTP parameter pollution in Express can aid attackers in bypassing security filters. · Issue #1824 · expressjs/express
- 普通にq[]=のように指定して意図的に配列にしている回答もある(こっちの方が確実か)
q = q.slice(0, i) + "*" + q.slice(i + 1, q.length);
この部分で文字列に結合されて、そこからは文字列として扱われるので、先頭にインジェクションコードを入れて、末尾に文字列にしても問題ないようにたくさんクエリを入れるか、長い文字列を入れておく- あとは、DBを自由に動いて情報を特定する
- うむ。これをググラビティで見つけてくるには、どういう感じに検索すればいいんだろう
- 190点 LeetTube
- このHintをヒントと思える人間がどれだけいるのだろうか
- 本当のヒントはNoteのNGINXにあるような気がしてならない
- 任意の情報を抜き出せそうな部分というと、
try: video = open(file, 'rb', 0)
この辺しかないだろうという感じはするcurl -v --path-as-is https://leettube.2020.chall.actf.co/videos/../leettube.py
これでソースコードが出てくる- passwd抜けるかと思いきや、400エラーになる(500ではない)
- NGINXのWAFが防いでいる
- NGINXのWAFをバイパスしよう
- どういう感じにバイパスするかというと
https://leettube.2020.chall.actf.co/videos/../?/../../etc/passwd
とする ../../
がブラックリスト入りしていると仮定する。よくある仮定? ångstromCTF - LeetTube- NGINXでは?以降はクエリとして扱われるので、無視される
- pythonの方では、?フォルダに入って../で抜けると解釈されて、大丈夫
- なるほど?
- どういう感じにバイパスするかというと
- (ここまではいいんだけど、ここからがやばい)
- 『名前の分かっている』ファイルは取り出すことができそうだ
- 今回は名前がわからない
- メモリマップを
/proc/self/maps
から抜き出せる - メモリマップが分かれば、
/proc/self/mem
から読み出すことでメモリを読み出すことができる - 丁度プログラムは範囲読込ができるようになっている。方針はあっていそうだ
- ここからは根性。かたっぱしから読み込んで答えの映像を探す。他と同様にmp4だろうから、mp4のマジックナンバーをもとに探す
- ワンライナーで読んでくるコードがある
- ångstromCTF - LeetTube
curl --path-as-is 'https://leettube.2020.chall.actf.co/videos/../?/../../proc/self/mem' -H "Range: bytes $(python3 -c 'print(f"{0x7f4d4c225000}-{0x7f4d4cae6000}")')" --output memory.dump
- 名前のない区間が3つあるので、全部持ってきてmp4のマジックナンバーで検索する
- 最後の区間で
00 00 00 20 66 74 79 70 69 73 6F 6D 00 00 02 00
がばっちりヒットする(すげぇ) - それを先頭にして保存しなおし、mp4にして再生するとフラグが書いてある
- 最後の区間で
- このHintをヒントと思える人間がどれだけいるのだろうか
- 300点 UBI
- (20) graneedさんはTwitterを使っています 「ångstromCTF 2020のUBIの想定解法。HTTP Header Injectionでtext/cache-manifestを付与できるので、TopページのCSSをインターセプトするAppCacheのマニフェストを作り、CSS InjectionでFlagファイルのリンク先を取得するという連携技。 素晴らしい・・・、今年のまとめに載せさせて頂きます。」 / Twitter
- ( ^ω^)
- 公式解説:[Python] from Crypto.Cipher import PKCS1_OAEP from Crypto.Hash import SHA256 from Crypt - Pastebin.com
- さっぱりわからんというか、どっから手を付けたもんか分からん