Blog

GOOTLOADER 맬웨어 및 인프라의 진화

Govand Sinjari, Andy Morales
Jan 26, 2023
12 min read
|   Last updated: Jul 26, 2023
Threat Research
Managed Defense
Malware

맨디언트 매니지드 디펜스(Mandiant Managed Defense)는 2021년 1월부터 GOOTLOADER 맬웨어 감염에 지속해서 대응해왔습니다. 위협 행위자는 이 맬웨어를 퍼뜨릴 때 광범위한 인프라를 활용해 다양한 지역과 산업에 영향을 끼치고자 하였습니다. 맨디언트는 GOOTLOADER 맬웨어와 관련 인프라를 UNC2565 위협 클러스터로 추적 중인 공격 그룹에 귀속시키고 있습니다. 현재까지 관찰한 바에 따르면 GOOTLOADER와 인프라는 UNC2565가 독점적으로 사용하는 것으로 보입니다.

2022년부터 UNC2565는 공격에 사용하는 TTP(전술, 기술, 절차)에 변화를 가하기 시작하였습니다. 주요 변경 사항으로 FONELAUNCH 런처 변형 사용, 새로운 후속 페이로드 배포, GOOTLOADER.POWERSHELL 도입 등을 꼽을 수 있습니다. TTP에 새로운 변경 사항이 통합되는 것을 볼 때 UNC2565가 적극적으로 개발을 진행 중이고 기능을 개선해 나아가고 있음을 알 수 있습니다.

맨디언트는 지속적인 대응을 통해 고객이 GOOTLOADER 맬웨어 피해를 입기 전에 신속하게 감지하고 완화하였습니다. 본 블로그 포스팅을 통해 GOOTLOADER 맬웨어가 코드를 숨기기 위해 사용한 다양한 방법과 난독화 프로세스를 자동화할 수 있는 스크립트에 대해 알아보겠습니다.

감염 체인

GOOTLOADER 맬웨어 감염은 피해자가 온라인에서 문서 템플릿이나 계약서 참조 문서를 찾는 것에서 시작합니다. 피해자는 자신이 원하는 문서 양식이라 생각하고 손상된 웹 사이트를 방문해 파일을 받는데, 이 파일은 GOOTLOADER로 알려진 자바스크립트 파일이 포함된 악성 아카이브를 다운로드 합니다.

GOOTLOADER 맬웨어를 실행하면 레지스트리에 저장될 추가 페이로드인 FONELAUNCH, Cobalt Strike BEACON 또는 SNOWCONE이 다운로드됩니다. 이들 페이로드는 이후 파워쉘을 통해 실행됩니다.

2020년 후반부터 GOOTLOADER 캠페인은 일관성 있는 감염 체인을 보여 주었습니다. 그러나 2022년 11월 중순부터는 주목할 만한 변화가 생겼습니다. 2022년 11월 이전에 관찰할 수 있었던 감염 체인은 다음과 같습니다.

  • 사용자는 손상된 웹 사이트(비즈니스 문서 관련된 사이트)를 방문해 악성 ZIP 아카이브 파일을 다운로드합니다.
  • 악성 ZIP 파일은 사용자의 다운로드 폴더에 저장됩니다.
  • 사용자는 ZIP 파일을 열고 .JS 파일을 클릭 합니다.
  • .JS 파일은 WScript.exe를 사용해 시작됩니다.
  • WScript.exe 프로세스는 세 개의 하드코딩 된 도메인에 연결해 레지스트리에 저장된 두 개의 페이로드를 다운로드합니다.
  • WScript.exe는 첫 번째 레지스트리 페이로드인 FONELAUNCH를 ‘HKCU\SOFTWARE\Microsoft\<STRING>\%USERNAME%0’ 경로에 값으로 저장합니다.
  • WScript.exe는 두 번째 레지스트리 페이로드(일반적으로 BEACON)을 ‘HKCU\SOFTWARE\Microsoft\<STRING>\%USERNAME%’ 경로에 값으로 저장합니다.
  • WScript.exe는 첫 번째 페이로드를 디코딩 하고 실행하는 파워쉘 스크립트를 실행합니다. 이 페이로드는 맨디언트가 FONELAUNCH로 추적 중인 .NET 기반 런처입니다.
  • WScript.exe는 앞서 언급한 것과 같은 파워쉘 스크립트를 실행하는 명령을 실행합니다. 현재 계정 사용자 이름이 작업 이름으로 사용되며 사용자가 로그인을 하면 작업이 시작되도록 설정됩니다.
  • 첫 번째 레지스트리 페이로드인 FONELAUNCH는 Cobalt Strike BEACON 또는 SNOWCONE 맬웨어가 포함된 두 번째 레지스트리 페이로드를 디코딩 하고 실행합니다.
