Blog

UNC2891: 유닉스와 리눅스 환경에 정통한 위협 행위 클러스터

Mathew Potaczek, Takahiro Sugiyama, Logeswaran Nadarajan, Yu Nakamura, Josh Homan, Martin Co, Sylvain Hirsch
Nov 24, 2022
10 min read
|   Last updated: Apr 03, 2023
Threat Research
Uncategorized Groups (UNC Groups)

맨디언트 어드밴스드 프랙티스(Mandiant Advanced Practices) 팀은 이전에 금융 및 컨설팅 업계의 표적에 접근하기 위해 매니지드 서비스 사업자를 침해한 UNC1945 관련 연구 내용을 포스팅으로 정리해 올린 적이 있습니다. 이후 맨디언트는 이 위협 행위자 집단과 관련 있어 보이는 위협 클러스터인 UNC2891의 몇몇 침입을 조사하여 그 원인을 찾았습니다. 이 조사를 통해 맨디언트는 이전에 UNC1945의 위협 행위에서 관찰한 것 외에도 새로 추가한 것으로 보이는 기술, 맬웨어, 유틸리티를 발견하였습니다. 조사 결과를 보면 UNC1945와 UNC2891 위협 클러스터 간에 상당한 유사점이 있음을 알 수 있습니다. 그러나 맨디언트는 다음과 같은 이유로 이들이 같은 집단이라고 보지는 않습니다.

  • UNC2891은 금전적 동기를 갖고 침해 활동을 하는 것으로 보이며, 몇 년 동안 활동이 감지되지 않았습니다.
  • UNC2891은 주로 TINYSHELL 및 SLAPSTICK 백도어가 있는 오라클 솔라리스 기반 시스템을 노렸고, 이를 통해 유닉스와 리눅스에 익숙하고 전문성을 갖고 있음을 보여주었습니다.
  • UNC2891은 높은 수준의 운영 보안(OPSEC, Operations Security) 전략을 사용하는 것으로 보입니다. 맨디언트는 이 위협 클러스터가 공개/비공개 맬웨어, 유틸리티 및 스크립트를 사용해 증거 제거 및 피해 조직의 대응 노력을 방해하는 것을 관찰하였습니다.
  • 맨디언트는 UNC2891이 이전에 알려지지 않은 오라클 솔라리스 시스템용 루트킷을 피해 조직의 네트워크에 숨겨 놓은 것을 발견하고 이를 CAKETAP라고 이름 붙였습니다.
  • CAKETAP 변종 중 하나는 피해자의 현금 자동 인출기(ATM) 네트워크를 오가는 메시지를 조작했습니다. 이는 무단 복제나 신용을 도용해 만든 카드를 사용해 여러 은행에서 현금을 인출하기 위한 사기 작업을 일부로 보입니다.

SLAPSTICK 및 TINYSHELL 백도어의 광범위한 사용

과거에 관찰한 UNC1945의 침입과 마찬가지로 UNC2891은 SLAPSTICK으로 추적하는 PAM(Pluggable Authentication Module) 기반 백도어를 광범위하게 사용해 자격 증명을 수집하여 피해자 네트워크의 손상된 시스템에 접근하는 것을 관찰하였습니다. 이전 블로그 게시물에서 설명한 바와 같이 SLAPSTICK은 하드 코딩된 암호를 사용해 감염된 시스템에 지속해서 접근하기 백도어를 유지합니다. 인증 시도 및 암호는 로그 파일에 기록되는데, 이 파일은 암호화됩니다. 이런 접근은 자격 증명 수집 및 측면 이동 활동에서 큰 도움이 된 것으로 보입니다. 맨디언트는 SLAPSTICK의 암호화된 로그 파일을 해독할 수 있었고, 백도어가 제공하는 암호로 위협 행위자의 측면 이동 활동을 추적할 수 있었습니다.

Example SLAPSTICK decoded log (fabricated)
그림 1: SLAPSTICK 디코딩 로그

