Blog

변조된 LNK 바로 가기 파일을 이용한 침해를 찾기 위한 헌팅 방법론

Jared Wilson
May 01, 2023
11 min read
|   Last updated: Mar 06, 2024
Threat Research
TTPs

마술의 한 종류로 손 기술을 이용하는 것이 있습니다. 손가락의 움직임에 초점을 두고 청중의 눈을 속이는 것으로 카드 같은 소품을 이용하기도 합니다. 손 기술을 이용하는 마술의 비밀은 청중의 눈에 보이지 않는 숨겨진 액션입니다. 이런 수법은 사이버 위협 행위자들도 사용합니다. 초기 침투에 성공한 후 지속성을 유지할 때 마법사와 같이 상대를 속이는 손 기술을 씁니다. 맨디언트의 관찰에 따르면 위협 행위자가 쓰는 손 기술은 대략 다음과 같습니다.

  1. 사용자가 자신도 모르는 사이에 변조된 LNK 바로 가기 파일을 실행하게 합니다.
  2. 수정된 LNK 바로가기 파일은 합법적인 브라우저를 실행하여 악성 확장 프로그램임을 숨깁니다.

위와 같은 손 기술을 통한 속임수가 통하면 위협 행위자는 악의적인 Chromium 기반 브라우저 확장 프로그램을 통해 지속성을 달성합니다. 맨디언트는 이런 방법론에 대한 이해를 토대로 러스트(rust) 언어로 만든 드롭퍼인 BRAINSTORM을 식별하였습니다. 이 드롭퍼는 스파이더랩스(SpiderLabs)가 처음 공개적으로 보고한 크롬 기반 확장 프로그램인 RILIDE와 끈이 닿아 있는 것으로 확인되었습니다. 본 포스팅에서는 변조된 LNK 바로 가기 파일을 실행하게 하는 악의적인 방법론을 분석하고 관련된 맬웨어 제품군에 대해 논의해 보겠습니다.

LNK에서 확장 프로그램으로 연결

LNK 파일

확장자가 .lnk인 LNK 파일은 공식적으로 쉘 링크 바이너리를 뜻합니다. 표준화된 형식을 따르는 LNK 파일에는 다른 데이터 객체를 가리키는 정보가 포함되어 있습니다. 대부분의 경우 이 정보는 최종 사용자에게 직관적입니다. 가령 윈도우 운영체제 사용자는 시작 메뉴에서 구글 크롬 아이콘을 클릭하면 크롬 브라우저가 열립니다. 사용자의 눈에는 크롬 브라우저로 보이지만 마술사의 손 기술처럼 LNK 파일은 보이지 않는 작업을 합니다. 아이콘이 크롬 실행 파일을 가리키는 속성을 포함하고 있는 것입니다.

맨디언트는 다음과 같은 많은 공격자 및 맬웨어 제품군이 LNK 파일을 악용하는 사례를 보고한 바 있습니다(FIN7, UNC1151, KEGTAP, FIN13, APT29)

CRX 파일

CRX 파일은 크롬 기반 브라우저에서 확장 프로그램으로 사용할 수 있는 단일 패키지에 함께 보관된 파일 모음입니다. 확장 프로그램은 브라우저에 기능을 추가해 웹을 이용하는 사용자 경험을 개선합니다. 대부분의 브라우저는 사용자가 자신이 필요한 확장 프로그램을 손쉽게 찾을 수 있는 스토어를 운영합니다. 스토어에 올라온 확장 프로그램은 브라우저를 소유한 회사에서 사전 검토를 하므로 보안 측면에서 더 안전한 것으로 인식되고 있습니다.

그러나 경우에 따라 확장 프로그램은 안전하지 않을 수 있습니다. 사용자의 브라우저 보안 설정에 따라 CRX 파일 또는 압축 해제된 확장 프로그램의 매뉴얼 로딩을 허용할 수도 있습니다. 압축이 풀린 확장자(CRX 파일)은 확장자가 .crx인 단일 파일입니다. 반면에 압축이 풀린 확장자는 확장자 파일이 포함된 디렉토리입니다. 맨디언트는 2022년 한 해 동안 금정적인 동기를 가진 여러 위협 행위자들이 악성 브라우저 확장자를 배포하거나 운영에 활용하는 데 관심을 보이고 있는 것을 관찰할 수 있었습니다.

LNK와 CRX 악용

맨디언트는 이전에 LNK 파일과 CRX 파일의 남용에 대해 개별적으로 보고한 적이 있습니다. 최근 관찰에 따르면 공격자는 일련의 이벤트에서 두 파일 유형을 모두 활용하고 있는 것으로 나타났습니다. 두 파일 간 연결 포인트는 크롬 기반 브라우저의 --load-extension 스위치입니다. 이 스위치를 사용하면 소스가 확장 프로그램으로 로드할 대상 디렉토리를 지정할 수 있습니다. 이를 통해 맬웨어는 악상 확장 프로그램이 로드된 새 브라우저 창을 시작할 수 있습니다. 이 기능은 Chromium 기반 브라우저에 있으며 다음과 같이 예제 명령을 찾을 수 있습니다.