GOOTLOADER attack chain
그림 1: GOOTLOADER 공격 체인

맨디언트는 2022년 11월 새로운 감염 체인을 사용하는 GOOTLOADER 변종을 발견하였습니다. 이 변종은 두 번째 .JS 파일을 디스크에 쓰고 이를 실행할 예약된 작업을 생성합니다. 스크립트는 10개의 하드코딩 된 URL에 도달하도록 작성되었습니다. URL 요청에는 실행 중인 프로세스 및 로컬 드라이브 같은 호스트에 대한 인코딩 된 데이터가 포함됩니다. 후속 활동은 이전 공격 체인과 비슷합니다.

변종에서 확인할 수 있었던 공격 체인의 변화를 정리하면 다음과 같습니다.

  • 사용자는 손상된 웹 사이트(비즈니스 문서 관련된 사이트)를 방문해 악성 ZIP 아카이브 파일을 다운로드합니다.
  • 악성 ZIP 파일은 사용자의 다운로드 폴더에 저장됩니다.
  • 사용자는 ZIP 파일을 열어 .JS 파일을 클릭합니다. 이 파일은 GOOTLOADER.POWERSHELL을 실행할 난독화된 JScript 파일을 포함하는 트로이목마 자바스크립트 라이브러리입니다. 최근 관찰된 라이브러리에는 jQuery, Chroma.js, Undersocre.js가 포함되어 있었습니다.
  • .JS 파일은 WScript.exe를 사용해 시작됩니다.
  • WScript.exe 프로세스는 ‘C:\Users\%USERNAME%\AppData\Roaming\<RANDOM_DIRECTORY>\<HARD_CODED_FILE_NAME>’에 대한 .LOG 확장자 파일을 생성합니다. 드로퍼는 난독화된 JScript 코드를 작성하고 파일 크기를 늘리기 위해 임의의 문자를 채웁니다.
  • .LOG 파일은 .JS 확장자로 파일 이름이 바뀝니다.
  • 드로퍼는 새 JScript 파일ㅇ르 실행하는 예약 작업을 만듭니다. 예약 작업은 생성 직후 실행되지만 다음 로그온을 할 때 두 번째 JScript 파일을 실행하는 지속성 유지에도 활용됩니다.
  • WScript.exe 및 CScript.exe는 10개의 하드코딩 된 도메인에 연결하는 파워쉘 프로세스를 시작합니다. 수집된 피해 정보에는 환경 변수, 윈도우 버전, 파일 이름 및 실행 중인 프로세스가 포함됩니다. 이들 정보는 Gzip으로 압축되고 Base64로 인코딩 되어 쿠키 헤더의 C2(Command & Control) 서버로 전송됩니다.
  • C2 서버는 Invoke-Expression PowerShell cmdlet을 사용해 실행되는 페이로드를 반환합니다. 이렇게 하면 FONELAUNCH 및 FONELAUNCH로 실행할 보조 페이로드가 레지스트리 키로 다운로드 됩니다. 이후 앞서 살펴본 기존 GOOTLOADER 감염 체인의 6~10번 과정이 진행됩니다.
GOOTLOADER.POWERSHELL attack chain
그림 2: GOOTLOADER.POWERSHELL 공격 체인

진화를 거듭한 난독화 기법

맨디언트는 변종 외에도 GOOTLOADER 난독화 기법의 변화도 관찰하였습니다. 현재 맨디언트는 세 가지 난독화 변종을 추적하고 있습니다. 2021년 초부터 GOOTLOADER는 하나의 난독화된 코드 블록(MD5: ab1171752af289e9f85a918845859848)이 포함된 JS 파일로 배포되었습니다. 이 샘플은 난독화 변형 1로 추적하였습니다(그림 3).

GOOTLOADER obfuscation variant 1 in February 2021
그림 3: 2021년 2월 GOOTLOADER 난독화 변형 1

맨디언트는 2021년 10월 트로이 목마화된 jQuery 라이브러리가 내장된 GOOTLOADER를 발견하였습니다. 이는 탐지를 회피하고 분석을 방해하려는 시도로 보입니다(MD5: 82607b68e061abb1d94f33a2e06b0d20). 이 샘플은 난독화 변형 2로 추적하였습니다(그림 4).

