개발블로그
article thumbnail

https://blog.sucuri.net/2022/06/analysis-massive-ndsw-ndsx-malware-campaign.html

 

Analysis of the Massive NDSW / NDSX Malware Campaign

A detailed analysis of the notable ongoing NDSW/NDSX malware infection with steps on how to identify the telltale if(ndsw===undefined) clause and how clean up the malware from a compromised website.

blog.sucuri.net

 

NDSW 멀웨어는 무엇이고 어떻게 동작하는가?

 

특징

1. JavaScript  Injection 내에서 ndsw 변수 사용

2. 페이로드의 ndsx 변수를 사용

ndsw/ndsx 패턴으로 Javascript Injection 난독화를 주기적으로 변경함

 

NDSW Javascript 변형

 

모든 변형에 "if(ndsw===undefined)" 라는 ndsw 문구가 포함됨

악성 스크립트는 일반적으로 모든 js 파일 하단에 삽입되어 있음 하나의 사이트에 수천 개의 감염파일이 있을 수 있다.

드물게 DB에서 발견되기도 한다. (보통 일부 플러그인에 의해 캐시됨)

 

악성 NDSW 캠페인 Javascript 예시

 

동일한 사이트에 위치한 PHP 파일에서 URL을 명확하게 볼 수 있다. 이 스크린샷에서는 //<감염된 웹사이트 도메인>/wp-admin/css/colors/blue/blue.php?id='+token() 형태이다. PHP 파일의 URL 탐지를 막기 위해 난독화 하기도 한다.

 

난독화된 PHP 프록시 URL이 있는 Javascript 변형

 

아래처럼 중요한 문자열을 숨기기 위해 다양한 유형의 난독화를 사용하는 변종이 나타나기도 한다.

 

여러 난독화 기술을 활용한 NDSW Javascipt

 

어떠한 변형은 ndsw대신 ndsj 변수를 사용한다.

 

ndsj 변수를 사용하는 Javascript 변형

 

Inection 된 자바스크립트는 들여쓰기가 잘 되어 있어 덜 의심스럽게 보이며 무심코 지나칠 수 있다.

 

들여쓰기 된 NDSW Javascript

 

가장 특이한 변형은 PHP대신 캔버스의 getImageDataString.fromCharCode 함수의 조합을 사용해 가짜 이미지 파일 "pixelapn.adsprofitnetwork[.]com/apnpixel.png "에서 페이로드를 로드하는 버전을 발견했다.

 

가짜 이미지파일에서 페이로드를 로딩함

 

위 Javascript Injection의 기능은 공격의 2번째 레이어(페이로드의 ndsx 사용)를 가져와서 실행하는 것이다. 일반적으로 동일한 손상된 환경의 임의 디렉토리 내에서 발견된 PHP파일에서 로드된다.

 

 

NDSW PHP 악성코드

 

Javascript 페이로드를 로드하는 PHP 스크립트 목록이다. 가장 일반적인 패턴과 실제 사례 목록을 작성했다.

 

/wp-admin/css/colors/blue/blue.php (most commonly used)

/random/<directory>/<directory>.php
- /assets/images/about/about.php
- /ajax/jquery.validate/1.11.1/1.11.1.php
- /bat/phpmailer/phpmailer.php
- /administrator/components/com_admin/helpers/html/html.php
- /wp-content/plugins/affiliates-manager-wp-estore-integration/affiliates-manager-wp-estore-integration.php

/random/directory/slicemap.php
- /slicemap.php
- /staging/slicemap.php
- /system/Database/slicemap.php

/random/directory/class.php
- /wp-content/plugins/wp-sp/class.php
- /wp-content/plugins/wp-sps/class.php

/random/directory/.class.php
- /wp-content/uploads/typehub/custom/dn46/.class.php

/wp-content/plugins/<fake-plugin>/clock.php
- wp-content/plugins/wp-dumpme/clock.php
- wp-content/plugins/wp-pimple/ciock.php

wp-special.php

 

이 외에도 새로운 변종이 개발됨에 따라 계속 변경될 것으로 예상된다.

 

 

난독화 기술

 

PHP 프록시는 일반적으로 다음과 같다.

 

