[H3X0R CTF 2016]

Web+Pwnable_120

Simple_Test



120점짜리 Web+Pwnable 문제입니다.

문제를 살펴보기에 앞서, 이 문제는 Web+Pwnable임에도 불구하고 web문제를 우회하여 풀이 할 수 있었습니다..


Misc_1_mic_no_check : http://choiys.tistory.com/entry/H3X0R-CTF-2016-misc1micnocheck


위 1점짜리 문제를 풀이할 때 ;sh를 이용하여 쉘을 띄워 문제를 풀이하였습니다.

그런데 여기서 find / -name flag 2>/dev/null 명령어를 이용하여 검색을 하면 1점짜리 문제의 플래그 뿐만 아니라 다른 문제들의 플래그까지 검색이 가능했습니다.

물론 플래그에 접근 할 수 있는 권한이 없었지만...

디렉토리의 _solved를 빼면 해당 문제의 디렉토리가 나온다는 것은 쉽게 유추 할 수 있었습니다.

그래서 Simple_Test_solved에서 _solved를 뺀 디렉토리를 들어가면 Simple_Test 바이너리가 기다리고 있으며...

실행까지 됩니다.

웹을 풀지 않아도 바이너리에 접근 가능했던거죠.



잡설은 여기까지.. 먼저 웹 문제를 확인 해 봅시다.



simple_sqli.php가 나오는데, sql injection을 통해 로그인을 우회하라는 것 같습니다.



소스를 확인 해 보니 id와 pw의 포맷을 알려주고 있습니다.



guest/guest로 입장 했을 때의 화면이며, admin으로 접속을 해야합니다.

위에서 pw의 포맷을 알려주었으니 그대로 써먹어봅시다.

pw에 guest')-- 를 넣어주면 guest로 로그인이 됩니다.

따라서 a')||1-- 를 넣어줘도 guest로 로그인이 됩니다.

그렇다면 여기서 생각 할 수 있는것은, 첫 번째 row에 guest가 있다고 가정했을 때 2번째 row에 admin이 있을 것입니다.


a')||1 limit 1,1-- 의 쿼리를 입력 했을 때 화면입니다.

limit 구문을 이용하여 2번째 row 값을 출력했더니 예상대로 admin으로의 로그인이 성공했으며, base64로 인코딩 된 문자열이 나타났습니다.



이 값을 decoding 하면 nc로 접속 할 수 있는 ip와 port가 나타납니다.


여기서 이 문제의 취약한 부분이 나타나는데, 문제마다 모두 ip가 같으며, 50001 ~ 50005번 등의 포트를 사용했습니다.

이로 미루어 보았을 때 웹 문제를 풀지 않고 단순 게싱으로도 pwnable 문제로 바로 넘어 갈 수 있습니다.



해당 문제를 확인 해 보니, 바이너리의 소스코드를 보여주는 프로그램이 실행되었습니다. 마지막에 바이너리를 받을 수 있는 구글 드라이브 url이 있으니, 문제를 받아줍시다.



checksec.sh로 Simple_Test 바이너리를 확인 해 보니 NX를 제외한 모든 보호 기법이 해제되어있습니다.



소스는 source 변수가 바이너리를 실행했을 때 나타나는 소스코드가 들어있는 변수입니다.

따라서 stdout으로 소스코드를 출력해주고, read 함수로 stdin으로 100만큼의 버퍼를 읽어들입니다. 하지만 buf 변수는 12바이트의 공간을 가지고 있기 때문에 BOF가 가능한 바이너리라고 볼 수 있습니다.


-----------------------------------------------------------------------------

이 문제는 CTF 도중 풀지 못했던 문제입니다.

하지만 H3X0R 페이스북 페이지에 올라온 송사리님의 WriteUp을 확인 했을때는 NX가 걸려있지 않다고 했는데...

제가 대회중에 확인했을 때 바이너리는 NX비트가 걸려있어 스택에서 쉘코드를 실행 할 수 없는 상태였습니다.

친구가 송사리님과 H3X0R 페이지 관리자분께 사실여부 파악을 위해 문의를 넣은 상태이며, 결과가 나오는대로 WriteUp 작성하겠습니다.

+ Recent posts