본문 바로가기
CTF&War Game/CTF

[CCE 2022] BabyWeb Write Up

by Becoming a Hacker 2022. 9. 24.
반응형

문제 Docker

BabyWeb.zip
0.00MB

 

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

댓글