GOOTLOADER obfuscation variant 2 in October 2021
그림 4: 2021년 10월 GOOTLOADER 난독화 변형 2

맨디언트는 2022년 8월 난독화 코드 약간 변형된 샘플을 관찰하였습니다. 이 샘플은 난독화된 문자열 변소를 같은 줄에 두지 않고 전체 파일 곳곳에 두었습니다(MD5: d3787939a5681cb6d6ac7c42cd9250b5). 이 샘플은 그림 5와 같이 jQuery가 아닌 트로이 목마화된 jit.js 파일을 샘플링하였습니다.

GOOTLOADER obfuscation variant 2 in August 2022
그림 5: 2022년 8월 GOOTLOADER 난독화 변형 2

맨디언트는 2022년 11월 새로운 난독화 변종을 또 발견하였습니다. 이 변종은 이전보다 더 복잡합니다. 이 변형에는 두 번째 난독화 단계에 문자열 변수가 추가되었습니다. 그리고 이 변종은 jQuery, Chroma.js, Underscore.js(MD5: ea2271179e75b652cafd8648b698c6f9)를 포함한 여러 합법적인 자바스크립트 라이브러리를 트로이 목마화하는 것으로 관찰되었습니다.

GOOTLOADER obfuscation variant 3 in November 2022
그림 6: 2022년 11월 GOOTLOADER 난독화 변형 3

난독화 변형 비교

다음 표는 맨디언트가 관찰한 샘플을 기반으로 다양한 난독화 변형을 비교한 것에 대한 내용입니다.

Table 1: Comparison between different GOOTLOADER obfuscation variants
 

변형 1

변형 2

변형 3

처음 관찰 시점

2021년 2월

2021년 10월

2022년 11월

맬웨어

쉽게 알아볼 수 있는 하나의 난독화된 코드 블록

파일 내에 맬웨어 코드가 중첩되어 있음, 초기 샘플에는 한 코드 블록에 모든 변수가 있었으나 이후 샘플은 파일 전체에 코드가 퍼져 있음

파일 전체에 맬웨어 코드가 중첩되어 있음, 두 번째 난독화를 위해 문자열 변수가 추가됨

페이로드 (감염 체인 내용 참조)

GOOTLOADER

GOOTLOADER

GOOTLOADER.POWERSHELL

파일리스 레지스트리 페이로드

GOOTLOADER를 실행하면 다음과 같이 두 개의 추가 페이로드가 다운로드됩니다. 이들은 윈도우 레지스트리에 저장되며, 영구적으로 유지됩니다. 메모리 저장 후 페이로드가 시작됩니다.

HKCU\SOFTWARE\Microsoft\Phone\%USERNAME%0 (FONELAUNCH)

HKCU\SOFTWARE\Microsoft\Phone\%USERNAME% (Secondary registry payload)

 

HKCU\SOFTWARE\Microsoft\Personalization\%USERNAME%0 (FONELAUNCH)

HKCU\SOFTWARE\Microsoft\Personalization\%USERNAME% (Secondary registry payload)

 

HKCU\SOFTWARE\Microsoft\Fax\%USERNAME%0 (FONELAUNCH)

HKCU\SOFTWARE\Microsoft\Fax\%USERNAME% (Secondary registry payload)

 

HKCU\SOFTWARE \Microsoft\Personalization\<RANDOM_STRING> (FONELAUNCH & The secondary registry payload)

두 번째 단계로 넘어가면 파워쉘 스크립트가 레지스트리에 저장된 악성 페이로드를 시작하는 예약된 작업을 생성하려고 시도합니다.

Second stage PowerShell script that creates a scheduled task for malware persistence
그림 8: 맬웨어 지속성을 위해 예약된 작업을 생성하는 두 번째 단계 PowerShell 스크립트
The Base64 data from Figure 8 is a PowerShell script that reconstructs and executes the first registry payload
그림 9: 그림 8의 Base64 데이터는 첫 번째 레지스트리 페이로드를 재구성하고 실행하는 PowerShell 스크립트입니다.

파워쉘 스크립트는 메모리에서 FONELAUNCH 맬웨어 실행을 위해 다음 단계를 수행합니다.

  • HKCU\SOFTWARE\Microsoft\Phone\%USERNAME%0 레지스트리 키 쿼리
  • 모든 레지스트리 값을 병합
  • "#" 문자를 문자열 '1000'으로 바꿈
  • 데이터를 16진수에서 바이트로 변환
  • 페이로드(FONELAUNCH) 로드 후 실행

FONELAUNCH

