콘텐츠로 이동하기
위협 인텔리전스

COLDRIVER, 새로운 악성코드를 이용해 서방 표적 및 NGO 문서 탈취

2025년 5월 7일
Google Threat Intelligence Group

Google Threat Intelligence

Visibility and context on the threats that matter most.

Learn more

해당 블로그의 원문은 2025년 5월 8일 Google Cloud 블로그(영문)에 게재되었습니다. 


작성자: Wesley Shields


러시아 정부 지원 그룹인 COLDRIVER가 새로운 멀웨어로 서방 표적 및 NGO의 문서를 탈취하고 있습니다.

Google 위협 인텔리전스 그룹(GTIG)은 러시아 정부의 지원을 받는 위협 그룹 COLDRIVER(UNC4057, Star Blizzard, Callisto 등으로도 알려져 있음)가 사용하는 LOSTKEYS라는 새로운 멀웨어를 발견했습니다. LOSTKEYS는 하드코딩된 확장자 및 디렉터리 목록에서 파일을 탈취하고, 시스템 정보 및 실행 중인 프로세스를 공격자에게 전송할 수 있습니다. 2025년 1월, 3월, 4월에 관찰된 LOSTKEYS는 주로 NATO 정부, 비정부 기구(NGO), 전직 정보 및 외교관과 같은 고위급 표적에 대한 자격 증명 피싱으로 알려진 COLDRIVER의 툴셋에 새로운 발전을 가져왔습니다. GTIG는 2024년의 SPICA 멀웨어를 포함하여 COLDRIVER를 수년 동안 추적해 왔습니다.

COLDRIVER는 일반적으로 개인 이메일 주소나 NGO 주소를 통해 고위급 인사를 표적으로 삼습니다. 이들은 자격 증명을 탈취하는 것으로 알려져 있으며, 일단 표적의 계정에 액세스하면 이메일을 유출하고 침해된 계정에서 연락처 목록을 훔칩니다. 일부 사례에서는 COLDRIVER가 표적 기기에 멀웨어를 전달하고 시스템의 파일에 액세스하려고 시도하기도 합니다.

최근 COLDRIVER 캠페인의 표적은 서방 정부 및 군대의 현직 및 전직 고문, 기자, 싱크 탱크, NGO 등이었습니다. 또한 이 그룹은 우크라이나와 관련된 개인들을 계속해서 표적으로 삼았습니다. Google은 COLDRIVER의 작전 주요 목표가 러시아의 전략적 이익을 지원하기 위한 정보 수집이라고 믿습니다. 소수의 사례에서 이 그룹은 영국 관리NGO를 표적으로 삼는 해킹 및 유출(hack-and-leak) 캠페인과 관련이 있었습니다.

잠재적인 표적 사용자를 보호하기 위해, Google은 COLDRIVER와 같은 심각한 위협 행위자에 대한 연구를 활용하여 Google 제품의 안전과 보안을 개선합니다. Google은 잠재적인 표적에게 Google의 Advanced Protection Program에 가입하고, Chrome에 Enhanced Safe Browsing을 사용 설정하며, 모든 기기를 최신 상태로 업데이트할 것을 권장합니다.

1단계 — 가짜 CAPTCHA로 시작

LOSTKEYS는 가짜 CAPTCHA가 있는 유인 웹사이트로 시작되는 다단계 감염 체인의 마지막 단계에서 전달됩니다. CAPTCHA가 "확인"되면 PowerShell이 사용자의 클립보드에 복사되고, 페이지는 사용자에게 Windows의 "실행" 프롬프트를 통해 PowerShell을 실행하도록 유도합니다.

https://storage.googleapis.com/gweb-cloudblog-publish/images/coldriver-fig1.max-700x700.png

첫 번째 단계에서 붙여넣은 PowerShell은 두 번째 단계를 가져와 실행합니다. 관찰된 여러 사례에서 두 번째 단계는 165.227.148[.]68에서 검색되었습니다.

COLDRIVER만이 표적을 사회 공학적으로 속여 PowerShell 명령을 복사, 붙여넣기, 실행하도록 유도하는 위협 행위자는 아닙니다. 이 기법은 일반적으로 ‘ClickFix’라고 불립니다. Google은 여러 APT 및 금전적 동기를 가진 행위자들이 이 기법을 사용하는 것을 확인했으며, 이는 공개적으로도 널리 보고되었습니다. 사용자는 브라우저를 종료하고 자신의 기기에서 명령을 실행하도록 유도하는 사이트를 접할 때 주의해야 하며, 기업 정책은 최소 권한을 구현하고 기본적으로 사용자가 스크립트를 실행하는 것을 허용하지 않아야 합니다.