NDSW 캠페인에서 발견된 전형적인 난독화된 PHP 멀웨어

 

PHP 악성코드 내에서 난독화는 동일하게 유지된다. 랜덤한 이름을 가진 두 개의 디코딩 helper 클래스, 암호화된 값을 가진 코드, visible curl requests 그리고 "base64_encode(json_encode)"가 사용된 함수 조합이 뒤를 따른다.

악성 Javascript 일부는 파일이 합법적인 PHP로 가장하기 위해 가짜 헤더 주석과 적절한 들여쓰기를 사용한다.

 

 

스크립트 기능은 버전마다 조금씩 다르지만 주요 아이디어는 동일하다

 

부분적으로 디코딩된 PHP 스크립트 기능공개

 

위 스크립트는 사이트 방문자(IP 주소, 브라우저 및 리퍼러)에 대한 정보를 인코딩하고 이를 타사 서버의 스크립트(위에 "ad.syncadv[.]com" 으로 표시됨)에 전달한다. 응답에 ndsx 키워드가 포함되어 있으면 감염된 웹 페이지에 인라인 스크립트로 즉석에서 Injection 및 실행이 된다.

 

 

NDSX 페이로드

 

타사 서버(일반적으로 PHP 프록시를 통해)에서 가져온 일반적인 ndsx 페이로드의 예이다.

 

NDSX 페이로드 Javascript

 

이 예에서 스크립트는 "hxxps://stuff.bonneltravel[.]com/report?r=dj03ZDdlM2JjMjNlY2E3Mzc0OTQxYSZjaWQ9MjUw"에서 또 다른 스크립트를 로드한다.

 

아주 드문 경우지만 해커가 웹 페이지와 .js 파일에 직접 주입한 "var ndsx=true" 는 없을 수도 있다.

 

NDSW/NDSX 스크립트 레이어

이 공격에는 구분가능한 여러 레이어가 있다.

 

1. NDSW Javascript Injection:

첫 번째 계층은 감염된 웹 페이지의 HTML 코드 또는 손상된 웹 사이트에서 명시적으로 로드한 .js  파일에서 찾을 수 있는 Inection된 ndsw/ndsj 스크립트이다.

 

2. PHP Proxy Script:

두 번째 계층은 (일반적이지만 선택사항) 동일한 손상된 환경의 PHP 프록시로부터 로드된 스크립트이다. 이 프록시의 주요 목적은 NDSX 페이로드가 있는 서버의 위치를 숨기는 것이다. 서버 측에 페이로드를 로드함으로써, 그 출처는 클라이언트 레벨에서 수행되는 트래픽 모니터링과 정적 분석에는 보이지 않는다. 페이로드는 인라인 스크립트로 주입된다.

 

3. TDS(Traffic Direction System) Server에서 온 NDSX Script:

세 번째(혹은 두 번째) 계층은 TDS(트래픽 지향 시스템)로 사용되는 공격자가 제어하는 서버의 NDSX 스크립트이다. IP, 브라우저 및 리퍼러 데이터를 기반으로 TDS는 특정 사용자에게 사용할 페이로드를 결정한다. 또한 이미 블랙리스트에 있는 리소스로 트래픽을 보내는 것을 피하기 위해 악의적인 스크립트에 대한 새 URL을 지속적으로 도입한다.

 

4. Malicious Payload:

TDS가 특정 사이트 방문자의 자격(eligibility)을 확인하면 NDSX 스크립트는 서드파티 웹사이트에서 최종 페이로드를 로드한다.

https://decoded.avast.io/janrubin/parrot-tds-takes-over-web-servers-and-threatens-millions/

위 게시물에서 설명했듯 Windows 컴퓨터에서 가장 널리 퍼진 최종 페이로드는 이른바 "가짜 업데이트" 멀웨어이다.

 

악성 도메인

adsprofitnetwork[.]com - Creation Date: 2019-10-22, IP:188.120.239.154
- pixelapn.adsprofitnetwork[.]com/apnpixel.png

statclick[.]net - Creation Date: 2021-01-30, IP:145.239.23.7
- visit.statclick[.]net/ui_node.js
- go.statclick[.]net/ui_node.js

clickstat360[.]com - Creation Date: 2018-10-22, IP:145.239.23.7
- public.clickstat360[.]com/ui_node.js