FONELAUNCH는 GOOTLOADER에 의해 레지스트리에 기록되는 페이로드 중 하나로 인코딩 된 페이로드를 로드하는 .NET 기반 로더입니다. 2021년 5월부터 맨디언트는 UNC2565가 세 가지 변형을 사용하는 것을 관찰하였습니다. 시간이 흐르면서 FONELAUNCH 변종은 진화를 통해 DLL, .NET 바이너리, PE 파일 등 다양한 페이로드를 배포하고 실행할 수 있게 되었습니다.

  • FONELAUNCH.FAX는 'HKCU\SOFTWARE\Microsoft\Fax\%USERNAME% ' 레지스트리 키에서 데이터를 읽고 디코딩 합니다. 반환된 컨텐츠는 런타임 시 메모리에 로드되는 .NET 어셈블리일 것으로 보입니다. FONELAUNCH.FAX는 현재 사용자 레지스트리 하이브(그림 10)에 레지스트리 키를 생성해 지속성을 설정합니다(MD5: d6220ca85c44e2012f76193b38881185).
  • FONELAUNCH.PHONE는 특정 레지스트리 키에 있는 데이터를 읽고 디코딩 합니다. 반환된 데이터는 공개적으로 사용할 수 있는 DynamicDllLoader 프로젝트를 통해 로드 되는 DLL로 보입니다. 초기 샘플은 'HKCU\SOFTWARE\Microsoft\Phone\%USERNAME% '레지스트리 키(MD5: 35238d2a4626e7a1b89b13042f9390e9)에서 데이터를 읽고 디코딩 했습니다. 2022년 10월부터 FONELAUNCH.PHONE 샘플의 하위 집합이 'HKCU\SOFTWARE\Microsoft\Personalization\%USERNAME%'에서 데이터를 읽고 디코딩 했습니다.
  • FONELAUNCH.DIALTONE은 'HKCU\SOFTWARE\Microsoft\%USERNAME%' 레지스트리 키에서 데이터를 읽고 디코딩 합니다. 반환된 컨텐츠는 PE 파일로 보입니다(MD5: aef6d31b3249218d24a7f3682a00aa10). 참고로 FONELAUNCH.DIALTONE이 배포된 모든 사고는 SNOWCONE.GZIPLOADER 실행으로 이어졌습니다.

다음 표는 FONELAUNCH 변형 간 비교에 대한 내용입니다.

 

FONELAUNCH.FAX

FONELAUNCH.PHONE

FONELAUNCH.DIALTONE

처음 관찰한 시점

2021년 5월

2021년 9월

2022년 5월

관찰한 레지스트리 경로

HKCU\SOFTWARE\Microsoft\Fax\%USERNAME%

HKCU\SOFTWARE\Microsoft\Phone\%USERNAME%

 HKCU \SOFTWARE\Microsoft\Personalization\%USERNAME%

 HKCU\SOFTWARE\Microsoft\%USERNAME%

지원 페이로드

.NET

DLL

PE

지속성 유지

RunOnce 레지스트리 키

없음

없음

FONELAUNCH.FAX persistence mechanism
그림 10: FONELAUNCH.FAX 지속성 메커니즘

dnSpy로 FONELAUNCH를 열면 'HKCU\SOFTWARE\Microsoft\Phone\%USERNAME%' 레지스트리 키에 있는 두 번째 페이로드 디코딩에 사용할 수 있는 대체 암호 키가 나타납니다.

The dnSpy screenshot shows the substitution table and loading function
그림 11: dnSpy 스크린샷은 대체 테이블과 로딩 기능을 보여줍니다.

보조 레지스트리 페이로드

GOOTLOADER에 의해 레지스트리에 기록된 페이로드는 .NET 또는 C++ 언어로 작성한 메모리 전용 드로퍼로 임의로 이름이 지정된 함수에 있는 임베디드 페이로드를 디코딩 하고 실행합니다. dnSpy로 열어 보면 그림 12와 같이 메모리에서 실행될 것임을 알 수 있습니다. 맨디언트는 대부분 Cobalt Strike BEACON 페이로드라는 것을 확인하였습니다.

dnSpy screenshot showing the payload that will be launched in memory
그림 12: 메모리에서 실행될 페이로드를 보여주는 dnSpy 스크린샷

GOOTLOADER 난독화 알아보기

GOOTLOADER의 GitHub 페이지를 통해 본 포스팅에서 언급한 모든 스크립트를 받아볼 수 있습니다.

변형 1