2단계 — 기기 회피

두 번째 단계는 기기 화면 해상도의 MD5 해시를 계산하여, 세 가지 특정 값 중 하나와 일치하면 실행을 중지하고, 그렇지 않으면 세 번째 단계를 검색합니다. 이 단계는 VM에서의 실행을 회피하기 위한 것으로 보입니다. 이 체인의 각 관찰된 인스턴스는 다음 단계를 검색하기 위해 요청에 있어야 하는 고유한 식별자를 사용합니다. 모든 관찰된 인스턴스에서 세 번째 단계는 이전 단계와 동일한 호스트에서 검색됩니다.

3단계 — 최종 페이로드 검색

세 번째 단계는 Base64로 인코딩된 블록이며, 이는 더 많은 PowerShell로 디코딩됩니다. 이 단계는 최종 페이로드를 검색하고 디코딩합니다. 이를 위해 다른 단계와 동일한 호스트에서 두 개의 파일을 더 다운로드하며, 다시 감염 체인별로 다른 고유한 식별자를 사용합니다. 첫 번째는 '디코더'라고 불리는 Visual Basic 스크립트(VBS) 파일로, 두 번째 파일을 디코딩하는 역할을 합니다. 디코딩 프로세스는 감염 체인별로 고유한 두 개의 키를 사용합니다. 디코더는 고유한 키 중 하나를 가지고 있으며, 두 번째 키는 3단계에 저장됩니다. 이 키들은 인코딩된 블록에 대한 대체 암호에 사용되며, 각 감염 체인에 고유합니다. 최종 페이로드를 디코딩하는 Python 스크립트는 다음과 같습니다.

# Args: encoded_file Ah90pE3b 4z7Klx1V

import base64
import sys

if len(sys.argv) != 4:
    print("Usage: decode.py file key1 key2")
    sys.exit(1)

if len(sys.argv[2]) != len(sys.argv[3]):
    print("Keys must be the same length")
    sys.exit(1)

with open(sys.argv[1], 'r') as f:
    data = f.read()

x = sys.argv[2]
y = sys.argv[3]
for i in range(len(x)):
    data = data.replace(x[i], '!').replace(y[i], x[i]).replace('!', y[i])

with open(sys.argv[1] + '.out', 'wb') as f:
    f.write(base64.b64decode(data))

최종 Payload (LOSTKEYS)

이러한 단계의 최종 결과는 Google이 LOSTKEYS라고 명명한 VBS 멀웨어입니다. 이 멀웨어는 하드코딩된 확장자 및 디렉터리 목록에서 파일을 탈취하고, 시스템 정보와 실행 중인 프로세스를 공격자에게 전송할 수 있습니다. COLDRIVER는 일반적으로 자격 증명을 훔친 후 이를 사용하여 표적의 이메일과 연락처를 탈취하지만, 이전 사례에서 문서화했듯이 표적 시스템의 문서에 액세스하려는 경우 SPICA라는 멀웨어를 일부 표적에 배포하기도 합니다. LOSTKEYS는 이와 유사한 목표를 달성하기 위해 설계되었으며, 매우 선별적인 경우에만 배포됩니다.

https://storage.googleapis.com/gweb-cloudblog-publish/images/coldriver-fig2.max-2100x2100.png

2023년 12월 사례와의 연관성

이 활동에 대한 조사 과정에서 저희는 2023년 12월까지 거슬러 올라가는 두 개의 추가 샘플을 발견했습니다. 해당 해시 값은 침해 지표(Indicators of Compromise) 섹션에서 확인할 수 있습니다. 이 샘플들은 모두 LOSTKEYS를 최종적으로 실행하지만, 여기서 언급된 실행 체인과는 분명히 다릅니다. 이들은 Maltego 소프트웨어 패키지와 관련이 있는 것처럼 위장한 PE(Portable Executable) 파일이었습니다.

2023년 12월의 이 샘플들이 COLDRIVER와 관련이 있는지, 또는 멀웨어가 다른 개발자나 작전에서 재활용되어 2025년 1월부터 시작된 활동에 사용된 것인지는 현재로서는 불분명합니다.

커뮤니티 보호