SLAPSTICK과 함께 UNC2891은 종종 공개적으로 사용할 수 있는 TINYSHELL 백도어의 맞춤형 변종을 설치했습니다. 이 백도어는 외부 암호화 구성 파일을 활용했으며 일부 변종은 기본 인증으로 HTTP 프록시를 통해 통신하는 추가 기능이 포함되어 있었습니다. UNC2891은 종종 TINYSHELL을 SYSTEMD, NCSD, ATD 같은 합법적인 서비스처럼 보이게 하였습니다. 이를 통해 UNC2891이 유닉스와 리눅스를 능숙히 다룬 다는 것을 유추해 볼 수 있습니다.

표 1. 관찰한 TINYSHELL 파일 경로

TINYSHELL 백도어 파일 경로

TINYSHELL 설정 파일 경로

/usr/lib/libhelpx.so.1

/usr/lib/systemd/systemd-helper

/usr/sbin/nscd

/usr/lib/libatdcf.so

/usr/lib/libnscd.so.1

/usr/lib/libsystemdcf.so

/var/ntp/ntpstats/1

표 2. 디코딩 된 TINYSHELL 구성 예

디코딩 된 구성 예

/pm_systemd_mag <32-character string>

systemd_nme <system id>

pm_systemd_adr <C2 IP address/domain>

pm_systemd_prt <443 or 53>

pm_systemd_tme 300

systemd_non1 none

systemd_non2 none

systemd_non3 none

systemd_non4 none

UNC2891은 TINYSHELL 백도어의 지속성을 위해 다음과 같은 SYSTEMD 서비스 단위 파일도 활용했습니다.

표 3. TINYSHELL 지속성에 사용된 서비스 단위 파일

/usr/lib/systemd/system/systemd-helper.service

[Unit]
Description=Rebuild Hardware Database
[Service]
Type=forking
ExecStart=/lib/systemd/systemd-helper
[Install]
WantedBy=multi-user.target

UNC2891은 여러 손상된 내부 서버를 활용하는 다중 홉 구조로 TINYSHELL 백도어를 구성하였습니다. 맨디언트는 한 사례에서 증거를 찾았는데, 공격자는 접근에 제약이 있는 네트워크에 위치한 서버에 원격 연결을 하기 위해 두 개의 TINYSHELL 백도어를 연계하였습니다.

TINYSHELL 연결 네트워크를 숨기기 위해 UNC2891은 네트워크 연결 관련 API에 연결을 필터링하는 루트킷을 설치하고 구성하였습니다. UNC2891은 외부에 위치한 명령 및 제어(Command & Control, 이하 C2) 채널로 동적 DNS 도메인을 사용하는 시스템을 구성하였습니다. 도메인은 호스트 별로 생성되었으며, 한 번 이상 쓰이지 않았습니다. 하위 도메인은 종종 손상된 시스템의 호스트 이름과 비슷한 것이 사용되었습니다. 여기에서 알 수 있는 것은 UNC2891이 네트워크에 접근하는 짧은 시간 동안만 IP 확인을 활성화했을 수 있다는 것입니다. 한 피해 조직의 경우 TINYSHELL 백도어가 포트 53 및 443을 통해 TCP 통신을 수행하도록 구성되어 있었습니다.

Example of TINYSHELL command and control used by UNC2891
그림 2: UNC2891에서 사용하는 TINYSHELL 명령 및 제어의 예

메모리 드로퍼 - STEELHOUND, STEELCORGI

UNC2891은 종종 인메모리 드로퍼(in-memory dropper)인 STEELCORGI를 사용하였습니다. 이 드로퍼는 ChaCha20 키로 페이로드를 복호화 합니다. 조사 과정에서 맨디언트는 대부분의 경우 내장된 페이로드 해독에 필요한 환경 변수를 복구할 수 없었습니다. 그러나 해독할 수 있었던 제한된 샘플을 통해 UNC2891은 SUN4ME라는 이름의 툴킷을 배포한 것을 알 수 있었습니다. 위협 행위자들이 개발한 것으로 보이는 SUN4ME 툴킷에는 네트워크 정찰, 호스트 열거, 알려진 취약점 악용, 로그 삭제, 파일 작업 및 일반적인 쉘 유틸리티를 위한 도구가 포함되어 있었습니다. 이 툴킷에 대한 상세 정보는 이전 블로그 게시물을 참조 바랍니다.