앞서 언급한 바와 같이 GOOTLOADER 변형 1의 난독화는 간단합니다. 그림 13과 같이 Python 함수의 2회 반복은 자바스크립트 파일을 해독합니다.

deobfuscation function
그림 13: 난독화 기능

다음 그림에서 빨간색 부분이 난독화 관련 코드입니다.

GOOTLOADER obfuscation variant 1 JS sample
그림 14: GOOTLOADER 난독화 변형 1 JS 샘플

첫 번째 난독화 반복 결과는 다음 그림과 같습니다.>

First GOOTLOADER deobfuscation iteration
그림 15: 첫 번째 GOOTLOADER 난독화 반복

작은따옴표로 묶인 코드를 난독화하면 스크립트가 디코딩 됩니다. 다음 그림은 CyberChef 'Generic Code Beatutify' 레시피를 사용한 후 결과를 보여줍니다.

Using CyberChef to beautify the code
그림 16: CyberChef를 사용하여 코드 미화

변형 2

변형 1 이후 등장한 변형은 추가 난독화를 위해 1만 라인 이상의 코드 속에 자신을 숨깁니다. 정규 표현식 '.*\+.*\+.*\+.*\+.*\+.*\+.*\+.*\+.*(\n.*\=.*\+. *)*'을 사용해 관련 코드 블록을 찾을 수 있습니다.

Malicious code in the GOOTLOADER obfuscation variant 2 JS file sample
그림 17: GOOTLOADER 난독화 변종 2 JS 파일 샘플의 악성코드

그림 17과 같이 코드는 여러 변수를 채운 다음 함께 연결합니다. 난독화된 코드에 'Single' 문자열이 없기 때문에 GOOTLOADER1 스크립트를 사용할 수 없습니다.

wabjrw = siyiqs+ektlkoi+nknhti+idkbqxaw+pqxyicj+vzphnjxnkwqcf+yycsvqac+udazlru+rnoyxn+pdolnhb+oznmgnee;

다음 코드 블록은 여러 'equals' 문을 사용해 코드를 난독화하는 다른 변형을 보여줍니다.

Sdcsd= sdcdscs+sdcsdc; wabjrw =ujmlmdcd+sdcsd

이후 샘플은 관련 코드를 파일 전체에 퍼뜨립니다. 그러나 변수는 여전히 동일한 순서로 설정되므로 스크립트의 난독화를 자동화할 수 있습니다.

샘플들 간의 또 다른 차이는 파일 맨 위에 있는 주소 블록입니다. 초기 샘플에는 'jQuery JavaScript Library” (MD5: 82607b68e061abb1d94f33a2e06b0d20)'이 포함되어 있었고, 이후 샘플에는 그림 18 및 19와 같이 ‘Copyright © 2011 Sencha In–. - Author: Nicolas Garcia Belmonte” (MD5: d3787939a5681cb6d6ac7c42cd9250b5)’이 포함되어 있었습니다.

Early GOOTLOADER obfuscation variant 2 JS file header
그림 18: 초기 GOOTLOADER 난독화 변형 2 JS 파일 헤더
Later GOOTLOADER obfuscation variant 2 JS file header
그림 19: 최신 GOOTLOADER 난독화 변형 2 JS 파일 헤더

연결된 변수 결과를 수동으로 계산하면 많은 변수가 있고 순서가 잘못 선언되므로 시간이 많이 걸립니다. 반면에 스크립트에서 문자열 연결 코드를 실행하고 결과를 난독화하면 빠르게 처리할 수 있습니다.

수동 난독화 스크립트는 자바스크립트 파일에서 관련 코드 블록을 일일이 찾아 스크립트에 입력해야 합니다. GOOTLOADER의 경우 스크립트의 사소한 변경만으로도 자동화 기반 처리가 중단될 수 있습니다. 더 자세한 난독화 관련 내용은 GOOTLOADER GitHub 페이지를 참조 바랍니다.

변형 2의 경우 관련 코드를 수동으로 찾는 대신 'GootLoaderAutoJsDecode.py' 스크립트로 전체 프로세스를 자동화할 수 있습니다. 스크립트는 파일 헤더를 사용해 샘플을 구별하고, 그에 따라 정규식 검색을 조정합니다. 자바스크립트 파일을 매개변수로 스크립트에 전달하면 모든 맬웨어 도메인 목록이 반환되고 해독한 코드가 'DecodedJsPayload.js_'에 기록됩니다. 스크립트는 GOOTLOADER GitHub 페이지에서 받아 볼 수 있습니다.

