Wargame.kr

Web_700

ip log table




700점짜리 문제도 거의 끝나가네요. Blind SQL Injection을 이용하여 풀이하는 문제인 것 같습니다.

바로 문제를 확인 해 보도록 하죠.


문제에 접속 해 보니 상단에 admin 계정으로 로그인 할 수 있는 페이지로 접근 할 수 있는 버튼이 있고, 아래 테이블에는 idx와 함께 IP가 있습니다.

해당 테이블의 항목들을 클릭하면 아래와 같은 log time이 나타납니다.




이 log time은 문제 페이지에 접속한 당시의 서버 시간을 나타내는 것 같습니다.

그리고 Request 때리는 부분을 확인해봤더니 chk.php 페이지로 POST 요청을 날려주는데, 파라미터로 idx를 같이 날려줍니다.

이 idx가 위에서 확인했던 log time을 구별해주는 지표가 됩니다.

여기서 생각 할 수 있는것은 이 idx 파라미터가 전달 될 때 select 쿼리를 사용할텐데, 여기에 single quotation이 없는 등의 코딩 실수가 있을 경우 SQL Injection이 가능할 것입니다.



그래서 위와 같이 burp suite를 이용하여 idx 파라미터에 select문을 사용하여 table명을 알아내는 코드를 짰더니, 참과 거짓에 따라 다른 값이 나타났습니다.

(chk.php 페이지에서는 idx가 문제 페이지에 나타나있는 테이블에 존재하지 않는 경우 1970년 1월 1일자로 나타납니다.)

따라서 이를 이용하여 Blind SQL Injection을 먹일 수 있습니다.



python으로 테이블명을 알아 낼 수 있는 스크립트를 작성했습니다.

돌려보도록 하죠.



페이지 내에 sleep문이 적용되어있는지 약간 느린 반응을 보여줬습니다. 이 11글자 알아내는데 30초가 넘게 걸렸습니다...

아무튼 limit의 숫자를 늘려가며 admin_table이라는 테이블을 알아냈습니다.

이 테이블 안에 아마도 admin 계정의 id와 pw를 알아 낼 수 있는 컬럼이 있을 것입니다.



위에서 사용했던 payload.py를 복사하여 약간 내용을 수정 후 column.py로 바꾸고 컬럼 값을 찾는 스크립트를 돌려봤습니다.

이 또한 limit 값을 늘려가며 찾아보았더니 id와 ps라는 컬럼을 찾아 낼 수 있었습니다.

이제 이를 이용하여 admin 계정의 id와 pw를 알아내면 될 것 같습니다.



id는 blue_admin



pw는 0h~myp4ss!인 것을 알아냈습니다.

이제 이를 admin 페이지에 접속하여 로그인 해 보도록 하죠.






짠! flag를 찾아냈습니다.

'Wargame > Wargame.kr' 카테고리의 다른 글

[Wargame.kr] Web_800_QnA  (0) 2016.05.27
[Wargame.kr] Web_700_php? c?  (0) 2016.05.27
[Wargame.kr] Web_700_lonely guys  (0) 2016.05.26
[Wargame.kr] Web_700_dmbs335  (0) 2016.05.26
[Wargame.kr] Web_650_crack crack crack it  (0) 2016.05.25

Wargame.kr

Web_650

crack crack crack it



.htaccess를 크랙하는 문제라고 합니다.



문제에 접속하면 .htpasswd 파일을 받을 수 있는 링크와 텍스트박스, 인증 버튼이 있습니다.

패스워드는 G4HeulB로 시작하며, 알파벳 소문자와 숫자로만 이루어져있다고 합니다.



htpasswd 파일을 받으면 HTTP의 Basic Authentication과 같은 형태의 아이디 및 패스워드가 있으며, 패스워드 부분은 md5 crypt로 hash 되어있습니다.

이는 john the ripper라는 프로그램으로 패스워드를 크랙 할 수 있습니다.



해당 프로그램의 charset을 python을 이용해 출력하는 스크립트를 짰습니다.



위 스크립트를 이용하여 john the ripper 프로그램을 실행시키면 뒤의 문자열을 알아 낼 수 있습니다.



짠!





References

