서문
Elastic 보안 연구소는 최근 드래곤 브레스 APT(APT-Q-27)에 기인한 gh0st RAT의 수정된 변종(변형)이 구글 크롬과 마이크로소프트 팀즈와 같은 합법적인 소프트웨어로 가장한 트로이 목마 NSIS 설치 프로그램을 통해 배포되는 캠페인을 확인했습니다. 감염 체인은 다양한 회피 기술을 활용하는 다단계 전달 메커니즘을 사용하며, 중국 시장에서 널리 사용되는 엔드포인트 보안 제품을 무력화하기 위해 많은 중복성을 가지고 있습니다. 여기에는 합법적으로 서명된 드라이버 가져오기, 사용자 지정 WDAC 정책 배포, PPL 남용을 통한 Microsoft Defender 바이너리 변조 등이 포함됩니다.
이 캠페인은 주로 중국어권 사용자를 대상으로 하며, 2022~2023년에 기록된 이전의 드래곤브레스 관련 캠페인과 비교했을 때 적응력에서 뚜렷한 진화를 보여주고 있습니다. 이 보고서를 통해 이 멀웨어가 구현하기 시작한 새로운 기법에 대한 경각심을 높이고 RoningLoader라고 명명한 독특한 로더에 대해 조명할 수 있기를 바랍니다.
핵심 사항
- 이 멀웨어는 보호된 프로세스 표시등(PPL)을 악용하여 Windows Defender를 비활성화합니다.
- 위협 행위자는 유효한 서명된 커널 드라이버를 활용하여 프로세스를 죽입니다.
- 360 Total Security 및 Huorong 실행 파일을 차단하기 위해 사용자 지정 서명되지 않은 WDAC 정책이 적용되었습니다.
- 추가 안티바이러스 프로세스 종료를 위한 스레드 풀을 통한 팬텀 DLL 및 페이로드 인젝션
- 최종 페이로드에는 사소한 업데이트가 있으며 DragonBreath와 연관되어 있습니다.
탐색
2025년 8월, 엔드포인트 보안 도구를 비활성화하기 위해 보호된 프로세스 조명(PPL)을 악용하는 방법을 자세히 설명하는 연구가 발표되었습니다. 이 공개 이후, 저희는 행동 규칙인 ' 클립업 실행을 통한 잠재적 회피'를 만들었고, 텔레메트리 데이터의 위협 헌팅을 통해 이 기술을 사용하는 라이브 캠페인을 확인했습니다.
로닝로더 코드 분석
초기 감염 벡터는 Nullsoft 스크립터블 인스톨 시스템(NSIS)을 사용하여 만든 트로이 목마 인스톨러입니다. NSIS는 Windows 설치 프로그램을 만들기 위한 합법적인 오픈 소스 도구이지만, GULOADER에서 볼 수 있듯이 위협 행위자들이 멀웨어를 패키징하고 전달하는 데 악용하는 경우가 많습니다. 이 캠페인에서는 다양한 테마로 악성 설치 프로그램이 배포되고 있으며, 구글 크롬, 마이크로소프트 팀즈 또는 기타 신뢰할 수 있는 애플리케이션과 같은 합법적인 소프트웨어로 가장하여 사용자가 실행하도록 유인하는 것이 관찰되었습니다.
실행 시 기본 NSIS 설치 관리자는 두 개의 추가 임베디드 NSIS 설치 관리자를 포함하는 드롭퍼로 작동합니다. 중첩된 인스톨러 중 하나는 양성이며 합법적인 소프트웨어를 설치하는 반면, 두 번째는 악성이며 공격 체인을 배포하는 역할을 담당합니다.
공격 체인은 안티바이러스 프로세스 종료를 위해 ollama.sys 이라는 서명된 드라이버를 활용합니다. 드라이버의 서명자 이름은 Kunming Wuqi E-commerce Co., Ltd. 이며, 인증서는 2월 3, 2025 에서 2월 3, 2026 까지 유효합니다. 바이러스토탈에서 피벗을 통해 71 추가 서명된 바이너리를 발견했습니다. 이 중 중국 사용자들 사이에서 인기 있는 게임 중심 VPN 소프트웨어인 慕讯公益加速器 (MuXunAccelerator) 로 위장한 AgentTesla 드로퍼를 확인했으며, 샘플은 2025년 4월로 거슬러 올라갑니다. 특히 서명 기법은 샘플마다 다릅니다. 와 같은 일부 초기 샘플에는 inject.sys와 같은 일부 이전 샘플에는 HookSignTool JemmyLoveJenny 문자열을 포함한 아티팩트가 포함된 반면, 10월 2025 ollama.sys 샘플은 이러한 아티팩트가 없고 표준 서명 절차를 사용하지만 둘 다 동일한 인증서 유효 기간을 공유합니다.
ollama.sys의 PDB 문자열 아티팩트 D:\VS_Project\加解密\MyDriver1\x64\Release\MyDriver1.pdb 를 다른 샘플과 비교한 결과, 제출된 다른 샘플과 다른 아티팩트를 발견했습니다.
D:\cpp\origin\ConsoleApplication2\x64\Release\ConsoleApplication2.pdbD:\a_work\1\s\artifacts\obj\coreclr\windows.x86.Release\Corehost.Static\singlefilehost.pdbC:\Users\0\Desktop\EAMap\x64\Release\ttt.pdbh:\projects\netfilter3\bin\Release\Win32\nfregdrv.pdb
바이너리의 다양성과 많은 양의 제출로 인해 인증서가 유출되었을 수 있다고 생각하지만, 현재로서는 추측일 뿐입니다.
스테이지 1
분석은 SHA256 해시로 식별되는 초기 바이너리( da2c58308e860e57df4c46465fd1cfc68d41e8699b4871e9a9be3c434283d50b)로 시작되었습니다. 압축을 풀면 정상 설치 프로그램( letsvpnlatest.exe)과 악성 설치 프로그램( Snieoatwtregoable.exe)의 두 가지 실행 파일이 포함되어 있는 것을 확인할 수 있습니다.
악성 설치 프로그램( Snieoatwtregoable.exe)은 C:\Program Files\Snieoatwtregoable\ 에 새 디렉터리를 생성합니다. 이 폴더에는 Snieoatwtregoable.dll 이라는 이름의 DLL과 tp.png 이라는 암호화된 파일 두 개가 드롭됩니다.
악성 활동의 핵심은 단일 함수를 내보내는 Snieoatwtregoable.dll 에 있습니다: DllRegisterServer. 이 함수가 호출되면 디스크에서 tp.png 파일의 내용을 읽은 다음 오른쪽 회전(ROR)과 XOR 연산을 모두 포함하는 간단한 알고리즘을 사용하여 이 데이터를 복호화합니다.
해독된 콘텐츠는 메모리에서 PE 파일을 반사적으로 로드하고 실행하는 셸코드입니다. 멀웨어는 먼저 NtAllocateVirtualMemory API를 사용하여 자체 프로세스 내에 새 메모리 영역을 할당하고 NtCreateThreadEx 을 호출하여 셸 코드를 실행할 새 스레드를 생성합니다.
멀웨어는 새로운 ntdll.dll 을 로드한 다음 GetProcAddress 을 API 이름과 함께 사용하여 주소를 확인함으로써 유저랜드 훅을 제거하려고 시도합니다.
이 악성 코드는 실제 목적 없이 포트 5555 의 로컬 호스트에 연결을 시도하지만 결과는 중요하지 않으므로, 추측컨대 데드 코드 또는 제작 전 남은 코드일 가능성이 높습니다.
무대 2 - tp.png
로닝로더는 먼저 GetTokenInformation API를 사용하여 관리 권한이 있는지 확인합니다. 그렇지 않은 경우 원래 프로세스를 종료하기 전에 runas 명령을 사용하여 권한이 상승된 새 인스턴스를 시작하여 권한을 상승시키려고 시도합니다.
흥미롭게도 이 멀웨어는 하드코딩된 URL과 통신을 시도합니다. http://www.baidu.com/ 와 사용자 에이전트 “Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko” 와 통신을 시도하지만, 이는 향후 버전에서 제거된 기능 또는 플레이스홀더 코드로 인해 죽은 코드인 것으로 보입니다. URL에서 HTTP 응답 헤더 날짜를 추출하여 기록하도록 설계되었습니다.
그런 다음 멀웨어는 실행 중인 프로세스 목록에서 특정 안티바이러스 솔루션을 검색합니다. 하드코딩된 프로세스 이름 목록을 확인하고 해당 부울 플래그가 발견되면 "True" 로 설정합니다.
다음은 바이너리로 하드코딩된 프로세스 및 관련 보안 제품의 표입니다:
| 프로세스 이름 | 보안 제품 |
|---|---|
MsMpEng.exe | Microsoft Defender 바이러스 백신 |
kxemain.exe | 킹소프트 인터넷 보안 |
kxetray.exe | 킹소프트 인터넷 보안 |
kxecenter.exe | 킹소프트 인터넷 보안 |
QQPCTray.exe | Tencent PC 관리자 |
QQPCRTP.exe | Tencent PC 관리자 |
QMToolWidget.exe | Tencent PC 관리자 |
HipsTray.exe | 치후 360 종합 보안 |
HipsDaemon.exe | 치후 360 종합 보안 |
HipsMain.exe | 치후 360 종합 보안 |
360tray.exe | 치후 360 종합 보안 |
주입된 원격 프로세스를 통한 AV 프로세스 종료
그런 다음 멀웨어가 해당 프로세스를 죽입니다. 흥미롭게도 Qihoo 360 토탈 보안 제품은 다른 제품과는 다른 접근 방식을 취합니다.
첫째, 방화벽을 변경하여 모든 네트워크 통신을 차단합니다. 그런 다음 함수를 호출하여 볼륨 섀도 복사본(VSS) 서비스와 연결된 프로세스(vssvc.exe)에 셸코드를 삽입합니다.
먼저 높은 무결성( SeDebugPrivilege ) 토큰을 스스로 부여합니다.
그런 다음 VSS(볼륨 섀도 복사본 서비스) 가 아직 실행 중이 아닌 경우 이를 시작하고 관련 프로세스(vssvc.exe)의 PID를 가져옵니다.
다음으로, 멀웨어는 NtCreateSection 을 사용하여 두 개의 개별 메모리 섹션을 만듭니다. 그런 다음 이러한 섹션의 보기를 vssvc.exe 프로세스의 메모리 공간에 매핑합니다. 첫 번째 섹션에는 장치 이름이 \\.\Ollama 인 드라이버인 전체 PE(휴대용 실행 파일) 파일이 포함되어 있습니다. 두 번째 섹션에는 실행을 위한 셸코드가 포함되어 있습니다.
로닝로더는 다른 멀웨어에서 사용되는 다른 주입 방법과 달리 이 프로세스 주입에 대해 다른 접근 방식을 취합니다. 이 기술은 스레드 풀을 활용하여 원격 프로세스의 파일 쓰기 트리거를 통해 코드를 원격으로 실행합니다. 이 기술은 다양한 변종과 함께 SafeBreach에서 2023 에 문서화되어 있습니다.
일단 실행되면 셸코드는 작동에 필요한 Windows API의 주소를 동적으로 확인하는 것으로 시작합니다. 이것은 로닝로더에서 유일하게 난독화를 사용하는 부분으로, 파울러-놀-보 해시 (FNV) 알고리즘을 사용하여 이름이 아닌 해시로 함수를 조회합니다.
먼저 CreateFileW, WriteFile, CloseHandle 의 주소를 가져와서 하드코딩된 경로인 C:\windows\system32\drivers\1912763.temp 에 드라이버를 디스크에 씁니다.
그런 다음 다음 작업을 수행합니다:
xererre1라는 이름의 서비스를 만들어 디스크에 드롭된 드라이버를 로드합니다.- 다음 프로세스(
360Safe.exe,360Tray.exe,ZhuDongFangYu.exe)는 모두 Qihoo 360 소프트웨어와 연결되어 있으며, 이름별로 프로세스의 PID를 찾는 함수와 PID별로 프로세스를 종료하는 함수( 2 )를 각각 호출합니다. - 그런 다음 서비스를 중지하고 삭제합니다.
xererre1
프로세스를 종료하기 위해 멀웨어는 드라이버를 사용합니다. 드라이버를 분석한 결과 1 기능만 등록한 것으로 나타났습니다. 이 드라이버는 PID를 매개변수로 사용하는 하나의 IOCTL ID(0x222000)를 처리하고 ZwOpenProcess 로 프로세스를 먼저 연 다음 ZwTerminateProcess 커널 API로 종료하는 방식으로 프로세스를 종료합니다.
AV 프로세스 종료
기본 실행 흐름으로 돌아가서, 멀웨어는 VSS 서비스에 주입된 셸코드가 처리하는 360tray.exe 의 종료를 확인하는 루프로 들어갑니다. 프로세스가 더 이상 실행되지 않는지 확인한 후에만 진행됩니다. 이 확인 직후 시스템이 방화벽 설정을 복원합니다. 이 조치는 소프트웨어의 통신 채널을 차단하여 최종 활동 로그나 보안 경고를 백엔드 서비스에 업로드하지 못하도록 하기 위한 방어적 조치일 가능성이 높습니다.
그런 다음 주 프로세스에서 다른 보안 프로세스를 직접 종료합니다. 특히 이러한 작업을 숨기려고 시도하지 않고, 이전의 API 해싱 기술을 버리고 필요한 함수를 직접 호출합니다.
로닝로더는 일관되고 반복 가능한 절차에 따라 대상 프로세스를 종료합니다:
- 먼저, 이번에는 임시 경로에 악성 드라이버를 디스크에 씁니다.
C:\Users\analysis\AppData\Local\Temp\ollama.sys. - 임시 서비스(
ollama)를 생성하여ollama.sys을 커널에 로드합니다. - 그런 다음 멀웨어는 대상 프로세스의 이름으로 PID를 가져와 해당 드라이버에 PID가 포함된 요청을 전송하여 종료를 수행합니다.
- 킬 명령이 전송된 직후 서비스가 삭제됩니다.
Microsoft Defender의 경우, 이 악성 코드는 위에서 설명한 것과 동일한 접근 방식을 사용하여 MsMpEng.exe 프로세스를 죽이려고 시도합니다. 작성자로부터 코드 버그를 발견했습니다. Microsoft Defender의 경우 코드가 Defender가 이미 실행 중인지 확인하지 않고 MsMpEng.exe 프로세스 검색으로 바로 진행합니다. 즉, 프로세스가 실행되고 있지 않으면 멀웨어가 드라이버에 0 을 PID로 전송합니다.
이 멀웨어는 보안 솔루션 프로세스를 죽이기 위해 더 많은 중복 코드를 가지고 있습니다. 또한 svchost.exe에 다른 셸코드를 삽입합니다, vssvc.exe에 주입된 것과 유사하지만 아래 스크린샷에서 볼 수 있듯이 프로세스 목록이 다릅니다.
삽입 기법도 스레드풀을 사용하지만 삽입된 코드는 이벤트에 의해 트리거됩니다.
프로세스가 종료된 후 악성코드는 4 폴더를 만듭니다.
C:\ProgramData\lnkC:\ProgramData\<current_date>C:\Users\Public\Downloads\<current_date>C:\ProgramData\Roning
임베디드 아카이브
그런 다음 악성 코드는 C:\Users\Public\Downloads\<current_date> 에 .txt 파일 세 개를 작성합니다. 확장자는 텍스트 파일이 아니라 다른 코드 베이스에서 가져온 특정 형식으로 만들어진 컨테이너일 가능성이 높습니다.
이 사용자 지정 파일 구조는 다음과 같이 구성됩니다:
- 매직 바이트: 파일은 식별을 위해
4B 44 01 00서명으로 시작됩니다. - 파일 수: 바로 뒤에 컨테이너 내에 캡슐화된 파일 수를 나타내는 값이 나옵니다.
- 파일 메타데이터: 헤더 섹션에는 저장된 각 파일에 대한 정보가 설명되어 있습니다.
- 압축 데이터: 마지막으로, 각 임베디드 파일은 ZLIB 압축 데이터 블록에 저장됩니다.
다음은 2 파일이 포함된 hjk.txt archive 의 파일 형식 예시입니다: 1.bat 및 fhq.bat.
이 아카이브 형식은 현재 단계의 2 기타 임베디드 파일에 적용됩니다:
agg.txt3 파일 -Enpug.bin,goldendays.dll, 그리고trustinstaller.binkill.txt1 파일이 포함되어 있습니다.1.dll
UAC 및 AV 네트워킹을 우회하는 배치 스크립트
1.bat 는 EnableLUA 레지스트리 값을 0으로 설정하여 UAC(사용자 계정 컨트롤)를 비활성화하는 간단한 배치 스크립트입니다.
fhq.bat C:\ProgramData\lnk\123.txt 에 정의된 프로그램과 Qihoo 360 보안 소프트웨어(360Safe.exe)를 대상으로 하는 또 다른 배치 스크립트입니다. 인바운드 및 아웃바운드 연결을 차단하는 방화벽 규칙을 만들면 됩니다. 또한 모든 프로필에서 방화벽 알림을 비활성화합니다.
팬텀 DLL을 통한 AV 프로세스 종료
배포된 DLL인 1.dll 은 C:\Windows\System32\Wow64\Wow64Log.dll 으로 복사되어 모든 WOW64 프로세스에 의해 사이드 로드됩니다. Wow64Log.dll 은 기본적으로 Windows 시스템에 존재하지 않는 팬텀 DLL이기 때문입니다. 이 작업은 기본적으로 표준 Windows API(TerminateProcess)를 사용하여 프로세스 목록을 종료하려고 시도하는 중복 작업입니다.
클립업 MS 디펜더 킬러
그런 다음 이 멀웨어는 2025년 8월 제로 살라리움에서 문서화한 PPL 어뷰징 기법을 사용하려고 시도합니다. 이 게시물의 PoC는 Microsoft Defender만을 대상으로 합니다. 실행되는 모든 시스템 명령은 ShellExecuteW API를 사용하여 cmd.exe 를 통해 이루어집니다.
C:\ProgramData\Microsoft\Windows Defender\Platform\*에서 Microsoft Defender의 설치 폴더를 검색하여 현재 사용 중인 버전을 나타내는 가장 최근 수정 날짜가 있는 디렉터리만 대상으로 합니다.- 다음 명령으로 찾은 디렉터리를 가리키도록
C:\ProgramData\roming폴더와mklink디렉터리 링크를 만듭니다:cmd.exe /c mklink /D "C:\ProgramData\roming" “C:\ProgramData\Microsoft\Windows Defender\Platform\4.18.25050.5-0” - 그런 다음 다음 매개 변수를 사용하여
C:\Windows\System32\ClipUp.exe을 실행합니다:-ppl C:\ProgramData\roming\MsMpEng.exe를 실행하여MsMpEng.exe을 정크 데이터로 덮어쓰고 재시작 후에도 EDR을 효과적으로 비활성화합니다.
작성자는 EDR-Freeze에서 코드를 복사하여 ClipUp.exe 을 시작한 것으로 보입니다.
Ci정책
이 악성 코드는 C:\\Windows\\System32\\CodeIntegrity\\CiPolicies\\Active\\{31351756-3F24-4963-8380-4E7602335AAE}.cip 경로에 정책 파일을 작성하여 WDAC(Windows Defender 응용 프로그램 제어)를 직접 표적으로 삼습니다.
이 악성 정책은 '거부 목록' 모드로 작동하여 대부분의 애플리케이션은 실행할 수 있지만 두 개의 유명 중국 안티바이러스 공급업체는 명시적으로 차단합니다:
- 치후 360 차단을 통한 완벽한 보안
360rp.exe및360sd.exe - 차단을 통한 후오롱 보안
ARPProte.exe - 후오롱 보안(
北京火绒网络科技有限公司)에서 인증서 TBS 해시를 통해 서명된 모든 실행 파일A229D2722BC6091D73B1D979B81088C977CB028A6F7CBF264BB81D5CC8F099F87D7C296E48BF09D7EBE275F5498661A4
중요한 구성 요소는 Enabled:Unsigned System Integrity Policy 규칙으로, 유효한 디지털 서명 없이 정책을 로드할 수 있습니다.
Truncated...
<Rule>
<Option>Enabled:Inherit Default Policy</Option>
</Rule>
<Rule>
<Option>Enabled:Unsigned System Integrity Policy</Option>
</Rule>
<Rule>
<Option>Enabled:Advanced Boot Options Menu</Option>
</Rule>
<Rule>
<Option>Enabled:Update Policy No Reboot</Option>
</Rule>
</Rules>
<EKUs />
<FileRules>
<Allow ID="ID_ALLOW_A_019A298478CE7BF4902DE08CA2D17630" FileName="*" />
<Allow ID="ID_ALLOW_A_019A298478CE7AB089C369772F34B39B" FileName="*" />
<Deny ID="ID_DENY_A_019A298478CE7DBA9913BFC227DACD14" FileName="360rp.exe" InternalName="360rp.exe" FileDescription="360杀毒 实时监控" ProductName="360杀毒" />
<Deny ID="ID_DENY_A_019A298478CE763C85C9F42EC8669750" FileName="360sd.exe" InternalName="360sd.exe" FileDescription="360杀毒 主程序" ProductName="360杀毒" />
<FileAttrib ID="ID_FILEATTRIB_A_019A298478CE766B9C39FB9CE6805A11" FileName="ARPProte.exe" MinimumFileVersion="6.0.0.0" />
</FileRules>
<Signers>
<Signer ID="ID_SIGNER_A_019A298478CE7608908CAE58FD9C3D8E" Name="">
<CertRoot Type="TBS" Value="A229D2722BC6091D73B1D979B81088C977CB028A6F7CBF264BB81D5CC8F099F87D7C296E48BF09D7EBE275F5498661A4" />
<CertPublisher Value="北京火绒网络科技有限公司" />
<FileAttribRef RuleID="ID_FILEATTRIB_A_019A298478CE766B9C39FB9CE6805A11" />
</Signer>
<Signer ID="ID_SIGNER_A_019A298478CE77F7B523D1581F518639" Name="">
<CertRoot Type="TBS" Value="A229D2722BC6091D73B1D979B81088C977CB028A6F7CBF264BB81D5CC8F099F87D7C296E48BF09D7EBE275F5498661A4" />
<CertPublisher Value="北京火绒网络科技有限公司" />
</Signer>
</Signers>
...Truncated
무대 3 - goldendays.dll
이전 단계에서 로닝로더는 다음 명령으로 다음 실행 단계를 실행하기 위해 MicrosoftSoftware2ShadowCop4yProvider 이라는 새 서비스를 생성합니다: regsvr32.exe /S "C:\ProgramData\Roning\goldendays.dll.
이 구성 요소의 주요 목표는 다음 페이로드를 합법적이고 높은 권한의 시스템 프로세스에 삽입하여 활동을 위장하는 것입니다.
이를 위해 로닝로더는 먼저 적합한 대상 프로세스를 식별합니다. 순차적으로 시작하려고 시도하는 두 가지 서비스 이름의 하드코딩된 목록이 있습니다:
- 트러스티드 인스톨러 (
TrustedInstaller.exe) - MicrosoftEdgeElevationService (
elevation_service.exe)
멀웨어는 이 목록을 반복하며 각 서비스를 시작하려고 시도합니다. 서비스가 성공적으로 시작되거나 이미 실행 중인 서비스가 발견되면 멀웨어는 주입 단계를 위해 프로세스 ID(PID)를 저장합니다.
다음으로, 멀웨어는 C:\Windows\ 디렉터리 내에 임의의 이름으로 배치 파일을 생성하여 지속성을 설정합니다(예: C:\Windows\KPeYvogsPm.bat). 이 파일 내부의 스크립트는 다음 로직으로 연속 루프를 실행합니다:
- 신뢰할 수 있는 서비스의 캡처된 PID(예:
TrustedInstaller.exe에 대한 PID4016)가 여전히 실행 중인지 확인합니다. - 서비스가 실행되고 있지 않으면 스크립트는 이전에 생성된 악성 서비스(
MicrosoftSoftware2ShadowCop4yProvider)를 다시 시작하여 멀웨어의 구성 요소가 활성 상태로 유지되도록 합니다. - 서비스 프로세스가 실행 중인 경우 스크립트는 10 초 동안 잠자기 상태로 있다가 다시 확인합니다.
마지막으로 멀웨어는 C:\ProgramData\Roning\trustinstaller.bin 의 내용을 읽습니다. 앞서 획득한 신뢰할 수 있는 서비스의 PID를 사용하여 이 페이로드를 대상 프로세스(TrustedInstaller.exe 또는 elevation_service.exe)에 인젝션합니다. 주입 방법은 간단합니다. VirtualAllocEx 로 원격 가상 할당을 수행하고 WriteProcessMemory 으로 여기에 쓴 다음 CreateRemoteThread 로 실행할 원격 스레드를 생성합니다.
단계 3 - trustinstaller.bin
trustinstaller.bin 에 포함된 세 번째 단계는 최종 페이로드를 합법적인 프로세스에 주입하는 역할을 담당합니다. 실행 중인 프로세스를 열거하고 하드코딩된 잠재적 프로세스 목록과 프로세스 이름을 일치시켜 대상을 검색하는 것으로 시작됩니다.
셸코드가 발견되면 최종 페이로드인 C:\ProgramData\Roning\Enpug.bin 에 셸코드를 삽입합니다. NtCreateSection 으로 섹션을 생성하고 NtMapViewOfSection 으로 원격 프로세스에 뷰를 매핑한 다음 페이로드를 작성합니다. 그런 다음 CreateRemoteThread 를 사용하여 원격 스레드를 생성합니다.
단계 4 - 최종 페이로드
최종 페이로드는 Sophos가드래곤브레스 캠페인을 발견한 이후 큰 변화가 없었습니다( 2023 )와 2022년 중반 QianXin의 보고서. 여전히 오픈 소스 gh0st RAT의 수정된 버전입니다.
최근 캠페인에서는 실행 초기에 가치 뮤텍스( Global\DHGGlobalMutex )가 생성됩니다. 메인 C2 통신 루프 외부에서 MyUniqueMutexName 이라는 뮤텍스를 생성한 후 즉시 파괴하는 데드 코드가 관찰됩니다.
C2 도메인과 포트는 하드코딩된 상태로 유지되지만 이제 XOR 암호화됩니다. C2 채널은 양방향으로 메시지가 암호화된 원시 TCP 소켓을 통해 작동합니다.
피해자 비콘 데이터
임플란트는 C2 서버에 체크인하고 Sleep(<random_amount> * 1000) 을 통해 구현된 임의의 간격으로 C2에 반복적으로 비콘을 전송합니다. 아래는 비콘 주기 동안 임플란트가 C2 서버로 반환하는 데이터의 구조입니다:
struct BeaconData {
// +0x000
uint32_t message_type; // Example Beacon ID - 0xC8 (200)
// +0x004
uint32_t local_ip; // inet_addr() of victim's IP
// +0x008
char hostname[50]; // Computer name or registry "Remark"
// +0x03A
char windows_version[?]; // OS version info
// +0x0D8
char cpu_name[64]; // Processor name
// +0x118
uint32_t entry_rdx;
// +0x11C
char time_value[64]; // Implant installed time or registry "Time" value
// +0x15C
char victim_tag[39]; // Command 6 buffer (Custom victim tag)
// +0x183
uint8_t is_wow64; // 1 if 32-bit on 64-bit Windows
// +0x184
char av_processes_found[128]; // Antivirus processes found
// +0x204
char uptime[12]; // System uptime
char padding[52];
// +0x244
char crypto_wallet_track[64]; // "狐狸系列" (MetaMask) or registry "ZU" (crypto related tracking)
// +0x284
uint8_t is_admin; // 1 if running with admin rights
// +0x285
char data[?];
// +0x305
uint8_t telegram_installed; // 1 if Telegram installed
// +0x306
uint8_t telegram_running; // 1 if Telegram.exe running
// +0x307
// (padding to 0x308 bytes)
};
C2 명령
C2 서버에서 임플란트로 전송되는 요청 메시지는 구조를 따릅니다:
struct C2_to_implant_msg {
uint32_t total_message_len;
uint32_t RC4_key;
char encrypted_command_id;
uint8_t encrypted_command_args;
};
임플란트는 다음 공식을 통해 C2 메시지를 해독합니다:
RC4_decrypt(ASCII(decimal(RC4_key)), encrypted_command_id || command)
아래는 사용 가능한 명령어 목록으로, 대부분 몇 년 전 2 과 동일하게 유지됩니다:
| 명령 ID | 설명 |
|---|---|
0 | ExitWindowsEx 제공된 EXIT_WINDOWS_FLAGS |
1 | 임플란트를 우아하게 종료 |
2 | 레지스트리 키 Enable 를 False로 설정하여 & 임플란트 지속적 비활성화를 종료합니다. |
3 | 사용자 지정 피해자 이름 변경을 위한 레지스트리 키 Remark 설정(기본값: 호스트 이름) |
4 | 메타마스크/암호화 관련 태깅을 위한 레지스트리 키 ZU 설정 |
5 | Windows 이벤트 로그 지우기(애플리케이션, 보안, 시스템) |
6 | 클라이언트 비콘을 사용할 때 추가 사용자 지정 태그 설정 |
7 | 제공된 URL을 통해 파일 다운로드 및 실행 |
9 | ShellExecute (보이는 창) |
10 | ShellExecute (숨겨진 창) |
112 | 클립보드 데이터 가져오기 |
113 | 클립보드 데이터 설정 |
125 | ShellExecute cmd.exe 명령 매개변수 사용(숨겨진 창) |
126 | 디스크에 드롭하여 페이로드를 실행하거나 PluginMe export를 반영적으로 로드하여 실행합니다. |
128 | 첫 번째 옵션 - 제공된 C2 도메인, 포트 및 비콘 간격을 사용하여 새 세션을 엽니다. 두 번째 옵션 - 레지스트리 키 CopyC 를 설정하여 C2 도메인 및 포트를 영구적으로 업데이트합니다. Base64Encode(XOR(C2_domain_and_port, 0x5)) 을 통해 암호화되어 저장됩니다. |
241 | 텔레그램이 설치 및/또는 실행 중인지 확인 |
243 | 클립보드 하이재커 구성 |
101, 127, 236, [...] | WTS 세션 토큰 가장을 사용하여 svchost.exe 에 사용자 지정 셸코드 삽입, 다음을 통해 CREATE_SUSPENDED 프로세스 삽입으로 되돌아갑니다. CreateRemoteThread |
분석가 참고: 동일한 명령을 가리키는 명령 ID가 여러 개 있습니다. 이를 식별하기 위해 줄임표를 사용했습니다.
시스템 로거
임플란트는 C2 명령 외에도 키 입력, 클립보드 및 활성 창 로거를 구현합니다. 캡처된 데이터는 %ProgramData%\microsoft.dotnet.common.log 에 기록되며 HKEY_CURRENT_USER\offlinekey\open 에서 레지스트리 키를 통해 활성화 또는 비활성화할 수 있습니다(활성화하려면1, 비활성화하려면 0 ). 로그 파일은 자동 순환을 구현하여 과도한 디스크 사용으로 인한 탐지를 피하기 위해 50 MB를 초과하면 자동으로 삭제됩니다.
아래 코드 스니펫은 로그 로테이션을 구현하고 이벤트 캡처를 위해 키보드 장치를 획득하기 위한 DirectInput8 인터페이스와 키보드 이벤트 검색 로직을 구성하는 초기화 루틴을 보여 줍니다.
그런 다음 멀웨어는 세 가지 범주의 정보를 캡처하기 위해 모니터링 루프에 들어갑니다.
- 먼저
OpenClipboard및GetClipboardData을 사용하여 클립보드를 모니터링하고 텍스트 콘텐츠에 대한 변경 사항을 접두사[剪切板:]로 기록합니다. - 둘째, 사용자가 애플리케이션을 전환할 때마다
GetForegroundWindow을 통해 활성 창 제목과 타임스탬프를 각각 접두사[标题:]과[时间:]로 기록하여 창 포커스 변경 사항을 추적합니다. - 셋째,
DirectInput8장치에서 버퍼링된 키보드 이벤트(설문조사당 최대 60 이벤트)를 검색하고 문자 매핑 테이블을 통해 읽을 수 있는 텍스트로 변환하여 결과에 접두사[内容:]를 붙입니다.
클립보드 하이재커
이 멀웨어는 또한 C2 명령 ID 243을 통해 원격으로 구성되는 클립보드 하이재커를 구현합니다. 클립보드 변경 사항을 모니터링하고 캡처된 텍스트에 대해 검색 및 바꾸기 작업을 수행하여 공격자가 정의한 문자열을 대체 값으로 대체합니다. 구성 매개변수는 clipboard (기능 활성화/비활성화), charac (검색 문자열), characLen (검색 길이), newcharac (대체 문자열) 키가 있는 HKEY_CURRENT_USER\offlinekey 아래의 레지스트리에 저장됩니다.
ClipboardListener_Class_Toggle 이라는 창 클래스를 등록하고 ClipboardMonitor 이라는 제목의 숨겨진 창을 만들어 클립보드 변경 알림을 받도록 합니다. 창 프로시저는 GetClipboardSequenceNumber 로 클립보드 시퀀스 번호를 확인하여 진짜 변경 사항을 감지한 다음 EmptyClipboard 및 SetClipboardData 를 통해 클립보드 콘텐츠를 교체하는 핵심 조작 루틴을 호출하여 WM_CLIPBOARDUPDATE (0x31D) 메시지를 처리합니다.
멀웨어 및 MITRE ATT&CK
Elastic은 MITRE ATT& CK 프레임워크를 사용하여 지능형 지속적 위협이 기업 네트워크에 대해 사용하는 일반적인 전술, 기술 및 절차를 문서화합니다.
전술
전술은 기술 또는 하위 기술의 이유를 나타냅니다. 이는 적의 전술적 목표, 즉 행동을 수행하는 이유입니다.
기술
기술은 공격자가 행동을 수행하여 전술적 목표를 달성하는 방법을 나타냅니다.
- 명령 및 스크립팅 인터프리터: Windows 명령 셸
- 시스템 서비스: 서비스 실행
- 시스템 프로세스 생성 또는 수정 Windows 서비스
- 고도 제어 메커니즘 남용: 사용자 계정 제어 우회
- Access Token Manipulation
- 방어력 약화: 도구 비활성화 또는 수정
- 방어 기능 손상: 시스템 방화벽 비활성화 또는 수정
- 표시기 제거: Windows 이벤트 로그 지우기
- 하이재킹 실행 흐름: DLL 사이드 로딩
- 프로세스 인젝션
- 가장: 합법적인 이름 또는 위치 일치
- Modify Registry
- 신뢰 제어 무력화: 코드 서명 정책 수정
- 입력 캡처: 키 로깅
- 클립보드 데이터
- 프로세스 검색
- 시스템 정보 검색
- System Owner/User Discovery
- 소프트웨어 검색: 보안 소프트웨어 검색
- Non-Application Layer Protocol
- 암호화된 채널: 대칭 암호화
완화
탐지
- 클립업 실행을 통한 회피 가능성
- 의심스러운 원격 메모리 할당
- 일시 중단된 프로세스 코드 삽입 가능성
- 신뢰할 수 있는 대상 프로세스에 원격 메모리 쓰기
- 낮은 평판 모듈에 의한 원격 프로세스 메모리 쓰기
- 자식이 아닌 프로세스에 프로세스 메모리 쓰기
- 서명되지 않은 모듈에서 백업되지 않은 셸코드
- WOW64 로거 DLL 사이드 로딩을 통한 UAC 우회 시도
- 백업되지 않은 메모리에서 네트워크 연결 API
- Rundll32 or Regsvr32 Loaded a DLL from Unbacked Memory
- 백업되지 않은 의심스러운 메모리에서 로드된 네트워크 모듈
YARA
Elastic Security는 이 활동을 식별하기 위해 YARA 규칙을 만들었습니다. 아래는 로닝로더와 최종 임플란트를 식별하기 위한 YARA 규칙입니다:
관찰
이 연구에서는 다음과 같은 관찰 가능성에 대해 논의했습니다.
| 관측 가능합니다. | 유형 | 이름 | 참조 |
|---|---|---|---|
da2c58308e860e57df4c46465fd1cfc68d41e8699b4871e9a9be3c434283d50b | SHA-256 | klklznuah.msi | 초기 NSIS 설치 관리자 |
82794015e2b40cc6e02d3c1d50241465c0cf2c2e4f0a7a2a8f880edaee203724 | SHA-256 | Snieoatwtregoable.exe | 초기 설치 프로그램에서 언패킹된 악성 설치 프로그램 |
c65170be2bf4f0bd71b9044592c063eaa82f3d43fcbd8a81e30a959bcaad8ae5 | SHA-256 | Snieoatwtregoable.dll | 스테이지 1 - 2단계용 로더 |
2515b546125d20013237aeadec5873e6438ada611347035358059a77a32c54f5 | SHA-256 | ollama.sys | 단계 2 - 프로세스 종료용 드라이버 |
1613a913d0384cbb958e9a8d6b00fffaf77c27d348ebc7886d6c563a6f22f2b7 | SHA-256 | tp.png | 스테이지 2 - 암호화된 핵심 페이로드 |
395f835731d25803a791db984062dd5cfdcade6f95cc5d0f68d359af32f6258d | SHA-256 | 1.bat | 단계 2 - UAC 우회 스크립트 |
1c1528b546aa29be6614707cbe408cb4b46e8ed05bf3fe6b388b9f22a4ee37e2 | SHA-256 | fhq.bat | Stage 2 - AV 프로세스에 대한 네트워킹을 차단하는 스크립트 |
4d5beb8efd4ade583c8ff730609f142550e8ed14c251bae1097c35a756ed39e6 | SHA-256 | 1.dll | 단계 2 - AV 프로세스 종료 |
96f401b80d3319f8285fa2bb7f0d66ca9055d349c044b78c27e339bcfb07cdf0 | SHA-256 | {31351756-3F24-4963-8380-4E7602335AAE}.cip | 단계 2 - WDAC 정책 |
33b494eaaa6d7ed75eec74f8c8c866b6c42f59ca72b8517b3d4752c3313e617c | SHA-256 | goldendays.dll | 단계 3 - 진입 지점 |
fc63f5dfc93f2358f4cba18cbdf99578fff5dac4cdd2de193a21f6041a0e01bc | SHA-256 | trustinstaller.bin | 스테이지 3 - 로더 Enpug.bin |
fd4dd9904549c6655465331921a28330ad2b9ff1c99eb993edf2252001f1d107 | SHA-256 | Enpug.bin | 단계 3 - 최종 페이로드용 로더 |
3dd470e85fe77cd847ca59d1d08ec8ccebe9bd73fd2cf074c29d87ca2fd24e33 | SHA-256 | 6uf9i.exe | 단계 4 - 최종 페이로드 |
qaqkongtiao[.]com | 도메인 이름 | 단계 4 - 최종 페이로드 C2 |
참고 자료
위의 조사에서 참조한 내용은 다음과 같습니다:
- https://nsis.sourceforge.io/Main_Page
- https://learn.microsoft.com/en-us/windows-server/storage/file-server/volume-shadow-copy-service
- https://github.com/Jemmy1228/HookSigntool
- https://www.safebreach.com/blog/process-injection-using-windows-thread-pools/
- https://hijacklibs.net/entries/microsoft/built-in/wow64log.html
- https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_함수
- https://www.zerosalarium.com/2025/08/countering-edrs-with-backing-of-ppl-protection.html
- https://github.com/TwoSevenOneT/EDR-Freeze/blob/ceffd5ea7b813b356c77d469561dbb5ee45aeb24/PPLHelp.cpp#L43
- https://news.sophos.com/en-us/2023/05/03/doubled-dll-sideloading-dragon-breath/
- https://ti.qianxin.com/blog/articles/operation-dragon-breath-%28APT-Q-27%29-차원성 감소-도박 산업에 대한 타격/
- https://github.com/sin5678/gh0st
