반응형
문제 Docker
1. 입력 창에 url을 입력하여 전송할 경우 url.parse 함수를 통해 hostname을 추출한 뒤, hostname이 flag.service일 경우 Not allow를 리턴하고 아닐 경우에 valid_ip 함수를 통해 해당 도메인이 내부 IP인지 확인하고 있는 것을 확인하였습니다.
def valid_ip(ip):
try:
ip = socket.gethostbyname(ip)
is_internal = ipaddress.ip_address(ip).is_global
if(is_internal):
return False
else:
return True
except:
pass
try:
url = request.form['url']
result = urllib.parse.urlparse(url)
if result.hostname == 'flag.service':
return "Not allow"
else:
if(valid_ip(result.hostname)):
return "huh??"
2. 그런데 valid_ip 함수에서 에러가 발생할 경우 검사를 수행하지 않고 함수를 종료하고 있어 내부망 IP 검사를 우회할 수 있다는 것을 확인하였습니다.
def index():
if request.host == "flag.service":
return FLAG
else:
return "Nice try :)"
3. 즉, gethostbyname 함수에서 에러가 발생하면서 request.get 함수에서는 사용 가능한 hostname을 입력할 수 있을 경우 flag를 획득할 수 있다는 것을 나타내며, Domain(flag.service)을 URL Encoding을 하여 전송할 경우 위의 조건을 모두 만족함으로써 flag를 획득할 수 있었습니다.
접속 URI : http://%66%6c%61%67%2e%73%65%72%76%69%63%65/flag
'CTF&War Game > CTF' 카테고리의 다른 글
WITHCON 2022 Buffalo [Steal] Write Up (0) | 2022.10.15 |
---|---|
[CCE 2022] blue archive Write Up (0) | 2022.09.25 |
[CCE 2022] reborn of php Write Up (0) | 2022.09.24 |
댓글