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の問題を紹介
  • 既存の攻撃手法と全く違う新機軸の問題が中心
  1. Hack.lu CTF 2020: FluxCloud DoH
  2. WCTF2019: Gyotaku The Flag
  3. *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のパケットでありつつ
    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」によりドロップされた
      パケットの数を示す

シーケンス番号の予測

  • 正しいシーケンス番号より大きな値の
    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,031