Blog

3CX 소프트웨어 공급망 침해 사건의 배후 - 북한의 위협 행위자!

Jeff Johnson, Fred Plan, Adrian Sanchez, Renato Fontana, Jake Nicastro, Dimiter Andonov, Marius Fodoreanu, Daniel Scott
Apr 20, 2023
17 min read
|   Last updated: Jul 27, 2023
Supply Chain
Malware
North Korea

맨디언트는 2023년 3월에 3CX 데스크톱 앱(3CX Desktop App)에 영향을 끼치는 소프트웨어 공급망 침해 사고에 대응하였습니다. 이 과정에서 맨디언트는 초기 침해가 금융 관련 솔루션을 제공하는 회사인 트레이딩 테크놀로지스(Trading Technologies)의 웹 사이트에서 다운로드한 맬웨어를 통해 이루어졌다는 사실을 확인했습니다. 이 경우처럼 소프트웨어 공급망 공격이 또 다른 소프트웨어 공급망 공격으로 이어지는 것은 맨디언트도 처음 목격한 방식입니다.

개요

3CX 데스크톱 앱은 채팅, 영상 통화, 음성 통화 등의 기능을 제공하는 기업용 커뮤니케이션 소프트웨어입니다. 2023년 3월 말에 일어난 소프트웨어 공급망 침해 사건으로 합법적으로 다운로드할 수 있는 3CX 데스크톱 앱을 통해 맬웨어가 확산되었습니다. 당시 18.12.416 이전 버전의 3CX 데스크톱 앱이 소프트웨어 공급망 침해의 영향을 받았습니다. 이들 버전의 소프트웨어에는 다운로더인 SUDDENICON을 실행하는 맬웨어가 포함되어 있었습니다. 이 맬웨어는 깃허브(GitHub)에서 호스팅되는 암호화된 아이콘 파일을 통해 추가 C2(Command & Control) 서버와 연결합니다. 이 C2 서버는 타인이 만든 디자인, 로고 등을 무단으로 복제하거나 도용하는 데 사용하는 저작권 침해 도구인 ICONICSTEALER를 다운로드하는 데 활용되었습니다. 맨디언트는 이 활동을 북한의 넥서스 클러스터(nexus cluster)의 활동으로 의심하고 있으며 UNC4736으로 명명해 추적하고 있습니다.

3CX software supply chain compromise linked to Trading Technologies software supply chain compromise
그림 1: Trading Technologies 소프트웨어 공급망 손상과 관련된 3CX 소프트웨어 공급망 손상

소프트웨어 공급망 취약점

맨디언트는 3CX 소프트웨어 공급망 침해 조사를 통해 초기 침입 경로를 찾았습니다. 초기 침해는 트레이딩 테크놀로지스에서 제공하는 소프트웨어인 X_TRADER에서 시작되었습니다(그림 1). 이 소프트웨어에는 변조된 설치 프로그램이 포함되어 있었습니다. 맨디언트는 복잡한 로딩 프로세스를 통해 여러 단계로 공격 모듈들을 순차적으로 실행하는 백도어인 VEILEDSIGNAL와 공격 모듈들이 배포된 것을 확인했습니다.

VEILEDSIGNAL 백도어 분석

맨디언트는 여러 단계에 걸쳐 모듈을 실행하는 백도어인 VEILEDSIGNAL을 배포하는 X_TRADER_r7.17.90p608.exe(MD5: ef4ab22e565684424b4142b1294f1f4d)라는 파일명을 가진 설치 프로그램을 확인했습니다.

X_TRADER 플랫폼은 2020년에 단종되었습니다. 하지만 2022년에도 트레이딩 테크놀로지스의 웹 사이트를 통해 다운로드받을 수 있었습니다. 이 파일은 'Trading Technologies International, Inc'라는 제목으로 서명되었으면 동일한 디지털 인증서로 서명된 실행 파일인 Setup.exe를 포함하고 있었습니다. 참고로 디지털 서명에 사용된 인증서는 2022년 10월 만료되도록 설정되어 있었습니다.

설치 파일에는 트로이 목마 DLL 두 개와 정상 실행 파일 하나를 드롭하는 Setup.exe가 포함되어 있습니다. Setup.exe는 정상 실행 파일을 사용해 악성 DLL 중 하나를 사이드 로딩합니다. 이를 통해 합법적인 윈도우 실행 파일로 맬웨어 파일을 로드하고 실행합니다. 로딩된 악성 DLL에는 SIGFLIP과 DAVESHELL이 포함되어 있으며, 이를 사용해 다른 드롭된 악성 실행 파일의 페이로드를 해독하여 메모리에 로드합니다. SIGFLIP은 RC4 스트림 암호를 사용해 선택한 페이로드를 복호화합니다. 그리고 이 과정에서 바이트 시퀀스 FEEDFACE를 사용해 쉘 코드(이 경우 DAVESHELL)를 찾습니다.