맨디언트는 UNC2891이 내장된 페이로드를 복호화 하기 위해 환경 변수를 사용하는 것 외에도 RC4 암호화에 의존하는 메모리 드로퍼를 활용하는 것도 발견하였습니다. 맨디언트는 이를 STEELHOUND라고 이름 붙였습니다. STEELHOUND는 임베디드 페이로드에 대한 드로퍼 기능 외에도 바이너리를 암호화하고, 파일 및 사본을 디스크에 기록합니다.

맬웨어 - WINGHOOK, WINGCRACK

조사 과정에서 맨디언트는 WINGHOOK, WINGCRACK라는 이름의 키로거 맬웨어 제품군도 발견하였습니다.

  • WINGHOOK: 리눅스 및 유닉스 운영체제용 키로거입니다. 사용자 입력을 처리하는 데 사용되는 두 가지 일반적인 기능인 read 및 fgets를 연결하는 공유 라이브러리(SO 파일)로 패키징 됩니다. 캡처된 데이터는 .zmanDw로 시작하는 파일 이름과 함께 /var/tmp/ 디렉토리에 인코딩된 형식으로 저장됩니다.
  • WINGCRACK: 이는 WINGHOOK에서 인코딩된 키 로그 데이터가 포함된 파일의 내용을 디코딩하고 표시할 수 있는 유틸리티입니다. 맬웨어 작성자는 인코딩된 파일을 "schwing" 파일로 참조하는 것으로 보입니다.

관찰된 유틸리티

맨디언트는 이전에 UNC1945가 다양한 공개 및 비공개 도구를 사용하는 것을 관찰하였습니다. 당시 관찰 내용과 비교해 보면 UNC2891도 비슷한 도구를 사용하는 것으로 보입니다. 차이가 있다면 다음과 같은 유틸리티도 추가해서 쓴다는 것입니다.

  • BINBASH: 그룹 ID와 사용자 ID를 "root" 또는 지정된 값으로 설정한 후 쉘을 실행하는 간단한 ELF 유틸리티입니다. UNC2891이 사용한 BINBASH는 이 링크의 소스 코드를 컴파일한 것으로 보입니다.
  • WIPERIGHT: 리눅스 및 유닉스 기반 시스템에서 특정 로그 항목을 지우는 ELF 유틸리티입니다. lastlog, utmp/utmpx, wtmp/wpmpx 및 pacct 로그에서 지정된 사용자와 관련된 항목을 제거할 수 있습니다. 이 유틸리티의 소스 코드는 이 링크의 것으로 보입니다.
  • MIGLOGCLEANER: 리눅스 및 유닉스 기반 시스템에서 로그를 지우거나 로그에서 특정 문자열을 제거하는 또 다른 ELF 유틸리티로 GitHub에서 공개적으로 사용할 수 있습니다.

UNC2891은 다른 위협 행위자와 달리 맬웨어 바이너리 파일 인코딩과 디코딩을 위해 UUdecoding 스키마를 사용하였습니다. 또한, UUencoding과 UUdecoding을 위해 종종 간단한 Perl 래퍼 스크립트도 활용하였습니다.

CAKETAP

CAKETAP은 UNC2891이 오라클 솔라리스를 실행하는 서버 인프라에 배포한 커널 모듈 루트킷입니다. CAKETAP은 네트워크 연결, 프로세스 및 파일을 숨길 수 있습니다. 초기화하는 동안 로드된 모듈 목록에서 자신을 제거하고 존재를 숨기기 위해 이전에 로드된 모듈로 last_module_id를 업데이트합니다.

ipcl_get_next_conn 함수와 ip 모듈의 여러 함수에 후크가 설치됩니다. 이를 통해 CAKETAP은 행위자가 구성한 IP 주소 또는 포트와 일치하는 모든 연결을 필터링할 수 있습니다.

오라클 솔라리스 시스템에서 실행 중인 CAKETAP을 식별하는 방법 중 하나를 알아보겠습니다. 다음은 후킹 된 ipcl_get_next_conn 함수를 식별하는 예제 명령입니다. 참고로 mdb 명령 실행은 시스템 특수 권한이 필요할 수 있습니다.

root@solaris:~# echo 'ipcl_get_next_conn::dis -n 0 ; ::quit' | mdb -k

루티킷이 없는 깨끗한 시스템의 출력은 다음과 같습니다.

ipcl_get_next_conn: save %sp, -0xb0, %sp

