#!

路上に就職!

HackCon 2017 writeup

HackConにBK201で参加した。146ポイントで順位は102。

Noobcoder 50Pt

PHP初心者が作ったログインフォームがある。 f:id:x6d61:20170826185010p:plain SQLiなどもなさそうなので、初心者がやりそうなミスを探してみるとchecker.php~をダウンロードすることができた。

<html>
<head>
</head>
<body>
<?php
if ($_POST["username"] == $_POST["password"] && $_POST["password"] !== $_POST["username"])
    echo "congratulations the flag is d4rk{TODO}c0de";
else
    echo "nice try, but try again";
?>
</body>

暗黙の型変換で一致して、厳密な型の比較で一致しない値 100 と 1e2を送信してflag

f:id:x6d61:20170826190101p:plain

d4rk{l0l_g3dit_m4ster_roxx}c0de

Magic 50Pt

またログインフォームだけで脆弱性はない。 レスポンスを見てみるとSet-Cookieがかなりある。

curl -I http://139.59.13.232:6060
HTTP/1.1 200 OK
Host: 139.59.13.232:6060
Connection: close
X-Powered-By: PHP/7.0.22-0ubuntu0.16.04.1
Set-Cookie: 0=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 1=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 2=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 3=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 4=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 5=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 6=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 7=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 8=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 9=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 10=%5B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 11=%3E; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 12=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 13=%3E; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 14=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 15=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 16=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
(skip)
Set-Cookie: 436=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 437=%2B; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Set-Cookie: 438=.; expires=Thu, 01-Jan-1970 00:00:10 GMT; Max-Age=0; path=/
Content-type: text/html; charset=UTF-8

連番のcookieを抜き出すsolveを書く

import requests
import urllib
import httplib
httplib._MAXHEADERS = 1000
cookie = []
url = "http://defcon.org.in:6060/"
r = requests.get(url)
list = r.headers['Set-Cookie'].split(';')
test = (list[0::3])
try:
    for i in test[1::]:
        split = i.split(',')
        cookie.append(split[1])
except:
    pass
r = []
for i in cookie:
    s = i.split('=')
    r.append(s[1])
print urllib.unquote(''.join(r))

繋げた値がBrainfuck っぽいのでBrainfuckを実行できるWebサービスに投げる f:id:x6d61:20170826235147p:plain

f:id:x6d61:20170826235315p:plain そしたらpassword が降ってくるのでアクセスしてflag

d4rk{c00k13s_4r3_fun}c0de

Rotate it 2Pt

rot13 やるだけ

d4rk{wh0_give$_ca3sar_in_CTF???}c0de

High Bass 3Pt

base64 するだけ

d4rk{that_$impl_3n0ugh4_U}c0de

File 3Pt

x86-64の実行ファイルを落として実行するだけ

d4rk{s1mpl_linux_execUt4ble}c0de

Needle P3

解凍して出て来たtext.txtからflagを探すだけ strings text.txt | ggrep d4rk

d4rk{n33dle_in_a_h4ystck}c0de

ALL CAPS 5Pt

換字式暗号

D4RK{TRY_FACCH3_IFTHIS_TOO_SIMPEL}C0DE

flag.txt 10Pt

f:id:x6d61:20170826201019p:plain アクセスするとRobotの記事のリンクが貼ってある。 robots.txtにアクセスすると 500786FBFB9CADC4834CD3783894239D ディレクトリがあることが わかる。

User-agent: *
Disallow: /500786FBFB9CADC4834CD3783894239D

500786FBFB9CADC4834CD3783894239D以下のflag.txtにアクセスしてflag

d4rk{r0b075_7x7_4r3_v3ry_c0mm0n}c0de

Welcome 5Pt

esya.iiitd.edu.in のソースを見るとflagが書いてある。

f:id:x6d61:20170826201721p:plain

d4rk{w3lc0m3_t0_35y4_2017}c0de

Keep talking 5Pt

HackCon 2017のSlackにアクセスするとflagがある。

d4rk{Pink_Floyd_1$_Awes0me}c0de

RSA-1 10Pt

他人のコード拝借して終了

d4rk{s1mpl3_rsa_n0t_th1s_34sy_next_time}c0de

競技が終了してから解いた問題

Stolen Calculator - PWN 100Pt

f:id:x6d61:20170827162302p:plain アクセスするとオンライン電卓(?)が操作できる。calc.jsが呼び出されてるので見てみると こんなコードがある。

                  for( var i=0  ; i < expr.length ; i++ )
                  if( charset.indexOf(expr[i]) < 0 )
                  {
                        alert("You can only use mathamatical expressions ")
                  }

                  urll = "http://defcon.org.in:10300/" + encodeURIComponent( strrr );
                  $.get( urll , function(res){
                      $("#data").html( res )  
                  })

http://defcon.org.in:10300 が怪しいのでアクセスしてみる。真っ白なページだったが /1+1とリクエストを送信すると2と表示され、文字列を送信するとerrが返ってくる。

f:id:x6d61:20170827162929p:plain

http://defcon.org.in:10300/{{1+1}} とリクエストを送信すると2と返って来たことから server side template injection の 脆弱性が存在することが 分かる。

f:id:x6d61:20170827163615p:plain

http://defcon.org.in:10300/{{process.cwd()}} と文字列を送信するとエラーが返ってくるため 数値または記号で難読化して送信しようと考えた。JsFuckはnodeJSにも対応してるらしいので

jscrew.it

上記のサイトで以下のコードを難読化して送信した。

process.binding('fs').internalModuleReadFile('/flag.txt')

そしたらflag

f:id:x6d61:20170827164158p:plain

d4rk{jaVaScriPtFuck}c0de