์์ฑ: 2026-04-26 (hostpital ๊ฒฉ๋ฆฌ ํ์ sprint)
1์ฐจ ๋ณด๊ณ ์: hospital-cryptojack-incident-20260425.md (q9tcDR7k ์ฑ๊ตด๊ธฐ ๊ฒฉ๋ฆฌ)
๋ฒ์ ํ์ฅ: ์ ์ง์ ์นจํด ์ถ์ โ THC ๋๊ตฌ + ์์ฉ RAT + ๋ค์ค persistence ๋ฐ๊ฒฌ
๊ฒฉ๋ฆฌ ์๋ฃ: ~50 IOC (1์ฐจ 17๊ฑด + 2์ฐจ 33๊ฑด)
๋์์: Claude Code (์์ CEO ๊ถํ, /sprint v2)
/sprint review 1์ฐจ ๊ฒฉ๋ฆฌ๋ ํ๋ฉด์ผ ๋ฟ. ์ฌ์ฉ์ ํต์ฐฐ("GitHub ํ ํฐ ์์ ์ผ๋ก ์ฐจ๋จ๋๋ค")๋ก ์ง์ง ๊ทธ๋ฆผ์ด ๋ณด์:
appleboy/ssh-action) โ hospital๋ง ์ด ํต๋ก ๋ณด์ | ์์ | ๋จ๊ณ | ์ฐ์ถ๋ฌผ |
|---|---|---|
| 2026-03-13 16:48 | Stage 1: THC ํ์ธํธ ๋ฐฐํฌ | /usr/local/bin/{blitz, gs_funcs, gs-mount, gs-sftp, terminate-helper, toket_dso.so.0, toket_uchroot_dso.so.0} |
| 2026-04-16 16:20 | Stage 2: ๋ฉ์ธ root ๊ถํ + ๋ค์ค persistence | terminate.service (9์ผ active), accounts-helper.service (UPX RAT), /etc/ssh/keys/authorized_keys (sshd backdoor), 00-keys.conf (sshd config ๋ณ์กฐ), 50unattended-check (apt hook), cron auto-upgrade/terminate, /usr/lib/security/.config/.ts |
| 2026-04-23 17:06 | Stage 3: ์ถ๊ฐ ๋ฐฑ๋์ด | /root/.cache/.sys/ksoftirqd (8.3MB ELF), user systemd ksoftirqd.service |
| 2026-04-24 07:48 | Stage 4: ์ ์ฐฐ + creds ํ์ทจ | deploy keys atime ๊ฐฑ์ (3์ข
), .ed1a089d8/.ed4f59376/.ef225fd73.sh POST โ 144.172.116.48 / 178.128.41.3 |
| 2026-04-25 08:08 | Stage 5: ์์ตํ | q9tcDR7k ์ฑ๊ตด๊ธฐ ์์ (UPX XMRig ๋ณ์ข
, C&C 47.239.60.142:33333), 8์ฝ์ด ํ๋ก๋ |
| 2026-04-25 23:02 | ๋ฐ๊ฒฌ | paperclip /mco-health ๋ฉ๋ชจ๋ฆฌ 64% โ top โ q9tcDR7k ๋ฐ๊ฒฌ |
| 2026-04-25 23:13 | 1์ฐจ ๊ฒฉ๋ฆฌ | 17 IOC (๋ณด๊ณ ์ v1) |
| 2026-04-26 00:30 | 2์ฐจ ๊ฒฉ๋ฆฌ sprint | ์ฌ์ฉ์ GitHub ํ ํฐ ํต์ฐฐ โ THC backdoor 33๊ฑด ์ถ๊ฐ ๋ฐ๊ฒฌยท๊ฒฉ๋ฆฌ |
๋ฐ๊ฒฌ ๊ฐ๋ฅ ์์ : 3/13 โ 4/16 โ 4/23 โ 4/24 โ 4/25 = ์์คํ ์ ์ ์ด๋ 5ํ attacker ํ๋. ์ฌ์ฉ์ ์ฝ๋ฉํธ "6th incident" ๋ถํฉ.
| ํ์ผ | ์ฉ๋ | SHA256 | ์์น |
|---|---|---|---|
q9tcDR7k.recovered |
XMRig UPX ์ฑ๊ตด๊ธฐ | 859b323f02eefe...218d9e3 |
quarantine root |
terminate-engine |
THC gs-netcat (toket) | c0a51b2d6de4...26a2d6c |
persistence-4-16 |
terminate-runner |
engine launcher | 39818452302e...2cb |
persistence-4-16 |
accounts-helper |
UPX packed RAT | 4f13658749ca...a98be |
persistence-4-16 |
usr_sbin_terminate |
watchdog (4039575 PID, 9์ผ running) | (๊ฒฉ๋ฆฌ ํ ๋ถ์) | persistence-4-16 |
/usr/local/bin/blitz (5,798 bytes)/usr/local/bin/gs_funcs (12,704)/usr/local/bin/gs-mount (2,399)/usr/local/bin/gs-sftp (1,653)/usr/local/bin/terminate-helper (5,312)/usr/local/bin/toket_dso.so.0 (64,048) โ LD_PRELOAD DSO/usr/local/bin/toket_uchroot_dso.so.0 (39,720) โ uchroot DSO/etc/ssh/keys/authorized_keys โ 2๊ฐ RSA "central@hospital-prod" (1150 bytes, chattr +ia lock)/etc/ssh/sshd_config.d/00-keys.conf โ AuthorizedKeysFile /etc/ssh/keys/authorized_keys .ssh/authorized_keys/root/.ssh/authorized_keys ์ hospital-server ํค (๋งค์นญ private key ๋ถ์ฌ = backdoor)/etc/systemd/system/terminate.service + .timer (active running 9์ผ)/etc/systemd/system/accounts-helper.service (Restart=always)/root/.config/systemd/user/ksoftirqd.service (user-level)/etc/cron.daily/terminate โ /usr/lib/security/.config ํธ์ถ/etc/cron.d/auto-upgrade (base64 โ http://0x1x2x3.top | sh)/etc/ld.so.preload ๋ณ์กฐ (libkeyutils.so.1 31KB + .libpam_sys.so 31KB)/etc/apt/apt.conf.d/50unattended-check (apt-get/dpkg ์ backdoor ์๋ ์ฌ์คํ)/usr/lib/security/.config (ELF, terminate cron ํ๊ฒ)/usr/lib/security/.ts (timestamp marker)/var/log/wtmp, /var/log/btmp, /var/log/lastlog ์ญ์ โ ์ฌ์์ฑ/root/.bash_history ์ญ์ โ ์ฌ์์ฑchattr +ia lock (root๋ ๋ณ๊ฒฝ ๋ชปํ๊ฒ)/tmp/.ed1a089d8.sh (86,763 bytes) โ POST 144.172.116.48:8080/tmp/.ed4f59376.sh (86,763) โ POST 144.172.116.48:8080/tmp/.ef225fd73.sh (18,574) โ POST 178.128.41.3:8080aws_full.txt, gcp_sa_full.txt, azure_full.txt, db_uri.txt, tokens.txt, privkey.txt, history.txt, environ.txt, proc_all.txt/tmp/.n โ Node.js reverse shell to 185.177.72.3:20024/tmp/config.json + /var/tmp/config.json โ XMRig (pool 62.60.246.210:443, user NEUGLOBALLY799911)/root/.cache/.sys/ksoftirqd 8.3MB ELF + .c.json config| 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 |
| 185.177.72.3 | 20024 | reverse shell |
| 62.60.246.210 | 443 | XMRig pool, user NEUGLOBALLY799911 |
0x1x2x3.top |
80 | drive-by downloader |
quarantine/
โโโ q9tcDR7k.recovered (๋ฉ๋ชจ๋ฆฌ ๋ณต์)
โโโ persistence-3-13/ (THC ํ์ธํธ)
โโโ persistence-4-16/ (๋ฉ์ธ stage ์ฐ์ถ๋ฌผ)
โโโ persistence-4-23-user/ (user systemd)
โโโ sshd-backdoor/ (sshd ๋ณ์กฐ)
โโโ rootkit/ (libkeyutils + libpam_sys + .config + .ts)
โโโ payloads/ (.ed*.sh + dot_n + ksoftirqd_fake)
โโโ configs/ (XMRig 2์ข
)
โโโ workflows-disabled/ (deploy.yml 3์ข
)
โโโ ssh-snapshot/ (๋ณ๊ฒฝ ์ .ssh/* ๋ฐฑ์
)
โโโ workflows/ (๋ชจ๋ .github ๋ฐฑ์
)
โโโ sha256.manifest (์ ์ฒด hash)
/etc/cron.d/auto-upgrade โ ๋น ํ์ผ + chattr +i (์ฌ์์ฑ ์ฐจ๋จ)
/etc/cron.daily/terminate โ ๋น ํ์ผ + chattr +i
/usr/lib/security/ โ ๋น ๋๋ ํ ๋ฆฌ + chattr +i
attacker๊ฐ ๊ฐ์ ์ด๋ฆ์ผ๋ก backdoor ์ฌ์์ฑ ์๋ํด๋ immutable๋ก ๋งํ.
cadvisor privileged ์ปจํ
์ด๋ ์ ์ง (escape vector ์์ฌ #1)PasswordAuthentication no 3 conf ์ผ๊ด ์ ์ฉgithub-actions-deploy SSH ํค disableappleboy/ssh-action ์ํฌํ๋ก 3์ข
๋นํ์ฑํhttps://github.com/settings/tokens?type=beta
โ ํ์ฌ PAT (github_pat_11AEJ646Y0diRDw...) Revoke
โ ์ ํ ํฐ ๋ฐ๊ธ (Contents:RW, Metadata:R for meneco/*)
โ ์๋ ค์ฃผ์๋ฉด paperclip + kahan์ ์๋ ์ ์ฉ
meneco/legal Settings โ Secrets:
DEPLOY_HOST, DEPLOY_USER, DEPLOY_SSH_KEY (๋ชจ๋ ํ์ )
meneco/assistant-platform Settings โ Secrets:
SSH_HOST, SSH_USER, SSH_PRIVATE_KEY (๋ชจ๋ ํ์ )
meneco/hospital Settings โ Secrets:
(ํ์ธ ํ์)
์ฐธ์กฐ: docs/04-report/hospital-secret-rotation-checklist-20260425.md
docs/01-plan/hospital-nuke-rebuild-20260425.plan.md| ์๋ฒ | ๊ฒฐ๊ณผ |
|---|---|
| kahan (66.42.42.24) | โ ๊นจ๋ (ld.so.preload ์์, libkeyutils ์ ์, /usr/lib/security ์์) |
| kahanclub (45.32.57.139) | โ ๊นจ๋ + anti-miner ๊ฐ๋ + kill-miners.sh 1๋ถ cron ์ด์ ์ค |
| gate (167.179.73.229) | โ ๊นจ๋ |
| paperclip (139.180.195.48) | โ ๊นจ๋ |
์ด์ : hospital๋ง GitHub Actions SSH deploy ํต๋ก(github-actions-deploy ํค + appleboy workflow)๋ฅผ ๋ณด์ . ๋ค๋ฅธ ์๋ฒ๋ ํต๋ก ์์ฒด๊ฐ ์์ด ๊ฐ์ attacker๊ฐ ๋ชป ๋ค์ด๊ฐ.
๋ณธ sprint ์ค ์ ๋ ๊ฑด๋๋ฆฌ์ง ์์ ๊ฒ:
PasswordAuthentication yes โ no ๋ง ๋ณ๊ฒฝ (๋ณด์ ๊ฐํ)apt-get install --reinstall libkeyutils1 ๋ง ์์คํ
ํจํค์ง ๋ณ๊ฒฝ. dpkg ์ ์ ์ข
๋ฃ.