[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 작성하겠습니다.

[H3X0R CTF 2016]

Web_10

cmp



대회 초중반쯤 공개 된 10점짜리 web 문제입니다. 친구들이랑 저녁밥 먹고 다시 들어와 보니 공개 되어 있었죠.. 확인 해 봅시다.


패스워드를 입력하는 text box와 submit 버튼 하나가 있습니다.

여기에 아무 문자나 입력을 하고 submit 해 봅시다.




A를 submit 해 보았더니 2라는 결과값을 뱉어냈습니다.



d를 입력 했을 때는 -33이 나왔습니다.


PHP strcmp() 함수의 반환값의 특성을 이용한 문제인 것 같습니다. 이 문제에서 str1은 flag, str2는 string을 가리키고 있는 것 같습니다.

아스키 코드 상으로 A보다 2만큼 위에 있는 문자는 C입니다. 



C를 입력해주니 15라는 값을 반환 해 주었습니다. C에 이어 다른 글자를 입력 해 주었을 때 위와 같이 양/음수로 나누어 출력을 해 주었습니다.



다른 문자들을 집어 넣어 2번째 문자는 0임을 알 수 있었습니다. 올바른 문자를 입력 했을 때 반환하는 숫자 값이 1씩 줄어드는 것을 보니, 이 값은 남은 string의 길이 같습니다. flag의 총 글자 수는 16인 것을 여기서 알 수 있었습니다.



사실 python으로 스크립트를 작성하여 브포를 돌려볼까도 생각 해 봤지만, 음수도 있고, 반환하는 숫자 값도 일정하지 않아 직접 손으로 브포를 했습니다...

(저 숫자가 남은 글자 수인 것을 알아 낸 타이밍이 4자 이상 찾았을 때라... 귀찮기도 했습니다.)



flag is C0MP4R3_15_900D!



SuNiNaTaS

Web Level10(Prob_23)




써니나타스 웹 카테고리의 마지막 문제입니다.

Hard Blind SQL Injection 문제라고 합니다.

이번에는 admin이라는 단어 자체가 필터링이 되어 있습니다. 이를 우회하여 admin 계정의 패스워드를 알아내는 것이 우리의 목표가 되겠습니다.



기본으로 주어지는 계정인 guest/guest 계정을 이용하여 주물럭거리다 보니 위와 같은 형태로 문자열 필터링 우회가 가능하다는 것을 알아냈습니다.



그래서 22번 문제와 동일한 방법으로 admin 계정의 pw 길이를 먼저 알아냈습니다.



그런데 쿼리를 작성하다 보니 자꾸 No Hack. 필터링이 걸리기에 확인을 해봤더니 역시나 쿼리 길이 제한이 있었습니다.

우와 같이 30byte까지는 허용 범위이지만



30byte를 넘어가는 순간 No hack을 뱉어내고 종료시킵니다. 따라서 우리는 30byte 이내의 쿼리를 작성해야 하는 상황이 됩니다.



한참 고민하던 중 22번과 다르게 23번 문제는 or 이 필터링 되지 않았다는 것을 알고 바로 이용했습니다.

substring, substr이 필터링 되기 때문에 이를 우회하기 위해 left 함수와 right 함수를 함께 사용하여 기능을 구현했습니다.

또한 쿼리를 작성하다보니 계속 30byte를 넘겨서 고민을 계속 해본 결과 위와 같은 형태의 쿼리문이 완성되었습니다.



딱 30byte



바로 python으로 브포 코드를 작성하여 key값을 찾아냈습니다.



SuNiNaTaS web level all clear!

'Wargame > SuNiNaTaS' 카테고리의 다른 글

SuNiNaTaS System Level2(Prob_24)  (0) 2016.05.10
SuNiNaTaS System Level1(Prob_16)  (0) 2016.05.10
SuNiNaTaS Web Level9(Prob_22)  (0) 2016.05.09
SuNiNaTaS Web Level8  (0) 2016.05.09
SuNiNaTaS Web Level7  (0) 2016.05.09

SuNiNaTaS

Web Level9(Prob_22)



9번째 문제입니다. Blind SQL Injection을 이용한 문제 풀이인데, 소스를 확인 해 보니 admin의 pw를 알아내는 것이 목표라고 합니다.


위와 같이 id에 admin'--, pw에 아무 값이나 넣어주면 pw 부분이 주석 처리 되어 바로 로그인이 가능해집니다.



이를 이용하여 and 뒤의 값을 적절히 변형시켜주면 참과 거짓일때의 반응이 다르다는 것을 알 수 있습니다.



참일때는 OK admin, 거짓일때는 false를 뱉어냅니다.



len 함수를 이용하여 pw의 길이를 확인 해 보니 10글자인 것을 알 수 있었으며



substring 함수를 이용하여 pw의 값을 한 글자씩 끊어서 판별 할 수도 있습니다.



python 스크립트를 이용하여 bruteforcing으로 키값을 알아내는 코드를 작성했습니다.



최종 값이 나오면 Auth 페이지에서 인증하면 됩니다.






References

 - Zairo(http://zairo.tistory.com/entry/SuNiNaTaS-Challenge-Level-22)

'Wargame > SuNiNaTaS' 카테고리의 다른 글

SuNiNaTaS System Level1(Prob_16)  (0) 2016.05.10
SuNiNaTaS Web Level10(Prob_23)  (0) 2016.05.10
SuNiNaTaS Web Level8  (0) 2016.05.09
SuNiNaTaS Web Level7  (0) 2016.05.09
SuNiNaTaS Web Level6  (0) 2016.05.09

SuNiNaTaS

Web Level8




8번째 문제입니다.

얼핏 봐서는 SQLi 문제같지만... 소스코드를 확인 해 보니 아닌 것을 알아챘습니다.




아래 힌트에 패스워드는 0부터 9999까지라고 나와 있기에... 이것은 브루트포싱을 이용한 무작위 대입으로 풀이하는 것이 맞다고 생각했습니다.



그래서 우리들의 영원한 친구 파이썬을 이용하여 브포 코드를 작성했습니다.

Password Incorrect! 문구가 나오지 않을 때까지 돌리는 코드입니다.

그리고 화장실 갔다왔습니다.



패스워드가 7707일때 AuthKey를 뱉어내네요.

'Wargame > SuNiNaTaS' 카테고리의 다른 글

SuNiNaTaS Web Level10(Prob_23)  (0) 2016.05.10
SuNiNaTaS Web Level9(Prob_22)  (0) 2016.05.09
SuNiNaTaS Web Level7  (0) 2016.05.09
SuNiNaTaS Web Level6  (0) 2016.05.09
SuNiNaTaS Web Level5  (0) 2016.05.09

SuNiNaTaS

Web Level7




7번째 문제입니다. 들어오자마자 아이유가 반겨주네요... 좋습니다.

아래로 조금 내려보니 YES라는 버튼이 있는데... 한번 눌러보도록 하죠.


버튼을 눌러보니



느리답니다...

YES 버튼이 아래 있기 때문에 손으로는 누르기 어려울 것 같습니다.

소스를 한번 확인 해 보도록 하죠.



js로 Tab과 F5를 막아놓았네요. 두 번째의 else if는 컨트롤R, N을 막고 있습니다. 컨트롤R은 F5와 동일한 기능을 하고, 컨트롤N은 새 창 띄우기를 막아 놓은 듯 합니다.

아무튼 탭과 새로고침을 통해 YES버튼을 누르는 것은 포기하는 편이 좋을 것 같습니다.

아래의 힌트를 보니 Faster and Faster, 최대한 빠르게 눌러보라고 합니다. 우리 손으로는 힘들 것 같으니, 프로그램의 도움을 받아보도록 하죠.



header에 referer를 넣어 web07.asp를 거치지 않고 바로 web07_1.asp로 들어가보았지만, 결국 실패하여.. web07.asp를 거쳐 web07_1.asp로 들어가는 코드를 작성했습니다.


(작성 하고 나서 수정하다보니 알게 된 것인데, 굳이 POST 요청을 때리지 않아도 키 값은 나오는 듯 합니다. req2에서 param 데이터는 굳이 넣지 않아도 무방합니다.)



짠! 키값을 뱉어내주었습니다.

'Wargame > SuNiNaTaS' 카테고리의 다른 글

SuNiNaTaS Web Level9(Prob_22)  (0) 2016.05.09
SuNiNaTaS Web Level8  (0) 2016.05.09
SuNiNaTaS Web Level6  (0) 2016.05.09
SuNiNaTaS Web Level5  (0) 2016.05.09
SuNiNaTaS Web Level4  (3) 2016.05.07

SuNiNaTaS

Web Level6




6번째 문제입니다. Hint와 reference 글을 읽어보면 README 글을 열람하라는 내용과, 인코딩 및 디코딩을 지원해주는 http://tools.web-max.ca/encode_decode.php 웹페이지 URL이 적혀있습니다. README 글을 클릭 해 보면 아래와 같은 창이 나타납니다.



파란 글씨로 SQL Query가 써져있는데, Single Quotation을 이용한 SQL Injection을 통해 간단하게 인증을 우회 할 수 있을 것 같았습니다.

그래서 위 그림과 같이 query를 날려주었습니다.(1' or 1=1#과 같은 쿼리를 날려 줄 수도 있지만, =과 # 필터링으로 인해 like와 --을 사용했습니다.)




Congratulation!!

Auth_key를 뱉어내길래 이 키로 바로 Auth 메뉴에 넣어줬더니 계속 틀린 값이라고 합니다... reference 글에 나타나있는 대로 뭔가 인코딩이 필요할 것 같아 base64, sha1, md5 등 인코딩을 해서도 날려봤지만 역시 인증이 되지 않았습니다.

한참 고민하던 중, 몇 번 다시 돌려보니 위 팝업창이 뜬 이후 http://suninatas.com/Part_one/web06/view.asp?idx=3&num=3&passcode=wkdrnlwnd 이라는 URL로 요청을 때리는데, 접근 거부 팝업이 뜨는 것을 확인했습니다.

그래서 한 단계가 더 있는 것을 깨닫고, 쿠키를 확인 해 봤더니 쿠키 중 auth_key라는 값이 있었습니다.

이 곳에 우리가 찾아낸 key값을 집어 넣는 듯 합니다.



이 auth_key 값을 suninatastopofworld!로 넣어주었더니 그래도 안되길래... base64, sha1, md5 등 인코딩을 하다 보니 md5 hash 값을 넣어 주었을 때 해당 글이 읽혔습니다.



저는 크롬 확장프로그램 중 하나인 EditThisCookie 툴을 이용하여 쿠키를 변조 해 주었습니다.



접근 거부가 뜨던 웹페이지가 정상적으로 접속이 되고, KeyFinding^^라는 본문 내용을 담고 있는 페이지가 나왔습니다.



소스를 확인 해 보니, 시작 부분에 KEY_HINT가 Rome's First Emperor 라고 주어져있습니다.

찾아보니 로마의 첫 번째 황제는 아우구스투스였습니다.



구글링을 통해 아우구스투스의 라틴 이름을 Auth 메뉴에 박아주니 인증 되는 것을 확인하였습니다.



이번 문제는 게싱이 많이 포함되어 있는 문제였습니다. 힌트가 없었다면 풀이하기 많이 어려웠을 것 같습니다...

'Wargame > SuNiNaTaS' 카테고리의 다른 글

SuNiNaTaS Web Level8  (0) 2016.05.09
SuNiNaTaS Web Level7  (0) 2016.05.09
SuNiNaTaS Web Level5  (0) 2016.05.09
SuNiNaTaS Web Level4  (3) 2016.05.07
SuNiNaTaS Web Level3  (0) 2016.05.06

SuNiNaTaS

Web Level5




5번째 문제입니다. 문자열을 체크하는 웹페이지인데, 소스를 확인 해 보도록 하죠.



빨간 네모 박스를 보면 js가 패킹되어있는 것을 확인 할 수 있는데, http://jsbeautifier.org/ 에 넣어주면 깔끔하게 언패킹 됩니다.



PASS라는 함수가 선언이 되어있네요.

파이썬으로 복호화 루틴을 짜서 돌려보는 방법도 있지만, 개발자 도구의 콘솔 기능을 이용하여 바로 PASS의 결과값을 도출 해 내도록 하겠습니다.



힌트에 나와있는 수를 PASS 함수에 넣어주니 9c43c20c 라는 16진수가 나타났습니다.



해당 값을 check 해 주면 Auth Key를 뱉어줍니다.

'Wargame > SuNiNaTaS' 카테고리의 다른 글

SuNiNaTaS Web Level7  (0) 2016.05.09
SuNiNaTaS Web Level6  (0) 2016.05.09
SuNiNaTaS Web Level4  (3) 2016.05.07
SuNiNaTaS Web Level3  (0) 2016.05.06
SuNiNaTas Web Level2  (0) 2016.05.06

SuNiNaTaS

Web Level4






4번째 문제입니다. Plus 버튼과 User-Agent, Auth key가 명시되어있습니다. 아마 User-Agent를 조작하여 다른 이름으로 변환시키는 문제인 것 같습니다.

소스를 보도록 하죠.



맨 아래 힌트 부분을 확인 해 보니 Point를 50으로 만들고 'SuNiNaTaS'를 어떻게 하라고 나와있는데, 역시 User-Agent를 SuNiNaTaS로 바꾸도록 유도하는 문제인 것 같습니다.

파이썬으로 소스를 짜서 변조 해 보도록 하죠.



소스에서 알 수 있듯이, Plus 버튼을 누르면 web04_ck.asp로 넘어가게 되며, 여기서 Point를 1 더해주는 형식입니다. 그래서 총 60번을 돌리면서 Auth Key에 있는 '?????'가 문자열로 표시 되었을 경우 해당 response 값을 출력하는 스크립트를 작성했습니다.

하지만 이렇게 돌렸을 경우, Point가 한번에 50까지 오르지 않고 10씩 올라가는 것을 확인 할 수 있었는데, DoS를 방지하기 위해 10번 참조하면 쉬도록 만들어 놨나 봅니다.

총 5번 스크립트를 돌렸을때 아래와 같은 응답값을 뱉어냈습니다.



Auth Key의 값이 ?????에서 문자열로 바뀌었습니다.

'Wargame > SuNiNaTaS' 카테고리의 다른 글

SuNiNaTaS Web Level6  (0) 2016.05.09
SuNiNaTaS Web Level5  (0) 2016.05.09
SuNiNaTaS Web Level3  (0) 2016.05.06
SuNiNaTas Web Level2  (0) 2016.05.06
SuNiNaTas Web Level1  (0) 2016.05.06

SuNiNaTaS

Web Level3




3번째 문제입니다. 아무것도 주지 않고 공지사항 게시판에 글을 쓰라고 하네요.



소스를 확인 해 보니 역시 이곳에도 아무 힌트도 주어지지 않았습니다.

그렇다면 남은것은 써니나타스 웹페이지 자체의 공지사항에 글을 쓰라는 말이 되겠네요.



공지사항 게시판에는 Write 버튼이 없기 때문에 Q&A(FreeBoard)에서 글쓰기를 하여 해당 URL을 확인하였습니다.

http://suninatas.com/board/write.asp?page=1&divi=Free

위와 같은 형식으로 나와있는데, 공지사항의 경우 ~/list.asp?divi=notice 의 형태입니다.

그렇다면 여기서 divi=notice로 바꿔주면 NoticeBoard에 글을 쓸 수 있는 페이지가 나올 듯 합니다.


역시나, 해당 페이지가 나타났고 아무 내용이나 입력 후 Submit을 했더니 Authkey를 뱉어냈습니다.

'Wargame > SuNiNaTaS' 카테고리의 다른 글

SuNiNaTaS Web Level6  (0) 2016.05.09
SuNiNaTaS Web Level5  (0) 2016.05.09
SuNiNaTaS Web Level4  (3) 2016.05.07
SuNiNaTas Web Level2  (0) 2016.05.06
SuNiNaTas Web Level1  (0) 2016.05.06

+ Recent posts