홈페이지 취약점 분석 이야기 파일 지도 사진 깨알






>> 목록보이기
#HTTP Method #HTTP 헤더 #XST #Cross-site Tracing #세션탈취 #HttpOnly #HttpOnly 우회 #AJAX #XMLHttpRequest #취약점해설

TRACE와 XST(Cross-site Tracing) 공격

웹 취약점 스캐너들이 TRACE 메소드는 XST에 취약하다고 쏟아낸다 (TRACE 메소드 수동점검 방법도 참조). 다음 예는 nikto 웹취약점탐색기의 XST 점검항목이다.

+ OSVDB-877: HTTP TRACE method is active, suggesting the host is vulnerable to XST

[ Nikto의 HTTP TRACE method 탐지 사례 ]

웹 서버 설정에서 TRACE 메소드를 비활성화시키면 조치가 완료되는 간단한 취약점이다. 현재는 알려진 공격방법이 없으나 -- 쉘쇼크(shellshock)나 해킹팀(Hacking Team), SCADA 공격에서 처럼 -- 숨은 공략법이 있을지도 모르니 조치는 하도록 하자.

Apache의 TRACE 비활성화 방법

- Apache 1.3.34 이상, Apache2 2.0.55 이상

TraceEnable off

아파치 웹서버 설정 파일인 httpd.conf 또는 apache2.conf 파일에 TraceEnable off 한줄을 추가하고 아파치 웹서버를 재시작하면 된다. 최근에 배포되는 Apache 웹 서버나 Apache Tomcat의 경우에는 기본적으로 TRACE가 비활성화되어 있다.

TRACE를 이용한 XST(Cross-site Tracing) 공격 개요

2002년에 MS가 자사의 인터넷 익스플로러 6.0 SP1에 HttpOnly라는 개념을 도입하여 XSS 공격에 의한 세션탈취를 방지하였다. 세션쿠키(또는 세션ID)에 HttpOnly라는 속성을 부여하면 HTTP 통신에서만 이 쿠키를 사용하게 함으로써 자바스크립트나 기타 클라이언트 측 프로그램이 해당 쿠키를 접근할 수 없도록 차단하는 방법이다. 간단하면서도 효과적인 세션탈취 방어책이다.

그런데 2003년에 TRACE 메소드를 허용하는 웹서버에서는 이 HttpOnly 방어책을 우회할 수 있는 방법이 발견되었다(Jeremiah Grossman의 Cross-site Tracing 최초 보고서). TRACE 메소드는 웹 브라우저가 보내는 HTTP 통신을 반사하는 역할을 한다. 그런데 HTTP 통신 상에는 클라이언트가 보내는 쿠키가 포함되므로 이 통신을 가로채면 HttpOnly로 선언된 쿠키값도 탈취를 할 수 있다.