후킹 된 함수는 다음과 같이 sethi 명령으로 시작합니다. 상수 0x1197c00은 CAKETAP이 로드된 위치에 다라 인스턴스마다 바뀝니다.

ipcl_get_next_conn: sethi %hi(0x11971c00), %g1

추가 후크는 mkdirat(make directory at) 및 getdents64(get directory entries) 시스템 호출에 설치됩니다. CAKETAP은 mkdirat 후크를 사용하여 신호 문자열을 포함하는 경로에서 명령을 수신합니다. 명령에는 네트워크 필터 구성, 구성 표시 및 업데이트, 숨기기 해제가 포함됩니다.

표 4. 관찰한 CAKETAP 후크 시크릿

Secret

Usage

.caahGss187

mkdirat hook signal string

.zaahGss187

getdents64 hook signal string

mkdirat 후크는 손상된 서버의 백도어에 접근해 CAKETAP을 제어하고 구성할 수 있도록 합니다. 맨디언트가 관찰한 명령은 다음과 같습니다.

표 5. 관찰한 CAKETAP 명령

명령

기능

Empty

로드된 모듈 목록에 CAKETAP 모듈을 다시 추가

M

getdents64 후크의 신호 문자열 변경

I

네트워크 필터 추가(형식: <IP>p<PORT>)

i

네트워크 필터 제거

P

getdents64 후크로 필터링 되지 않도록 현재 스레드 TTY 설정

p

모든 TTY가 getdents64 후크로 필터링 되도록 설정

S

현재 구성 표시

예를 하나 들어 보겠습니다. 새 네트워크 필터를 적용하고 현재 구성을 표시하려면 다음 명령을 사용할 수 있습니다.

  • mkdir /some/path/.caahGss187I192.168.1.10p80 - 192.168.1.10:80에 대한 네트워크 필터 추가
  • mkdir /some/path/.caahGss187S - 현재 구성 표시

getdents64에 설치된 후크는 디렉토리 내용에 신호 문자열이 있는지 숨기기 위해 출력을 필터링했습니다. 맨디언트는 공격자가 생성한 디렉토리에서 ipsatat 모듈 이름으로 CAKETAP을 로드하는 것을 관찰한 바 있습니다.

CAKETAP를 이용한 비인가 거래

한 피해 조직의 ATM 스위치 서버를 대상으로 한 메모리 포렌식 작업을 통해 카드 확인 관련 특정 메시지를 가로채는 네트워크 후킹 기능이 있는 CAKETAP 변종을 찾을 수 있었습니다. 포렌식을 통해 발견한 CAKETAP 변종은 카드를 사용하여 승인되지 않은 출금 관련 거래를 수행하는 금융 사기 활동의 일부로 보입니다. 관찰한 CAKETAP 변종은 HSM(Hardware Security Module)로 가는 특정 메시지를 표적으로 삼았습니다. 이 네트워크 후킹은 다음과 같은 기능을 수행하였습니다.

1. 카드 확인 메시지 조작: CAKETAP은 특정 발신 메시지의 모드를 변경해 카드 확인을 비활성화하였습니다. 이로 인해 HSM은 카드를 실질적으로 확인하지 않고 유효한 응답을 생성했습니다. ATM에서 돈을 인출하기 위해 사용한 사기를 목적으로 한 은행 카드는 기본 계화 번호(PAN) 및 CAKETAP의 "marker" 역할을 하는 매개변수를 사용하는 사용자 지정 알고리즘으로 확인 메시지를 생성했습니다. CAKETAP은 발신 메시지를 검사하여 알고리즘과 일치할 경우 카드를 사기를 목적으로 사용하는 카드로 식별하고 이를 다음에도 사용하기 위해 PAN을 메모리에 저장했습니다.

2. PIN 확인 메시지 재생: CAKETAP은 특정 조건과 일치하는 발신 PIN 확인 메시지를 조사하여 사기성 카드임을 나타내는 기본 계정 번호(PAN)가 있는 메시지를 식별했습니다. 사기성 카드에 대한 메시지가 아닌 경우 합법적인 ATM PIN 확인을 방해하지 않도록 내부적으로 메시지를 저장하고 수정하지 않은 상태로 보냅니다. 그러나 시기를 위해 사용하는 카드의 경우 PIN 확인을 우회하도록 합니다.

