서문
Elastic 보안 연구소는 최근 중국어권 지역을 대상으로 하는 새로운 침입 세트를 관찰했으며, 이 침입 세트는 REF3864로 추적되었습니다. 이러한 조직적인 캠페인은 웹 브라우저나 소셜 미디어 메시징 서비스와 같은 합법적인 소프트웨어로 위장하여 피해자를 노립니다. 이러한 캠페인의 배후에 있는 위협 그룹은 Linux, Windows 및 Android와 같은 여러 플랫폼에 멀웨어를 배포하는 데 어느 정도 다재다능한 모습을 보입니다. 이 조사 과정에서 저희 팀은 새브릿지라고 부르는 사용자 지정 로더가 있는 독특한 Windows 감염 체인을 발견했습니다. 이 로더는 GOSAR라고 부르는 QUASAR의 Golang 기반 재구현을 배포합니다. 저희 팀이 Golang 프로그래밍 언어로 QUASAR를 재작성하는 것을 관찰한 것은 이번이 처음입니다.
핵심 사항
- 텔레그램 및 오페라 웹 브라우저와 같은 합법적인 소프트웨어로 위장한 악성 설치 프로그램으로 중국어 사용자를 대상으로 한 지속적인 캠페인이 진행 중입니다.
- 감염 체인은 사용자 지정 로더(SADBRIDGE)를 사용하여 인젝션 및 DLL 사이드 로딩을 사용합니다.
- 새드브릿지는 새로 발견된 Golang(GOSAR)으로 작성된 쿼사 백도어 변종을 배포합니다.
- GOSAR은 현재 개발 중인 다기능 백도어로, 시간이 지남에 따라 불완전한 기능 및 개선된 기능의 반복이 관찰되고 있습니다.
- Elastic Security는 이러한 공격 체인에 대한 포괄적인 예방 및 탐지 기능을 제공합니다.
REF3864 캠페인 개요
11월, Elastic Security Labs 팀은 VirusTotal에 업로드된 여러 가지 샘플을 폭발시킬 때 독특한 감염 체인을 관찰했습니다. 이러한 다양한 샘플은 텔레그램이나 오페라 GX 브라우저와 같은 합법적인 소프트웨어로 가장한 랜딩 페이지를 통해 호스팅되었습니다.
이 조사 과정에서 유사한 기법을 사용하는 여러 감염 사슬을 발견했습니다:
- 탐지율이 낮은 트로이 목마 MSI 설치 프로그램
- 악성 DLL이 번들로 제공되는 합법적인 소프트웨어를 사용하여 가장하기
- 사용자 지정 새드브릿지 로더 배포
- 최종 단계 GOSAR 로드
이러한 캠페인은 여러 단계의 추상화로 인해 눈에 띄지 않게 진행되었다고 생각합니다. 일반적으로 첫 번째 단계는 MSI 설치 프로그램이 포함된 아카이브 파일(ZIP)을 여는 것입니다. Windows x64dbg.exe
디버깅 응용 프로그램과 같은 합법적인 소프트웨어가 악성 패치가 적용된 DLL(x64bridge.dll
)을 로드하는 데 백그라운드에서 사용됩니다. 이 DLL은 새로운 정상 프로그램(MonitoringHost.exe
)을 시작하여 다른 악성 DLL(HealthServiceRuntime.dll
)을 사이드 로드하고, 궁극적으로 인젝션을 수행하며 인젝션을 통해 메모리에 GOSAR 임플란트를 로드합니다.
멀웨어 연구원들은 공격자가 지정한 캠페인 날짜가 표시된 새드브릿지 구성을 추출했으며, 최소 2023년 12월부터 유사한 TTP를 사용하는 작업이 진행 중임을 알 수 있었습니다. GOSAR의 명령 및 제어(C2) 인프라는 종종 신뢰할 수 있는 서비스나 소프트웨어로 위장하여 양성으로 보이고 소프트웨어 설치자에 대한 피해자의 기대에 부합합니다. 실행 체인 전체에서 방화벽 규칙 이름 및 설명과 함께 중국어로 된 360tray.exe
과 같은 중국 AV 제품을 열거하는 데 중점을 두고 있습니다. 이러한 사용자 지정으로 인해 이 위협은 중국어 사용자를 타깃으로 하는 것으로 판단됩니다. 또한 중국어 로깅을 광범위하게 사용한다는 것은 공격자가 중국어 사용자라는 것을 의미합니다.
쿼사는 2017 (퀄리스, 쿼사 RAT의 진화) 이후 국가가 후원하는 스파이 활동, 비국가 핵티비즘, 금전적 동기를 가진 범죄 공격에 사용된 적이 있으며, 중국과 연계된 APT10이 그 예입니다. 골랑으로 다시 작성하면 이 기간 동안 얻은 제도적 지식을 활용하여 이전에 효과적인 TTP에 대한 광범위한 재교육 없이도 추가 기능을 제공할 수 있습니다.
GOSAR는 추가 정보 수집 기능, 다중 OS 지원, 안티바이러스 제품 및 멀웨어 분류기에 대한 향상된 회피 기능으로 QUASAR를 확장합니다. 그러나 일반적인 유인 웹사이트와 추가적인 타깃팅 정보 또는 목적에 대한 행동이 부족하여 공격자의 동기를 파악할 수 있는 증거가 충분하지 않습니다.
새드브릿지 소개
새드브릿지 멀웨어 로더는 MSI 실행 파일로 패키징되어 전달되며 다양한 인젝션 기법과 함께 DLL 사이드 로딩을 사용하여 악성 페이로드를 실행합니다. 새드브릿지는 x64dbg.exe
및 MonitoringHost.exe
과 같은 합법적인 애플리케이션을 악용하여 x64bridge.dll
및 HealthServiceRuntime.dll
과 같은 악성 DLL을 로드하고 후속 단계 및 셸코드로 이어집니다.
지속성은 서비스 생성 및 레지스트리 수정을 통해 달성됩니다. 관리자로의 권한 상승은 ICMLuaUtil
COM 인터페이스를 악용합니다. 또한 새드브릿지는 Windows 작업 스케줄러를 통한 권한 상승 우회 기능을 통합하여 시스템 수준 권한으로 메인 페이로드를 실행합니다.
새드브릿지 구성은 구성 문자열의 각 바이트에서 0x1
을 단순 차감하여 암호화됩니다. 암호화된 단계는 모두 .log
확장자로 추가되며, 런타임 중에 XOR 및 LZNT1 압축 해제 알고리즘을 사용하여 해독됩니다.
새드브릿지는 프로세스 주입을 위해 풀파티, APC 대기열, 토큰 조작 기술을 사용합니다. 샌드박스 분석을 피하기 위해 긴 Sleep
API 호출을 사용합니다. 또 다른 방어 회피 기법으로는 안티맬웨어 검사 인터페이스(AMSI) 및 Windows용 이벤트 추적(ETW)과 같은 Windows 보안 메커니즘을 비활성화하는 API 패치가 있습니다.
다음 심층 분석은 실행 체인을 탐색하도록 구성되어 있으며, 분석된 샘플의 구성을 기반으로 중요한 파일 및 단계의 기능에 대한 단계별 안내를 제공합니다. 이 분석은 최종 페이로드에 도달하는 데 있어 각 구성 요소 간의 상호 작용과 각 구성 요소의 역할을 강조하는 것을 목표로 합니다.
새드브릿지 코드 분석
MSI 분석
초기 파일은 고급 설치 관리자를 사용하여 MSI에 패키징되며, 주요 관심 파일은 x64dbg.exe
및 x64bridge.dll
입니다.
MSI 도구(lessmsi)를 사용하면 aicustact.dll
의 LaunchApp
진입점이 AI_APP_FILE
속성에 지정된 파일 경로를 실행하도록 구성되어 있음을 알 수 있습니다.
이 AI_APP_FILE
속성으로 이동하면 이 구성에 연결된 파일이 x64dbg.exe
임을 알 수 있습니다. 이는 설치가 완료된 후 실행될 파일을 나타내며, 정상적인 NetFxRepairTool.exe
는 실행되지 않습니다.
x64bridge.dll 사이드 로딩
x64dbg.exe
이 실행되면 x64bridge.dll
에서 BridgeInit
내보내기를 호출합니다. BridgeInit
은 BridgeStart
함수의 래퍼입니다.
블리스터에서 관찰된 기법과 유사하게, 새드브릿지는 합법적인 DLL의 내보내기를 패치합니다.
악성코드 초기화 루틴 중에 SADBRIDGE는 호스트 이름과 매직 시드 0x4E67C6A7
를 사용하여 해시를 생성하는 것으로 시작합니다. 이 해시는 암호화된 설정 파일을 저장하기 위한 디렉터리 이름으로 사용됩니다. 암호화된 구성이 C:\Users\Public\Documents\<hostname_hash>\edbtmp.log
에 기록됩니다. 이 파일에는 일반 디렉터리 목록에서 자신을 숨기기 위해 FILE_ATTRIBUE_SYSTEM, FILE_ATTRIBUE_READONLY, FILE_ATTRIBUE_HIDDEN 속성이 포함되어 있습니다.
구성 해독은 간단하며, 암호화된 청크는 널 바이트로 구분됩니다. 암호화된 청크 내의 각 바이트에 대해 0x1
만큼 증가시킬 수 있습니다.
구성은 다음과 같이 구성됩니다:
- 가능한 캠페인 날짜
- 서비스 생성에 사용할 문자열
- MonitoringHost.exe의 새 이름 (
DevQueryBroker.exe
) - MonitoringHost.exe(
HealthServiceRuntime.dll
)에서 사이드로드할 DLL의 DLL 이름입니다. - 추가 단계(
.log
파일)에 대한 절대 경로 - GOSAR 호스팅을 위한 기본 주입 대상(
svchost.exe
)
DevQueryBroker
디렉터리(C:\ProgramData\Microsoft\DeviceSync\Device\Stage\Data\DevQueryBroker\
)에는 런타임에 암호 해독되는 모든 암호화된 단계(.log
파일)가 포함되어 있습니다. 파일(DevQueryBroker.exe
)은 Microsoft 정상 응용 프로그램(MonitoringHost.exe
)의 이름이 변경된 복사본입니다.
마지막으로, 동일한 폴더에 악성 HealthServiceRuntime.dll
을 사이드 로드하는 DevQueryBroker.exe
을 실행하는 프로세스를 만듭니다.
HealthServiceRuntime.dll
이 모듈은 사용자의 %TEMP%
디렉터리에 암호화된 셸코드와 부분적으로 암호 해독된 셸코드를 모두 드롭합니다. 셸 코드의 파일 이름은 다음과 같은 형식을 따릅니다: log<random_string>.tmp
. 그런 다음 부분적으로 해독된 셸 코드의 각 바이트가 0x10
만큼 감소하여 완전히 해독됩니다. 셸코드는 동일한 프로세스의 새 스레드에서 실행됩니다.
이 멀웨어는 SonicWall에서 발표한 연구와 동일한 알고리즘을 사용하여 API 해싱을 활용하며, 해싱 알고리즘은 부록 섹션에 나와 있습니다. 셸코드는 DevQueryBroker.log
를 PE 파일로 복호화한 다음 파일의 첫 번째 1/3에 있는 단일 바이트(0x42)
)로 간단한 XOR 연산을 수행한 다음 LZNT1 알고리즘을 사용하여 결과를 압축 해제합니다.
그런 다음 셸코드는 NtUnmapViewOfSection
을 사용하여 PE 파일의 기본 기본 주소에서 기존 매핑을 모두 해제하여 VirtualAlloc
을 호출하면 기본 기본 주소부터 메모리가 할당되도록 합니다. 마지막으로 해독된 PE 파일을 이 할당된 메모리에 매핑하고 실행을 해당 진입점으로 전송합니다. 새드브릿지가 식별하고 실행하는 모든 셸코드는 복호화 및 실행을 위해 참조하는 특정 .log
파일만 다를 뿐 동일한 코드 구조를 공유합니다.
DevQueryBroker.log
이 악성 코드는 amsi.dll
을(를) 동적으로 로드하여 Windows의 중요한 보안 메커니즘을 비활성화합니다. 반환 값을 0x80070057
, 잘못된 인수를 나타내는 표준화된 Microsoft 오류 코드 E_INVALIDARG
로 수정하고 조기에 반환하는 명령을 삽입하여 amsi.dll
에 AmsiScanBuffer
을 패치하여 검사 로직을 효과적으로 우회합니다. 마찬가지로 AmsiOpenSession
를 패치하여 항상 동일한 오류 코드 E_INVALIDARG
을 반환합니다. 또한 ntdll.dll
에서 EtwEventWrite
을 패치하여 첫 번째 명령을 ret
명령으로 대체하여 Windows용 이벤트 추적(ETW)을 비활성화하여 악의적인 활동의 로깅을 억제합니다.
패치 적용 후 암호화된 셸코드가 경로 (C:\ProgramData\Microsoft\DeviceSync\Device\Stage\Data\DevQueryBroker\temp.ini
)의 temp.ini
에 기록됩니다.
멀웨어는 현재 프로세스 토큰의 그룹 멤버십을 확인하여 권한 수준을 결정합니다. SECURITY_LOCAL_SYSTEM_RID
으로 SID를 초기화하고 CheckTokenMembership
를 호출하여 프로세스가 LocalSystem 계정에 속하는지 확인합니다. 그렇지 않은 경우 SECURITY_BUILTIN_DOMAIN_RID
및 DOMAIN_ALIAS_RID_ADMINS
을 사용하여 SID를 만들고 유사한 토큰 구성원 자격 확인을 수행하여 Administrators 그룹의 구성원 자격을 확인하려고 시도합니다.
현재 프로세스에 로컬 시스템 또는 관리자 권한이 없는 경우 먼저 UAC 우회 메커니즘을 통해 ICMLuaUtil
COM 인터페이스를 활용합니다. 관리자 권한이 있는 CMSTPLUA
개체의 인스턴스를 만들기 위해 "Elevation:Administrator!new:{3E5FC7F9-9A51-4367-9063-A120244FBEC7}"
모니커 문자열을 작성합니다. 개체가 생성되고 ICMLuaUtil
인터페이스가 획득되면 악성 코드는 노출된 인터페이스의 ShellExec
메서드를 사용하여 DevQueryBroker.exe
을 실행합니다.
작업 또는 서비스가 DevQueryBroker.exe
을 정기적으로 실행하도록 만들어지지 않은 경우 악성 코드는 바이러스 백신 프로세스 360tray.exe
이 실행 중인지 확인합니다. 실행 중이 아닌 경우 다음 속성을 가진 SYSTEM으로 권한 에스컬레이션을 위한 서비스가 만들어집니다:
- 서비스 이름: DevQueryBrokerService
바이너리 경로 이름: "C:\ProgramData\Microsoft\DeviceSync\Device\Stage\Data\DevQueryBroker\DevQueryBroker.exe -svc". - 표시 이름: DevQuery 백그라운드 검색 브로커 서비스
- 설명: 앱이 백그라운드 작업이 있는 디바이스를 검색할 수 있도록 합니다.
- 시작 유형: 시스템 부팅 시 자동
- 권한: 로컬 시스템
360tray.exe
이 실행 중인 것이 탐지되면 악성 코드는 암호화된 PE 파일을 DevQueryBrokerService.log
에 쓴 다음 다음 단계 PE 파일(1단계)을 현재 프로세스 메모리에 매핑하여 실행을 이 파일로 전송합니다.
DevQueryBroker.exe
이 시스템 수준 권한으로 다시 트리거되어 체인의 이 부분에 도달하면 악성 코드는 Windows 버전을 확인합니다. Vista 이상(Windows 7 제외)을 실행하는 시스템의 경우 다른 다음 단계(2단계)를 메모리에 매핑하여 실행을 전송합니다.
그러나 Windows 7에서는 DevQueryBrokerPre.log
파일을 해독하고 실행하는 셸코드를 실행합니다.
Stage 1 Injection (explorer.exe)
새드브릿지는 풀파티 변종 7을 사용하여 스레드 풀의 I/O 완료 대기열을 대상으로 explorer.exe
에 셸코드를 주입합니다. 먼저 대상 프로세스의 I/O 완료 대기열에 핸들을 복제합니다. 그런 다음 explorer.exe
내에 메모리를 할당하여 셸 코드를 저장합니다. 셸 코드의 기본 주소를 콜백 주소로 포함하여 만들어진 TP_DIRECT
구조를 저장하기 위해 추가 메모리가 할당됩니다. 마지막으로 ZwSetIoCompletion
를 호출하여 TP_DIRECT
구조에 대한 포인터를 전달하여 대상 프로세스의 워커 팩토리(워커 스레드 관리자)의 I/O 완료 큐에 패킷을 큐에 대기시켜 주입된 셸코드의 실행을 효과적으로 트리거합니다.
이 셸코드는 DevQueryBrokerService.log
파일을 해독하고 기본 기본 주소를 차지하는 메모리 영역의 매핑을 해제하고 PE 파일을 해당 주소에 매핑한 다음 진입점을 실행합니다. 이 동작은 이전에 관찰된 셸코드를 반영합니다.
Stage 2 Injection (spoolsv.exe/lsass.exe)
2단계에서는 1단계와 동일한 주입 기법을 사용하여 새드브릿지가 spoolsv.exe
(spoolsv.exe
를 사용할 수 없는 경우 lsass.exe
)에 셸코드를 주입합니다. 셸코드는 이전 단계와 유사한 동작을 보입니다. DevQueryBrokerPre.log
을 PE 파일로 복호화하고, 기본 주소를 차지하는 모든 영역을 매핑 해제하고, PE 파일을 매핑한 다음, 실행을 진입 지점으로 전송합니다.
DevQueryBrokerService.log
이전 섹션에서 설명한 대로 DevQueryBrokerService.log
에서 해독된 셸코드는 Windows 작업 스케줄러를 사용하여 권한 상승 기술을 활용합니다. 새드브릿지는 IElevatedFactorySever
COM 개체를 사용하여 예약된 작업을 간접적으로 생성합니다. 이 작업은 작업 이름 DevQueryBrokerService
를 사용하여 시스템 수준 권한으로 매일 DevQueryBroker.exe
을 실행하도록 구성되어 있습니다.
이 악성 코드는 흔적을 감추기 위해 프로세스 환경 블록(PEB)을 직접 수정하여 이미지 경로와 명령줄을 스푸핑하여 COM 서비스가 explorer.exe
에서 온 것으로 위장하려고 시도할 수 있습니다.
DevQueryBrokerPre.log
새드브릿지는 레지스트리 하위 키 SYSTEM\CurrentControlSet\Services\DevQueryBrokerServiceSvc
아래에 DevQueryBrokerServiceSvc
이라는 서비스를 다음과 같은 속성으로 만듭니다:
- 설명: 앱이 백그라운드 작업이 있는 디바이스를 검색할 수 있도록 합니다.
- 표시 이름: DevQuery 백그라운드 검색 브로커 서비스
- 오류 제어: 1
- 이미지 경로:
%systemRoot%\system32\svchost.exe -k netsvcs
- ObjectName: LocalSystem
- 시작: 2 (자동 시작)
- 유형: 16.
- 실패 조치:
- 24 시간마다 실패 횟수를 초기화합니다.
- 세 번의 재시작 시도(첫 번째는 20밀리초 지연, 두 번째와 세 번째는 1분 지연)를 실행합니다.
서비스 매개 변수는 C:\Program Files (x86)\Common Files\Microsoft Shared\Stationery\<hostname_hash>\DevQueryBrokerService.dll
에 위치한 ServiceDll
을 지정합니다. DLL 파일이 존재하지 않으면 바로 디스크에 삭제됩니다.
DevQueryBrokerService.dll
는 실행 체인의 초기 단계에서 볼 수 있는 HealthServiceRuntime.dll
와 유사한 코드 구조를 가지고 있습니다. DevQueryBroker.log
의 암호를 해독하고 실행하는 역할을 담당합니다. ServiceDll
는 서비스가 시작될 때 svchost.exe
에 의해 로드되고 실행됩니다.
또한 SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost\netsvcs
키를 DevQueryBrokerServiceSvc
에 대한 항목을 포함하도록 수정하여 새로 만든 서비스를 netsvcs
서비스 호스트 그룹에서 관리하는 서비스 그룹에 통합합니다.
그런 다음 새드브릿지는 레지스트리 하위 키 SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Schedule\\TaskCache\\Tree\\DevQueryBrokerService
및 SYSTEM\\CurrentControlSet\\Services\\DevQueryBrokerService
을 제거하여 이전에 만든 예약된 작업 및 서비스를 삭제합니다.
마지막으로 새 지속성 메커니즘이 적용되었으므로 C:\ProgramData\Microsoft\DeviceSync\Device\Stage\Data\DevQueryBroker
폴더의 DevQueryBroker.exe
및 HealthServiceRuntime.dll
파일을 제거합니다.
GOSAR 주입
코드 후반부에서 SADBRIDGE는 WTSEnumerateSessionsA
API를 사용하여 로컬 컴퓨터의 모든 활성 세션을 열거합니다.
세션이 발견되면 각 세션을 반복합니다:
- 각 세션에 대해
WTSQuerySessionInformationA
을 사용하여 사용자 이름(WTSUserName
)을 검색하려고 시도합니다. 쿼리가 실패하면 다음 세션으로 이동합니다. WTSUserName
이 비어 있지 않으면 코드가svchost.exe
을 대상으로 하여 경로, 세션 ID 및 로더 구성의 내용을 최종 단계를 삽입하는 하위 루틴에 전달합니다.WTSUserName
이 비어 있지만 세션의WinStationName
이"Services"
(서비스 세션을 나타냄)인 경우 대신dllhost.exe
을 대상으로 하여 최종 단계 주입 하위 루틴에 동일한 매개 변수를 전달합니다.
세션을 찾을 수 없으면 무한 루프에 들어가 세션을 반복적으로 열거하고 최종 단계 주입을 위한 서브루틴을 호출하는 동시에 중복 주입을 방지하기 위한 검사를 수행합니다.
로그인한 세션은 svchost.exe
을 대상으로 하고, 로그인한 사용자가 없는 서비스 세션 또는 세션은 dllhost.exe
을 대상으로 합니다.
세션 ID를 사용할 수 있는 경우 코드는 해당 세션의 사용자 토큰을 복제하고 복제된 토큰의 무결성 수준을 S-1-16-12288
(시스템 무결성)으로 올리려고 시도합니다. 그런 다음 상승된 토큰을 사용하여 CreateProcessAsUserA
을 통해 하위 프로세스(svchost.exe
또는 dllhost.exe
)를 만듭니다.
토큰 조작에 실패하거나 세션 ID를 사용할 수 없는 경우(시스템 프로세스는 세션 ID가 0일 수 있음) CreateProcessA
을 사용하여 토큰 없이 프로세스를 만드는 것으로 되돌아갑니다.
암호화된 셸코드 C:\ProgramData\Microsoft\DeviceSync\Device\Stage\Data\DevQueryBroker\temp.ini
은 이전에 .log
파일을 해독할 때와 동일한 XOR 및 LZNT1 압축 해제 기술을 사용하여 해독되며, APC 주입을 사용하여 새로 만든 프로세스의 스레드에서 실행할 셸코드를 대기열에 넣습니다.
마지막으로 삽입된 셸코드는 DevQueryBrokerCore.log
을 GOSAR로 복호화하여 새로 생성된 프로세스의 메모리에서 실행합니다.
GOSAR 소개
GOSAR는 Windows 및 Linux 시스템을 대상으로 발견되는 다기능 원격 액세스 트로이 목마입니다. 이 백도어에는 시스템 정보 검색, 스크린샷 찍기, 명령 실행, 키 로깅 등의 기능이 포함되어 있습니다. GOSAR 백도어는 QUASAR의 핵심 기능과 동작의 대부분을 유지하면서 원래 버전과 차별화되는 몇 가지 수정 사항을 통합했습니다.
멀웨어를 Go와 같은 최신 언어로 재작성하면 많은 안티바이러스 솔루션과 멀웨어 분류기가 이러한 새로운 프로그래밍 구조에서 악성 문자열/특성을 식별하는 데 어려움을 겪기 때문에 탐지율을 낮출 수 있습니다. 아래는 업로드 시 5 개의 탐지만 수신하는 압축 해제된 GOSAR의 좋은 예시입니다.
특히 이 변형은 Linux 시스템용 ELF 바이너리와 Windows용 기존 PE 파일 등 여러 플랫폼을 지원합니다. 이러한 크로스 플랫폼 기능은 Go의 적응성과 맞물려 원래의 .NET 기반 QUASAR보다 더 다양한 용도로 사용할 수 있습니다. 다음 섹션에서는 오픈 소스 버전(QUASAR)과 비교하여 GOSAR의 코드 구조, 새로운 기능 및 추가 사항을 중점적으로 살펴보겠습니다.
GOSAR 코드 분석 개요
GOSAR의 코드 구조
바이너리가 모든 심볼을 유지했기 때문에 버전 샘플에서 추출한 소스 코드 구조를 재구성할 수 있었습니다. 0.12.01
- vibrant/config: 멀웨어의 구성 파일을 포함합니다.
- 생생한/프로토: 모든 Google 프로토콜 버퍼(프로토) 선언이 들어 있습니다.
- 생생한/네트워크: 메인 연결 루프, 프록시 처리, 방화벽 구성 및 수신기 설정 스레드 등 네트워킹과 관련된 기능을 포함합니다.
- 진동/메시지/리졸버: 멀웨어가 처리하는 명령을 정의합니다. 이러한 명령은
vibrant_msgs_init*
함수 내의 개체에 할당됩니다. - VIBRANT/MSGS/SERVICES: 키로거, 클립보드 로거와 같은 서비스 실행과 같은 새로운 기능을 도입하며, 이러한 서비스는
vibrant_network._ptr_Connection.Start
함수에서 시작됩니다. - 생생한/로그: 멀웨어의 실행 로깅을 담당합니다. 로그는 구성에 저장된 AES 키로 암호화됩니다. 멀웨어는 AES를 사용하여 로그를 청크 단위로 복호화합니다.
- vibrant/pkg/helpers: 다양한 멀웨어 명령과 서비스에서 사용되는 도우미 기능을 포함합니다.
- vibrant/pkg/screenshot: 감염된 시스템에서 스크린샷 캡처 기능을 처리합니다.
- vibrant/pkg/utils: 임의의 값을 생성하는 등의 유틸리티 함수를 포함합니다.
- vibrant/pkg/native: Windows API(WINAPI) 함수 호출을 위한 함수를 제공합니다.
GOSAR에 새롭게 추가된 기능
커뮤니케이션 및 정보 수집
이 새로운 변형은 계속해서 원본과 동일한 통신 방식인 TCP TLS를 기반으로 합니다. 연결되면 먼저 4 개의 새 필드가 추가된 시스템 정보를 C2로 전송합니다:
- IP 주소
- 안티바이러스
- 클립보드 설정
- 지갑
바이러스 백신 및 디지털 지갑 목록은 vibrant_pkg_helpers_init
함수에서 초기화되며 이 문서의 하단에서 확인할 수 있습니다.
서비스
이 악성 코드는 클라이언트가 C2에 처음 연결하는 동안 시작되는 3 개의 서비스를 처리합니다:
- vibrant_services_KeyLogger
- vibrant_services_ClipboardLogger
- vibrant_services_TickWriteFile
KeyLogger
GOSAR의 키 로깅 기능은 vibrant_services_KeyLogger
함수에 구현되어 있습니다. 이 기능은 Windows API를 사용하여 감염된 시스템의 키 입력을 가로채고 기록하기 위해 WH_KEYBOARD_LL
매개변수와 함께 SetWindowsHookEx
로 전역 Windows 훅을 설정하여 낮은 수준의 키보드 이벤트를 모니터링합니다. 후크 함수의 이름은 vibrant_services_KeyLogger_func1
입니다.
ClipboardLogger
클립보드 로깅 기능은 간단하며 Windows API에 의존합니다. 먼저 IsClipboardFormatAvailable
을 사용하여 클립보드 데이터의 사용 가능 여부를 확인한 다음 GetClipboardData
을 사용하여 데이터를 검색합니다. API를 사용하여 검색합니다.
TickWriteFile
ClipboardLogger
및 KeyLogger
서비스 모두 TickWriteFile
에서 현재 날짜의 파일(예: 2024-11-27
) 아래에 있는 디렉터리(C:\ProgramData\Microsoft\Windows\Start Menu\Programs\diagnostics
)에 주기적으로 기록하는 데이터를 수집합니다.
먼저 값 0x1f
을 뺀 다음 사이버셰프 레시피에 표시된 대로 값 0x18
을 곱하면 해독할 수 있습니다.
네트워킹 설정
서비스를 초기화한 후 멀웨어는 네트워킹 설정 전용 스레드 세 개를 생성합니다.
- vibrant_network_ConfigFirewallRule
- vibrant_network_ConfigHosts
- vibrant_network_ConfigAutoListener
구성 방화벽 규칙
이 악성 코드는 Distributed Transaction Coordinator (LAN)
로 번역된 중국어 이름으로 포트 범위 51756-51776
에 대한 인바운드 방화벽 규칙을 생성하여 설명이 Inbound rules for the core transaction manager of the Distributed Transaction Coordinator service are managed remotely through RPC/TCP.
로 설정된 모든 프로그램과 IP 주소의 인바운드를 허용합니다.
구성 호스트
이 함수는 c:\Windows\System32\Drivers\etc\hosts
에 다음 127.0.0.1 micrornetworks.com
항목을 추가합니다. 이 항목을 추가한 이유는 명확하지 않지만 현재 멀웨어의 개발 단계에서 누락된 기능이나 불완전한 기능 때문일 수 있습니다.
ConfigAutoListener
이 악성 코드의 기능은 이전에 방화벽 규칙에 의해 허용되었던 51756-51776
범위 내에서 사용 가능한 첫 번째 포트에서 HTTP 서버 리스너를 실행합니다. 흥미롭게도 서버는 어떠한 명령도 처리하지 않으며, 이는 멀웨어가 아직 개발 중이라는 것을 증명합니다. 현재 버전에서는 GET
요청을 /security.js
URI로만 처리하여 callback();
문자열로 응답하고, 다른 요청은 404 오류 코드를 반환합니다. 이 최소한의 응답은 서버가 플레이스홀더이거나 초기 개발 단계의 일부이며 나중에 더 복잡한 기능이 추가될 가능성이 있음을 나타낼 수 있습니다.
로그
이 악성 코드는 디렉터리에 실행 로그를 저장합니다: %APPDATA%\Roaming\Microsoft\Logs
디렉터리에 형식이 지정된 파일 이름 아래에 저장합니다: windows-update-log-<YearMonthDay>.log
.
각 로그 항목은 HMAC-AES 알고리즘으로 암호화되며, 키는 vibrant_config
함수에 하드코딩되어 있으며 다음은 그 예입니다:
공격자는 ResolveGetRunLogs
명령을 실행하여 멀웨어의 런타임 로그를 원격으로 검색할 수 있습니다.
Plugins
이 멀웨어는 플러그인을 실행할 수 있는 기능을 가지고 있는데, 플러그인은 C2에서 다운로드되어 XOR 알고리즘으로 암호화된 디스크에 저장된 PE 파일입니다. 이 플러그인은 경로에 저장됩니다: C:\ProgramData\policy-err.log
. 플러그인을 실행하려면 ResolveDoExecutePlugin
명령이 호출되며, 먼저 플러그인을 사용할 수 있는지 확인합니다.
그런 다음 plugins.dll
이라는 바이너리에 base64 형식으로 저장된 네이티브 DLL을 반사적으로 로드하고 내보내기 함수 ExecPlugin
을 실행합니다.
ExecPlugin
인자 /package
을 사용하여 C:\Windows\System32\msiexec.exe
의 일시 중단된 프로세스를 생성합니다. /quiet
. 그런 다음 프로세스의 메인 스레드에 비동기 프로시저 호출 (APC)을 큐에 대기시킵니다. 스레드가 재개되면 대기열에 대기 중인 셸코드가 실행됩니다.
셸코드는 C:\ProgramData\policy-err.log
에 저장된 암호화된 플러그인을 읽고 하드코딩된 1바이트 XOR 키를 사용하여 해독한 다음 반사적으로 로드 및 실행합니다.
HVNC
이 악성코드는 기존 소켓을 통해 숨겨진 VNC(HVNC)를 지원하며, 5 명령을 노출합니다.
- ResolveHVNCCommand
- ResolveGetHVNCScreen
- ResolveStopHVNC
- ResolveDoHVNCKeyboardEvent
- ResolveDoHVNCMouseEvent
실행되는 첫 번째 명령은 ResolveGetHVNCScreen
으로, 먼저 초기화하고 뷰를 설정하며, base64 형식의 내장된 기본 DLL HiddenDesktop.dll
을 사용하고, DLL이 메모리에 반사적으로 로드되어 실행됩니다.
이 DLL은 총 7 개의 내보낸 함수로 HVNC를 설정하기 위한 저수준 API를 실행하는 역할을 담당합니다:
- 엑스큐트 커맨드
- DoMouseScroll
- DoMouseRightClick
- DoMouseMove
- DoMouseLeftClick
- DoKeyPress
- 화면 캡처
처음 호출된 내보내기 함수는 Initialise
으로 데스크톱을 초기화하기 위해 CreateDesktopA
입니다. API로 데스크톱을 초기화합니다. 이 HVNC 구현은 ExcuteCommand
내보내기에서 찾을 수 있는 총 17 개의 명령을 처리하며, 이름에 오타가 있는 것처럼 명령 ID는 ExcuteCommand
을 호출하는 악성 코드의 명령 ResolveHVNCCommand
에서 전달됩니다.
명령 ID | 설명 |
---|---|
0x401 | 이 기능은 먼저 Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced 에서 TaskbarGlomLevel 레지스트리 키를 2 로 설정하여 작업 표시줄 단추 그룹화를 비활성화합니다. 그런 다음 ABM_SETSTATE 명령과 함께 SHAppBarMessage 을 사용하여 상태를 ABS_ALWAYSONTOP 로 설정하여 작업 표시줄이 항상 상단에 표시되도록 합니다. |
0x402 | shell32.dll .C:\Windows\system32\rundll32.exe shell32.dll,#61 의 61번째 내보내기 함수를 실행하여 실행 대화 상자를 생성합니다. |
0x403 | 의 인스턴스를 실행합니다. powershell.exe |
0x404 | 에 저장된 PE 파일을 실행합니다. C:\\ProgramData\\shell.log |
0x405 | 의 인스턴스를 실행합니다. chrome.exe |
0x406 | 의 인스턴스를 실행합니다. msedge.exe |
0x407 | 의 인스턴스를 실행합니다. firefox.exe |
0x408 | 의 인스턴스를 실행합니다. iexplore.exe |
0x409 | 의 인스턴스를 실행합니다. 360se.exe |
0x40A | 360ChromeX.exe 의 인스턴스를 실행합니다. |
0x40B | 의 인스턴스를 실행합니다. SogouExplorer.exe |
0x40C | 현재 창 닫기 |
0x40D | 지정된 창을 최소화합니다. |
0x40E | 창을 활성화하고 최대화된 창으로 표시합니다. |
0x40F | 창 프로세스를 종료합니다. |
0x410 | 클립보드 설정 |
0x411 | 클립보드 지우기 |
스크린샷
이 악성 코드는 Capture.dll
이라는 이름의 Base64 형식에 포함된 세 번째이자 마지막 PE DLL을 반사적으로 로드하며, 5 내보내기 함수를 가지고 있습니다:
- 첫 화면 캡처
- 다음 화면 캡처
- GetBitmapInfo
- GetBitmapInfoSize
- SetQuality
라이브러리는 먼저 CreateCompatibleDC
, CreateCompatibleBitmap
, CreateDIBSection
과 같은 일반적인 Windows API를 사용하여 화면 캡처 구조를 설정하는 DllEntryPoint
을 반사적으로 로드하고 실행하는 resolvers_ResolveGetBitmapInfo
을 호출하여 초기화됩니다. 2 내보내기 함수 CaptureFirstScreen
및 CaptureNextScreen
은 피해자의 데스크톱 스크린샷을 JPEG 이미지로 캡처하는 데 사용됩니다.
관찰
흥미롭게도 기존 .NET QUASAR 서버는 동일한 통신 프로토콜을 유지하므로 GOSAR 샘플의 비콘을 수신하는 데 여전히 사용할 수 있습니다. 그러나 이를 운영적으로 사용하려면 GOSAR 기능을 지원하기 위해 상당한 수정이 필요합니다.
작성자가 오픈 소스 .NET QUASAR 서버를 업데이트 또는 확장했는지, 아니면 완전히 새로운 서버를 개발했는지는 확실하지 않습니다. 원래 구현과 일관되게 기본 수신 포트인 1080을 유지했다는 점을 언급할 가치가 있습니다.
새로운 기능
다음 표에는 새로 추가된 모든 명령어에 대한 설명이 나와 있습니다:
새로운 명령 | |
---|---|
ResolveDoRoboCopy | RoboCopy 명령을 실행하여 파일을 복사합니다. |
ResolveDoCompressFiles | zip 형식으로 파일 압축 |
ResolveDoExtractFile | zip 파일 추출 |
ResolveDoCopyFiles | 감염된 컴퓨터의 디렉토리 또는 파일을 복사합니다. |
ResolveGetRunLogs | 사용 가능한 로그 가져오기 |
ResolveHVNCCommand | HVNC 명령 실행 |
ResolveGetHVNCScreen | HVNC 시작 |
ResolveStopHVNC | HVNC 세션 중지 |
ResolveDoHVNCKeyboardEvent | 키보드 이벤트를 HVNC로 보내기 |
ResolveDoHVNCMouseEvent | 마우스 이벤트를 HVNC로 보내기 |
ResolveDoExecutePlugin | 플러그인 실행 |
ResolveGetProcesses | 실행 중인 프로세스 목록 가져오기 |
ResolveDoProcessStart | 프로세스 시작 |
ResolveDoProcessEnd | 프로세스 종료 |
ResolveGetBitmapInfo | 현재 화면의 표시 설정에 대한 비트맵정보 구조를 검색합니다. |
ResolveGetMonitors | 피해자의 디스플레이 모니터를 EnumDisplayMonitors 로 열거합니다. API |
ResolveGetDesktop | 시작 화면 캡처 기능 |
ResolveStopGetDesktop | 화면 캡처 기능 중지 |
ResolveNewShellExecute | 스폰된 cmd.exe 프로세스에 대한 파이프를 열고 명령을 보냅니다. |
ResolveGetSchTasks | 다음 명령을 실행하여 예약된 작업을 가져옵니다. schtasks /query /fo list /v |
ResolveGetScreen샷 | 피해자의 데스크톱 스크린샷을 캡처합니다. |
ResolveGetServices | WMI 쿼리를 사용하여 서비스 목록을 가져옵니다: select * from Win32_Service |
ResolveDoServiceOperation | 서비스 시작 또는 중지 |
ResolveDoDisableMultiLogon | 키 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TerminalServer 아래에서 fSingleSessionPerUser 값을 1 로 설정하여 사용자별 다중 세션을 비활성화합니다. |
ResolveDoRestoreNLA | 원격 데스크톱 프로토콜(RDP)에 대한 보안 설정을 복원하여 NLA( 네트워크 수준 인증 )를 활성화하고 보안 통신을 위해 SSL/TLS 암호화를 적용합니다. |
ResolveGetRemoteClientInformation | 활성화된 모든 로컬 사용자 목록, RDP 포트, LAN IP 및 OS 관련 정보를 가져옵니다: 레지스트리 키 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion 에서 추출한 디스플레이 버전, 시스템 루트 및 현재 빌드 번호 |
ResolveDoInstallWrapper | 숨겨진 원격 데스크톱 프로토콜(HRDP) 설정하기 |
ResolveDoUninstallWrapper | HRDP제거 |
ResolveDoRecoverPrivileges | HRDP를 설치하는 동안 변경되기 전의 원래 HKEY_LOCAL_MACHINE\\SAM\\SAM 레지스트리를 복원합니다. |
ResolveGetRemoteSessions | 컴퓨터의 RDP 세션에 대한 정보를 검색합니다. |
ResolveDoLogoffSession | WTSLogoffSession **API를 사용한 로그오프 RDP 세션 |
ResolveGetSystemInfo | 시스템 정보 얻기 |
ResolveGetConnections | 머신의 모든 연결 가져오기 |
ResolveDoCloseConnection | 구현되지 않음 |
멀웨어 및 MITRE ATT&CK
Elastic은 위협이 엔터프라이즈 네트워크에 대해 사용하는 일반적인 전술, 기술 및 절차를 문서화하기 위해 MITRE ATT& CK 프레임워크를 사용합니다.
전술
전술은 기술 또는 하위 기술의 이유를 나타냅니다. 이는 적의 전술적 목표, 즉 행동을 수행하는 이유입니다.
기술
기술은 공격자가 행동을 수행하여 전술적 목표를 달성하는 방법을 나타냅니다.
- 하이재킹 실행 흐름: DLL 사이드 로딩
- 입력 캡처: 키 로깅
- 프로세스 주입: 비동기 프로시저 호출
- 프로세스 검색
- 아티팩트 숨기기: 숨겨진 창
- 시스템 프로세스 생성 또는 수정 Windows 서비스
- 비표준 포트
- 고도 제어 메커니즘 남용: 사용자 계정 제어 우회
- 난독화된 파일 또는 정보
- 방어력 약화: 도구 비활성화 또는 수정
- 가상화/샌드박스 회피: 시간 기반 회피
REF3864 완화
탐지
- PowerShell을 통한 잠재적 안티맬웨어 검사 인터페이스 우회 가능성
- 비정상적인 인쇄 스풀러 하위 프로세스
- 비정상적인 디렉터리에서 실행 - 명령줄
- 브라우저 이외의 프로세스에서 외부 IP 조회
- 비정상적인 부모-자식 관계
- DllHost를 통한 비정상적인 네트워크 연결
- 서비스 레지스트리를 통한 비정상적인 지속성
- 상위 프로세스 PID 스푸핑
예방
- 비정상적인 인수가 있는 프로세스를 통한 네트워크 연결
- SVCHOST로 마스커레이딩할 가능성
- 백업되지 않은 의심스러운 메모리에서 로드된 네트워크 모듈
- ICMLuaUtil Elevated COM 인터페이스를 통한 UAC 우회
- 스푸핑된 생성 시간에 따른 잠재적 이미지 로드 시간
YARA
Elastic Security는 이 활동을 식별하기 위해 YARA 규칙을 만들었습니다.
관찰
이 연구에서는 다음과 같은 관찰 가능성에 대해 논의했습니다:
관측 가능합니다. | 유형 | 이름 | 참조 |
---|---|---|---|
opera-x[.]net | 도메인 이름 | 랜딩 페이지 | |
teledown-cn[.]com | 도메인 이름 | 랜딩 페이지 | |
15af8c34e25268b79022d3434aa4b823ad9d34f3efc6a8124ecf0276700ecc39 | SHA-256 | NetFxRepairTools.msi | MSI |
accd651f58dd3f7eaaa06df051e4c09d2edac67bb046a2dcb262aa6db4291de7 | SHA-256 | x64bridge.dll | 새드브릿지 |
7964a9f1732911e9e9b9e05cd7e997b0e4e2e14709490a1b657673011bc54210 | SHA-256 | GOSAR | |
ferp.googledns[.]io | 도메인 이름 | GOSAR C2 서버 | |
hk-dns.secssl[.]com | 도메인 이름 | GOSAR C2 서버 | |
hk-dns.winsiked[.]com | 도메인 이름 | GOSAR C2 서버 | |
hk-dns.wkossclsaleklddeff[.]is | 도메인 이름 | GOSAR C2 서버 | |
hk-dns.wkossclsaleklddeff[.]io | 도메인 이름 | GOSAR C2 서버 |
참고 자료
위의 조사에서 참조한 내용은 다음과 같습니다:
- https://zcgonvh.com/post/Advanced_Windows_Task_Scheduler_Playbook-Part.2_from_COM_to_UAC_bypass_and_get_SYSTEM_dirtectly.html
- https://www.sonicwall.com/blog/project-androm-backdoor-trojan
- https://www.safebreach.com/blog/process-injection-using-windows-thread-pools/
- https://gist.github.com/api0cradle/d4aaef39db0d845627d819b2b6b30512
부록
해싱 알고리즘(새드브릿지)
def ror(x, n, max_bits=32) -> int:
"""Rotate right within a max bit limit, default 32-bit."""
n %= max_bits
return ((x >> n) | (x << (max_bits - n))) & (2**max_bits - 1)
def ror_13(data) -> int:
data = data.encode('ascii')
hash_value = 0
for byte in data:
hash_value = ror(hash_value, 13)
if byte >= 0x61:
byte -= 32 # Convert to uppercase
hash_value = (hash_value + byte) & 0xFFFFFFFF
return hash_value
def generate_hash(data, dll) -> int:
dll_hash = ror_13(dll)
result = (dll_hash + ror_13(data)) & 0xFFFFFFFF
return hex(result)
GOSAR에서 확인된 AV 제품
360sd.exe | kswebshield.exe |
---|---|
360tray.exe | kvmonxp.exe |
a2guard.exe | kxetray.exe |
ad-watch.exe | mcshield.exe |
arcatasksservice.exe | mcshield.exe |
ashdisp.exe | miner.exe |
avcenter.exe | mongoosagui.exe |
avg.exe | mpmon.exe |
avgaurd.exe | msmpeng.exe |
avgwdsvc.exe | mssecess.exe |
avk.exe | nspupsvc.exe |
avp.exe | ntrtscan.exe |
avp.exe | patray.exe |
avwatchservice.exe | pccntmon.exe |
ayagent.aye | psafesystray.exe |
baidusdsvc.exe | qqpcrtp.exe |
bkavservice.exe | quhlpsvc.EXE |
ccapp.exe | ravmond.exe |
ccSetMgr.exe | remupd.exe |
ccsvchst.exe | rfwmain.exe |
cksoftshiedantivirus4.exe | rtvscan.exe |
cleaner8.exe | safedog.exe |
cmctrayicon.exe | savprogress.exe |
coranticontrolcenter32.exe | sbamsvc.exe |
cpf.exe | spidernt.exe |
egui.exe | spywareterminatorshield.exe |
f-prot.EXE | tmbmsrv.exe |
f-prot.exe | unthreat.exe |
f-secure.exe | usysdiag.exe |
fortitray.exe | v3svc.exe |
hipstray.exe | vba32lder.exe |
iptray.exe | vsmon.exe |
k7tsecurity.exe | vsserv.exe |
knsdtray.exe | wsctrl.exe |
kpfwtray.exe | yunsuo_agent_daemon.exe |
ksafe.exe | yunsuo_agent_service.exe |