root@kali:~# curl -v --cookie "PHPSESSID=dgklrb9cmv44lad6tbti706mv7" -X TRACE http://www.memozee.com/
*   Trying 222.237.78.13...
* Connected to www.memozee.com (222.237.78.13) port 80 (#0)
> TRACE / HTTP/1.1
> Host: www.memozee.com
> User-Agent: curl/7.47.0
> Accept: */*
> Cookie: PHPSESSID=dgklrb9cmv44lad6tbti706mv7
> 
< HTTP/1.1 200 OK
< Date: Fri, 11 Nov 2016 05:52:01 GMT
< Server: Apache
< Connection: close
< Transfer-Encoding: chunked
< Content-Type: message/http
< 
TRACE / HTTP/1.1
Host: www.memozee.com
User-Agent: curl/7.47.0
Accept: */*
Cookie: PHPSESSID=dgklrb9cmv44lad6tbti706mv7

* Closing connection 0
root@kali:~#

http://www.memozee.com/은 현재 TRACE 메소드가 허용되고 있는 누리집이다. 위와 같이 curl을 이용하여 접속하면 웹브라우저가 보내는 모든 값(<주황색)이 서버의 응답 내용에 포함되어 반환(주황색)되는 것을 볼 수 있다. PHPSESSID가 HttpOnly로 선언되었다고 하더라도 TRACE 메소드의 서버응답에는 사용자의 쿠키가 노출된다. 이것을 자바스크립트로 읽어서 공격자에게 보내면 결국 세션탈취에 성공하게 된다.

viewing www.memozee.com's cookies with firebug
[ www.memozee.com의 쿠키정보: PHPSESSID에 대해서 HttpOnly 선언됨 ]

위의 그림은 FireFox로 http://www.memozee.com/에 접속한 화면이다. 파이어폭스의 부가기능인 FireBug를 이용하여 쿠키를 살펴볼 수 있다. 그림에서 볼 수 있듯이 PHPSESSIDHttpOnly로 선언되어 있다.

checking TRACE method with OWASP ZAP
[ OWASP-ZPA 프록시로 www.memozee.com에 대한 TRACE 메소드를 실행한 화면 ]

http://www.memozee.com/에 재접속하면서 OWASP-ZAP을 이용하여 GET 메소드를 TRACE로 변경하여 보았다. 클라이언트의 요청 값 모두가 서버 응답의 본문(BODY)에 그대로 출력되는 것을 관찰할 수 있다. Jeremiah Grossman은 이러한 점을 이용하여 HttpOnly로 선언된 쿠키를 탈취할 수 있는 방법을 제시하였다. 다음과 같이 AJAX에서 XMLHttpRequestTRACE 메소드를 보내고 그 결과를 alert() 창에 띄우는 것이 개념증명(PoC, Proof of Concept)의 요점이다.

<script type="text/javascript">
<!--
    function sendTrace () {
	var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
	xmlHttp.open("TRACE", "http://foo.bar",false);
	xmlHttp.send();
	xmlDoc=xmlHttp.responseText;
	alert(xmlDoc);
    }
//-->
</script>
<INPUT TYPE=BUTTON OnClick="sendTrace();" VALUE="Send Trace Request">

실제 공격이라면 위의 PoC에서 사용한 alert() 대신 공격자에게 그 값을 전달하도록 할 것이다.

XST 공격 시나리오

  • 공격자가 표적 홈페이지의 XSS 취약점을 찾아낸다.
  • 공격자가 XSS 취약점을 바탕으로 공격코드를 작성하여 관리자에게 메일을 보낸다.(게시판을 이용할 수도 있다.)
  • 관리자는 -- 로그인한 상태에서 -- 메일에 포함된 공격코드 링크를 클릭한다. (클릭없이 자동으로 실행되게 할수도 있다.)
  • 웹 브라우저는 XMLHttpRequest를 통해 서버에 TRACE로 접속하여 그 내용을 읽은 후 공격자에게 전송한다.
  • 공격자는 전송받은 데이터에서 세션 쿠키를 추출하여 표적 홈페이지에 접속하면 관리자 권한을 획득한다.

공략가능성: 낮음

현재 많이 사용하는 거의 모든 웹 브라우저는 XHR(XMLHttpRequest)에서 TRACE를 실행하지 못하도록 제한하고 있다. 이 때문에 Jeremiah Grossman이 보여주었던 AJAX를 이용한 TRACE 공략법은 현재 불가능한 것으로 알려져 있다. 다만, 플래쉬(Flash)와 같은 다른 플러그인(Plug-in)에서 XST 취약점을 공략할 수 있는 가능성은 남아있다.

참고할만한 바깥고리

[처음 작성한 날: 2016.11.11]    [마지막으로 고친 날: 2016.11.11] 


< 이전 글 : HTTP 세션 탈취와 IP보안 (2016.11.11)

> 다음 글 : 세션쿠키와 HttpOnly (2016.11.10)


크리에이티브 커먼즈 라이선스 이 저작물은 크리에이티브 커먼즈 저작자표시 4.0 국제 라이선스에 따라 이용할 수 있습니다.
잘못된 내용, 오탈자 및 기타 문의사항은 j1n5uk{at}daum.net으로 연락주시기 바랍니다.
문서의 시작으로 컴퓨터 깨알지식 웹핵 누리집 대문