python GootLoaderAutoJsDecode.py evil.js
Result of the decoding script
그림 20: 디코딩 스크립트의 결과

변형 3

이전 변형과 달리 변형 3은 실행 중에 두 개의 난독화된 자바스크립트 파일을 활용합니다. 샘플을 보면 여러 문자열 변수가 연결되고 디코딩 되는 난독화 방법을 사용하는 것을 알 수 있습니다. 삭제된 두 번째 파일을 디코딩 하는데에는 추가 루틴이 사용됩니다(그림 21). 샘플을 수동으로 디코딩 하는 것도 가능하지만 너무 번거롭습니다. 따라서 자동화된 스크립트를 사용하는 것이 좋습니다.

Python version of the decoding routine
그림 21: 디코딩 루틴의 Python 버전

'GootLoaderAutoJsDecode.py' 스크립트는 변형 3 샘플을 디코딩 하는 데에도 사용할 수 있습니다. 이 스크립트는 새로운 디코딩 루틴을 사용해 첫 번째 파일을 난독화하고 모든 관련 출력을 'GootLoader3Stage2.js_'에 저장하여 디코딩을 위한 스크립트로 다시 전달합니다(그림 22). 스크립트는 GOOTLOADER GitHub 페이지에서 받아 볼 수 있습니다.

Decoded output showing the C2 domains
그림 22: C2 도메인을 보여주는 디코딩 된 출력

레지스트리 페이로드 재구성

데이터가 상주하는 위치에 따라 레지스트리 페이로드를 재구성할 수 있습니다.

Off Host — Python Script + CSV

CSV 레지스트리 내보기와 결합된 'GootloaderRegDecode.py' 스크립트를 사용해 페이로드를 자동으로 재구성할 수 있습니다. 이 스크립트는 CSV 파일 형식을 지정하는 방법에 대한 세부 정보를 제공하며 레지스트리 페이로드 중 하나 또는 둘 모두를 동시에 처리할 수 있습니다.

GootloaderRegDecode.py Payload-1-and-2-Reg-Export.csv

GootloaderRegDecode.py Payload-1-Reg-Export.csv

GootloaderRegDecode.py Payload-2-Reg-Export.csv

두 페이로드 모두 현재 디렉토리에 저장되고 각 페이로드에 대한 MD5 해시가 제공됩니다. 이 스크립트는 Redline 및 Trellix HX 분류 패키지의 레지스트리 내보내기를 사용해 테스트 되었습니다. 다른 EDR은 약간 수정을 해야 스크립트가 동작합니다.

Off Host — CyberChef + Reg Export

CyberChef를 사용해 레지스트리 내보내기에서 페이로드를 추출할 수 있습니다. 'HKCU\SOFTWARE\Microsoft\Phone\%USERNAME%0''HKCU\SOFTWARE\Microsoft\Phone\%USERNAME%' 레지스트리 키의 별도 '.reg' 내보내기를 다음과 같은 명령으로 만듭니다. 그런 다음 파일을 CyberChef로 가져옵니다. 적절한 CyberChef의 레시피(GootloaderCyberChef-Stage1.recipie)(GootloaderCyberChef-Stage2.recipie)를 로드합니다. 끝으로 출력을 저장합니다.

reg export HKCU\SOFTWARE\Microsoft\Phone\%USERNAME%0\ reg_stage1.reg

reg export HKCU\SOFTWARE\Microsoft\Phone\%USERNAME%\ reg_stage2.reg

On Host — PowerShell Script

'GootloaderWindowsRegDecode.ps1' 스크립트는 현재 레지스트리 키가 있는 호스트에서 실행할 수 있습니다. 스크립트는 현재 사용자 또는 시스템에 있는 다른 사용자에 의해 실행될 수 있습니다. 두 페이로드 모두 현재 디렉토리에 저장되고 각 페이로드에 대한 MD5 해시가 제공됩니다.

#Run against the current user account GootloaderWindowsRegDecode.ps1

#Run against the JSmith user account GootloaderWindowsRegDecode.ps1 -User JSmith

끝으로 본 포스팅 작성에 도움을 주신 Ng Choon Kiat, David Lindquist, Yash Gupta, Jonathan Lepore, Tufail Ahmed, Moritz Raabe에게 감사의 말을 전합니다.

부록

기술 지표

지표에 대한 더 많은 정보는 맨디언트 어드밴티지 포탈에서 확인할 수 있습니다.

GOOTLOADER ZIP 파일
  • 1011b2cbe016d86c7849592a76b72853
  • 80a79d0c9cbc3c5188b7a247907e7264
  • bee08c4481babb4c0ac6b6bb1d03658e
