변조된 LNK 바로 가기 파일을 이용한 침해를 찾기 위한 헌팅 방법론
마술의 한 종류로 손 기술을 이용하는 것이 있습니다. 손가락의 움직임에 초점을 두고 청중의 눈을 속이는 것으로 카드 같은 소품을 이용하기도 합니다. 손 기술을 이용하는 마술의 비밀은 청중의 눈에 보이지 않는 숨겨진 액션입니다. 이런 수법은 사이버 위협 행위자들도 사용합니다. 초기 침투에 성공한 후 지속성을 유지할 때 마법사와 같이 상대를 속이는 손 기술을 씁니다. 맨디언트의 관찰에 따르면 위협 행위자가 쓰는 손 기술은 대략 다음과 같습니다.
- 사용자가 자신도 모르는 사이에 변조된 LNK 바로 가기 파일을 실행하게 합니다.
- 수정된 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 기반 브라우저에 있으며 다음과 같이 예제 명령을 찾을 수 있습니다.
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 파일을 드롭합니다.
- 실행 시 BRAINFOG는 taskkill.exe를 사용해 모든 크롬 인스턴스를 닫습니다.
- 그리고 chrome.vbs를 사용해 'Chrome'이 포함된 모든 LNK 파일을 삭제합니다.
- wtf.vbs는 --load-extension 스위치를 사용하여 새 LNK를 생성합니다. 이를 실행하면 RILIDE 브라우저 확장 프로그램이 강제로 로드됩니다.
사용자가 바뀐 LNK 바로가기 파일을 통해 크롬을 열면 감염된 브라우저가 웹 페이지를 로드하고 RILIDE가 백그라운드에서 실행됩니다. 초기 실행 중에 C2(Command & Control) API 엔드포인트 /api/machine/init에서 머신 식별자와 표적 도메인 목록을 가져옵니다. 참고로 이 목록은 5분마다 다시 가져옵니다.
{"machineId":2984,"urls":["coinbase.com","binance.com","blockchain.com","mail.google","outlook.live","mail.yahoo","bybit.com","okx.com"]} |
HTML 문서가 완전히 구문 분석이 되면 DOMContentLoaded 이벤트가 대상 함수인 loadScript로 전달됩니다. 이 함수는 이름과 경로가 포함된 키-값 쌍의 목록을 다운로드합니다. 이름은 관심 트래픽과 관련된 도메인입니다. 브라우징 도메인이 모니터링되는 도메인 중 하나와 일치하면 결로 값의 자바 스크립트가 액세스되고 결과 파일에 웹 사이트에 주입되어 실행됩니다.
이를 통해 공격자는 피해자를 대신해 작업을 호출하거나 웹 세션에서 데이터를 훔칠 수 있습니다. 맨디언트는 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은 각 엔드포인트가 반환하는 내용입니다.
엔드포인트 | 기능 |
/api/settings |
|
/api/machine | 피해자에 대한 세부 정보 목록 반환
|
/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 도메인을 사용했습니다.
const domain = "https://ashgrrwt.click" |
RILIDE C2 서버 인프라 헌팅
C2 서버 인프라는 다른 수많은 도메인 간에 흥미로운 중복을 보여주었습니다. ashgrrwt[.]click 도메인 관리자, WHOIS 세부 정보는 개인정보 보호를 위해 삭제되었지만 등록자 조직은 지워지지 않았습니다. 등록자 조직인 Kruglova LTD는 11개의 다른 웹 사이트와 연결되어 있습니다.
식별된 도메인은 암호화폐 거래소 플랫폼(FinAndy/TradingView) 및 금융 및 뱅킹 관련 위협 행위 캠페인에서도 볼 수 있던 것들입니다.
조사 3
RILIDE 생태계를 조사해 보니 146.70.79[.]75 에 있는 디렉토리에 두 개의 BRAINSTORM 샘플(0a4f321c903a7fbc59566918c12aca09 & 34eea751fcbf4ee8d44977adb4742d93)과 기타 수많은 맬웨어 샘플이 있는 것을 확인할 수 있었습니다. BRAINSTORM은 러스트 기반 드롭퍼로 RILIDE를 드롭하고 구글 크롬, 브레이브, 마이크로소프트 엣지 LNK 파일을 업데이트하여 RILIDE를 강제로 실행합니다. 맨디언트는 이 개방된 디렉토리와 관련된 활동을 UNC4553으로 추적하고 있습니다.
그림 6에 표시된 오픈 디렉토리 IP(146.70.79[.]75)는 이전에 nch-software[.]info와 panger-top[.]click으로 확인된바 있습니다. IP에서 도메인으로 연결을 더욱 확고히 하기 위해 오픈 디렉토리의 URI 패턴을 이러한 도메인의 URI 패턴과 연결한 증거가 있습니다.
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 파일의 한 유형입니다. 이런 파일 중 일부는 스테이징 또는 템플릿으로 표시되어 있어 의도를 명확히 알 수 없습니다.
URL | MD5 | 맬웨어 제품군 |
hxxps://146.70.79[.]75/2.exe hxxps://146.70.79[.]75/1/2.exe | 0a4f321c903a7fbc59566918c12aca09 | BRAINSTORM |
hxxps://146.70.79[.]75/1/install-win64-11.5.8_en-US.exe | 34eea751fcbf4ee8d44977adb4742d93 | BRAINSTORM |
hxxps://146.70.79[.]75/templates/light.dotm | f483821b0650653e4da643b212025709 | PUFFPASTRY |
hxxps://146.70.79[.]75/templates/light.pub | f6b319a6fa13e4537c4cf59675055661 | |
hxxps://146.70.79[.]75/templates/light.xlsm | 770dd49f7340003d9c66b58cd793dada | PUFFPASTRY |
hxxps://146.70.79[.]75/templates/x64.xll | 3bf971fcaa2a3bd321f4e0b6864cb86a | |
hxxps://146.70.79[.]75/templates/x86.xll | ac00b947ca51d0e71b4c792f1646e4e0 |
보안 강화 방안
앞서 살펴본 패턴의 침해에 대비하기 위한 보안 강화 방안은 브라우저에서 RILIDE 등의 악성 확장 프로그램을 로드하지 못하게 하는 것입니다. 이렇게 확장 프로그램 설치를 못하게 하면 민감한 데이터의 손상이나 유출을 막을 수 있습니다. 크롬 엔터프라이즈의 경우 다음과 같은 확장 프로그램 차단 옵션을 이용해 침해를 방지할 수 있습니다.
- BlockExternalExtentions - 외부 확장 프로그램 설치를 제어합니다.
- DeviceLoginScreenExtensionManifestV2Availablity - 버전 2 메니페스트 사용 기능을 제거합니다.
- ExtensionInstallAllowlist & ExtentionInstallBlocklist - 차단 및 허용 목록을 만들어 사용 가능한 확장 프로그램만 설치할 수 있게 합니다.
- ExtentionsInstallSource - 와일드카드가 포함된 문자열을 사용해 확장 프로그램을 설치할 수 있는 위치를 식별합니다.
크롬 LNK가 조작되었다고 의심이 갈 경우 재설정을 하여 위험을 완화할 수 있습니다. 재설정을 하면 로그인한 모든 기기에 있는 크롬 프로필 설정이 기본값으로 바뀝니다. 이렇게 하면 윈도우에서 제공하는 모든 기본 크롬 LNK(예: 빠른 실행 LNK)가 재설정되어 --load-extention 매개변수가 제거됩니다.
심층 방어 전략은 탐지 기회에 대한 설명과 부록 부문을 참조 바랍니다. 먼저 탐지 기회는 탐지 방법론과 맬웨어 제품군 측면에서 살펴볼 수 있습니다.
탐지 방법론
탐지 엔진 | 타이틀 | 설명 |
YARA | M_Hunting_Embedded_Chromium_CRX_1 | Equities 확장자를 가진 비CRX 파일 검색 |
YARA | M_Hunting_Embedded_Chromium_CRXandLNK_1 | Equities와 LNK 확장자를 가진 비CRX 파일 검색 |
YARA | M_Hunting_AdvancedInstaller_LNK_1 | LNK를 알려진 위치에 놓는 설치 관리자 파일 검색 |
YARA | M_Hunting_LNKEngine_LoadExtension_1 | Chromium 브라우저에서 확장 프로그램을 로드하는 LNK 검색 |
YARA | M_Hunting_LNKEngine_LoadExtension_Temp_1 | AppData 디렉토리에서 확장 프로그램을 로드하는 LNK 검색 |
YARA | M_Hunting_ArchiveEngine_CAB_Extension_1 | 잠재적 확장 파일이 포함된 CAB 파일 검색 |
YARA-L | M_Hunting_FileWrite_Manifest_Temp_1 | manifest.json 파일이 Temp 디렉토리에 기록되는 이벤트 검색 |
YARA-L | M_Hunting_Process_Chromium_LoadExtension_1 | 크롬이 AppData Temp 디렉토리의 값을 가진 --load-extention 매개변수로 시작하는 이벤트를 감지 |
YARA-L | M_Hunting_FileWrite_Chrome_LNK_1 | LNK가 디렉토리 공간에 있는 프로세스에서 알려진 사용 위치에 기록되는 이벤트를 검색 |
YARA-L | M_Hunting_FileWrite_CRXandLNK_1 | 프로세스가 2분 이내에 zip 또는 CRX와 LNK를 쓰는 이벤트를 감지 |
YARA-L | M_Hunting_FileWrite_ManifestandLNK_1 | 프로세스가 메니페스트와 LNK 파일을 서로 2분 이내에 쓰는 이벤트 감지 |
VT Grep | M_Hunting_FileWrite_ManifestandChromeLNK_1 | 실행 시 크롬 LNK와 메니페스트 파일을 모두 작성하는 샘플 감지 |
맬웨어 제품군
탐지 엔진 | 타이틀 | 설명 |
YARA | M_Hunting_RILIDE_InjectJS_1 | RILDIE가 삽입하는 자바 스크립트 파일 감지 |
YARA | M_Hunting_RILIDE_InjectJS_2 | RILDIE가 삽입하는 자바 스크립트 파일 감지 |
YARA | M_Hunting_RILIDE_InjectJS_3 | RILDIE가 삽입하는 자바 스크립트 파일 감지 |
YARA | M_Win_BRAINLINK_AdvancedInstaller_1 | BRAINLINK 감지 |
YARA | M_Utility_RILIDE_Manifest_1 | RILDIE 메니페스트 파일 감지 |
YARA | M_Utility_RILIDE_JS_1 | RILDIE 자바 스크립트 파일 감지 |
YARA | M_Utility_RILIDE_Background_1 | RILDIE 백그라운드 자바 스크립트 파일 감지 |
YARA | M_Hunting_RILIDE_CRX_1 | RILDIE CRX 파일 감지 |
YARA | M_Win_BRAINSTORM_1 | BRAINSTORM 감지 |
YARA | M_Win_BRAINFOG_1 | BRAINFOG 감지 |
YARA | M_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: 침해 지표
Indicator | Reference |
9984af7a440c39b7ac11a68f2da48137 | BRAINFOG |
1af84663df057aee4934abe717938b33 | BRAINFOG WScript |
f2f85d38b91f582a83388690fdc45284 | BRAINFOG WScript |
2782af385665c765807ed887d4bacf36 | BRAINLINK |
de283dfb9c88dbb6d455ca4b31c57240 | BRAINLINK CAB |
6b2e6d6650116d372ca8c47af08ca8fa | BRAINLINK PowerShell Script |
0a4f321c903a7fbc59566918c12aca09 | BRAINSTORM |
34eea751fcbf4ee8d44977adb4742d93 | BRAINSTORM |
69a1c37a796dd3ed81785c1995f0973f | BRAINSTORM |
b7bf29a9d19af79a0872b8fcf482331b | BRAINSTORM |
ea7496d6fb96e3c1e00a1d5f501f6724 | BRAINSTORM |
f1c21a69ed9f85e12d58ef0f5ac5c9b1 | BRAINSTORM |
3e181d794e62af5c54d4df5517766af8 | PUFFPASTRY |
70700ae977a0f3ca6a331842d8c103c9 | PUFFPASTRY |
770dd49f7340003d9c66b58cd793dada | PUFFPASTRY |
f483821b0650653e4da643b212025709 | PUFFPASTRY |
0fc2bd7320c2edfd7985b87fc8cb1f96 | RILIDE |
223e499f6ba6ebdacf1dcff96008635b | RILIDE |
395bef4512a3743299a45d4f9b74a2ee | RILIDE |
4f506058ab8bfc5746308a95e34dce85 | RILIDE |
5133177ac4950cf772d2f729bb0622ec | RILIDE |
b7ad9777e3166628abe11dd043ddfb7e | RILIDE |
bb8323247baad2d592e7ad1896935dd1 | RILIDE |
d56d195ebfaea6d97cccddcf3823be24 | RILIDE |
4724261ef04e2301ecc9ac994b4b346e | RILIDE HTML |
020a8ed8a2b123f6c58fed791c6ef636 | RILIDE Injection Script |
219070a2502a47a50dd3df5c804074b4 | RILIDE Injection Script |
3235e27576dd4e81f1c5986212ec2b78 | RILIDE Injection Script |
41a5f1c5d032bcac16c903681674872c | RILIDE Injection Script |
6e426758f184b5a942428731b749b000 | RILIDE Injection Script |
94c16b8f9236ab88bb0bca60c4399665 | RILIDE Injection Script |
9e5f43b2dc1606e27fa0cfdfb4e363d2 | RILIDE Injection Script |
9fe5b99b20bc91995b81eddd917bff50 | RILIDE Injection Script |
d41b7138ad25d0401acf3298d0110342 | RILIDE Injection Script |
5b7a2e7195bceb8e125758ae27c1e791 | RILIDE JavaScript |
d54fa225b07298ec34be872cd4ebf4ae | RILIDE JavaScript |
19c859513f67400f3563e656f27df1c0 | RILIDE LNK |
30abf9ca1bb792eb5edd8b033c010979 | RILIDE LNK |
baee9ba0b94ea1e2b2e566fc8a615554 | RILIDE Manifest |
f31e9238593b34b390ab8faf755e6ede | RILIDE Manifest |
3bf971fcaa2a3bd321f4e0b6864cb86a | Template XLL |
ac00b947ca51d0e71b4c792f1646e4e0 | Template XLL |
028b2f15560b0f80514cf0a23ae77a43 | VB Macro |
0a4834d3da05a1d0b2f3a0c13f352a0a | VB Macro |
89c34309aca3214c3ce7c72b407570e8 | VB Macro |
172.67.192[.]61 | C2 A Record |
89.185.85[.]144 | C2 A Record |
45.159.188[.]125 | C2 A Record |
146.70.79[.]75 | Open Directory |
104.168.167[.]25 | Open Directory |
telegromcn[.]org | BRAINFOG In The Wild Domain |
nch-software[.]info | Open Directory Domain |
vceilinichego[.]ru | Open Directory Domain and C2 |
2022-blanks[.]site | Registrant Org Pivot Domain |
finandy[.]info | Registrant Org Pivot Domain |
finandy[.]online | Registrant Org Pivot Domain |
flnand[.]online | Registrant Org Pivot Domain |
kz-smartbank[.]com | Registrant Org Pivot Domain |
mareux[.]online | Registrant Org Pivot Domain |
mmarx[.]quest | Registrant Org Pivot Domain |
okxsat[.]xyz | Registrant Org Pivot Domain |
pr-tracker[.]online | Registrant Org Pivot Domain |
qivvi-3[.]click | Registrant Org Pivot Domain |
serienjunkies[.]us | Registrant Org Pivot Domain |
vse-blanki[.]online | Registrant Org Pivot Domain |
ashgrrwt[.]click | RILIDE C2 |
extenision-app[.]com | RILIDE C2 |
hxxps://146.70.79[.]75/1/2.exe | Open Directory BRAINSTORM Download |
hxxps://146.70.79[.]75/1/install-win64-11.5.8_en-US.exe | Open Directory BRAINSTORM Download |
hxxps://146.70.79[.]75/2.exe | Open Directory BRAINSTORM Download |
hxxps://nch-software[.]info/1/2.exe | Open Directory BRAINSTORM Download |
hxxps://nch-software[.]info/1/install-win64-11.5.8_en-US.exe | Open Directory BRAINSTORM Download |
hxxps://panger-top[.]click/1/2.exe | Open Directory BRAINSTORM Download |
hxxps://panger-top[.]click/1/install-win64-11.5.8_en-US.exe | Open Directory BRAINSTORM Download |
hxxp://nch-software[.]info/1/2.exe | Open 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-urls | RILIDE C2 URL |
hxxp://vceilinichego[.]ru/api/machine/init | RILIDE C2 URL |
hxxp://vceilinichego[.]ru/api/machine/set-urls | RILIDE C2 URL |
hxxps://vceilinichego[.]ru | RILIDE C2 URL |
hxxps://vceilinichego[.]ru/api/machine | RILIDE C2 URL |
hxxps://vceilinichego[.]ru/api/machine/ | RILIDE C2 URL |
hxxps://vceilinichego[.]ru/api/machine/check-tasks | RILIDE C2 URL |
hxxps://vceilinichego[.]ru/api/machine/get-urls | RILIDE C2 URL |
hxxps://vceilinichego[.]ru/api/machine/init | RILIDE C2 URL |
hxxps://vceilinichego[.]ru/api/machine/set-tasks | RILIDE C2 URL |
hxxps://vceilinichego[.]ru/api/machine/set-urls | RILIDE C2 URL |
hxxps://146.70.79[.]75/templates/light.dotm | Template Open Directory URL |
hxxps://146.70.79[.]75/templates/light.pub | Template Open Directory URL |
hxxps://146.70.79[.]75/templates/light.xlsm | Template Open Directory URL |
hxxps://146.70.79[.]75/templates/x64.xll | Template Open Directory URL |
hxxps://146.70.79[.]75/templates/x86.xll | Template Open Directory URL |