그림 1: 여러 Chromium 기반 브라우저에서 확장을 로드하는 예제 명령

chrome.exe --load-extension="C:\Users\user\AppData\Local\Temp\HHe2lr" brave.exe --load-

extension="C:\Users\user\AppData\Local\Temp\HHe2lr" msedge.exe --load-

extension="C:\Users\user\AppData\Local\Temp\HHe2lr" opera.exe --load-

extension="C:\Users\user\AppData\Local\Temp\HHe2lr" vivaldi.exe --load-

extension="C:\Users\user\AppData\Local\Temp\HHe2lr"

맨디언트가 식별한 방법론

2023년 맨디언트는 LNK 및 확장 프로그램 남용 방법론 관련 여러 침해 사고를 조사하였습니다. 이들 사고에 영향을 받은 곳은 반도체, 마케팅, 금융, 통신 등 다양한 산업 분야에 속한 조직이었습니다. LNK 남용 및 확장 프로그램 설치를 모두 활용해 RILIDE를 지속하는 맬웨어 제품군에 대한 조사 내용을 상세히 알아보겠습니다.

조사 1

TradingView Desktop은 주식, 외환, 암호 화폐 등의 차트와 기술 분석, 트레이딩 아이디어, 소셜 트레이딩, 뉴스 및 경제 정보 등 다양한 기능을 제공하는 프로그램입니다. 암호화폐를 노리는 위협 행위자에게 아주 매력적인 표적이라 할 수 있는 프로그램입니다.