GOOTLOADER JS 파일
  • 82607b68e061abb1d94f33a2e06b0d20
  • 961cd55b17485bfc8b17881d4a643ad8
  • af9b021a1e339841cfdf65596408862d
  • d3787939a5681cb6d6ac7c42cd9250b5
  • ea2271179e75b652cafd8648b698c6f9
  • ab1171752af289e9f85a918845859848
레지스트리 페이로드 1 (FONELAUNCH)
  • FONELAUNCH.FAX
    • d6220ca85c44e2012f76193b38881185
  • FONELAUNCH.PHONE
    • 35238d2a4626e7a1b89b13042f9390e9
    • 53c213b090784a0d413cb00c27af6100
    • 7352c70b2f427ef4ff58128a428871d3
    • a0b7da124962b334f6c788c27beb46e3
    • a4ee41bd81dc3b842ddb2952d01f14ed
    • d401dc350aff1e3fd4cc483238208b43
    • ec17564ac3e10530f11a455a475f9763
    • f9365bf8d4b021a873eb206ec98453d9
    • aec78c1ef489f3f4b621037113cbdf81
  • FONELAUNCH.DIALTONE
    • 08fa99c70e90282d6bead3bb25c358dc
    • aef6d31b3249218d24a7f3682a00aa10
레지스트리 페이로드 2
  • Cobalt Strike BEACON
    • 04746416d5767197f6ce02e894affcc7
    • 2eede45eb1fe65a95aefa45811904824
    • 3d768691d5cb4ae8943d8e57ea83cac1
    • 84f313426047112bce498aad97778d38
    • 92a271eb76a0db06c94688940bc4442b
  • SNOWCONE
    • 328b032c5b1d8ad5cf57538a04fb02f2
    • 7a1369922cfb6d00df5f8dd33ffb9991

네트워크 지표

  • jonathanbartz[.]com
  • jp[.]imonitorsoft[.]com
  • junk-bros[.]com
  • kakiosk[.]adsparkdev[.]com
  • kepw[.]org
  • kristinee[.]com
  • lakeside-fishandchips[.]com

Cobalt Strike Beacon 백도어

  • hxxps://108.61.242[.]65/dot.gif
  • hxxps://108.61.242[.]65/submit.php
  • hxxps://146.70.78[.]43/fwlink
  • hxxps://146.70.78[.]43/submit.php
  • hxxps://87.120.254[.]39/ga.js
  • hxxps://87.120.254[.]39/submit.php
  • hxxps://45.150.108[.]213/ptj
  • hxxps://45.150.108[.]213/submit.php
  • hxxps://92.204.160[.]240/load
  • hxxps://92.204.160[.]240/submit.php

YARA 룰

FONELAUNCH.FAX 탐지 룰

rule M_Launcher_FONELAUNCH_1

{

    meta:

      author = "Mandiant”

      description = "Hunting rule looking for FONELAUNCH.FAX samples.”

      md5 = "d6220ca85c44e2012f76193b38881185"

 

    strings:

      $str_method_a = "OpenSubKey" ascii

      $str_namespace = "System.Reflection" ascii

      $str_method_b  = "[Environment]::GetEnvironmentVariable(" wide

     

      $ilasmx86_sequence_encoding_a = { 0A 06 02 7D [3] 04 00 16 06 }

      $ilasmx86_sequence_encoding_b = { 72 [3] 70 72 [3] 70 6F ?? 00 00 0A }

 

    condition:

      uint16(0) == 0x5A4D and all of ($str_*) and

      (

        $ilasmx86_sequence_encoding_a and #ilasmx86_sequence_encoding_b >= 16

      )

}

FONELAUNCH.DIALTONE 탐지 룰

rule M_Launcher_FONELAUNCH_2

{

    meta:

      author = "Mandiant"

      description = "Hunting rule looking for FONELAUNCH.DIALTONE samples."

      md5 = "aef6d31b3249218d24a7f3682a00aa10"

 

    strings:

      $ilasmx86_sequence_fprototype_a = { 1F 30 20 1B 00 10 00 28 }   

      $ilasmx86_sequence_fprototype_b = { 26 11 ?? 11 ?? 07 6A 20 ?? 30 00 00 1F 40 28 }

 

      $ilasmx86_sequence_encoding_a = { 0A 06 02 7D [3] 04 00 16 06 }

      $ilasmx86_sequence_encoding_b = { 72 [3] 70 72 [3] 70 6F ?? 00 00 0A }

 

    condition:

      uint16(0) == 0x5A4D and all of ($ilasmx86_sequence_fprototype_*) and

      (

        $ilasmx86_sequence_encoding_a and #ilasmx86_sequence_encoding_b >= 16

      )

}

