이번 포스트에서는 Python Challenge의 Level 20 문제에 대해 다루겠다.
문제를 클릭하면 다음과 같은 페이지가 출력된다.
## 문제 해석 :
"주의 깊게 살펴보는 것은 허용하다"는 말과 함께 경고판 사진이 출력되어 있다. 개발자 도구를 확인해보겠다.
"unreal.jpg"말고 단서가 없다. 여기서 해당 사진의 헤더 부분을 확인해보면 다음과 같다.
Response Headers가 존재한다. 또한 파일의 크기는 2123456789이지만 오직 0-30202만 제공된다는 것도 확인할 수 있다. 파일의 30203부터 확인해보면 될 것 같다.
## 문제 풀이 :
파이썬을 통해 30203부터의 데이터를 확인해보겠다.
### 공격 코드 :
import re
import urllib.request
import base64
request = urllib.request.Request(
"http://www.pythonchallenge.com/pc/hex/unreal.jpg")
vertify = base64.b64encode(b"butter:fly")
request.add_header("Authorization", f"Basic {vertify.decode()}")
response = urllib.request.urlopen(request)
pattern = re.compile("bytes (\d+)-(\d+)/(\d+)")
content_range = response.headers["content-range"]
# 정의한 패턴을 통해 start, end, length 변수 정의
(start, end, length) = pattern.search(content_range).groups()
while 1:
try:
request.headers["Range"] = "bytes=%i-" % (int(end) + 1)
response = urllib.request.urlopen(request)
print(response.read().decode())
(start, end, length) = pattern.search(
response.headers["content-range"]).groups()
except:
break
### 실행 결과 :
invader로 접속해보겠다.
### 공격문 : http://www.pythonchallenge.com/pc/hex/invader.html
### 실행 결과 :
"Yes! that's you!"라는 문구가 출력된다. 혹시나 하는 마음에 2123456789 이후의 값을 확인해보았다.
### 공격 코드 :
import urllib.request
import base64
request = urllib.request.Request(
"http://www.pythonchallenge.com/pc/hex/unreal.jpg")
vertify = base64.b64encode(b"butter:fly")
request.add_header("Authorization", f"Basic {vertify.decode()}")
request.headers["Range"] = "bytes=%i-" % (int(2123456789) + 1)
response = urllib.request.urlopen(request)
print(response.headers)
print(response.read().decode())
### 실행 결과 :
"esrever ni emankcin wen ruoy si drowssap eht"라는 문구를 거꾸로 하면 "the password is your new nickname reverse"가 된다. 즉 거꾸로 하면 된다는 것이다. invader를 거꾸로 하면 redavni이다. redavni로 접속해보겠다.
### 공격문 : http://www.pythonchallenge.com/pc/hex/redavni.html
### 실행 결과 :
아무것도 출력되지 않는 것을 확인할 수 있다. 새로운 Content-Range인 2123456744의 reverse한 값(-1) 2123456743의 값을 확인해보겠다.
### 공격 코드 :
import urllib.request
import base64
request = urllib.request.Request(
"http://www.pythonchallenge.com/pc/hex/unreal.jpg")
vertify = base64.b64encode(b"butter:fly")
request.add_header("Authorization", f"Basic {vertify.decode()}")
request.headers["Range"] = "bytes=2123456743-"
response = urllib.request.urlopen(request)
print(response.headers)
print(response.read().decode())
### 실행 결과 :
1152983631에 숨어있다고 한다. 1152983631의 값을 확인해보겠다.
### 공격 코드 :
import urllib.request
import base64
request = urllib.request.Request(
"http://www.pythonchallenge.com/pc/hex/unreal.jpg")
vertify = base64.b64encode(b"butter:fly")
request.add_header("Authorization", f"Basic {vertify.decode()}")
request.headers["Range"] = "bytes=1152983631-"
response = urllib.request.urlopen(request)
with open("level21.zip", "wb") as f:
f.write(response.read())
### 실행 결과 :
다운로드 해보니 zip파일이다. 압축해제를 하려면 이전에 찾은 비밀번호인 redavni를 입력하면 된다. 폴더의 readme.txt를 확인해보면 다음과 같다.
### 실행 결과 :
Level 21로 넘어간 것을 확인할 수 있다.
'Wargame > Python Challenge' 카테고리의 다른 글
Python Challenge (Level 22) (0) | 2022.09.21 |
---|---|
Python Challenge (Level 21) (1) | 2022.09.20 |
Python Challenge (Level 19) (0) | 2022.09.18 |
Python Challenge (Level 18) (0) | 2022.09.17 |
Python Challenge (Level 17) (0) | 2022.09.16 |