맨디언트의 조사에 따르면 UNC2891은 사기성 은행 카드를 사용해 여러 은행의 ATM 기기에서 승인되지 않은 현금 인출을 하기 위해 벌인 금융 사기 작전의 일부로 CAKETAP를 활용한 것으로 보고 있습니다.

결론

UNC2891은 높은 수준의 운영 보안(OPSEC) 수준을 유지하는 가운데 탐지 회피를 위해 여러 기술을 사용합니다. 위협 행위자는 기술과 경험을 활용해 유닉스와 리눅스 환경에서 흔히 볼 수 있는 보안 조치를 최대한 악용하였습니다. 맨디언트는 UNC2891이 유닉스와 리눅스에 대한 이해를 바탕으로 이들 운영체제 기반으로 운영하는 미션크리티컬한 시스템을 대상으로 금전적 이익을 위해 비슷한 위협 활동을 이어갈 것으로 전망합니다.

UNC2891과 UNC2945 사이에 유사성은 있지만 단일 위협 그룹이라고 단정 짓기에는 증거가 부족합니다. UNC2891과 UNC1945 활동의 상당 부분은 다른 위협 행위자에 의해서도 수행될 수 있습니다. 맨디언트가 UNC2891 관련 정보를 담은 포스팅을 올린 이유는 UNC2891의 목표가 될 수 있는 조직의 보안 담당자들을 돕기 위함입니다.

부록

YARA 룰

rule TINYSHELL

{

meta:

author = "Mandiant "

strings:

$sb1 = { C6 00 48 C6 4? ?? 49 C6 4? ?? 49 C6 4? ?? 4C C6 4? ?? 53 C6 4? ?? 45 C6 4? ?? 54 C6 4? ?? 3D C6 4? ?? 46 C6 4? ?? 00 }

$sb2 = { C6 00 54 C6 4? ?? 4D C6 4? ?? 45 C6 4? ?? 3D C6 4? ?? 52 }

$ss1 = "fork" ascii fullword wide

$ss2 = "socket" ascii fullword wide

$ss3 = "bind" ascii fullword wide

$ss4 = "listen" ascii fullword wide

$ss5 = "accept" ascii fullword wide

$ss6 = "alarm" ascii fullword wide

$ss7 = "shutdown" ascii fullword wide

$ss8 = "creat" ascii fullword wide

$ss9 = "write" ascii fullword wide

$ss10 = "open" ascii fullword wide

$ss11 = "read" ascii fullword wide

$ss12 = "execl" ascii fullword wide

$ss13 = "gethostbyname" ascii fullword wide

$ss14 = "connect" ascii fullword wide

condition:

uint32(0) == 0x464c457f and 1 of ($sb*) and 10 of ($ss*)

}

rule TINYSHELL_SPARC

{

meta:

author = "Mandiant"

strings:

$sb_xor_1 = { DA 0A 80 0C 82 18 40 0D C2 2A 00 0B 96 02 E0 01 98 03 20 01 82 1B 20 04 80 A0 00 01 82 60 20 00 98 0B 00 01 C2 4A 00 0B 80 A0 60 00 32 BF FF F5 C2 0A 00 0B 81 C3 E0 08 }

$sb_xor_2 = { C6 4A 00 00 80 A0 E0 00 02 40 00 0B C8 0A 00 00 85 38 60 00 C4 09 40 02 84 18 80 04 C4 2A 00 00 82 00 60 01 80 A0 60 04 83 64 60 00 10 6F FF F5 90 02 20 01 81 C3 E0 08 }

condition:

uint32(0) == 0x464C457F and (uint16(0x10) & 0x0200 == 0x0200) and (uint16(0x12) & 0x0200 == 0x0200) and 1 of them

}

rule SLAPSTICK

{

    meta:

        author = "Mandiant "

    strings:

        $ss1 = "%Y %b %d %H:%M:%S    \x00"

        $ss2 = "%-23s %-23s %-23s\x00"

        $ss3 = "%-23s %-23s %-23s %-23s %-23s %s\x0a\x00"

    condition:

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

}

rule STEELCORGI