위협 행위자들과 맞서 싸우기 위한 노력의 일환으로, 저희는 연구 결과를 활용하여 Google 제품의 안전과 보안을 개선하고 있습니다. 발견 즉시, 식별된 모든 악성 웹사이트, 도메인, 파일은 Safe Browse에 추가되어 사용자를 추가적인 악용으로부터 보호합니다. 또한, 정부 지원 공격자 알림을 통해 Gmail 및 Workspace 사용자에게 해당 활동을 통지하고, 잠재적 표적에게 Chrome에 향상된 세이프 브라우징을 사용 설정하고 모든 기기를 최신 상태로 유지하도록 권장합니다.

저희는 보안 커뮤니티에 연구 결과를 공유하여 인식을 높이고, 이러한 활동의 표적이 되었을 수 있는 기업 및 개인들과도 공유하는 데 전념하고 있습니다. 전술 및 기술에 대한 이해가 향상되면 위협 헌팅 역량이 강화되고 업계 전반의 사용자 보호가 더욱 강력해질 수 있기를 바랍니다.

침해 지표(IOC) 및 YARA 규칙이 이 게시물에 포함되어 있으며, GTI 컬렉션 및 규칙 팩으로도 제공됩니다.

YARA Rules

rule LOSTKEYS__Strings {
  meta:
    author = "Google Threat Intelligence"
    description = "wscript that steals documents and becaons system 
information out to a hardcoded address"
    hash = "28a0596b9c62b7b7aca9cac2a07b067109f27d327581a60e8cb4fab92f8f4fa9"
  strings:
    $rep0 = "my_str = replace(my_str,a1,\"!\" )"
    $rep1 = "my_str = replace(my_str,b1 ,a1 )"
    $rep2 = "my_str = replace(my_str,\"!\" ,b1 )"

    $mid0 = "a1 = Mid(ch_a,ina+1,1)"
    $mid1 = "b1 = Mid(ch_b,ina+1,1)"

    $req0 = "ReqStr = base64encode( z & \";\" & 
ws.ExpandEnvironmentStrings(\"%COMPUTERNAME%\") & \";\" & 
ws.ExpandEnvironmentStrings(\"%USERNAME%\") & \";\" & 
fso.GetDrive(\"C:\\\").SerialNumber)"
    $req1 = "ReqStr = Chain(ReqStr,\"=+/\",\",-_\")"

    $cap0 = "CapIN \"systeminfo > \"\"\" & TmpF & \"\"\"\", 1, True"
    $cap1 = "CapIN \"ipconfig /all >>  \"\"\" & TmpF & \"\"\"\", 1, True"
    $cap2 = "CapIN \"net view >>  \"\"\" & TmpF & \"\"\"\", 1, True"
    $cap3 = "CapIN \"tasklist >>  \"\"\" & TmpF & \"\"\"\", 1, True"
  condition:
    all of ($rep*) or all of ($mid*) or all of ($req*) or all of ($cap*)
}

침해 지표 (Indicators of Compromise)

IOC

상세

13f7599c94b9d4b028ce02397717a128
2a46f07b9d3e2f8f2b3213fa8884b029

Stage 1 - 가짜 CAPTCHA 페이지, 클립보드로 PowerShell 로드

4c7accba35edd646584bb5a40ab78f96
3de45e5fc816e62022cd7ab1b01dae9c

Stage 2: 기기 회피 및 Stage 3 로더

6b85d707c23d68f9518e757cc97adb20
adc8accb33d0d68faf1d8d56d7840816

Stage 3: 최종 페이로드 검색 및 디코딩, 키 Ah90pE3b 포함

3233668d2e4a80b17e6357177b53539d
f659e55e06ba49777d0d5171f27565dd

디코더 스크립트, 키 4z7Klx1V 포함

6bc411d562456079a8f1e38f3473c33a
de73b08c7518861699e9863540b64f9a

최종 페이로드(인코딩)

28a0596b9c62b7b7aca9cac2a07b0671
09f27d327581a60e8cb4fab92f8f4fa9

최종 페이로드(디코딩)

165.227.148[.]68

C2

cloudmediaportal[.]com

C2

b55cdce773bc77ee46b503dbd9430828
cc0f518b94289fbfa70b5fbb02ab1847

2023년 12월, LOSTKEYS를 실행하는 바이너리

02ce477a07681ee1671c7164c9cc847b
01c2e1cd50e709f7e861eaab89c69b6f

2023년 12월, LOSTKEYS를 실행하는 바이너리

8af28bb7e8e2f663d4b797bf3ddbee7f
0a33f637a33df9b31fbb4c1ce71b2fee

2023년 12월, LOSTKEYS

njala[.]dev

2023년 12월 C2

80.66.88[.]67

2023년 12월 C2

게시 위치