Hacking/[Web]Natas

OverTheWire [Natas Level 18]

양선규 2023. 3. 29. 18:59
728x90
반응형

Natas Level 18 입니다. 어느새 총 34단계 중 절반을 넘어섰네요.

어렵지만 확실히 많이 배우고 있습니다.

 

 

Level 18

 

Level 18 메인 페이지 입니다.

natas19의 password를 획득하기 위해선, admin 계정으로 로그인 하라고 합니다.

SQL Injection 인가 싶어, 인증우회 구문을 입력해 봤습니다.

 

 

인증우회 구문

 

" or 1=1 #

입력했습니다.

 

 

실패

 

실패했습니다. 일반유저로 로그인 되었다고 합니다.

이후에도 admin" or 1=1 # 등으로 여러가지 시도해 봤지만 실패했습니다.

SQL Injection 공격이 아닌걸까요?

 

 

코드1
코드2

 

소스코드입니다. 좀 기네요.

중요한 부분을 살펴봅시다.

 

 

PHPSSID 주목

 

COOKIE에서 PHPSESSID 값을 확인하는 것 같은데요..

아래쪽도 보시면

 

 

admin 세션인지 확인

 

사용자 세션을 확인해서, admin 계정일 경우 natas19의 password를 출력해주고 있습니다.

반대로 admin 계정이 아닐 경우, admin 계정으로 로그인하라는 문구가 출력됩니다.

 

전체적으로 SQL 관련 코드는 없는걸로 보아, 쿠키의 PHPSESSID 부분을 조작하여 admin 계정의 세션을 획득하면 될 것 같습니다.

세션을 획득한다는 것은, 해당 계정의 권한을 획득하는 것과 같은 것입니다. 즉, 로그인 하는것과 다름이 없습니다.

 

그러니 우리가 할 일은 admin계정의 세션 즉, admin계정의 PHPSESSID 값을 알아내어 대입하는 것입니다.

그런데 어떻게 알아낼까요..?

 

일단 현재 우리의 PHPSESSID 값을 확인해 봅시다.

 

 

191 이다.

 

개발자도구(F12) -> Application -> Cookies 경로로 들어가 보면

사진과 같이 현재 PHPSESSID 값을 확인할 수 있습니다.

현재 저의 값은 "191" 이군요.

음, 아까 봤던 소스코드를 다시 봐볼까요? admin계정에 대한 힌트가 있을지도 모르죠.

 

 

최대값은 640?

 

코드 맨 위에 선언된 변수입니다.

maxid = 640 이라... 현재 제 세션값과 형태로 일치하고(숫자3자리), 변수명도 굉장히 수상합니다.

세션의 최대값은 640이라는 뜻일까요?

 

 

맞는 것 같다

 

조금 밑에 선언된 함수입니다.

입력값이 숫자라면 TRUE 를 반환하는 함수 $isValidID 

그리고 1~640 중 랜덤한 숫자를 생성하는 함수 $createID

 

두 함수를 보아하니, 아무래도 1~640 사이의 숫자만으로 세션값을 생성하는 것 같습니다.

 

하지만 그 중에 정확히 어떤 숫자가 admin의 세션값인지는 모릅니다. 그렇다면 하나하나 대입해 봐야겠죠?

이번엔 Burp Suite의 Intruder 기능을 이용해 봅시다.

Burp Suite를 이용하면, Brute force(무작위 대입 공격)를 쉽게 시도할 수 있습니다.

 

이렇게 누군가의 세션을 탈취하는 공격을, "Session Hijacking" 이라고 합니다.

 

 

Send to Intruder

 

먼저 메인 페이지에서 아이디 패스워드 아무거나 입력 후 로그인 버튼을 눌러서, 패킷을 잡읍시다. (이정돈 할 줄 아시죠?)

그리고 오른쪽 마우스 클릭 후, "Send to Intruder" 를 눌러서 이 패킷을 Intruder로 보내줍시다.

 

 

