Wargame.kr

Web_500

md5 password



이번에도 md5에 관련 된 문제입니다.


단순하게 패스워드를 입력 받는 텍스트박스와 로그인 버튼이 있습니다.

무엇을 원하는 문제인지 모르니 get source 링크를 타고 들어가 소스를 확인 해 봅시다.




md5($ps, true)를 이용하여 풀이하는 문제네요.

md5($ps, true)는 md5 hash를 16진수로 리턴하는게 아닌, 바이너리로 리턴을 해줍니다.



위 블로그에 나온 대로 1' or '1같은 바이너리가 나오도록 만들어주는 md5 hash 값을 찾아내면 됩니다.

ex에 나온 숫자를 그대로 입력해줍시다.





References

- bbolmin(http://bbolmin.tistory.com/77)

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

[Wargame.kr] Web_550_type confusion  (0) 2016.05.19
[Wargame.kr] Web_550_strcmp  (0) 2016.05.18
[Wargame.kr] Web_500_md5_compare  (2) 2016.05.18
[Wargame.kr] Web_500_fly me to the moon  (0) 2016.05.17
[Wargame.kr] Web_500_DB is really GOOD  (0) 2016.05.17

Wargame.kr

Web_500

md5_compare


이번 문제는 md5를 비교하는 문제인 것 같습니다.

그냥 단순하게 다른 값을 가지고 비교를 하라고 하네요.




문제에 접속했을 때의 화면입니다. value1과 value2를 비교하는 폼이 있네요.

view-source를 클릭하여 소스를 확인 해 보도록 하죠.


v1은 ctype_alpha함수로 알파벳만 들어와야 하며, v2는 is_numeric 함수를 사용하여 숫자만 들어와야 합니다.

하지만 세 번째 if문에서는 md5로 hash한 값이 같아야만 chk 변수가 true로 남아있을 수가 있네요.




이는 php magic hash 취약점을 이용하여 우회 할 수 있습니다.

이는 문자열이 아닌 0e로 시작되는 값을 서로 비교할때, 문자열이 아닌 float형으로 인식하게 되면서 0의 지수형을 나타내는 변수로 바뀌게 됩니다. 그래서 0=0 꼴로 인식하게 되어 true를 반환하게 됩니다.





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

[Wargame.kr] Web_550_strcmp  (0) 2016.05.18
[Wargame.kr] Web_500_md5 password  (0) 2016.05.18
[Wargame.kr] Web_500_fly me to the moon  (0) 2016.05.17
[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_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

Wargame.kr

Web_500

DB is really GOOD



이번 문제는 게시판에 낚여 꽤 애먹었습니다... 삽질 끝에 플래그가......ㅠㅠ


DB에 관련된 문제같습니다. 시작하죠.




문제에 접속하면 다음과 같은 화면이 나오는데, admin을 입력해보니 admin에는 접근 할 수 없다고 나옵니다.

여기서 user 이름을 아무렇게나 작성해주면 게시판이 나오는데, 거기서 허우적대다가 몇시간을 날려먹었습니다... 문제 힌트대로 처음부터 Username을 파봤어야했는데..



입력 가능한 특수문자를 모두 넣어보던 중 / 를 입력했을 때 db connect 오류가 발생하는 것을 알 수 있었습니다.






위 두가지 오류로 알 수 있는 것은 /home/www/db_is_really_good/db/wkrm_username.db로 db가 생성된다는 것을 알 수 있습니다.

그렇다면 접근이 금지된 admin db를 확인 해 보면 뭔가 있을 것 같습니다.




바로 접근해서 db를 다운 받아줍시다.



DB오류에서 DB는 SQLite3라는 것을 알아냈고, SQLite browser를 이용하여 해당 db를 까보니 memo 테이블에 플래그에 관련된 메모가 하나 남아있었습니다.


해당 메모를 열어보면 flag를 뱉어내는 php 주소를 보여줍니다.

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

[Wargame.kr] Web_500_md5_compare  (2) 2016.05.18
[Wargame.kr] Web_500_fly me to the moon  (0) 2016.05.17
[Wargame.kr] Web_450_login filtering  (0) 2016.05.17
[Wargame.kr] Web_450_WTF_CODE  (0) 2016.05.17
[Wargame.kr] Web_450_flee button  (0) 2016.05.16

Wargame.kr

Web_450

login filtering




계정을 가지고 있지만 정지된 상태라고 합니다.

필터링을 우회 할 수 있는 지 알아보는 문제입니다.




소스를 확인 해 보면 mysql_real_escape_string 함수로 addslash를 하고 있습니다. 이로 인해 single quotation과 같은 sql 문에 영향을 끼칠 수 있는 특수문자는 제한이 되었습니다. sql injection을 이용하지 않고 id가 guest 또는 blueh4g일 때 flag를 출력해 주는 것 같습니다.




소스 아래에 주석으로 blocked 된 계정 정보를 알려주고 있습니다.



guest/guest로 로그인 했을 때의 화면입니다.

your account is blocked라는 메시지를 출력하고 끝나네요. 



여기서 ID 부분에 guest가 아닌 대문자를 추가 해 준다면, 쉽게 우회가 가능합니다.

원리는 MYSQL에서는 대/소문자 구분을 하지 않지만 php에서는 대/소문자를 구분하기 때문에 $id에는 대문자로 입력이 되지만, 쿼리문이 실행 될 때는 guest와 동일한 결과 값이 출력됩니다. 따라서 $id는 guesT이지만, 쿼리의 결과값인 $row['id']는 존재하기 때문에 플래그가 출력이 됩니다.

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

[Wargame.kr] Web_500_fly me to the moon  (0) 2016.05.17
[Wargame.kr] Web_500_DB is really GOOD  (0) 2016.05.17
[Wargame.kr] Web_450_WTF_CODE  (0) 2016.05.17
[Wargame.kr] Web_450_flee button  (0) 2016.05.16
[Wargame.kr] Web_300_QR CODE PUZZLE  (0) 2016.05.16

Wargame.kr

Web_450

WTF_CODE



웹 450점짜리 WTF_CODE입니다. 바로 시작합니다.



문제를 보니 또다른 프로그래밍 언어라고 합니다.



들어가보면 source_code.ws라는 파일을 다운받을 수 있는 링크가 하나 있네요. 다운 받아봅시다.



.ws 확장자로 뭔가 모스부호같은게 있습니다. 처음에는 모스부호로 착각하고 모스부호 해석기를 돌려봤으나... eeeeeeeee 이런식으로 알 수 없는 문자만 나오게 되어.. 다시 검색을 해봤더니, .ws 확장자를 가진 프로그래밍 언어가 있다는 것을 알게 되었습니다. 화이트 스페이스라는 프로그래밍 언어인데, 설명은 아래와 같습니다.



또 구글링을 해보니 해석기를 만들어 놓은 웹페이지가 있었습니다... 역시 세상은 넓고 능력자들은 많습니다.

바로 돌려줍시다.



WS -> JS로 바꿔주고, 이를 실행해줍시다.



바로 Key값을 뱉어줍니다.

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

[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_flee button  (0) 2016.05.16
[Wargame.kr] Web_300_QR CODE PUZZLE  (0) 2016.05.16
[Wargame.kr] Web_200_already got  (0) 2016.05.16

Wargame.kr

Web_450

flee button



450점짜리 문제네요. 바로 봅시다.



화면은 이렇지만 문제에 접속해서 마우스를 움직여보면 click me!라는 버튼이 마우스에서 멀찍이 떨어져서 이동합니다.

이를 클릭하는게 이 문제의 핵심입니다.

소스를 확인해보죠.



p8.js를 불러오네요.



맨 아래 escdiv() 함수에서 거리를 늘려주네요.

i 값과 sw 값이 늘어나지 않게 큰 값으로 넣어줍시다. 그리고 ax와 ay의 값도 0으로 바꿔주도록 하죠.



현재 마우스가 click me!에 있는 상태입니다.




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

[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
[Wargame.kr] Web_300_QR CODE PUZZLE  (0) 2016.05.16
[Wargame.kr] Web_200_already got  (0) 2016.05.16

Wargame.kr

Web_300

QR CODE PUZZLE



QR코드 관련 문제인 것 같습니다. 확인해보죠.



자바스크립트 퍼즐이라고 합니다.


접속 하니 QR코드가 우릴 반겨주네요. 퍼즐처럼 뒤섞여있습니다.

소스를 한번 확인해보죠.




저기가 수상해보이네요. 디코딩 해봅시다.



/img/qr.png라는 그림 파일을 불러오는 함수입니다.



접속 하니 퍼즐로 만들어지기 이전의 QR코드가 복원되었습니다.

스마트폰으로 스캔해서 접속 해 보면 FLAG를 얻을 수 있습니다.

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

[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
[Wargame.kr] Web_450_flee button  (0) 2016.05.16
[Wargame.kr] Web_200_already got  (0) 2016.05.16

Wargame.kr

Web_200

already got



Wargame.kr 첫 번째 문제입니다.


HTTP Response header를 볼 수 있는지에 대한 문제네요. 확인 해 봅시다.



우린 이미 키를 받았답니다.



받았네요.

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

[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
[Wargame.kr] Web_450_flee button  (0) 2016.05.16
[Wargame.kr] Web_300_QR CODE PUZZLE  (0) 2016.05.16

[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