write-ups/CTF

DEFCON CTF 2018 exzendtential-crisis

2018. 5. 16. 22:48


분석

 해당 문제는 기본적으로 소스를 제공하는 문제이다. 여기에서 보면 알 수 있듯, 우리는 flag.php 의 contents를 읽어야 플래그를 획득할 수 있다. 



http://d4a386ad.quals2018.oooverflow.io/essays.php 여기에서 Essays를 작성할 수 있고, 현재 자신이 작성한 문제를 볼 수 있다. 이런 식(http://d4a386ad.quals2018.oooverflow.io/essays.php?preview&name=601c1c69cccb89b6651d)으로 파일을 읽을 수 있는데, name 값에 조금만 퍼징을 해보면 알겠지만, http://d4a386ad.quals2018.oooverflow.io/essays.php?preview&name=../../../../../../../etc/passwd 이런 식으로 Local File을 read할 수 있는 취약점이 있다. 


대회 중의 삽질 

 일단 우리 팀은 처음에 Local File Read 를 이용해서 권한을 따든 뭘 하든 하려고 노력하였다. 그것을 하다가 삽질을 한 것이 php.ini, source_view, mydb.db 파일등등,,,ㅋㅋ 왜 계속 삽질했는지..ㅋㅋ (view-source:http://d4a386ad.quals2018.oooverflow.io/essays.php?preview&name=../../../../../../../var/www/html/login.php, http://d4a386ad.quals2018.oooverflow.io/essays.php?preview&name=../../../../../../../var/lib/mydb/mydb.db )
 가장 가능성이 있었던 것은 mydb.db 를 읽어서 1번 권한의 정보를 확인하는 것이었다. 하지만, 비밀번호가 hash 된 후 저장되어있고, salt 값을 알 수는 있지만 우리가 갖고 있던 rainbow table로는 복구가 안된다는 것이 함정이었다. 

취약점

 취약점은 mydb.so 를 보면 알 수 있다. 전형적인 webnable 문제이다. snprintf 함수는 bof 취약점을 막으려고 존재하지만, 역설적이게도 해당 문제에서는 snprintf 함수를 이용해서 exploit 하면 된다. 

 취약점은 로그인 부분에 존재한다. 대회가 끝나갈 무렵, 주창이와 나는 snprintf로 길이가 길면 씹히는 것을 이용해서 SQL Injection을 계속 시도했었으나, 거기에서 조금만 더 삽질을 해볼걸 너무 아쉽다. 


mydb.so 파일을 보면 j_get_user_id 라는 함수를 호출해서 DB에서 뭔가 값을 가져오는 것을 볼 수 있다. 



해당 함수는 get_user_id 로 점프한다. 



그리고 아래에 조금 간단한 소스가 있다. 원래 v5로 되어있을 table 변수에는 users 라는 테이블명이 들어간다. 왜 대회 때 굳이 출제자가 테이블명을 변수에 넣어놨을까 생각을 조금이라도 해보았다면 본선 진출이었는데...ㅠㅠ 


snprintf를 통해서 sql 을 완성시킨다. 여기에서 table과 username 값을 보자. 



생각보다 멀지 않은 곳에 sql 과 table 변수가 존재한다. 

떨어진 길이는 112 byte이다. 



근데 snprintf를 보면 305 byte 를 받는다. 우리는 bof 를 일으켜 table 값을 조작할 수 있다. 

Exploit 

 login 할 때 id에 "A" * 112 를 넣고 뒤에 테이블 users 를 넣으면 sql은 `select * from users where username='AAAAA ... '` 이 된다. 따라서 뒤에 limit 1을 추가하고 주석을 추가한다. -- -

 따라서 최종적인 Exploit code는 다음과 같다. 


AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAusers limit 1-- -

flag : ooo{IMHO, Hell is other people AND other people's code}



이번 문제를 통해서 웹너블이 재밌다는 것을 처음 알았다.