ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 해커 팩토리(Hacker Factory) - 웹 워게임 초급해킹 문제-7 풀이 과정
    워게임(Wargame)/해커 팩토리(Hacker Factory) 2020. 2. 16. 17:45

     

    해커 팩토리(Hacker Factory) - 웹 워게임 초급해킹 문제-7 풀이 과정

     

    워게임 사이트인 해커 팩토리의 초급해킹 문제-7에 대해 풀어보고자 한다.

    해커 팩토리의 정식 사이트는 https://hackerfactory.co.kr/ 이다.

     

    [그림 1] 풀이 대상인 초급해킹 문제-7

     

    풀이 과정은 다음과 같다.

     

    1. 문제유형을 확인한다.

    먼저 문제풀이에 앞서 문제를 확인한다.

    좌측의 [웹워게임] - [초급해킹] - [문제-7] 클릭하여 문제를 확인하면, 관리자가 작성한 비밀 게시글을 읽는 문제 유형임을 알 수 있다.

    문제 6과 비슷하지만, 문제 6에서 한 단계 보안 조치가 된 형태의 문제유형 임을 예상할 수 있다.

     

    [그림 2] 초급해킹 문제-7 확인

     

    [그림 2]에서 하단의 [문제접속]을 클릭하면 아래와 같은 홈페이지를 확인할 수 있다.

     

    [그림 3] 문제-7 접속 화면

     

    우측 상단의 [Board] 메뉴를 클릭하면 2001번 글에 관리자가 비밀글로 작성한 게시글을 확인할 수 있다.

     

    [그림 4] 비밀 게시글 확인

     

    비밀 게시글을 클릭하면, 아래와 같이 패스워드를 입력하는 팝업창을 확인할 수 있다.

     

    [그림 5] 비밀글 클릭 시 출력되는 팝업창

     

    임의의 패스워드를 입력하면 아래 [그림 6]과 같이 일치하지 않는다는 메시지를 확인할 수 있다.

     

    [그림 6] 임의의 패스워드 입력 시, 출력되는 팝업창

     

    2. 비밀글 클릭 시, 웹 서버에서 전송하는 응답문을 웹 프록시 도구를 통해 확인한다.

    비밀글 클릭 시, 웹 서버에서 전송하는 응답문을 웹 프록시 도구인 Burp Suite를 통해 확인한다.

    아래 [그림 7]과 같이 응답문을 살펴보면, 자바 스크립트 소스코드를 확인할 수 있는데, 해당 소스코드를 통해 사용자의 입력한 패스워드가 올바른 패스워드인지, 잘못된 패스워드인지 구분한다.

     

    입력한 패스워드가 변수 EncryptReadKey의 값인 "iRAJHaTRiRAJHaLLFBOwrXoLF6j2rSXC"와 동일한지 비교 후, 동일하지 않으면 "패스워드가 일치하지 않습니다" 라는 팝업을 출력시키고, 동일하면 Submit()를 호출하고 있음을 알 수 있다.

     

    그리고, 사용자가 입력한 패스워드는 UserPasswordEncryptFunc()를 통해 암호화 또는 인코딩 과정을 거치고 있음을 추측할 수 있다.

     

    즉, UserPasswordEncryptFunc()를 소스코드를 확인하여, 어떠한 방식으로 암호화 또는 인코딩 하고 있는지 알아내는 것이 해당 문제의 핵심이다.

     

    [그림 7] 웹 서버에서 전송하는 응답문 내  자바 스크립트 소스코드

     

    3. UserPasswordEncryptFunc() 소스코드를 확인한다.

    비밀글 클릭 시, 웹 서버에서 전송되는 응답문 내 utill.js를 확인할 수 있다.

     

    [그림 8] utill.js 파일 확인

     

    utill.js 파일을 정적 접근을 통해 소스코드를 확인한다.

    소스코드를 살펴보면 UserPasswordEncryptFunc()가 존재하며, 인코딩을 수행하는 소스코드를 확인할 수 있다.

     

    [그림 9] utill.js 파일 소스코드 확인

     

    4. UserPasswordEncryptFunc() 소스코드를 확인한다.

    UserPasswordEncryptFunc()를 분석하여 임의의 값(input)이 입력되었을 때, 'iRAJHaTRiRAJHaLLFBOwrXoLF6j2rSXC' 값이 출력되는지 확인해보면 된다.

     

    UserPasswordEncryptFunc()는 입력값을 앞에서부터 1, 2, 3번째 자리를 읽어, 작성된 알고리즘을 통과하면 4개의 결과물로 출력한다.

    즉, 입력값이 1개여도 출력값은 4자리,

    입력값이 2개여도 출력값이 4자리,

    입력값이 3개여도 출력값이 4자리인 것이다.

     

    그리고 위 소스코드를 살펴보면, 입력값이 1개일 경우에는 출력값의 앞 2자리는 연산에 의해 임의 생성되지만 나머지 2자리는 C로 출력된다.

    입력값이 2개일 경우에는 앞 3자리는 연산에 의하여 생성되고, 나머지 1자리만 C로 출력된다.

     

    대략적으로 생성방법을 살펴본 뒤,

    파이썬 소스코드를 코딩하여, 입력값을 확인해보면 BestOfBestHackerFactory 임을 확인할 수 있다.

     

    아래는 문제풀이를 위해 작성한 파이썬 코드이다.

    # -*- encoding: cp949 -*-
    EncryptReadKey = "iRAJHaTRiRAJHaLLFBOwrXoLF6j2rSXC"
    _keyStr = "DUYZabcVWdQefGghijklmAnEFopqrHstKLuvXwRSxyz0IO12M34JN5B6789+PT/=C"
    output = ""
    index = 0
    
    while index < len(EncryptReadKey):
    	if index == 28:
    		for chr1 in range(33,126):
    			for chr2 in range(33,126):
    				enc1 = _keyStr[chr1 >> 2]
    				enc2 = _keyStr[((chr1 & 3) << 4) | (chr2 >> 4)]
    				enc3 = _keyStr[(chr2 & 15) << 2]
    				enc4 = _keyStr[64]
    
    				if EncryptReadKey[index] == enc1 and EncryptReadKey[index+1] == enc2 and EncryptReadKey[index+2] == enc3 and EncryptReadKey[index+3] == enc4:
    						output += chr(chr1) + chr(chr2)
    		index += 4
    		print(output)
    
    	else:
    			for chr1 in range(33,126):
    				for chr2 in range(33,126):
    					for chr3 in range(33,126):
    						enc1 = _keyStr[chr1 >> 2]
    						enc2 = _keyStr[((chr1 & 3) << 4) | (chr2 >> 4)]
    						enc3 = _keyStr[((chr2 & 15) << 2) | (chr3 >> 6)]
    						enc4 = _keyStr[chr3 & 63]
    
    						if EncryptReadKey[index] == enc1 and EncryptReadKey[index+1] == enc2 and EncryptReadKey[index+2] == enc3 and EncryptReadKey[index+3] == enc4:
    
    							output += chr(chr1) + chr(chr2) + chr(chr3)
    			index += 4
    			print(output)
    
    print("\nFinal result : %s" % output)

     

    아래는 파이썬 코드를 실행시킨 결과이다.

     

    [그림 10] 파이썬 소스코드 실행 결과

    5. 획득한 입력값을 게시글 패스워드로 입력한다.

    획득한 입력값을 게시글의 패스워드로 입력하면, 인증키를 확인할 수 있다.

     

    [그림 11] 획득한 입력값을 게시글 패스워드로 입력

     

    정상적으로 입력값을 입력하면, 아래와 같이 인증키를 확인할 수 있다.

     

    [그림 12] 인증키 획득 화면

     

     

    6. 획득한 인증키를 통해 인증을 시도한다.

    좌측의 [인증] 메뉴를 클릭 후, 인증키 입력을 통해 인증을 시도한다.

    인증이 정상적으로 완료되면 아래와 같은 화면을 확인할 수 있다.

     

    [그림 13] 초급문제-7 인증 완료 화면


    댓글

Designed by Tistory.