URL은 다음과 같다.

http://suninatas.com/challenge/web13/web13.asp

 

Game 13

 

suninatas.com


해결책

들어가면 다음과 같은 화면이 우리를 반긴다.

특별한 상호작용은 없다. 혹시나 문제 출자자가 HINT를 주었나 주석을 보자

힌트는 다음과 같다.

 

"프로그래머의 잘못된 소스백업 습관"

 

뭐; 물론 요즘이야 소스코드 형상관리 도구(github 등)가 어마어마한 성능을 자랑하기 때문에, 믿고 맡기면 되지만. 우리 솔직해 지자. 귀찮으면 다 합쳐서 zip 파일에 때려밖고 HDD에 넣은 적... 있지 않으신가요? 자 download 받자 분명 그렇게 해두었을 거다.

  • https://suninatas.com/challenge/web13/web13.zip

zip파일을 다운로드할 수는 있는데, 패스워드가 lock 되어있다. 다행히도 zip안쪽에서 이름을 보면 

 

"압축비 번은 4자리 정수"라고 적혀있는 txt가 있다.

 

툴을 이용해서 가볍게 풀어주자 다음과 같은 파일을 얻을 수 있다.

저 TXT를 열면 한가지 힌트를 더 얻을 수 있다.

그렇구먼, 이미지에 특이한 게 있나 보면 문자열이 숨겨져 있다. BINTEXT를 써도 좋고 다른 도구들을 써도 좋다. 

예시로 whitehack1.jpg를 열어보면 이상한 문자열이 있다.

 

"first key : 3○○○○○○○"

 

인데, 이게 다른 파일들에도 동일한 방식으로 숨겨져 있다.

 

URL은 다음과 같다.

http://suninatas.com/challenge/web12/web12.asp

 

Game 12

 

suninatas.com


해결책 

직관적인 문제다. suninatas에 admin으로 로그인을 하는 것이 이번 문제의 목표이다.

아쉽게도 login credential을 탈취하는 문제는 아니고, suninatas.com의 루트 디렉터리 바로 아래 admin 디렉터리가 있다. 그걸로 들어가서 2 ke2 ke 하는 문제이다. 일단 아래와 같은 URL로 접속을 하면 QR코드를 확인할 수 있다.

  • http://suninatas.com/admin/

 

QR Code를 해석하자 필자는 아래 site를 이용했다.

  • https://zxing.org/w/decode.jspx

다음과 같은 admlogin.asp라는 새로운 URL를 얻을 수 있다.

  • http://suninatas.com/admin/admlogin.asp

들어가면 놀라운 화면이 우리를 반겨준다.

오마이갓. 일단 swf플래시 파일이다. 직접 경로 들어가 줘서 다운로드도 가능하고, code를 써서 다운로드해주셔도 되고, 개발자 도구를 이용해서 다운로드해도 된다. 혀튼 다운로드한 swf는 바로 decompile 해주자. 필자는 아래 사이트를 썼는데, 구글에 swf decompile 하면 널리고 널린 게 툴이다.

  • https://pdfrecover.herokuapp.com/swfdecompiler/

swf의 로그인 코드는 다음과 같다.

on(release){
   function receipt()
   {
      if(flashid != "admin" or flashpw != "myadmin!@")
      {
         flashmessage = "Wrong ID or PW";
         play();
      }
      else
      {
         flashmessage = "Auth : \"To---------------\"";
         play();
      }
   }
   receipt();
}

Auth Key를 확인할 수 있다.

 

URL은 다음과 같다.

http://suninatas.com/challenge/web09/web09.asp

 

Game 09

 

suninatas.com


해결책

다운로드하면 zip 파일을 할 수 있다. 압축해제부터 해주자. pw는 페이지에서 봤듯이 suninatas이다.

그렇다. SuNiNaTaS폴더안에는 Project1.exe라는 PE 파일이 있다. 리버싱 문제인 만큼 무언가 뚫어야 되는 느낌이다. 실행하면 다음과 같은 프로그램을 만날 수 있다.

으흠; Key를 찾아서 click하면 성공인 기분이다.

흔히 CTF에서 리버싱문제를 풀 때 가장 우선적으로 해볼 것은 프로그래머가 정적으로 적어둔 리터럴 문자열을 찾아보는 것이다. Entry Point도 찾을 수 있고, 운이 좋으면 하드 코딩된 Key도 얻을 수 있을 것이다.

 

필자는 X32dbg를 이용해서 찾아보았다.

https://x64dbg.com/#start

 

x64dbg

Built on open-source libraries x64dbg uses Qt, TitanEngine, Zydis, Yara, Scylla, Jansson, lz4, XEDParse, asmjit and snowman.

x64dbg.com

 