FONELAUNCH.PHONE 탐지 룰

rule M_Launcher_FONELAUNCH_3

{

    meta:

      author = “Mandiant”

      description = “Hunting rule looking for FONELAUNCH.PHONE samples.”

      md5 = "ec17564ac3e10530f11a455a475f9763"

 

    strings:

      $str_winfunction = "LoadLibrary" ascii

      $str_registrykey = "SOFTWARE\\" wide

      $str_constant = "PAGE_EXECUTE_READWRITE" ascii

 

      $ilasmx86_sequence_encoding_a = { 0A 06 02 7D [3] 04 00 16 06 }

      $ilasmx86_sequence_encoding_b = { 72 [3] 70 72 [3] 70 6F ?? 00 00 0A }

 

    condition:

      uint16(0) == 0x5A4D and all of ($str_*) and

      (

        $ilasmx86_sequence_encoding_a and #ilasmx86_sequence_encoding_b >= 16

      )

}

GOOTLOADER.POWERSHELL 탐지 룰

rule M_Downloader_GOOTLOADER_POWERSHELL

{

  meta:

    author = "Mandiant"

    description = "Hunting rule looking for GOOTLOADER.POWERSHELL samples."

    md5 = "2567a2bca964504709820de7052d3486"

 

  strings:

    $ps_object_a = ".IsLink" ascii

    $ps_object_b = ".IsFolder" ascii

    $ps_object_c = ".IsFileSystem" ascii

   

    $ps_code_parseresponse = "[1] -replace" ascii nocase

    $ps_code_httpheader = ".Headers.Add(\"Cookie:" ascii nocase

    $ps_code_concatenatedata = "([String]::Join(\"|" ascii nocase

 

  condition:

    all of ($ps_code_*) and any of ($ps_object_*)

}

FONELAUNCH 탐지 룰

import "pe"

rule M_Hunting_Win_FONELAUNCH

{

    meta:

        author = "Mandiant"

        description = "Hunting rule looking for suspicious version information metadata observed in FONELAUNCH samples"

        md5 = "35238d2a4626e7a1b89b13042f9390e9"

    strings:

        $m1 = { 49 00 6E 00 74 00 65 00 72 00 6E 00 61 00 6C 00 4E 00 61 00 6D 00 65 00 00 00 70 00 6F 00 77 00 65 00 72 00 73 00 68 00 65 00 6C 00 6C 00 2E 00 64 00 6C 00 6C 00 }

        $m2 = { 4F 00 72 00 69 00 67 00 69 00 6E 00 61 00 6C 00 46 00 69 00 6C 00 65 00 6E 00 61 00 6D 00 65 00 00 00 70 00 6F 00 77 00 65 00 72 00 73 00 68 00 65 00 6C 00 6C 00 2E 00 64 00 6C 00 6C 00 }

   

    condition:

        filesize < 15MB and uint16(0) == 0x5a4d and uint32(uint32(0x3C)) == 0x00004550 and (pe.version_info["OriginalFilename"] == "powershell.dll" or pe.version_info["InternalName"] == "powershell.dll" or any of ($m*))

}

탐지 기술

제품

시그니처

Trellix Endpoint Security

  • SUSPICIOUS POWERSHELL USAGE B (METHODOLOGY)
  • Powershell Encoded Command
  • JS loader extracted from ZIP file
  • Potential GootLoader File
  • CRITICAL: JS loader extracted from ZIP file

Trellix Endpoint Security (Hunting)

  • WSCRIPT WRITES LARGE REG KEY VALUE (METHODOLOGY)
  • EXPLORER LAUNCHING WSCRIPT (METHODOLOGY)
  • FILEWRITE TO ARCHIVE (FILETRACKER)

Microsoft Defender for Endpoint

  • Suspicious PowerShell command line
  • Suspicious file launch
  • Suspicious JavaScript process
  • An active 'Gootkit' malware in a PowerShell script was detected while executing via AMSI
  • An active 'Gootkit' malware in a PowerShell script was prevented from executing via AMSI

Trellix Network Security

  • Downloader.JS.GOOTLOADER
  • Backdoor.BEACON
  • M.Malicious.SSL.Certificate.[CobaltStrike]
  • M.Malicious.SSL.Certificate.[146473198]