SIGFLIP과 DAVESHELL은 모듈식 백도어인 VEILEDSIGNAL과 두 개의 공격 모듈을 추출하여 실행합니다. VEILEDSIGNAL은 프로세스 인젝션과 C2 서버와 통신을 위해 추출된 두 모듈에 의존합니다.

VEILEDSIGNAL과 함께 제공되는 두 가지 구성 요소는 다음과 같은 기능을 제공합니다.

  • VEILEDSIGNAL 백도어는 임플란트 데이터 전송, 쉘 코드 실행, 자체 종료 세 가지 명령을 지원합니다.
  • 프로세스 인젝션 모듈은 크롬, 파이어폭스, 엣지 브라우저에서 처음 발견된 프로세스 인스턴스에 C2 서버와 통신을 위한 모듈을 인젝션합니다. 또한, 명명된 파이프를 모니터링하고 필요한 경우 통신 모듈을 다시 주입합니다.
  • C2 서버와 통신을 위한 모듈은 윈도우 네임드 파이프를 생성하고 들어오는 통신을 수신 대기한 다음 갈루아 카운터 모드(GCM)에서 AES-256으로 암호화된 C2 서버로 전송합니다.

확인된 VEILEDSIGNAL 샘플(MD5: c6441c961dcad0fe127514a918eaabd4)의 C2 서버 구성은 하드코딩된 URL(www.tradingtechnologies[.]com/trading/order-management)에 의존합니다.

VEILEDSIGNAL 유사점 및 코드 비교