syncadv[.]com - Creation Date: 2020-11-18, IP:145.239.23.7
- ad.syncadv[.]com/ui_node.js

webcachespace[.]net - Creation Date: 2021-09-22, IP:217.23.6.50
- webcachespace[.]net/ac-analytics.js
- webcachespace[.]net/jquery.min.js

cachespace[.]net - Creation Date: 2022-03-13, IP:217.23.6.50
- ping.cachespace[.]net/jquery.min.js

staticvisit[.]net - Creation Date: 2021-08-17 IP:54.38.59.250
- go.staticvisit[.]net/ui_node.js

webcachestorage[.]com - Creation Date: 2021-09-22 IP:217.23.6.22
- webcachestorage[.]com/sync.adv.min.js

 

최근 레이어 4 도메인 목록

 

도메인 섀도잉으로 알려진 기술에서 합법적인 웹사이트의 하위 도메인을 활용하는 다음과 같은 레이어 4 스크립트로 분류했다.

45.10.42.26 (VDSINA-NL, RU)
- market.bluestonechiropractic[.]com
- craft.cheesedome[.]com

109.234.35.249 (VDSINA-NL, RU)
- design.lawrencetravelco[.]com
- stuff.bonneltravel[.]com
- rotation.ahrealestatepr[.]com
- doors.vipveinsaz[.]com
- patients.brannonsmiles[.]com

179.43.169.30 (PLI-AS, PA
)
- contractor.thecaninescholar[.]com
- staff.beeboykind[.]com
- sdk.expresswayautopr[.]com
- flowers.netplusplans[.]com
- 
rotation.craigconnors[.]com
- 
notify.aproposaussies[.]com

188.120.239.154 (RU-JSCIOT, RU)
- pixelapn.adsprofitnetwork[.]com
- mines.cajonsoul[.]com
- 
bumpy.daniyalmedicaltech[.]com
- trace.mukandratourandtravels[.]com
- mamba.cpncredit[.]com

대부분 공격자는 도메인 소유자의 계정(DNS)를 손상시키고 자신의 서버를 가리키는 악의적인 하위 도메인에 대한 추가 A 레코드를 생성했다.

 

감염 벡터

 

대부분의 웹사이트에서 다양한 백도어, Black Hat SEO Script, 취약하거나 오래된 구성요소(ex. 플러그인 및 테마)가 포함되어 있었다. 또한 많은 감염된 웹사이트에서  푸시 알림 사기 페이지로 리다이렉션 하는 일본어 스팸이나 진행중인 WordPress 캠페인에 속하는 악성 프로그램을 발견했다. 

 

NDSW 멀웨어 캠페인은 공개된 새로운 제로데이 취약점을 지속적으로 추가하는 다용도 공격 툴킷을 사용하기 때문에 매우 성공적이다. 악의적인 행위자가 환경에 무단 액세스하면 다양한 백도어 및 CMS 관리자를 추가해 기존 취약점이 보완되더라도 해당 웹사이트에 대한 액세스를 유지한다.

 

이 캠페인은 여러 공격 시나리오를 사용하기 떄문에 공격자가 웹 사이트에 침입하는 방법이나 감열을 어떻게 치료하고 예방할 수 있는지에 대한 간단하고 보편적인 답을 줄 수 없다. 사이트마다 다르기 때문이다. Injection 자체도 해당되는 취약점과 제공하는 서버에 대한 액세스 수준에 따라 다르다.

 

WordPress 웹사이트의 가짜 플러그인

 

예를 들면 이 취약점이 워드프레스 사이트에 대한 관리자 액세스를 제공하는 경우 해커가 일반적으로 가짜 플러그인을 설치하는 것으로 나타났다. 이러한 플로그인의 일반적인 이름은 wp-sp, wp-sps, wp-pimple, 그리고 wp-dumpme이다.

 

다음은 액세스 로그에서 wp-dumpme 악성 플러그인을 설치하는 방법이다.

194.87.216.247 - - [19/May/2022:10:42:32 -0400] "POST /wp-admin/plugin-install.php?wc-ajax=1 HTTP/1.1" 200 17807 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0"

