์ํ: ๋ชจ๋ backdoor ๊ฒฉ๋ฆฌ + RCE ํต๋ก ์ฐจ๋จ + ๊ฒ์ฆ๋ ๊ฐ๋ ์ด์ + ์ ์ ๋๋ฉ์ธ ์๋
๋์์: Claude Code (์์ CEO ๊ถํ, /sprint v2 ๋ค์ค ๋จ๊ณ)
์ด sprint ์๊ฐ: ~3์๊ฐ (1์ฐจ ๊ฒฉ๋ฆฌ 17๋ถ + 2์ฐจ backdoor hunting 1์๊ฐ + 3์ฐจ RCE ์ฐจ๋จ 1.5์๊ฐ)
์ด๋ฒ ์นจํด๋ THC group ๋๊ตฌ + ์์ฉ RAT + GitHub deploy ํต๋ก + Next.js Server Actions RCE ์ ํ-์คํํธ๋ผ ๋ค๋จ๊ณ ์บ ํ์ธ.
๊ทผ๋ณธ ์์ธ: agency-web Next.js v15.1.0 (CVE-2025-29927 + npm audit critical 1ยทhigh 7ยทmoderate 14) โ /api/v1/* proxy โ agency-api (port 10100) ์์์ child_process spawn โ backdoor ๋ฐํ
ํด๊ฒฐ:
x-middleware-subrequest ํค๋ strip (CVE-2025-29927)kill-miners.sh 1๋ถ cron โ 15:15 attacker xmrig ์๋ 6์ด ์๋ ์ฐจ๋จ ์ค์ฆ/api/v1/* proxy โ agency-api โ child_process.spawn โ nohup sh /tmp/.e6d7461dc.shdigest: 'L29wdC9hZ2VuY3kvLi4u' (base64 = ํ๊ฒฝ๋ณ์ dump), /tmp/xmrig: Permission denied (noexec ์ฐจ๋จ)/root/.ssh/authorized_keys์ github-actions-deploy ํค (๋ค๋ฅธ ์๋ฒ๋ ์์)appleboy/ssh-action ์ฌ์ฉ ์ํฌํ๋ก 3์ข
(legal/assistant deploy/scheduled)github-actions-deploy ํค ์์| IOC | ์ ์ฒด |
|---|---|
| q9tcDR7k | UPX XMRig ๋ณ์ข (8์ฝ์ด ํ๋ก๋) |
| terminate-engine 2.8MB | THC gs-netcat (toket) |
| accounts-helper 2.2MB | UPX RAT (auto-update, hide) |
| ksoftirqd ELF 8.3MB | kernel thread ์์ฅ |
| .libpam_sys.so + libkeyutils.so.1 | ld.so.preload rootkit |
| THC ํ์ธํธ 7๊ฐ (blitz, gs_funcs, gs-mount, gs-sftp, terminate-helper, toket_*.so) | gsocket/toket DSO |
| .ed*.sh ร 4 | creds ํ์ทจ๊ธฐ (POST 144.x/178.x/216.x) |
| /tmp/.n | Node.js reverse shell |
| XMRig configs ร 2 | RandomX, NEUGLOBALLY799911 |
/etc/ssh/keys/authorized_keys (central@hospital-prod RSA 2๊ฐ)/etc/ssh/sshd_config.d/00-keys.conf (AuthorizedKeysFile ๋ณ์กฐ)/root/.ssh/authorized_keys์ hospital-server ํค (๋งค์นญ priv key ๋ถ์ฌ)proxy_set_header x-middleware-subrequest "" ์ถ๊ฐ| IP / Host | ํฌํธ | ์ฉ๋ |
|---|---|---|
| 47.239.60.142 (Alibaba) | 33333 | q9tcDR7k C&C |
| 144.172.116.48 | 8080 | creds exfil 1 |
| 178.128.41.3 (DigitalOcean) | 8080 | creds exfil 2 |
| 216.126.225.20 | 8080 | creds exfil 3 (4/26 ๋ฐ๊ฒฌ) |
| 185.177.72.3 | 20024 | reverse shell |
| 62.60.246.210 | 443 | XMRig pool, user NEUGLOBALLY799911 |
0x1x2x3.top |
80 | drive-by downloader |
[14:37:17] LOG-TAMPER-ALERT: /var/log/auth.log missing โ ์๋ ๋ณต๊ตฌ
[14:37:17] LOG-TAMPER-ALERT: /var/log/syslog missing โ ์๋ ๋ณต๊ตฌ
[14:59:04] CREDENTIAL HARVEST DIR REMOVED: /tmp/.e6d7461dc
[14:59:07] Removed 1 threats
[15:15:02] THREAT FOUND: xmrig PIDs=1825812 โ attacker ๋ ์๋!
[15:15:08] Removed 1 threats โ 6์ด ๋ง์ ์๋ ์ฐจ๋จ โ
/tmp/xmrig ์ง์ ์คํ โ Permission denied ์ฐจ๋จsh /tmp/.e*.sh ๋ sh ์ธํฐํ๋ฆฌํฐ ํตํด ์ฐํ๋จ (kill-miners.sh๊ฐ ์ก์)| ์์ญ | ๊ฒฐ๊ณผ |
|---|---|
| paperclip 10 HQ ๋๋ฉ์ธ | 200 OK ๋ชจ๋ โ |
| starium 6 ๋๋ฉ์ธ | assistant/finance/shop/legal/pet 307 โ , agency 502 (์ ์ง ์๋) |
| gate ํธ๋ ์ด๋ฉ | gate-pair-hedge active, gate-admin-dashboard active โ (๋ฏธ์ ์ด) |
| kahan ํธ๋ ์ด๋ฉ | gunja-* systemd ๋์ โ (๋ฏธ์ ์ด) |
| hospital PM2 | 27/30 (agency 3๊ฐ ์ ์ง ์๋) |
| hospital Docker | 34 ์ปจํ ์ด๋ (cadvisor ์ ์ง ์๋) |
| hospital load 1min | 0.50 (์ ์) |
| kill-miners.sh | 1๋ถ cron + attacker ์ฐจ๋จ ์ค์ฆ |
https://github.com/settings/tokens?type=beta
โ ํ์ฌ PAT (github_pat_11AEJ646Y0diRDw...) Revoke
โ ์ fine-grained ํ ํฐ ๋ฐ๊ธ (Contents:RW for meneco/*)
โ ํ ํฐ ์๋ ค์ฃผ์๋ฉด paperclip + kahan ์๋ ์ ์ฉ
์์กด ๋ฉ๋ชจ๋ฆฌ backdoor ์ฐ๋ ค ์. /opt/agency ํ๊ธฐ + GitHub fresh clone + npm audit fix --force + ์ฝ๋ audit.
๋ณธ sprint ์ค ์ ๋ ๊ฑด๋๋ฆฌ์ง ์์ ๊ฒ:
PasswordAuthentication no ์ผ๊ด ์ ์ฉ + from= IP ์ ํ (๋ณด์ ๊ฐํ๋ง)์์คํ ๋ณ๊ฒฝ (์ ๋น ํ์):
apt-get install --reinstall libkeyutils1 (rootkit ์ ์ํ)npm audit fix /opt/agency (์ ์ง ์ํ)