{

    meta:

        author = "Mandiant "

    strings:

        $s1 = "\x00\xff/\xffp\xffr\xffo\xffc\xff/\xffs\xffe\xffl\xfff\xff/\xffe\xffx\xffe\x00"

        $s2 = "\x00\xff/\xffv\xffa\xffr\xff/\xffl\xffi\xffb\xff/\xffd\xffb\xffu\xffs\xff/\xffm\xffa\xffc\xffh\xffi\xffn\xffe\xff-\xffi\xffd\x00"

        $sb1 = { FE 1B 7A DE 23 D1 E9 A1 1D 7F 9E C1 FD A4 }

        $sb2 = { 3B 8D 4F 45 7C 4F 6A 6C D8 2F 1F B2 19 C4 45 6A 6A }

    condition:

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

}

침해 지표

맬웨어 패밀리

MD5

SHA1

SHA256

STEELCORGI

e5791e4d2b479ff1dfee983ca6221a53

e55514b83135c5804786fa6056c88988ea70e360

95964d669250f0ed161409b93f7a131bfa03ea302575d555d91ab5869391c278

STEELCORGI

0845835e18a3ed4057498250d30a11b1

c28366c3f29226cb2677d391d41e83f9c690caf7

7d587a5f6f36a74dcfbcbaecb2b0547fdf1ecdb034341f4cc7ae489f5b57a11d

STEELCORGI

d985de52b69b60aa08893185029bcb31

a3e75e2f700e449ebb62962b28b7c230790dc25d

cd06246aff527263e409dd779b517157882a1f5f74a84ad78b3b0c44d306bfc3

TINYSHELL

4ff6647c44b0417c80974b806b1fbcc3

fa36f10407ed5a6858bd1475d88dd35927492f52

55397addbea8e5efb8e6493f3bd1e99f9742ff4cfe0f0d3da7e92067904b5194

TINYSHELL

13f6601567523e6a37f131ef2ac4390b

4228d71c042d08840089895bfa6bd594b5299a89

1da09cac0e414020ce9c48bcef47ec96e3587b

TINYSHELL

4e9967558cd042cac8b12f378db14259

018bfe5b9f34108424dd63365a14ab005e249fdd

5f46a25473b9dda834519093c66cced0e3630378c2a953ebd83f90f3777f2e19

STEELHOUND

a4617c9a4bde94e867f063c28d763766

097d3a15510c48cdb738344bdf00082e546827e8

161a2832baba6ff6f9f1b52ed8facfa1197cfc7947fe58152b3617a258cf52b0

MITRE ATT&CK

Discovery

  • T1016:System Network Configuration Discovery
  • T1018:Remote System Discovery
  • T1049:System Network Connections Discovery
  • T1082:System Information Discovery
  • T1083:File and Directory Discovery
  • T1135:Network Share Discovery

Lateral Movement

  • T1021:Remote Services
  • T1021.004:SSH

Credential Access

  • T1003:OS Credential Dumping
  • T1003.008:/etc/passwd and /etc/shadow
  • T1110:Brute Force
  • T1110.001:Password Guessing
  • T1552:Unsecured Credentials
  • T1552.003:Bash History
  • T1552.004:Private Keys
  • T1556.003:Pluggable Authentication Modules

Command and Control

  • T1090:Proxy
  • T1095:Non-Application Layer Protocol
  • T1105:Ingress Tool Transfer
  • T1572:Protocol Tunneling
  • T1573.001:Symmetric Cryptography

Execution

  • T1053.001:At (Linux)
  • T1059:Command and Scripting Interpreter
  • T1059.004:Unix Shell

Collection

  • T1056.001:Keylogging
  • T1560:Archive Collected Data
  • T1560.001:Archive via Utility
  • T1560.002:Archive via Library

Defense Evasion

  • T1014:Rootkit
  • T1027:Obfuscated Files or Information
  • T1070:Indicator Removal on Host
  • T1070.002:Clear Linux or Mac System Logs
  • T1070.004:File Deletion
  • T1070.006:Timestomp
  • T1140:Deobfuscate/Decode Files or Information
  • T1480.001:Environmental Keying
  • T1548.001:Setuid and Setgid
  • T1620:Reflective Code Loading

Persistence

  • T1543.002:Systemd Service
  • T1547.006:Kernel Modules and Extensions