어렵지 않게 하드 코딩된 Key를 얻을 수 있었다. 이게 아마 곧 Auth Key일거 같다.

URL은 다음과 같다.

http://suninatas.com/challenge/web08/web08.asp

 

Game 08

 

suninatas.com


해결책

다음과 같은 로그인 창이 우리를 반겨준다.

늘상 그래 왔듯 코드에 힌트가 있을 것이다. 주석을 보자.

제일 아래부분에 힌트로 다음과 같이 쓰여있다.

  • Hint : login 'admin' password in 0~9999

어쩐지 pw필드가 네 자리밖에 안 들어가더라 다음과 같은 Python코드를 작성하자

### 8.py

from requests import *

if __name__=="__main__" :

    header = {"User-Agent" :"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36",}
    data = {"id":"admin"}
    cookie = {"ASP.NET_SessionId" : "자기꺼",
              "ASPSESSIONIDCSSBTATD" : "적어",
              "auth%5Fkey" : "주세용..."
              }

    url = "http://suninatas.com/challenge/web08/web08.asp"

    for i in range(10000) :
        data['pw'] = i
        res = post(url,cookies=cookie,data=data,headers=header)
        if(res.text.find("Password Incorrect!") == -1 ) :
            break
    print(res.text)

출력은 다음과 같다.

...

                    <input type="button" name="btn" value="Login" onclick="submit()" size="20"></td>
            </tr>
            <tr class="table_main" height="30">
                <td colspan="2" align="center" bgcolor="cccccc">Authkey : l3XXXXXXXXXXXXXXX</td>
            </tr>
        </table>
...

 

Auth Key를 찾을 수 있다.

 

URL은 다음과 같다.

http://suninatas.com/challenge/web07/web07.asp

 

Game 07

 

suninatas.com


해결책

들어가면 아이유 누님이 우리를 반겨준다.

영어로는 "이 분들을 좋아하시나요?'"라고 적혀있다. 조금 아래로 내려보면 [YES]라는 버튼을 찾을 수 있다.

눌러보면

너무 느리다고 한다. 주석을 보면 다음과 같은 힌트를 볼 수 있다.

빠르게 더 빠르게이다. 일단 다음과 같은 KeyCode는 금지되어있다.

  • event.KeyCode 116 : [F5]
  • event.KeyCode 9 : [Tab]
  • event.ctrlKey && event.keyCode = 78 : [Ctrl] + [n]
  • event.ctrlKey && event.keyCode = 82 : [Ctrl] + [r]

* [Ctrl] + [n], [r]은 금지로 코드가 짜여져 있긴 한데, alert()가 없다. 

쉬운 해결방법이다. 들어가자마자 [Console]에 document.frm.submit(); 치면 해결할 수 있다.

더 쉬운 해결방법은 배율을 줄여라, 줄바꿈 <br> 코드로 나누어둔 것이기 때문에.....

이렇다.

URL은 다음과 같다.

http://suninatas.com/challenge/web06/web06.asp

 

Game 06

 

suninatas.com


해결책

들어가면 한 페이지의 게시판이 우리를 반긴다. 게시글은 다음과 같다.

  • Hint : Reading suninatas's Writing!^^
  • Reference : https://md5hashing.net/
  • README : 아래 사진 참조
  • Waiting : 세상일들이 다 내뜻대로는 되지 않는다.. 기다라고 기다리자 때가 올 때까지...
  • 열공열공 : PoP짱!ㅋㅋ

README를 조금 자세하게 볼 필요가 있어 보인다. 

간단한 쿼리이다.

  • "select szPwd from T_Web13 where nldx = '3' and szPwd = '"&pwd&"'"

SQL Injection이라고 생각하고 일단 기본적인 공격 쿼리를 짜 보자.

  • 'or 1=1-- 

으흠; 쿼리 필터링이 있는 거 같은데, 등호를 막는 건지 작은따옴표를 막는 건지, 공격의 형태를 띄고 있는걸 막는건지, 판단을 할 필요가 있다. 다 보내보면 알 수 있는데, 등호만 막는다. 따라서 부등호를 사용해서 쿼리를 짜 보자

  • 1' or 2>1-- 

결과를 auth_key가 suninatastopofworld!로 받았는데 어디 써야 될지 모르겠다. 일단 아래 쓰여있는 "이제 이 글을 읽으실 수 있습니다."의 요청정보를 보자

그렇다. 쿠키에 auth_key가 있다. 보면 md5로 암호화되어있는 걸 알 수 있다. 위에 suninatastopofworld! 를 md5 돌린 값으로 바꾸어 보자

다음과 같은 "KEY_HINT"라는 친구가 나왔다. action이 Rome's First Emperor이다. 와우 검색 ㄱㄱ 찾을 수 있었다.

+ Recent posts