CTFで出題された
Webの難問良問解説
2021-05-23 魔女のお茶会 #1
@hakatashi
資料: wkp.hkt.sh
誰?
@hakatashi (博多市)
- 2012年ごろ
チームEpsilonDeltaで
CTFに初参加- 現在の所属はTSG
- 現在もCTFに参加するかたわら
CTFの主催・作問を行う- TSG CTF
- GoogleCTF
- SECCON
- 得意ジャンル: Crypto, Web,
Stego
今日のあらすじ
- 解いて/読んで面白かったWebの問題を紹介
- 既存の攻撃手法と全く違う新機軸の問題が中心
- Hack.lu CTF 2020: FluxCloud DoH
- WCTF2019: Gyotaku The Flag
- *ctf 2021: oh-my-socket
Hack.lu CTF 2020
FluxCloud DoH
- DoHは「DNSって暗号化されてないし
HTTPSでやればめっちゃ安全じゃね?」
みたいなやつ - HTTPでPOSTすることで
指定されたサーバーに
DoHクエリを発行することができる - フラグは?
DoH (DNS over HTTPS) を
題材にした問題
- もう一つ内部向けサーバーが立っている
- クエリとしてRedisに
いくつかの操作を行うことができ、
結果としてProtobufを返す - フラグはRedisに保存されているため
このサービスにアクセスできたら勝ち
内部向けサーバー
- incomingQueryを書き換えることで
任意のアドレスにDoHを発行できる - ローカルのProtobufサーバーは
GETパラメーターでデータを受け取るので
pathを書き換えると
任意のパラメータを渡せる
SSRFを見つける
DNS over HTTPS の仕様
- Protobufサーバーからのレスポンスは
DoHライブラリの仕様上
正当なDoHレスポンスでないといけない - じゃあDoHの仕様って?
- ほとんど「DNSのパケットを
HTTPのbodyで流す」だけのプロトコル
- ほとんど「DNSのパケットを
- つまり目的のレスポンスは
正当なDNSのパケットでありつつ
Protobufでないといけない - つまり⋯⋯
_人人人人人人人人人人人人人_
> DNSとProtobufのpolyglot <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄
- polyglotとは
「複数の言語/プロトコルで
validなペイロード」のこと- Ruby/Pythonとか
- 今回のサーバーが実装する
機能の一つに、「別のDNSを
実行した結果を取得する」
というものがあるので、
これを活用する
別サーバーのTXTレコードに
以下の値を設定
\x00\x00\x00\x01\x00\x00\x00\x00\x01a\x00\x02\x00\x01\x00\x00\x00
まとめ
- polyglot自体はWeb問題で
そこそこ出題されるジャンルだが、
まさかDNSとProtobufで
問題が作れるとは⋯⋯ - この問題を解くには、
DNSとProtobuf両方の仕様を
正しく理解して、どちらでも通用する
パケットを組む必要がある
WCTF2019
Gyotaku The Flag
Goで書かれたサーバー
- 指定したURLにアクセスし
その内容をファイルに保存する - ファイルを読む機能は
「まだ実装されていない」 - 内部専用エンドポイント/flagが
存在しフラグが降ってくる
- サーバーができることは
「ただファイルを保存するだけ」 - ファイルを読むことはできない
- 一見、不可能にしか思えない
- 想像もつかない方法でフラグを得る
Windows特有の機能を利用
Server: Microsoft-IIS
- HTTPヘッダーを見ると、
実は Windows Server で動いていることがわかる
Windows特有の機能を利用
- Wisdows Server には通常のWindows同様
Windows Defender が付属している - 「リアルタイム保護」がデフォルトでオンになっており
ウイルスと思しきファイルを見つけると即座に削除する - 特に、EICARと呼ばれる文字列でテストできる
Windows特有の機能を利用
<script>eval("X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H" + "*")</script>
- Windows Defender のウイルス検知は
単なる文字列マッチングだけでない - HTMLっぽい文字列の場合、中のJavaScriptを実行して
怪しい文字列に変換される場合はウイルスと検知する
Windows特有の機能を利用
<script>eval("X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H" + document.body.innerHTML[0].charCodeAt(0) === "W" ? "*" : "A")</script>
<body>WCTF{hogefuga}</body>
- このスクリプトは <body> と </body> で囲われた
部分の文字列を取得できるため、
「bodyの1文字目が"W"ならウイルスになり、
そうでないならウイルスにならない」
という摩訶不思議なファイルを生成することができる
改めて今回の
プログラムを見てみる
- urlとusernameは自由に指定でき、
その間に挟まれているbodyに
フラグの内容が入ってくる- url = "...<body>"
- body = "FLAG{....}"
- username = "</body>"
- この方法でフラグの内容が取得できる!
まとめ
- のちに AV Oracle と命名される手法を
(CTFかどうかを問わず) 初めて導入した問題 - アンチウイルスソフトというこれまで
誰も着目しなかった部分に着目し、
脆弱性として作り込んでおり、世紀の良問
*ctf 2021
oh-my-socket
server
client
webserver
- 外部からアクセスできるのは
webserverのみ - フラグはserverにある
- serverに直接接続すれば
フラグが降ってくるのだが、
clientというサーバーが
コネクションを専有してしまうため
接続できない- なんとかしてこれを
剥がす必要がある
- なんとかしてこれを
3台のサーバーを用いる
server
client
webserver
- webserverにはRCE (任意コード実行)
clientにはLFI (Local File Inclusion)の
脆弱性がそれぞれある - これらを用いてclientのコネクションを
強制的に引き剥がすには?- →IPスプーフィング
IP Spoofing
- IPパケットには、送信元を記載する
セクションがあるが、これは容易に偽造できる - ただし、これを実行するには
送信元アドレス、ポート、
そしてTCPシーケンス番号を
完璧に合わせる必要がある
https://www.slideserve.com/jeri/session-hijacking
シーケンス番号の予測
- 「TCP遅延ACK」と呼ばれる機能を利用する
- clientサーバーの Local File Inclusion を利用し
/proc/net/netstat を読むことで
DelayedACKLostというシステムステータスを
読むことができる- 「TCP遅延ACK」によりドロップされた
パケットの数を示す
- 「TCP遅延ACK」によりドロップされた
シーケンス番号の予測
- 正しいシーケンス番号より大きな値の
spoofed TCP を投げつけると
DelayedACKLostが増加し、
そうでないと変化しない- →二分探索可能!
Qian, Zhiyun & Mao, Zhuoqing & Xie, Yinglian. (2012). Collaborative TCP Sequence Number Inference Attack: How to Crack Sequence Number Under A Second. Proceedings of the ACM Conference on Computer and Communications Security. 10.1145/2382196.2382258.
TCP Reset Attack
- 最終的に、RSTフラグを立てたパケットを送信元を偽造して
送りつけることで、コネクションを強制切断できる - 言うのは簡単だが、これを実際に動くexploitとして構築するには
相当深いTCPの知識が必要
https://www.slideserve.com/jeri/session-hijacking
まとめ
- IPスプーフィングを現実に出題可能な
問題設定として出題した点でとても良問 - HTTP smuggling とかTCPとか、
Webの低レイヤーの出題も近年増えてきている- ちゃんと勉強しないと⋯⋯
-
今回紹介した問題はどれも
「Webとしてはかなり尖った問題」なので
普通に出題される「Web問題」とは
ちょっとアプローチのしかたが違うかも -
でもWeb問題の雰囲気はこんな感じ
-
今までWebの経験がない人も
これをきっかけにWebを触ってもらえると嬉しい
おわりに
ちょっと宣伝
※hakatashiが運営に参加するか未確定なものも含まれます
TSG CTF 2021
- 8月ごろ開催予定
- 問題傾向: 知識より発想が問われるパズル的問題
Google CTF 2021
- 7月17日~19日
- 問題傾向: 世界トップクラスの難問
SECCON CTF 2021
- 12月11日~12日
- 問題傾向: 教育的問題・独特の問題
ありがとうございました!
今回の資料: wkp.hkt.sh
CTFで出題されたWebの難問良問解説
By Koki Takahashi
CTFで出題されたWebの難問良問解説
- 4,387