PHPSESSID 값만 바꾼다

 

Intruder로 옮겨진 상태입니다. 처음엔 파란색으로 여러부분이 색칠되어 있을 텐데요,

Clear 버튼을 눌러서 선택된 부분을 해제하신 후, PHPSESSID="이부분"  

"이부분" 부분만 드래그 선택 후 Add 버튼을 눌러줍시다.

그러면 저렇게 저부분만 파란색으로 변합니다. ( 0은 제가 그냥 변경해 놓은 겁니다. 값 달라도 됩니다. )

 

 

Payloads

 

그리고 위쪽 Payloads 탭으로 들어가신 후,

사진과 같이 셋팅해 줍니다.

 

숫자를 대입할 것이므로 Payload type 은 Numbers 로 설정하였습니다.

From : 시작할 숫자

To : 끝날 숫자

Step : 1씩 증가

0부터 640까지 1씩 증가하며 , 아까 선택해 두었던 PHPSESSID 부분에 대입하게 됩니다.

그리고 Start Attack 클릭!!

 

OK 누르면 됨

 

그러면 이 창이 뜰수도 있는데요

이건 뭐 막 무료버전이니까 기능이 제한된다 그런 내용이었던 것 같은데 그냥 OK 누르시면 됩니다.

 

 

exploit

 

공격이 시작되었습니다. 숫자가 1씩 증가하고 있고, 상태코드 200과 Length 1284 를 반환하고 있습니다.

여기서, Length가 다르게 나타나는 요청이 있다? 그럼 그게 Admin 계정의 PHPSESSID 값인 겁니다.

 

 

"119"

 

유일하게 "119" 값만 Length 값이 1326 입니다.

다른 요청들과는 다른 응답을 보냈다는 겁니다. 

119가 admin 계정의 세션값일 거라고 확신합니다.

 

 

password 획득

 

요청을 클릭하여, 각 Request와 Response 를 직접 확인할 수 있습니다.

"119" 의 Response 패킷을 확인했더니, natas19의 password가 존재합니다.

admin의 PHPSESSID 값은 "119" 였습니다.

 

추가적으로, 파이썬 코드로도 무작위 대입 공격을 시도할 수 있습니다.

 

 

import requests

username = 'natas18'
password = '8NEDUUxg8kFgPV84uLwvZkGn6okJQ6aq'

url = f"http://{username}.natas.labs.overthewire.org/?debug=true"


for i in range(0,641):
    response = requests.post(url, auth=(username, password), cookies={"PHPSESSID": str(i)}, )
    print(f"exploit : {i}" )
    if "You are an admin." in response.text:
        print(response.text+"\nfinished!!!!")
        break

 

cookies(쿠키) 부분에 0부터 640까지의 숫자를 1씩 증가시키며 대입하고 있습니다.

만약 응답 패킷에 "You are an admin." 문자열이 존재한다면 반복문을 종료하고 해당 응답 패킷을 출력하는 프로그램입니다.

 

 

실행 결과

 

실행 결과입니다. "119" 에서 반복문이 종료되고 최종 응답 패킷을 출력한 모습입니다.

 

그런데 파이썬 코드를 이용한 공격이 Burp Suite의 Intruder 기능을 이용한 것보다 느렸습니다.

그리고 Burp Suite가 더 간단한 것 같기도 하고요. 

저는 공부삼아 파이썬 코드로도 만들어 보았습니다.

728x90
반응형

'Hacking > [Web]Natas' 카테고리의 다른 글

OverTheWire [Natas Level 20]  (0) 2023.04.04
OverTheWire [Natas Level 19]  (0) 2023.04.04
OverTheWire [Natas Level 17]  (4) 2023.03.29
OverTheWire [Natas Level 16]  (0) 2023.03.28
OverTheWire [Natas Level 15]  (0) 2023.03.27