- God of Webhacking Zairo(http://zairo.tistory.com)

'Wargame > Wargame.kr' 카테고리의 다른 글

[Wargame.kr] Web_700_lonely guys  (0) 2016.05.26
[Wargame.kr] Web_700_dmbs335  (0) 2016.05.26
[Wargame.kr] Forensics_650_img recovery  (0) 2016.05.24
[Wargame.kr] Misc_650_pyc decompile  (0) 2016.05.23
[Wargame.kr] Web_650_web chatting  (0) 2016.05.23

Wargame.kr

Misc_650

pyc decompile



650점짜리 문제입니다. 정확한 분야를 정하기가 애매해서 Misc로 지정했습니다.

문제를 확인해보죠.



문제 페이지에 접속하면 서버 타임과 함께 bughela.pyc를 받을 수 있는 링크가 있습니다.

pyc파일을 받은 후 Easy Python Decompiler 툴을 이용하여 .py 파일로 변환시켜줬습니다.



bughela.py입니다.

소스를 확인해보니 %m/%d/HJEJSH 포맷으로 현재 로컬 타임을 받아옵니다.

그리고 start와 end 부분은 로컬 시, 로컬 분을 연산 한 결과로 집어 넣어줍니다.

하지만 로컬 타임과 서버 타임이 약 8분정도 차이나는 것을 확인 할 수 있습니다.



따라서 위와 같이 약간 변형을 시켜줍시다.

flag와 ok와 다를 때 die 함수로 가는 부분을 return ok로 바꾼 이유는 처음 함수에 접근했을 때 flag 값을 받아오기 위함입니다.



위는 bughela.py에서 GIVE_ME_FLAG 함수를 한번 호출하여 flag에 해당하는 값을 얻어오고, 그 값을 웹페이지에 요청하는 스크립트입니다.

5번째 라인의 두번째 GIVE_ME_FLAG 함수는 테스트를 위해 추가한 코드이니 신경 쓰지 않아도 무방합니다.



짠!

Key 값을 뱉어주네요.

'Wargame > Wargame.kr' 카테고리의 다른 글

[Wargame.kr] Web_650_crack crack crack it  (0) 2016.05.25
[Wargame.kr] Forensics_650_img recovery  (0) 2016.05.24
[Wargame.kr] Web_650_web chatting  (0) 2016.05.23
[Wargame.kr] Web_600_SimpleBoard  (0) 2016.05.21
[Wargame.kr] Web_600_tmitter  (0) 2016.05.20

Wargame.kr

Web_650

web chatting


650점짜리 문제입니다. 이번에도 SQLi 문제라고 하네요.

개발자의 관점에서 문제를 풀어보라고 합니다. 문제 확인 들어가봅시다.



BlueCHAT 프로그램이 나오네요. ID를 입력하고 join 해 봅시다.




채팅 프로그램이 나타납니다. 왼쪽 텍스트박스에 입력한 ID가 표시되고, 오른쪽 텍스트박스에 문자열을 입력하고 say를 누르면 위와 같이 채팅창에 글이 올라오는 형태입니다.

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



xmlhttp를 이용한 AJAX를 구현 해 놓은 채팅으로 보입니다.

say를 누르면 chatlog.php에 data파라미터로 문자열이 인코딩 되어 들어가면서 서버에 저장이 됩니다.

그리고 1초간의 인터벌을 두고 채팅 로그를 가져오네요.

가져올 때 t 값과 ni 값을 가지고 값을 불러오는데, t는 크게 관련이 없는 변수인 것 같고, ni가 중요한 변수가 됩니다.

ni는 아래에서 다시 언급하겠지만, 채팅을 할 때 해당 글이 서버에 저장된 index의 값입니다. 



blueh4g_js.js입니다. 이 소스 또한 크게 신경 쓸 부분은 아닌 것 같습니다. get_Cookie 함수에서 get_Cookie('chat_id') 등을 입력하면 채팅에 설정된 id가 나타난다는 것만 알고 있으면 될 것 같습니다.(실제 문제 풀이에는 쓰이지 않는 함수였습니다.)



위에서 확인했던 chatlog.php?t=1을 접속했을 때의 화면입니다. 13828은 마지막으로 저장했던 index+1, 즉 앞으로 저장 될 ni의 값입니다.



그렇기 때문에 chatview.php에서 ni의 값을 13827(13828-1)로 입력해주면 마지막으로 채팅했던 값이 반환되며



그 이전의 값을 입력하면 최근 채팅부터 그 index에 해당하는 값까지 모두 출력이 됩니다.



여기서 select문을 사용하는 것 같은 느낌이 들어, and와 or문을 적절히 이용하여 request를 날려보았더니, 역시나 쿼리가 먹힙니다.



그렇다면 위와 같이 if문을 이용하여 SQLi를 시도 할 수 있을 것 같습니다.



파이썬으로 테이블 명을 찾는 스크립트를 작성했습니다.

42번째 index에 우리가 찾고자 하는 테이블 명을 알아 낼 수 있었습니다.



딱 봐도 여기에 플래그가 있다고 광고하는듯한 테이블입니다.



다음으로 컬럼 값을 찾아보았습니다. 이번에는 486번째 인덱스에 우리가 찾는 컬럼이 있었습니다.



README! 이전의 SimpleBoard 문제가 생각이 나네요.



이제 flag 값을 찾아내는 스크립트를 작성해봅시다.

chat_log_secret 테이블에서 readme 칼럼 값을 빼옵니다.



그러면 Key 값을 얻어낼 수 있습니다.

'Wargame > Wargame.kr' 카테고리의 다른 글

[Wargame.kr] Forensics_650_img recovery  (0) 2016.05.24
[Wargame.kr] Misc_650_pyc decompile  (0) 2016.05.23
[Wargame.kr] Web_600_SimpleBoard  (0) 2016.05.21
[Wargame.kr] Web_600_tmitter  (0) 2016.05.20
[Wargame.kr] Web_550_type confusion  (0) 2016.05.19

Wargame.kr

Web_500

fly me to the moon





이번에는 자바스크립트로 만들어진 게임이네요. 치팅 방지 시스템을 우회하여 게임을 클리어하는 것이 우리의 목표입니다.




저기서 클릭하여 게임을 시작하고, Score를 31337점까지 올리는 것이 우리의 목표입니다.

물론 직접 31337점을 만들어도 되지만... 힘들잖아요?

소스를 확인해봅시다.



윗부분에는 style에 관련된 코드이고, 우리에게 중요한 부분은 역시 스크립트쪽이죠!



packing 되어 있는 자바스크립트를 언패킹 해주는 웹페이지에 복사하여 언패킹 해봅시다. 여기에 추가적으로 JSBeautifulier를 적용하여 예쁘게 만들어줍시다.




sublime text로 열어 확인해보는데, 중간에 type, url, data를 어딘가로 보내는 부분이 있습니다. 수상하지 않나요?

그리고 token이 변수이기 때문에 어디서 값을 할당받는지 확인해봅시다.



updateToken 함수에서 할당을 해주네요. 이제 이 값들이 어떤 값인지 확인 해 봅시다. _0x32bb 배열은 스크립트 시작부분에 고정값으로 선언되어있습니다.



첫 번째로 봤던 코드에서 type은 POST, url은 high-scores.php, data는 token=토큰&score=점수(BTunnelGame[getScore]()) 인 것을 알 수 있습니다.

더불어, 토큰은 token.php에서 받아오네요.



token.php에 접근하면, 이 때마다 랜덤한 숫자 값이 할당됩니다.




하지만 할당받은 직후 그 값으로 high-scores.php에 접근하면 PARAM ERROR가 나타나네요. token 부분이 아마 시간에 따라 값이 변화하며, 일정 시간 안에 해당하는 토큰을 high-scores.php에 넣어줘야만 flag가 출력되는 형식인 것 같습니다. 이 부분이 바로 prevent cheating system인 것 같네요.

python으로 스크립트를 작성해줍시다.




token.php에 먼저 접근하여 token을 받아 준 후, high-scores.php에 접근하여 score 값을 넘겨줍시다.




Flag를 깔끔하게 뱉어주네요.


'Wargame > Wargame.kr' 카테고리의 다른 글

[Wargame.kr] Web_500_md5 password  (0) 2016.05.18
[Wargame.kr] Web_500_md5_compare  (2) 2016.05.18
[Wargame.kr] Web_500_DB is really GOOD  (0) 2016.05.17
[Wargame.kr] Web_450_login filtering  (0) 2016.05.17
[Wargame.kr] Web_450_WTF_CODE  (0) 2016.05.17

[H3X0R CTF 2016]

Misc_20

is_this_real_hex



대회 시작부터 공개되었던 20점짜리 misc문제입니다. 초반에 다들 이 문제만 푸셨었더라구요..

무슨 문제인지 확인 해 봅시다.



문제를 다운받으면 26바이트짜리 파일이 있습니다.



출력 해 보니 깨진 문자를 포함한 스트링이 출력됩니다.



문제가 hex가 관련되어있으니 hexdump로 hex값을 뽑아봅니다.



python으로 해당 hex값을 1부터 더해주는 스크립트를 작성해봤습니다.



더하는 결과값으로는 플래그에 관련된 값을 찾을 수 없었습니다.



이제 빼봅시다.



모든 hex값에서 10을 뺐을 때

 

fl[g iy ^ong\in iy yo \}z_ 


라는 문자열이 출력되었습니다.

뭔가 flag 관련된 문자열인듯 하여 이 값을 파보았습니다.



[는 a가 될 것이고, y는 s가 되는 것 같습니다.

그리고 원래의 hex값이 95일 때 _가 됩니다.(문제 힌트에 format is FLAG_IS_THIS_FLAG 와 같이 주어졌습니다.)

확인 해 본 결과, 3, 7, 9, 13, 18, 20, 23, 24, 25, 26번째 자리가 변환되어있었으며, 각각 -10 한 결과에서 +6이나 -6만큼 해줄 때 알파벳으로 출력이 되었습니다.

위 코드처럼 직접 인덱스를 박아줘도 되지만, +6, -6 한 결과가 알파벳의 범위에 있을 경우 출력하는 코드로 작성해도 무방합니다.



위 플래그 값을 대문자로 입력 해주면 됩니다.


FLAG_IS_DONGBIN_IS_SO_CUTE

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 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

+ Recent posts