손상된 X_TRADER와 3CX 데스크톱 앱 애플리케이션은 최종 페이로드가 다릅니다. 그러나 페이로드를 포함하는 방식과 추출 및 실행하는 방법은 동일합니다. 맨디언트는 샘플 분석을 통해 다음과 같은 유사점을 찾았습니다.

  • 페이로드 암호화 및 복호화를 위해 SIGFLIP 도구 구성에서 동일한 RC4 키인 3jB(2bsG#@c7를 활용
  • CVE-2013-3900 (MS13-098)를 활용하는 깃허브에서 공개적으로 사용할 수 있는 프로젝트인 SIGFLIP을 사용함
  • 공개적으로 사용할 수 있는 오픈 소스 프로젝트인 DAVESHELL을 사용해 PE-COFF 파일을 위치 독립적인 코드 또는 쉘 코드로 변환하고 메모리 내에서 실행 가능한 코드를 동적으로 로드하는 기술(Reflective loading)을 활용해 메모리에서 페이로드를 로드
  • 페이로드에서 하드코딩된 쿠키 변수인 _tutma를 사용
  • 두 페이로드 모두 AES-256 GCM 암호로 데이터를 암호화

3CX 빌드 환경 침해

공격자는 공개적으로 사용할 수 있는 Fast Reverse Proxy 프로젝트의 컴파일된 버전을 사용해 공격 중에 3CX 조직 내에서 측면 이동을 하였습니다. MsMpEng.exe 파일(MD5: 19dbffec4e359a198daf4ffca1ab9165)은 위협 행위자에 의해 C:\Windows\System32에서 삭제되었습니다.

맨디언트는 공격자가 자격 증명을 수집하고 측면 이동을 하여 윈도우 및 맥OS 빌드 환경을 모두 손상시키는 데 성공한 것으로 파악하고 있습니다. 윈도우 빌드 환경에서 공격자는 IKEEXT 서비스를 통해 DLL 검색 순서 하이재킹을 수행하고 로컬 시스템 권한으로 실행되는 TAXHAUL 런처와 COLDCAT 다운로더를 배포했습니다. 맥OS 빌드 서버는 런치 데몬을 지속성 메커니즘으로 사용하는 POOLRAT 백도어에 의해 손상되었습니다.

맨디언트는 이전 보고에서 맥OS 빌드 서버가 SIMPLESEA로 손상되었다고 밝힌 바 있습니다. 맨디언트 인텔리전스는 샘플 분석 완료 후 새로운 맬웨어 제품군이 아닌 백도어 POOLRAT로 확인하였습니다.

위협 행위자 스포트라이트: UNC4736

UNC4736은 맨디언트가 추적한 여러 북한 위협 행위자, 특히 금전적인 동기를 가진 사이버 범죄 작전에 관여한 북한의 공격자와 여러 측면에서 유사합니다. 이 위협 행위자 집단은 시간이 지남에 따라 암호 화폐 및 핀테크 관련 서비스에 집중하는 것으로 나타나고 있습니다.

맨디언트는 CISA가 보고한 바와 같이 UNC4736이 금전적인 동기를 가진 북한의 'AppleJeus' 활동과 관련이 있다고 보고 있습니다. 맨디언트는 해당 사이트에서 손상된 X_TRADER 업데이트가 배포되기 전인 2022년 2월에 www.tradingtechnologies[.]com이 손상된 것을 보고한 구글 TAG의 조사 결과를 통해 'AppleJeus' 활동과의 연관성에 대한 분석에 더욱 확신을 갖게 되었습니다.

  • 구글 TAG는 크롬의 원격 코드 실행 취약점인 CVE-2022-0609를 악용하는 북한의 위협 행위자 집단에 대해 보고했으며, 이들의 행위가 암호 화폐를 노리는 활동인 'AppleJeus'에 겹치는 부분이 많다고 설명했습니다.
  • www.tradingtechnologies[.]com이 트로이 목마 X_TRADER 소프트웨어 패키지를 제공하는 것으로 알려지기 두 달 전에 숨겨진 IFRAME를 호스팅하고 있었습니다.
  • 3CX 환경에서 맨디언트는 journalide[.]org를 C2 서버로 사용하는 POOLRAT 백도어를 확인하였습니다.
  • 이전 버전의 POOLRAT 샘플(MD5: 451c23709ecd5a8461ad060f6346930c)은 이전에 'AppleJeus' 공격에 사용된 트로이 목마화된 CoinGoTrade 애플리케이션의 일부로 CISA에 의해 보고된 바 있습니다(그림 2). 이전 샘플의 운영 인프라는 또 다른 트로이 목마 거래 애플리케이션인 JMT Trading과도 연관되어 있으며 이 역시 'AppleJeus'로 추적되었습니다.
POOLRAT Link to CoinGoTrade and JMT Trading Activity
그림 2 : CoinGoTrade 및 JMT 거래 활동에 대한 POOLRAT 링크

또한, UNC4736은 APT43 활동으로 의심되는 두 위협 행위자 집단인 UNC3782와 UNC4469 간에 운영 인프라가 약간 겹치는 것으로 확인되었습니다.

DNS를 확인해 보니 UNC4736과 APT43에 연결된 위협 행위 간에 운영 인프라 중복이 있는 것으로 확인되었습니다(표 1-3). APT43은 암호 화폐 사용자와 관련된 서비스를 표적으로 삼고 있습니다. 이런 금전적인 동기가 있는 위협 행위는 북한과 연결된 사이버 범죄자 전반에서 관찰되는 공통점입니다.

표 1: IP 89.45.67.160

Date

Domain

UNC

2022-12-20

curvefinances[.]com

UNC4469

2022-12-29

pbxphonenetwork[.]com

UNC4736

표 2: IP 172.93.201.88

Date

Domain

UNC

2022-04-08

journalide[.]org

UNC4736

2021-11-26

nxmnv[.]site

UNC3782

표 3: IP 185.38.151

Date

Domain

UNC

2023-01-09

msedgepackageinfo[.]com

UNC4736

2023-03-22

apollo-crypto.org.shilaerc20[.]com

UNC4469

전망 및 시사점

맨디언트가 이번에 확인한 침해는 두 건의 소프트웨어 공급망 침해가 연쇄적으로 일어난 최초의 사례입니다. 이번 조사에서 입증된 것처럼 위협 행위자는 마음먹기에 따라 연쇄적으로 침입을 할 수 있으며 이런 방법이 광범위하게 확산될 수 있습니다. UNC4736 활동에 대한 연구에 따르면 이번 침해는 금전적인 동기를 가진 북한의 위협 행위자들과 관련이 있을 가능성이 높습니다. 두 개의 소프트웨어 공급망 취약점을 연속해서 악용하는 방법은 북한의 위협 행위자가 창의적인 방식으로 맬웨어를 배포할 수 있음을 잘 보여줍니다. 북한 위협 행위자는 자국 정부의 이익에 부합하는 작업을 수행하는 데 있어 표적으로 삼은 네트워크 간에 자유롭게 이동할 수 있음을 보여 주었습니다.

끝으로 포스팅 작성 및 검토에 참여한 Michael Bailey, Willi Ballenthin, Michael Barnhart, Jakub Jozwiak에게 감사의 말을 전합니다. 더불어 이번 침해 연구를 위해 협력한 구글의 TAG와 마이크로소프트의 MSTIC에도 감사의 뜻을 전합니다.

맬웨어 정의

맬웨어

설명

ICONICSTEALER

애플리케이션 구성 데이터와 기록을 수집하는 C/C++ 데이터 마이너입니다.

DAVESHELL

인메모리 드로퍼로 작동하는 쉘 코드입니다. 내장된 페이로드가 메모리에 매핑되어 실행됩니다.

SIGFLIP

파일의 서명에 영향을 끼치거나 손상시키지 않고 임의의 코드를 삽입하기 위해 인증 코드로 서명된 PE-COFF 파일을 패치하는 도구입니다.

POOLRAT

기본 시스템 정보를 수집하고 명령을 실행할 수 있는 C/C++ 맥OS 백도어입니다. 수행되는 명령에는 임의의 명령 실행, 파일 보안 삭제, 파일 읽기 및 쓰기, 구성 업데이트 등이 있습니다.

TAXHAUL

C:\Windows\System32\config\TxR\<machine hardware profile GUID>.TxR.0.regtrans-ms에서 예상되는 쉘 코드 페이로드를 해독하는 DLL입니다. 맨디언트는 DLL 검색 순서 하이재킹을 통해 TAXHAUL이 지속되는 것을 확인했습니다.

COLDCAT

고유한 호스트별 식별자 정보를 생성하고, 쿠키 헤더의 데이터와 함께 POST 요청을 통해 별도의 파일에 지정된 C2 서버에 비콘을 전달하는 다운로더입니다. 간단한 핸드쉐이크 후 맬웨어는 응답으로 Base64로 인코딩된 쉘 코드가 실행될 것으로 예상됩니다.

VEILEDSIGNAL

쉘 코드를 실행하고 스스로 종료할 수 있는 C로 작성된 백도어입니다. 또한, VEILEDSIGNAL은 C2 서버 인프라와 상호작용하기 위해 Windows라는 이름의 파이프를 통해 연결되는 추가 모듈에 의존합니다.

MITRE ATT&CK

Resource Development

  • T1588 Obtain Capabilities
  • T1588.004 Digital Certificates
  • T1608 Stage Capabilities
  • T1608.003 Install Digital Certificate

Initial Access

  • T1190 Exploit Public-Facing Application
  • T1195 Supply Chain Compromise
  • T1195.002 Compromise Software Supply Chain

Persistence

  • T1574 Hijack Execution Flow
  • T1574.002 DLL Side-Loading

Privilege Escalation

  • T1055 Process Injection
  • T1574 Hijack Execution Flow
  • T1574.002 DLL Side-Loading

Defense Evasion

  • T1027 Obfuscated Files or Information
  • T1036 Masquerading
  • T1036.001 Invalid Code Signature
  • T1055 Process Injection
  • T1070 Indicator Removal
  • T1070.001 Clear Windows Event Logs
  • T1070.004 File Deletion
  • T1112 Modify Registry
  • T1140 Deobfuscate/Decode Files or Information
  • T1497 Virtualization/Sandbox Evasion
  • T1497.001 System Checks
  • T1574 Hijack Execution Flow
  • T1574.002 DLL Side-Loading
  • T1620 Reflective Code Loading
  • T1622 Debugger Evasion

Discovery

  • T1012 Query Registry
  • T1082 System Information Discovery
  • T1083 File and Directory Discovery
  • T1497 Virtualization/Sandbox Evasion
  • T1497.001 System Checks
  • T1614 System Location Discovery
  • T1614.001 System Language Discovery
  • T1622 Debugger Evasion

Command and Control

  • T1071 Application Layer Protocol
  • T1071.001 Web Protocols
  • T1071.004 DNS
  • T1105 Ingress Tool Transfer
  • T1573 Encrypted Channel
  • T1573.002 Asymmetric Cryptography  

Impact 

  • T1565 Data Manipulation
  • T1565.001 Stored Data Manipulation

YARA 룰

rule M_Hunting_3CXDesktopApp_Key {

  meta:

    disclaimer = "This rule is meant for hunting and is not tested to run in a production environment"

    description = "Detects a key found in a malicious 3CXDesktopApp file"

    md5 = "74bc2d0b6680faa1a5a76b27e5479cbc"

    date = "2023/03/29"

    version = "1"

  strings:

    $key = "3jB(2bsG#@c7" wide ascii

  condition:

    $key

}

rule M_Hunting_3CXDesktopApp_Export {

  meta:

    disclaimer = "This rule is meant for hunting and is not tested to run in a production environment"

    description = "Detects an export used in 3CXDesktopApp malware"

    md5 = "7faea2b01796b80d180399040bb69835"

    date = "2023/03/31"

    version = "1"

  strings:

    $str1 = "DllGetClassObject" wide ascii

    $str2 = "3CXDesktopApp" wide ascii

  condition:

    all of ($str*)

}

rule TAXHAUL
{
  meta:
  author = "Mandiant"
  created = "04/03/2023"
  modified = "04/03/2023"
  version = "1.0"
  strings:
    $p00_0 = {410f45fe4c8d3d[4]eb??4533f64c8d3d[4]eb??4533f64c8d3d[4]eb}
    $p00_1 = {4d3926488b01400f94c6ff90[4]41b9[4]eb??8bde4885c074}
  condition:
    uint16(0) == 0x5A4D and any of them
}

rule M_Hunting_MSI_Installer_3CX_1

{

meta:

author = "Mandiant"

md5 = "0eeb1c0133eb4d571178b2d9d14ce3e9, f3d4144860ca10ba60f7ef4d176cc736"

strings:

$ss1 = { 20 00 5F 64 33 64 63 6F 6D 70 69 6C 65 72 5F 34 37 2E 64 6C 6C 5F }

$ss2 = { 20 00 5F 33 43 58 44 65 73 6B 74 6F 70 41 70 70 2E }

$ss3 = { 20 00 5F 66 66 6D 70 65 67 2E 64 6C 6C 5F }

$ss4 = "3CX Ltd1" ascii

$sc1 = { 1B 66 11 DF 9C 9A 4D 6E CC 8E D5 0C 9B 91 78 73 }

$sc2 = "202303" ascii

condition:

(uint32(0) == 0xE011CFD0) and filesize > 90MB and filesize < 105MB and all of them

}

rule M_Hunting_TAXHAUL_Hash_1

{

meta:

author = "Mandiant"

disclaimer = "This rule is meant for hunting and is not tested to run in a production environment"

description = "Rule looks for hardcoded value used in string hashing algorithm observed in instances of TAXHAUL."

md5 = "e424f4e52d21c3da1b08394b42bc0829"

strings:

$c_x64 = { 25 A3 87 DE [4-20] 25 A3 87 DE [4-20] 25 A3 87 DE }

condition:

filesize < 15MB and uint16(0) == 0x5a4d and uint32(uint32(0x3C)) == 0x00004550 and any of them

}

rule M_Hunting_SigFlip_SigLoader_Native

{

meta:

author = "Mandiant"

disclaimer = "This rule is meant for hunting and is not tested to run in a production environment"

description = "Rule looks for strings present in SigLoader (Native)"

md5 = "a3ccc48db9eabfed7245ad6e3a5b203f"

strings:

$s1 = "[*]: Basic Loader..." ascii wide

$s2 = "[!]: Missing PE path or Encryption Key..." ascii wide

$s3 = "[!]: Usage: %s <PE_PATH> <Encryption_Key>" ascii wide

$s4 = "[*]: Loading/Parsing PE File '%s'" ascii wide

$s5 = "[!]: Could not read file %s" ascii wide

$s6 = "[!]: '%s' is not a valid PE file" ascii wide

$s7 = "[+]: Certificate Table RVA %x" ascii wide

$s8 = "[+]: Certificate Table Size %d" ascii wide

$s9 = "[*]: Tag Found 0x%x%x%x%x" ascii wide

$s10 = "[!]: Could not locate data/shellcode" ascii wide

$s11 = "[+]: Encrypted/Decrypted Data Size %d" ascii wide

condition:

filesize < 15MB and uint16(0) == 0x5a4d and uint32(uint32(0x3C)) == 0x00004550 and 4 of ($s*)

}

rule M_Hunting_Raw64_DAVESHELL_Bootstrap

{

meta:

author = "Mandiant"

disclaimer = "This rule is meant for hunting and is not tested to run in a production environment"

description = "Rule looks for bootstrap shellcode (64 bit) present in DAVESHELL"

md5 = "8a34adda5b981498234be921f86dfb27"

strings:

$b6ba50888f08e4f39b43ef67da27521dcfc61f1e = { E8 00 00 00 00 59 49 89 C8 48 81 C1 ?? ?? ?? ?? BA ?? ?? ?? ?? 49 81 C0 ?? ?? ?? ?? 41 B9 ?? ?? ?? ?? 56 48 89 E6 48 83 E4 F0 48 83 EC 30 C7 44 24 20 ?? ?? ?? ?? E8 ?? 00 00 00 48 89 F4 5E C3 }

$e32abbe82e1f957fb058c3770375da3bf71a8cab = { E8 00 00 00 00 59 49 89 C8 BA ?? ?? ?? ?? 49 81 C0 ?? ?? ?? ?? 41 B9 ?? ?? ?? ?? 56 48 89 E6 48 83 E4 F0 48 83 EC 30 48 89 4C 24 28 48 81 C1 ?? ?? ?? ?? C7 44 24 20 ?? ?? ?? ?? E8 ?? 00 00 00 48 89 F4 5E C3 }

condition:

filesize < 15MB and any of them

}

rule M_Hunting_MSI_Installer_3CX_1

{

meta:

author = "Mandiant"

disclaimer = "This rule is meant for hunting and is not tested to run in a production environment"

description = "This rule looks for hardcoded values within the MSI installer observed in strings and signing certificate"

md5 = "0eeb1c0133eb4d571178b2d9d14ce3e9"

strings:

$ss1 = { 20 00 5F 64 33 64 63 6F 6D 70 69 6C 65 72 5F 34 37 2E 64 6C 6C 5F }

$ss2 = { 20 00 5F 33 43 58 44 65 73 6B 74 6F 70 41 70 70 2E }

$ss3 = { 20 00 5F 66 66 6D 70 65 67 2E 64 6C 6C 5F }

$ss4 = "3CX Ltd1" ascii

$sc1 = { 1B 66 11 DF 9C 9A 4D 6E CC 8E D5 0C 9B 91 78 73 }

$sc2 = "202303" ascii

condition:

(uint32(0) == 0xE011CFD0) and filesize > 90MB and filesize < 100MB and all of them

}

rule M_Hunting_VEILEDSIGNAL_1

{

meta:

author = "Mandiant"

disclaimer = "This rule is meant for hunting and is not tested to run in a production environment"

md5 = "404b09def6054a281b41d309d809a428, c6441c961dcad0fe127514a918eaabd4"

strings:

$rh1 = { 68 5D 7A D2 2C 3C 14 81 2C 3C 14 81 2C 3C 14 81 77 54 10 80 26 3C 14 81 77 54 17 80 29 3C 14 81 77 54 11 80 AB 3C 14 81 D4 4C 11 80 33 3C 14 81 D4 4C 10 80 22 3C 14 81 D4 4C 17 80 25 3C 14 81 77 54 15 80 27 3C 14 81 2C 3C 15 81 4B 3C 14 81 94 4D 1D 80 28 3C 14 81 94 4D 14 80 2D 3C 14 81 94 4D 16 80 2D 3C 14 81 }

$rh2 = { 00 E5 A0 2B 44 84 CE 78 44 84 CE 78 44 84 CE 78 1F EC CA 79 49 84 CE 78 1F EC CD 79 41 84 CE 78 1F EC CB 79 C8 84 CE 78 BC F4 CA 79 4A 84 CE 78 BC F4 CD 79 4D 84 CE 78 BC F4 CB 79 65 84 CE 78 1F EC CF 79 43 84 CE 78 44 84 CF 78 22 84 CE 78 FC F5 C7 79 42 84 CE 78 FC F5 CE 79 45 84 CE 78 FC F5 CC 79 45 84 CE 78}

$rh3 = { DA D2 21 22 9E B3 4F 71 9E B3 4F 71 9E B3 4F 71 C5 DB 4C 70 94 B3 4F 71 C5 DB 4A 70 15 B3 4F 71 C5 DB 4B 70 8C B3 4F 71 66 C3 4B 70 8C B3 4F 71 66 C3 4C 70 8F B3 4F 71 C5 DB 49 70 9F B3 4F 71 66 C3 4A 70 B0 B3 4F 71 C5 DB 4E 70 97 B3 4F 71 9E B3 4E 71 F9 B3 4F 71 26 C2 46 70 9F B3 4F 71 26 C2 B0 71 9F B3 4F 71 9E B3 D8 71 9F B3 4F 71 26 C2 4D 70 9F B3 4F 71 }

$rh4 = { CB 8A 35 66 8F EB 5B 35 8F EB 5B 35 8F EB 5B 35 D4 83 5F 34 85 EB 5B 35 D4 83 58 34 8A EB 5B 35 D4 83 5E 34 09 EB 5B 35 77 9B 5E 34 92 EB 5B 35 77 9B 5F 34 81 EB 5B 35 77 9B 58 34 86 EB 5B 35 D4 83 5A 34 8C EB 5B 35 8F EB 5A 35 D3 EB 5B 35 37 9A 52 34 8C EB 5B 35 37 9A 58 34 8E EB 5B 35 37 9A 5B 34 8E EB 5B 35 37 9A 59 34 8E EB 5B 35 }

condition:

uint16(0) == 0x5A4D and uint32(uint32(0x3C)) == 0x00004550 and 1 of ($rh*)

}

rule M_Hunting_VEILEDSIGNAL_2

{

meta:

author = "Mandiant"

disclaimer = "This rule is meant for hunting and is not tested to run in a production environment"

md5 = "404b09def6054a281b41d309d809a428"

strings:

$sb1 = { C1 E0 05 4D 8? [2] 33 D0 45 69 C0 7D 50 BF 12 8B C2 41 FF C2 C1 E8 07 33 D0 8B C2 C1 E0 16 41 81 C0 87 D6 12 00 }

$si1 = "CryptBinaryToStringA" fullword

$si2 = "BCryptGenerateSymmetricKey" fullword

$si3 = "CreateThread" fullword

$ss1 = "ChainingModeGCM" wide

$ss2 = "__tutma" fullword

condition:

(uint16(0) == 0x5A4D) and (uint32(uint32(0x3C)) == 0x00004550) and (uint16(uint32(0x3C)+0x18) == 0x020B) and all of them

}

rule M_Hunting_VEILEDSIGNAL_3

{

meta:

author = "Mandiant"

disclaimer = "This rule is meant for hunting and is not tested to run in a production environment"

md5 = "c6441c961dcad0fe127514a918eaabd4"

strings:

$ss1 = { 61 70 70 6C 69 63 61 74 69 6F 6E 2F 6A 73 6F 6E 2C 20 74 65 78 74 2F 6A 61 76 61 73 63 72 69 70 74 2C 20 2A 2F 2A 3B 20 71 3D 30 2E 30 31 00 00 61 63 63 65 70 74 00 00 65 6E 2D 55 53 2C 65 6E 3B 71 3D 30 2E 39 00 00 61 63 63 65 70 74 2D 6C 61 6E 67 75 61 67 65 00 63 6F 6F 6B 69 65 00 00 }

$si1 = "HttpSendRequestW" fullword

$si2 = "CreateNamedPipeW" fullword

$si3 = "CreateThread" fullword

$se1 = "DllGetClassObject" fullword

condition:

(uint16(0) == 0x5A4D) and (uint32(uint32(0x3C)) == 0x00004550) and (uint16(uint32(0x3C)+0x18) == 0x020B) and all of them

}

rule M_Hunting_VEILEDSIGNAL_4

{

meta:

author = "Mandiant"

disclaimer = "This rule is meant for hunting and is not tested to run in a production environment"

md5 = "404b09def6054a281b41d309d809a428, c6441c961dcad0fe127514a918eaabd4"

strings:

$sb1 = { FF 15 FC 76 01 00 8B F0 85 C0 74 ?? 8D 50 01 [6-16] FF 15 [4] 48 8B D8 48 85 C0 74 ?? 89 ?? 24 28 44 8B CD 4C 8B C? 48 89 44 24 20 }

$sb2 = { 33 D2 33 C9 FF 15 [4] 4C 8B CB 4C 89 74 24 28 4C 8D 05 [2] FF FF 44 89 74 24 20 33 D2 33 C9 FF 15 }

$si1 = "CreateThread" fullword

$si2 = "MultiByteToWideChar" fullword

$si3 = "LocalAlloc" fullword

$se1 = "DllGetClassObject" fullword

condition:

(uint16(0) == 0x5A4D) and (uint32(uint32(0x3C)) == 0x00004550) and (uint16(uint32(0x3C)+0x18) == 0x020B) and all of them

}

rule M_Hunting_VEILEDSIGNAL_5

{

meta:

author = "Mandiant"

disclaimer = "This rule is meant for hunting and is not tested to run in a production environment"

md5 = "6727284586ecf528240be21bb6e97f88"

strings:

$sb1 = { 48 8D 15 [4] 48 8D 4C 24 4C E8 [4] 85 C0 74 ?? 48 8D 15 [4] 48 8D 4C 24 4C E8 [4] 85 C0 74 ?? 48 8D 15 [4] 48 8D 4C 24 4C E8 [4] 85 C0 74 ?? 48 8D [3] 48 8B CB FF 15 [4] EB }

$ss1 = "chrome.exe" wide fullword

$ss2 = "firefox.exe" wide fullword

$ss3 = "msedge.exe" wide fullword

$ss4 = "\\\\.\\pipe\\*" ascii fullword

$ss5 = "FindFirstFileA" ascii fullword

$ss6 = "Process32FirstW" ascii fullword

$ss7 = "RtlAdjustPrivilege" ascii fullword

$ss8 = "GetCurrentProcess" ascii fullword

$ss9 = "NtWaitForSingleObject" ascii fullword

condition:

(uint16(0) == 0x5A4D) and (uint32(uint32(0x3C)) == 0x00004550) and (uint16(uint32(0x3C)+0x18) == 0x020B) and all of them

}

rule M_Hunting_VEILEDSIGNAL_6

{

meta:

author = "Mandiant"

disclaimer = "This rule is meant for hunting and is not tested to run in a production environment"

md5 = "00a43d64f9b5187a1e1f922b99b09b77"

strings:

$ss1 = "C:\\Programdata\\" wide

$ss2 = "devobj.dll" wide fullword

$ss3 = "msvcr100.dll" wide fullword

$ss4 = "TpmVscMgrSvr.exe" wide fullword

$ss5 = "\\Microsoft\\Windows\\TPM" wide fullword

$ss6 = "CreateFileW" ascii fullword

condition:

(uint16(0) == 0x5A4D) and (uint32(uint32(0x3C)) == 0x00004550) and (uint16(uint32(0x3C)+0x18) == 0x010B) and all of them

}

rule MTI_Hunting_POOLRAT {
  meta:
    author = "Mandiant"
    disclaimer = "This rule is meant for hunting and is not tested to run in a production environment"
    description = "Detects strings found in POOLRAT. "
    md5 = "451c23709ecd5a8461ad060f6346930c"
    date = "10/28/2020"
    version = "1"
  strings:
    $str1 = "name=\"uid\"%s%s%u%s" wide ascii
    $str2 = "name=\"session\"%s%s%u%s" wide ascii
    $str3 = "name=\"action\"%s%s%s%s" wide ascii
    $str4 = "name=\"token\"%s%s%u%s" wide ascii
    $boundary = "--N9dLfqxHNUUw8qaUPqggVTpX-" wide ascii nocase
  condition: 
    any of ($str*) or $boundary
}

rule M_Hunting_FASTREVERSEPROXY

{

      meta:

      author = "Mandiant"

      disclaimer = "This rule is meant for hunting and is not tested to run in a production environment"

      md5 = "19dbffec4e359a198daf4ffca1ab9165"

      strings:

      $ss1 = "Go build ID:" fullword

      $ss2 = "Go buildinf:" fullword

      $ss3 = "net/http/httputil.(*ReverseProxy)." ascii

      $ss4 = "github.com/fatedier/frp/client" ascii

      $ss5 = "\"server_port\"" ascii

      $ss6 = "github.com/armon/go-socks5.proxy" ascii

      condition:

      uint16(0) == 0x5A4D and uint32(uint32(0x3C)) == 0x00004550 and all of them

}

Snort 룰

alert tcp any any -> any any (msg:"Possible malicious 3CXDesktopApp Identified"; content:"raw.githubusercontent.com/IconStorages/images/main/"; threshold:type limit, track by_src, count 1, seconds 3600; sid: 99999999;)

 

alert tcp any any -> any any (msg:"Possible malicious 3CXDesktopApp Identified"; content:"3cx_auth_id=%s\;3cx_auth_token_content=%s\;__tutma=true"; threshold:type limit, track by_src, count 1, seconds 3600; sid: 99999999;)

 

alert tcp any any -> any any (msg:"Possible malicious 3CXDesktopApp Identified"; content:"__tutma"; threshold:type limit, track by_src, count 1, seconds 3600; sid: 99999999;)

 

alert tcp any any -> any any (msg:"Possible malicious 3CXDesktopApp Identified"; content:"__tutmc"; threshold:type limit, track by_src, count 1, seconds 3600; sid: 99999999;)