TradingView Desktop_v4-94406.zip 파일은 TradingView Desktop을 가장한 파일 세트입니다. 샘플은 457개의 서로 다른 파일이 포함된 압축 디렉토리입니다. 압축 파일에서 눈길을 끈 것은 Node.JS 기반의 다운로더인 TradingView Desktop_x64.exe입니다. 이를 실행하면 텔레그램을 가장한 URL(hxxp://telegromcn[.] org/soft/analytics/extension[.])에 접속하여 드롭퍼 확장자인 extention.exe를 다운로드합니다. 맨디언트는 이를 BRAINFOG로 추적하고 있습니다.

BRAINFOG는 Node.JS로 패키징된 바이너리 드롭퍼로 비주얼 베이직 스크립트와 함께 RILIDE를 드롭하여 모든 크롬 LNK를 삭제합니다. 그러고 나서 악의적인 LNK 파일을 통해 RILIDE를 강제로 실행합니다. RILIDE는 피해자가 방문한 URL을 모니터링하고, 브라우저 탭 보기를 스크린샷으로 찍고, 일부 웹 사이트에 원격 자바 스크립트를 삽입하는 Chromium 기반 확장 프로그램입니다. RILIDE는 이메일 및 암호화폐 세부 정보를 도용하는 것을 목표로 하는 금융 부문을 표적으로 삼는 맬웨어입니다.

BRAINFOG는 extension.zip(RILIDE), wtf.vbs, chrome.vbs, chrome.lnk 파일을 드롭합니다.

  1. 실행 시 BRAINFOG는 taskkill.exe를 사용해 모든 크롬 인스턴스를 닫습니다.
  2. 그리고 chrome.vbs를 사용해 'Chrome'이 포함된 모든 LNK 파일을 삭제합니다.
  3. wtf.vbs는 --load-extension 스위치를 사용하여 새 LNK를 생성합니다. 이를 실행하면 RILIDE 브라우저 확장 프로그램이 강제로 로드됩니다.

사용자가 바뀐 LNK 바로가기 파일을 통해 크롬을 열면 감염된 브라우저가 웹 페이지를 로드하고 RILIDE가 백그라운드에서 실행됩니다. 초기 실행 중에 C2(Command & Control) API 엔드포인트 /api/machine/init에서 머신 식별자와 표적 도메인 목록을 가져옵니다. 참고로 이 목록은 5분마다 다시 가져옵니다.

그림 2: RILIDE 변형이 /api/machine/init에서 모니터링하는 도메인
{"machineId":2984,"urls":["coinbase.com","binance.com","blockchain.com","mail.google","outlook.live","mail.yahoo","bybit.com","okx.com"]}

HTML 문서가 완전히 구문 분석이 되면 DOMContentLoaded 이벤트가 대상 함수인 loadScript로 전달됩니다. 이 함수는 이름과 경로가 포함된 키-값 쌍의 목록을 다운로드합니다. 이름은 관심 트래픽과 관련된 도메인입니다. 브라우징 도메인이 모니터링되는 도메인 중 하나와 일치하면 결로 값의 자바 스크립트가 액세스되고 결과 파일에 웹 사이트에 주입되어 실행됩니다.

그림 3: Adversary C2의 /api/machine/get-urls 엔드포인트에 나열된 도메인 및 URI

이를 통해 공격자는 피해자를 대신해 작업을 호출하거나 웹 세션에서 데이터를 훔칠 수 있습니다. 맨디언트는 RILIDE 맬웨어 제품군을 추적하는 동안 C2 서버에서 흥미로운 API 엔드포인트를 여럿 발견했습니다.

그림 4: RILIDE C2 API 엔드포인트

hxxp://extenision-app[.]com/api/settings

hxxp://extenision-app[.]com/api/machine/

hxxp://extenision-app[.]com/api/machine/init

hxxp://extenision-app[.]com/api/machine/get-urls

표 1은 각 엔드포인트가 반환하는 내용입니다.

표 1: RILIDE C2 API 엔드포인트 설명
엔드포인트기능
/api/settings
  • 생성 및 업데이트된 날짜/시간
  • 최소 금액을 정의하는 여러 통화 금액(80 EUR, 80 USD 등)
  • 텔레그램 채팅 ID 및 토큰
/api/machine

피해자에 대한 세부 정보 목록 반환

  • 피해자 IP 주소
  • 피해자 국가
  • 변형 참조(Google, TradingView 등)
  • 추가되었을 때
  • C2 서버와 통신하는 것이 마지막으로 관찰되었을 때
/api/machine/init컴퓨터 ID와 컴퓨터 ID가 모니터링하는 도메인 목록을 반환
/api/machine/get-urls삽입할 JS 스크립트에 대한 URI 경로 반환

조사 2

이전에 SpiderLabs 블로그에서 강조한 바와 같이 GitHub 사용자인 굴라틴은 RILIDE 샘플을 저장하는 수많은 리포지토리를 보유하고 있는 것으로 확인되었습니다. 또한, 맨디언트는 이것이 샘플을 전달하기 위한 방법일 수 있다고 의심하고 있습니다.

맨디언트가 BRAINLINK로 추적한 Blanks라는 이름의 파일은 굴라틴의 GitHub 리포지토리(hxxp://raw.githubusercontent[.]com/gulantin/blanks/main/blanks_online.exe)의 URL인 raw.githubusercontent.com에서 다운로드되었습니다.

BRAINLINK는 인스톨러 컴파일 드롭퍼파워쉘 스크립트와 함께 RILIDE 확장 파일이 포함된 CAB 파일을 드롭하여 RILIDE를 강제로 실행하는 새로운 바로가기를 생성합니다.

맨디언트는 RILIDE에 대한 조사를 통해 백그라운드 자바 스크립트 파일에 각 맬웨어 버전에 대해 C2 서버 도메인으로 설정된 것이 포함되어 있음을 확인했습니다. 이 조사에서 RILIDE 샘플은 ashgrrwt[.]click 도메인을 사용했습니다.

그림 4: RILIDE C2 도메인 변수 정의
const domain = "https://ashgrrwt.click"

RILIDE C2 서버 인프라 헌팅

C2 서버 인프라는 다른 수많은 도메인 간에 흥미로운 중복을 보여주었습니다. ashgrrwt[.]click 도메인 관리자, WHOIS 세부 정보는 개인정보 보호를 위해 삭제되었지만 등록자 조직은 지워지지 않았습니다. 등록자 조직인 Kruglova LTD는 11개의 다른 웹 사이트와 연결되어 있습니다.

RILIDE C2 domain infrastructure graph
그림 5: RILIDE C2 도메인 인프라

식별된 도메인은 암호화폐 거래소 플랫폼(FinAndy/TradingView) 및 금융 및 뱅킹 관련 위협 행위 캠페인에서도 볼 수 있던 것들입니다.

조사 3

RILIDE 생태계를 조사해 보니 146.70.79[.]75 에 있는 디렉토리에 두 개의 BRAINSTORM 샘플(0a4f321c903a7fbc59566918c12aca09 & 34eea751fcbf4ee8d44977adb4742d93)과 기타 수많은 맬웨어 샘플이 있는 것을 확인할 수 있었습니다. BRAINSTORM은 러스트 기반 드롭퍼로 RILIDE를 드롭하고 구글 크롬, 브레이브, 마이크로소프트 엣지 LNK 파일을 업데이트하여 RILIDE를 강제로 실행합니다. 맨디언트는 이 개방된 디렉토리와 관련된 활동을 UNC4553으로 추적하고 있습니다.

UNC4553 Open Directory
그림 6: UNC4553 오픈 디렉토리

그림 6에 표시된 오픈 디렉토리 IP(146.70.79[.]75)는 이전에 nch-software[.]info와 panger-top[.]click으로 확인된바 있습니다. IP에서 도메인으로 연결을 더욱 확고히 하기 위해 오픈 디렉토리의 URI 패턴을 이러한 도메인의 URI 패턴과 연결한 증거가 있습니다.

그림 7: Open Directory URL

hxxps://nch-software[.]info/1/2.exe

hxxps://nch-software[.]info/1/install-win64-11.5.8_en-US.exe

hxxps://panger-top[.]click/1/2.exe

hxxps://panger-top[.]click/1/install-win64-11.5.8_en-US.exe

오픈 디렉토리에는 두 개의 BRAINSTORM 샘플, 두 개의 PUFFPASTRY 샘플, 불완전한 것으로 의심되는 PUFFPASTRY 샘플, 두 개의 XLL 샘플이 포함되어 있었습니다.

PUFFPASTRY는 비주얼 베이직으로 작성한 백도어입니다. PUFFPASTRY는 파일을 다운로드, 업로드, 삭제, 실행할 수 있습니다. 또한, PUFFPASTRY는 안티바이러스 세부 정보를 포함한 시스템 정보를 열거할 수 있습니다. C2 서버 통신은 표준 HTTP/HTTPS를 통해 이루어집니다.

XLL 추가 기능은 파일 확장자가 .xll인 엑셀 추가 기능 파일입니다. XLL 파일은 엑셀에서만 열 수 있는 DLL 파일의 한 유형입니다. 이런 파일 중 일부는 스테이징 또는 템플릿으로 표시되어 있어 의도를 명확히 알 수 없습니다.

표 2. UNC4553 Open Directory 컨텐츠
URLMD5맬웨어 제품군

hxxps://146.70.79[.]75/2.exe

hxxps://146.70.79[.]75/1/2.exe

0a4f321c903a7fbc59566918c12aca09BRAINSTORM
hxxps://146.70.79[.]75/1/install-win64-11.5.8_en-US.exe34eea751fcbf4ee8d44977adb4742d93BRAINSTORM
hxxps://146.70.79[.]75/templates/light.dotmf483821b0650653e4da643b212025709PUFFPASTRY
hxxps://146.70.79[.]75/templates/light.pubf6b319a6fa13e4537c4cf59675055661 
hxxps://146.70.79[.]75/templates/light.xlsm770dd49f7340003d9c66b58cd793dadaPUFFPASTRY
hxxps://146.70.79[.]75/templates/x64.xll3bf971fcaa2a3bd321f4e0b6864cb86a 
hxxps://146.70.79[.]75/templates/x86.xllac00b947ca51d0e71b4c792f1646e4e0 

보안 강화 방안

앞서 살펴본 패턴의 침해에 대비하기 위한 보안 강화 방안은 브라우저에서 RILIDE 등의 악성 확장 프로그램을 로드하지 못하게 하는 것입니다. 이렇게 확장 프로그램 설치를 못하게 하면 민감한 데이터의 손상이나 유출을 막을 수 있습니다. 크롬 엔터프라이즈의 경우 다음과 같은 확장 프로그램 차단 옵션을 이용해 침해를 방지할 수 있습니다.

크롬 LNK가 조작되었다고 의심이 갈 경우 재설정을 하여 위험을 완화할 수 있습니다. 재설정을 하면 로그인한 모든 기기에 있는 크롬 프로필 설정이 기본값으로 바뀝니다. 이렇게 하면 윈도우에서 제공하는 모든 기본 크롬 LNK(예: 빠른 실행 LNK)가 재설정되어 --load-extention 매개변수가 제거됩니다.

심층 방어 전략은 탐지 기회에 대한 설명과 부록 부문을 참조 바랍니다. 먼저 탐지 기회는 탐지 방법론과 맬웨어 제품군 측면에서 살펴볼 수 있습니다.

탐지 방법론

탐지 엔진타이틀설명
YARAM_Hunting_Embedded_Chromium_CRX_1Equities 확장자를 가진 비CRX 파일 검색
YARAM_Hunting_Embedded_Chromium_CRXandLNK_1Equities와 LNK 확장자를 가진 비CRX 파일 검색
YARAM_Hunting_AdvancedInstaller_LNK_1LNK를 알려진 위치에 놓는 설치 관리자 파일 검색
YARAM_Hunting_LNKEngine_LoadExtension_1Chromium 브라우저에서 확장 프로그램을 로드하는 LNK 검색
YARAM_Hunting_LNKEngine_LoadExtension_Temp_1AppData 디렉토리에서 확장 프로그램을 로드하는 LNK 검색
YARAM_Hunting_ArchiveEngine_CAB_Extension_1잠재적 확장 파일이 포함된 CAB 파일 검색
YARA-LM_Hunting_FileWrite_Manifest_Temp_1manifest.json 파일이 Temp 디렉토리에 기록되는 이벤트 검색
YARA-LM_Hunting_Process_Chromium_LoadExtension_1크롬이 AppData Temp 디렉토리의 값을 가진 --load-extention 매개변수로 시작하는 이벤트를 감지
YARA-LM_Hunting_FileWrite_Chrome_LNK_1LNK가 디렉토리 공간에 있는 프로세스에서 알려진 사용 위치에 기록되는 이벤트를 검색
YARA-LM_Hunting_FileWrite_CRXandLNK_1프로세스가 2분 이내에 zip 또는 CRX와 LNK를 쓰는 이벤트를 감지
YARA-LM_Hunting_FileWrite_ManifestandLNK_1프로세스가 메니페스트와 LNK 파일을 서로 2분 이내에 쓰는 이벤트 감지
VT GrepM_Hunting_FileWrite_ManifestandChromeLNK_1실행 시 크롬 LNK와 메니페스트 파일을 모두 작성하는 샘플 감지

맬웨어 제품군

탐지 엔진타이틀설명
YARAM_Hunting_RILIDE_InjectJS_1RILDIE가 삽입하는 자바 스크립트 파일 감지
YARAM_Hunting_RILIDE_InjectJS_2RILDIE가 삽입하는 자바 스크립트 파일 감지
YARAM_Hunting_RILIDE_InjectJS_3RILDIE가 삽입하는 자바 스크립트 파일 감지
YARAM_Win_BRAINLINK_AdvancedInstaller_1BRAINLINK 감지
YARAM_Utility_RILIDE_Manifest_1RILDIE 메니페스트 파일 감지
YARAM_Utility_RILIDE_JS_1RILDIE 자바 스크립트 파일 감지
YARAM_Utility_RILIDE_Background_1RILDIE 백그라운드 자바 스크립트 파일 감지
YARAM_Hunting_RILIDE_CRX_1RILDIE CRX 파일 감지
YARAM_Win_BRAINSTORM_1BRAINSTORM 감지
YARAM_Win_BRAINFOG_1BRAINFOG 감지
YARAM_Hunting_BRAINFOG_1의심되는 BRAINFOG 감지

결론

맨디언트는 일련의 침해를 추적하면서 공격자의 방법론과 새로운 맬웨어 제품군을 발견합니다. 이번 포스팅에서 설명한 샘플 중 상당수는 탐지 등급이 낮습니다. 이처럼 살펴본 샘플은 눈에 띄지 않는 방식으로 탐지를 회피하려는 공격자의 노력이 담겨 있습니다. 다행히 맨디언트의 연구를 통해 살펴본 샘플과 같은 새로운 방법론도 사전에 충분히 탐지하고 대비할 수 있습니다.

끝으로 본 포스팅 작성에 도움을 준 Connor McLaughlin, Pepe Torrijos, Matthew Dunwoody, Anders Vejlby, Nick Simonian에게 감사의 인사를 전합니다.

rule M_Hunting_Embedded_Chromium_CRX_1

{

   meta:

         author = "Mandiant"

         md5 = "f1c21a69ed9f85e12d58ef0f5ac5c9b1"

         description = "Hunting for non-CRX files with extension equities"

   strings:

         $a1 = "_metadata" ascii

         $a2 = "manifest.json" ascii

         $a3 = "verified_contents.json" ascii

         $s1 = "_locales" ascii

         $s2 = "messages.json" ascii

         $f = /[a-z0-9A-Z_-]+\.(html|htm|css|js)/ ascii

         $pk = {50 4B 03 04}

   condition:

         (((uint16(0) == 0x5A4D) and uint32(uint32(0x3C)) == 0x00004550) or (uint32(0) == 0x464c457f) or (uint32(0) == 0xfeedface or uint32(0) == 0xcefaedfe or uint32(0) == 0xfeedfacf or uint32(0) == 0xcffaedfe or uint32(0) == 0xcafebabe or uint32(0) == 0xbebafeca or uint32(0) == 0xcafebabf or uint32(0) == 0xbfbafeca)) and

         (((2 of ($a*)) and $f) or ((1 of ($a*)) and ($f or (1 of ($s*))))) and

         $pk and

         (#pk >1) and

         (for any i in (1..#pk) : ($a2 at @pk[i]+30)) and

         (for any j in (1..#pk) : ($f at @pk[j]+30))

}

rule M_Hunting_Embedded_Chromium_CRXandLNK_1

{

   meta:

         author = "jared.wilson"

         md5 = "f1c21a69ed9f85e12d58ef0f5ac5c9b1"

         description = "Hunting for non-CRX files with extension equities and common strings for Google Chrome LNKs"

   strings:

         $a1 = "_metadata" ascii

         $a2 = "manifest.json" ascii

         $a3 = "verified_contents.json" ascii

         $s1 = "_locales" ascii

         $s2 = "messages.json" ascii

         $f = /[a-z0-9A-Z_-]+\.(html|htm|css|js)/ ascii

         $pk = {50 4B 03 04}

         $load = "--load-extension" ascii wide

         $lnk1 = "Google Chrome.lnk" ascii wide

        

   condition:

         (((uint16(0) == 0x5A4D) and uint32(uint32(0x3C)) == 0x00004550) or (uint32(0) == 0x464c457f) or (uint32(0) == 0xfeedface or uint32(0) == 0xcefaedfe or uint32(0) == 0xfeedfacf or uint32(0) == 0xcffaedfe or uint32(0) == 0xcafebabe or uint32(0) == 0xbebafeca or uint32(0) == 0xcafebabf or uint32(0) == 0xbfbafeca)) and

         (((2 of ($a*)) and $f) or ((1 of ($a*)) and ($f or (1 of ($s*))))) and

         $pk and

         (#pk >1) and

         (for any i in (1..#pk) : ($a2 at @pk[i]+30)) and

         (for any j in (1..#pk) : ($f at @pk[j]+30)) and

         ($load or $lnk1)

}

rule M_Hunting_AdvancedInstaller_LNK_1

{

   meta:

         author = "Mandiant"

         md5 = "2782af385665c765807ed887d4bacf36"

         description = "Hunting for Advanced Installer files that drop LNKs to known locations."

   strings:

         $a1 = "Advanced Installer" wide

         $a2 = "Advanced Installer" ascii

         $a3 = "https://www.advancedinstaller.com" ascii

         $l1 = "Google Chrome.lnk"

         $l2 = "Brave.lnk"

         $p1 = "\\Microsoft\\Windows\\Start Menu\\Programs\\Google Chrome.lnk"

         $p2 = "\\Microsoft\\Internet Explorer\\Quick Launch\\User Pinned\\TaskBar\\Brave.lnk"

         $p3 = "\\Microsoft\\Internet Explorer\\Quick Launch\\Brave.lnk"

         $p4 = "\\Microsoft\\Internet Explorer\\Quick Launch\\Google Chrome.lnk"

         $p5 = "\\Microsoft\\Windows\\Start Menu\\Programs\\Brave.lnk"

         $p6 = "\\Microsoft\\Internet Explorer\\Quick Launch\\User Pinned\\TaskBar\\Google Chrome.lnk"

         $r = /\$[^\.]+\.CreateShortcut\([^\)]+\)/

   condition:

         ((uint16(0) == 0x5A4D) and uint32(uint32(0x3C)) == 0x00004550) and (all of ($a*)) and (1 of ($l*)) and (2 of ($p*)) and $r

}

rule M_Hunting_LNKEngine_LoadExtension_1

{

   meta:

         author = "Mandiant"

         description = "Hunting rule that looks for files containing strings pertaining to execution of Edge, Opera, Brave, Chrome to launch an extension."

         md5 = "30abf9ca1bb792eb5edd8b033c010979"

   strings:

         $r1 = /(chrome|msedge|opera|brave)[^\r\n]+--load-extension=/ ascii nocase wide

         $s1 = "chrome" ascii wide

         $s2 = "--load-extension=" ascii wide

   condition:

         (uint32(0) == 0x0000004c) and filesize < 50KB and all of ($s*) and $r1

}

rule M_Hunting_LNKEngine_LoadExtension_Temp_1

{

    meta:

        author = "Mandiant"

        description = "Hunting rule that looks for files containing strings pertaining to execution of Edge, Opera, Brave, Chrome to launch an extension."

        md5 = "30abf9ca1bb792eb5edd8b033c010979"

    strings:

        $r1 = /(chrome|msedge|opera|brave)[^\r\n]+--load-extension="?[A-Za-z]:\\Users\\[^\\]+\\AppData\\/ ascii nocase wide

        $s2 = "--load-extension=" ascii wide

    condition:

        (uint32(0) == 0x0000004c) and filesize < 50KB and all of them

}

rule M_Hunting_ArchiveEngine_CAB_Extension_1

{

   meta:

         author = "Mandiant"

         description = "Looking for CAB containing what is suspected to be the files that make up an extension"

         md5 = "de283dfb9c88dbb6d455ca4b31c57240"

   strings:

         $f1 = "manifest.json" nocase

         $f2 = ".js" nocase

         $f3 = ".htm" nocase

         $f4 = ".png" nocase

   condition:

         filesize < 1MB and uint32be(0) == 0x4D534346 and ($f1 in (uint32(16) .. uint32(16) + 256)) and ($f2 in (uint32(16) .. uint32(16) + 256)) and ($f3 in (uint32(16) .. uint32(16) + 256)) and ($f4 in (uint32(16) .. uint32(16) + 256))

}

rule M_Hunting_FileWrite_Manifest_Temp_1

{

   meta:

         author = "Mandiant"

         md5 = "f1c21a69ed9f85e12d58ef0f5ac5c9b1"

         description = "Hunting for cases where a process writes a Chrome CRX manifest file to the appdata temp directory."

         severity = "Medium"

   events:

         $e.metadata.event_type = "FILE_CREATION"

         ($e.target.file.names = "manifest.json" OR $e.target.file.full_path = /manifest\.json$/)

$e.target.file.full_path = /[a-zA-Z]{1}:\\Users\\[^\\]+\\AppData\\(Local\\Temp\\|Roaming\\)[^\\]+\\manifest.json/ nocase

   condition:

         $e

}

rule M_Hunting_Process_Chromium_LoadExtension_1

{

   meta:

         author = "Mandiant"

         md5 = "f1c21a69ed9f85e12d58ef0f5ac5c9b1"

         description = "Hunting for cases where Chrome process is startng with the --load-extension parameter with the value in the appdata temp directory."

         severity = "Medium"

events:

$e.metadata.event_type = "PROCESS_OPEN"

$e.target.process.command_line = /(chrome|brave|msedge|opera|vivaldi)\.exe"?\s+\-\-load\-extension="?[A-Za-z]{1}:\\Users\\[^\\]+\\AppData\\(Local\\Temp\\|Roaming\\)[^ ]+/ nocase

$e.target.process.file.full_path = /(chrome|brave|msedge|opera|vivaldi)\.exe$/ nocase

    condition:

$e

}

rule M_Hunting_FileWrite_Chrome_LNK_1

{

   meta:

         author = "Mandiant"

         md5 = "f1c21a69ed9f85e12d58ef0f5ac5c9b1"

         description = "Hunting for cases where the LNK is written to known used locations from a process that is in user directory space."

         severity = "Medium"

   events:

         $e.metadata.event_type = "FILE_CREATION"

         $e.target.file.full_path = /Google Chrome\.lnk$/

         ($e.target.file.full_path = `C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Google Chrome.lnk` or $e.target.file.full_path = `C:\Users\Public\Desktop\Google Chrome.lnk` or $e.target.file.full_path = /C:\\Users\\[^\\]+\\AppData\\Roaming\\Microsoft\\Internet Explorer\\Quick Launch\\Google Chrome.lnk/ or $e.target.file.full_path = /C:\\Users\\[^\\]+\\AppData\\Roaming\\Microsoft\\Internet Explorer\\Quick Launch\\User Pinned\\TaskBar\\Google Chrome.lnk/)

         ($e.principal.process.file.full_path = /[a-zA-Z]{1}:\\Users\\[^\\]+/ or $e.src.process.file.full_path = /[a-zA-Z]{1}:\\Users\\[^\\]+/)

   condition:

         $e

}

부록 B: 침해 지표

IndicatorReference
9984af7a440c39b7ac11a68f2da48137BRAINFOG
1af84663df057aee4934abe717938b33BRAINFOG WScript
f2f85d38b91f582a83388690fdc45284BRAINFOG WScript
2782af385665c765807ed887d4bacf36BRAINLINK
de283dfb9c88dbb6d455ca4b31c57240BRAINLINK CAB
6b2e6d6650116d372ca8c47af08ca8faBRAINLINK PowerShell Script
0a4f321c903a7fbc59566918c12aca09BRAINSTORM
34eea751fcbf4ee8d44977adb4742d93BRAINSTORM
69a1c37a796dd3ed81785c1995f0973fBRAINSTORM
b7bf29a9d19af79a0872b8fcf482331bBRAINSTORM
ea7496d6fb96e3c1e00a1d5f501f6724BRAINSTORM
f1c21a69ed9f85e12d58ef0f5ac5c9b1BRAINSTORM
3e181d794e62af5c54d4df5517766af8PUFFPASTRY
70700ae977a0f3ca6a331842d8c103c9PUFFPASTRY
770dd49f7340003d9c66b58cd793dadaPUFFPASTRY
f483821b0650653e4da643b212025709PUFFPASTRY
0fc2bd7320c2edfd7985b87fc8cb1f96RILIDE
223e499f6ba6ebdacf1dcff96008635bRILIDE
395bef4512a3743299a45d4f9b74a2eeRILIDE
4f506058ab8bfc5746308a95e34dce85RILIDE
5133177ac4950cf772d2f729bb0622ecRILIDE
b7ad9777e3166628abe11dd043ddfb7eRILIDE
bb8323247baad2d592e7ad1896935dd1RILIDE
d56d195ebfaea6d97cccddcf3823be24RILIDE
4724261ef04e2301ecc9ac994b4b346eRILIDE HTML
020a8ed8a2b123f6c58fed791c6ef636RILIDE Injection Script
219070a2502a47a50dd3df5c804074b4RILIDE Injection Script
3235e27576dd4e81f1c5986212ec2b78RILIDE Injection Script
41a5f1c5d032bcac16c903681674872cRILIDE Injection Script
6e426758f184b5a942428731b749b000RILIDE Injection Script
94c16b8f9236ab88bb0bca60c4399665RILIDE Injection Script
9e5f43b2dc1606e27fa0cfdfb4e363d2RILIDE Injection Script
9fe5b99b20bc91995b81eddd917bff50RILIDE Injection Script
d41b7138ad25d0401acf3298d0110342RILIDE Injection Script
5b7a2e7195bceb8e125758ae27c1e791RILIDE JavaScript
d54fa225b07298ec34be872cd4ebf4aeRILIDE JavaScript
19c859513f67400f3563e656f27df1c0RILIDE LNK
30abf9ca1bb792eb5edd8b033c010979RILIDE LNK
baee9ba0b94ea1e2b2e566fc8a615554RILIDE Manifest
f31e9238593b34b390ab8faf755e6edeRILIDE Manifest
3bf971fcaa2a3bd321f4e0b6864cb86aTemplate XLL
ac00b947ca51d0e71b4c792f1646e4e0Template XLL
028b2f15560b0f80514cf0a23ae77a43VB Macro
0a4834d3da05a1d0b2f3a0c13f352a0aVB Macro
89c34309aca3214c3ce7c72b407570e8VB Macro
172.67.192[.]61C2 A Record
89.185.85[.]144C2 A Record
45.159.188[.]125C2 A Record
146.70.79[.]75Open Directory
104.168.167[.]25Open Directory
telegromcn[.]orgBRAINFOG In The Wild Domain
nch-software[.]infoOpen Directory Domain
vceilinichego[.]ruOpen Directory Domain and C2
2022-blanks[.]siteRegistrant Org Pivot Domain
finandy[.]infoRegistrant Org Pivot Domain
finandy[.]onlineRegistrant Org Pivot Domain
flnand[.]onlineRegistrant Org Pivot Domain
kz-smartbank[.]comRegistrant Org Pivot Domain
mareux[.]onlineRegistrant Org Pivot Domain
mmarx[.]questRegistrant Org Pivot Domain
okxsat[.]xyzRegistrant Org Pivot Domain
pr-tracker[.]onlineRegistrant Org Pivot Domain
qivvi-3[.]clickRegistrant Org Pivot Domain
serienjunkies[.]usRegistrant Org Pivot Domain
vse-blanki[.]onlineRegistrant Org Pivot Domain
ashgrrwt[.]clickRILIDE C2
extenision-app[.]comRILIDE C2
hxxps://146.70.79[.]75/1/2.exeOpen Directory BRAINSTORM Download
hxxps://146.70.79[.]75/1/install-win64-11.5.8_en-US.exeOpen Directory BRAINSTORM Download
hxxps://146.70.79[.]75/2.exeOpen Directory BRAINSTORM Download
hxxps://nch-software[.]info/1/2.exeOpen Directory BRAINSTORM Download
hxxps://nch-software[.]info/1/install-win64-11.5.8_en-US.exeOpen Directory BRAINSTORM Download
hxxps://panger-top[.]click/1/2.exeOpen Directory BRAINSTORM Download
hxxps://panger-top[.]click/1/install-win64-11.5.8_en-US.exeOpen Directory BRAINSTORM Download
hxxp://nch-software[.]info/1/2.exeOpen Directory URL
hxxps://146.70.79[.]75/Open Directory URL
hxxps://146.70.79[.]75/admin_cp/Open Directory URL
hxxps://146.70.79[.]75/templates/Open Directory URL
hxxp://vceilinichego[.]ru/api/machine/RILIDE C2 URL
hxxp://vceilinichego[.]ru/api/machine/get-urlsRILIDE C2 URL
hxxp://vceilinichego[.]ru/api/machine/initRILIDE C2 URL
hxxp://vceilinichego[.]ru/api/machine/set-urlsRILIDE C2 URL
hxxps://vceilinichego[.]ruRILIDE C2 URL
hxxps://vceilinichego[.]ru/api/machineRILIDE C2 URL
hxxps://vceilinichego[.]ru/api/machine/RILIDE C2 URL
hxxps://vceilinichego[.]ru/api/machine/check-tasksRILIDE C2 URL
hxxps://vceilinichego[.]ru/api/machine/get-urlsRILIDE C2 URL
hxxps://vceilinichego[.]ru/api/machine/initRILIDE C2 URL
hxxps://vceilinichego[.]ru/api/machine/set-tasksRILIDE C2 URL
hxxps://vceilinichego[.]ru/api/machine/set-urlsRILIDE C2 URL
hxxps://146.70.79[.]75/templates/light.dotmTemplate Open Directory URL
hxxps://146.70.79[.]75/templates/light.pubTemplate Open Directory URL
hxxps://146.70.79[.]75/templates/light.xlsmTemplate Open Directory URL
hxxps://146.70.79[.]75/templates/x64.xllTemplate Open Directory URL
hxxps://146.70.79[.]75/templates/x86.xllTemplate Open Directory URL