CTF/웹해킹

[angstromCTF] Celeste Tunneling Association - 웹해킹 / Burp Suite

SecurityMan 2023. 5. 15. 11:00

 

간단한 웹해킹 문제이다.

 

문제페이지 주소와 소스코드가 주어진다.

 

반응형

 

 

문제페이지에 접속하면

 

까만 화면에 이렇게 하얀 글씨가 써있다.

 

이거 외엔 별다른 기능이 없어서 소스코드를 바로 열어봤다.

 

# run via `uvicorn app:app --port 6000`
import os

SECRET_SITE = b"flag.local"
FLAG = os.environ['FLAG']

async def app(scope, receive, send):
    assert scope['type'] == 'http'

    headers = scope['headers']

    await send({
        'type': 'http.response.start',
        'status': 200,
        'headers': [
            [b'content-type', b'text/plain'],
        ],
    })

    # IDK malformed requests or something
    num_hosts = 0
    for name, value in headers:
        if name == b"host":
            num_hosts += 1

    if num_hosts == 1:
        for name, value in headers:
            if name == b"host" and value == SECRET_SITE:
                await send({
                    'type': 'http.response.body',
                    'body': FLAG.encode(),
                })
                return

    await send({
        'type': 'http.response.body',
        'body': b'Welcome to the _tunnel_. Watch your step!!',
    })

 

소스코드를 살펴보니

 

HTTP 요청 패킷의 헤더를 가지고 장난을 치는것 같았다.

 

    for name, value in headers:
        if name == b"host":
            num_hosts += 1

 

헤더 목록을 가져와서 

 

헤더 중 이름이 host 인게 있다면

 

num_hosts 를 +1 해주고

 

    if num_hosts == 1:
        for name, value in headers:
            if name == b"host" and value == SECRET_SITE:
                await send({
                    'type': 'http.response.body',
                    'body': FLAG.encode(),
                })
                return

 

host 헤더의 값이

 

SECRET_SITE 라면

 

FLAG 를 리턴하게 되는 구조이다.

 

SECRET_SITE = b"flag.local"

 

SECRET_SITE 는

 

flag.local 로 맨 위에 정의되어 있다.

 

 

Burp Suite 를 이용해

 

문제페이지 접속할때의 요청 패킷을 캡쳐하면

 

host 헤더부분에

 

현재 웹 서버의 주소가 그대로 찍히게 된다.

 

 

이 부분을 SECRET_SITE 에 정의되어 있는

 

flag.local 로 바꿔서 요청 패킷을 보내주면

 

응답 패킷에서 플래그를 찾을 수 있다.

반응형