194.87.216.247 - - [19/May/2022:10:42:34 -0400] "POST /wp-admin/plugins.php HTTP/1.1" 200 18995 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0"

194.87.216.247 - - [19/May/2022:10:42:34 -0400] "POST /wp-admin/plugins.php?wc-ajax=1&action=activate&plugin=wp-dumpme%2Fwp-dumpme.php&plugin_status=all&_wpnonce=f66ee79d9b HTTP/1.1" 302 0 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0"

194.87.216.247 - - [19/May/2022:10:42:35 -0400] "GET /wp-admin/plugins.php?activate=true&plugin_status=all&paged=1&s= HTTP/1.1" 200 18806 "https://redacted/wp-admin/plugins.php?wc-ajax=1&action=activate&plugin=wp-dumpme%2Fwp-dumpme.php&plugin_status=all&_wpnonce=f66ee79d9b" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0"
…
194.87.216.247 - - [19/May/2022:10:42:39 -0400] "GET /?dumpmecheck=1 HTTP/1.1" 200 8109 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36"

가짜 WordPress DumpME 플러그인

 

위 예시에서 보면 이 플러그인이 wp-dumpme/clock.php 파일에 NDSW PHP 프록시를 생성하는 것을 볼 수 있다. 이 파일의 내용은 처음에는 wp-dumpme/tasty.pot에 base64 인코딩 문자열로 저장된다. 다른 가짜 플러그인의 경우 NDSW PHP 프록시 파일의 이름은 일반적으로 class.php이다.

 

"wp-dumpme/click.php 백도어를 해독하며, 원치 않는 요청에 대한 응답으로 'systemfilesdonttouch'를 반환함

 

이런 플러그인은 많은 감염 시나리오 중 하나일 뿐이며 감염된 모든 사이트에서 플러그인을 찾을 수 있는 것은 아니다. 집중해야 할 것은 제거를 위해 체계적으로 접근하는 것이다.

 

 

정리 및 안화 조치

 

웹사이트가 이 멀웨어에 의해 손상된 경우 다음 단계를 수행해 치료하고 웹사이트를 강화해야 한다.

 

1. CMS 관리자 비밀번호를 변경하고, CMS를 감사해 관리자 권한이 있는 원치 않는 사용자가 없는지 확인한다.

2. 웹 사이트에 설치된 모든 테마, 플러그인 및 기타 타사 구성요소를 검사한다. 인식하지 못하거나 더 이상 사용하지 않는 항목은 모두 제거한다(단순 비활성화로는 충분치 않다).

3. 감염된 모든 파일과 데이터베이스 기록을 식별하고 정리한다. 깨끗한 새로운 웹 사이트 백업 및 무결성 모니터링 시스템을 활용하면 이 멀웨어에 감염된 총 파일 수가 수천 개에 달할 수 있으므로 많은 도움이 될 수 있따. 이렇게 많은 감염된 파일을 처리할 때 수동정리는 매우 힘들 수 있으므로 사용가능한 웹 사이트 백업이 없는 경우 자동화된 솔루션을 고려하거나 해킹된 웹사이트 가이드를 참조한다.

4. CMS와 나머지 모든 타사 구성요소가 최신 상태인지 확인한다. 이 공격은 툴킷에 새로운 취약점을 매우 빠르게 추가하므로 시간을 지체하지 않는다. 다행히 취약점이 공개될 때 취약한 테마 또는 플러그인의 공급업체가 이미 보안 패치를 출시했을 수도 있다.

5. 소프트웨어를 업데이트 할 수 있을 때까지 가장 잘 알려진 공격으로부터 사이트를 보호하고 알려진 취약점을 가상으로 패치하는 웹사이트 방화벽 사용을 고려한다.

 

 

-- 

 

최근 회사에서 받은 웹사이트 중에 NDSW 멀웨어 코드가 들어간 사이트가 있었다.

사이트에 코드가 들어가 있는건 확인 했는데 이게 어떤 방식으로 동작하는지 잘 확인이 되지 않아서 공부가 필요하다고 느꼈다.

'보안' 카테고리의 다른 글

Shijack 보고서  (0) 2022.01.03
세션 하이재킹  (0) 2021.11.21
profile

개발블로그

@ORIONPOINT

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그