
리눅스 보안 점검
리눅스 서버용 암호화폐 채굴기 탐지, 제거 및 강화 도구 키트.
실제 침해 대응 경험을 바탕으로 제작 — 루트킷 기법을 사용하여
ps,top,htop,btop에서 숨는 채굴기를 탐지합니다.
git clone https://gitlab.com/abdom.seada/security-checks.git
cd security-checks
sudo bash setup.sh
🔀 브랜치:
master— 이 도구 키트는master브랜치에 있습니다. 향후 다른 보안 스크립트가 별도 브랜치에 추가될 수 있습니다.
⚠️ 클론 직후
setup.sh를 한 번 실행하세요 — 이를 생략하면 오류의 주요 원인이 됩니다.
sudo bash setup.sh
setup.sh가 모든 것을 자동으로 처리합니다:
설치 성공 시 예상 출력:
✅ Setup complete — all checks passed!
Next steps:
sudo ./miner-hunter scan # Safe read-only scan
sudo ./miner-hunter full # Scan → Kill → Harden
💡 왜 필요한가요? 리눅스는 파일에
+x플래그가 없으면 실행하지 않습니다. Git 및 SCP 전송 시 이 플래그가 제거됩니다.setup.sh는 기본 스크립트가 의존하는lib/모듈을 포함하여 모든 파일을 한 번에 수정합니다.
sudo ./miner-hunter scan # ✅ 안전 — 읽기 전용, 변경 없음
sudo ./miner-hunter full # ⚠️ 전체 파이프라인: 스캔 → 종료 → 강화
sudo ./miner-hunter scan --dry-run # 👁️ 미리보기 모드 — 수행될 작업 표시
| 옵션 | 설명 |
|---|---|
-d, --dry-run | 변경 사항 없이 모든 작업 미리보기 |
-e, --evidence DIR |
실제 상황과 각 상황에서 정확히 실행해야 할 내용.
top에는 아무것도 표시되지 않습니다"이것은 전형적인 루트킷 증상입니다. 채굴기가 사용자 공간 도구로부터 숨고 있지만 하드웨어 성능 카운터로부터는 숨을 수 없습니다.
# 1단계: 먼저 안전한 스캔 실행 — 아무것도 건드리기 전에 무엇이 있는지 확인
sudo ./miner-hunter scan
채굴기가 존재할 경우 볼 수 있는 내용:
🚨 [CRITICAL] CPU anomaly: 97% user CPU but top shows max 2% per process
🚨 [CRITICAL] perf detected 4 hidden threads consuming ~94% total CPU
🚨 [CRITICAL] Active connection to 185.x.x.x:9200 (known mining port)
🚨 [CRITICAL] Fake kernel thread PID=3421 NAME=[kworker/0:1] EXE=/tmp/.x/miner
# 2단계: 채굴기 종료 및 풀 차단
sudo ./miner-hunter kill
# 3단계: 서버를 강화하여 다시 돌아올 수 없도록 함
sudo ./miner-hunter harden
의심스러운 것을 발견했습니다 — 비정상적인 외부 트래픽, 생성하지 않은 크론 작업, 이상한 이름의 프로세스 — 하지만 확실하지 않습니다.
# 전체 스캔 실행 — 완전히 안전, 읽기 전용, 변경 없음
sudo ./miner-hunter scan
# 그런 다음 구조화된 보고서 읽기
sudo ./miner-hunter report
/root/miner_evidence_*/report.txt에 있는 보고서는 각 발견 항목을 심각도별로 분류합니다:
[CRITICAL] 항목 → 즉시 kill 진행[WARNING] 항목 → 조치 전 수동 검토채굴기에 지속성 메커니즘이 있습니다 — 크론 작업, systemd 서비스, PM2 항목 또는 셸 프로필 백도어로 종료 후 다시 생성됩니다.
sudo ./miner-hunter scan
출력에서 다음을 찾으세요:
⚠️ [WARN] Suspicious cron entry: * * * * * /tmp/.x/update
🚨 [CRITICAL] Malicious systemd service: /etc/systemd/system/update-check.service
🚨 [CRITICAL] PM2 process 'app-worker' has 8432 restarts — likely miner respawn loop
🚨 [CRITICAL] Shell profile backdoor detected in /root/.bashrc
# kill은 실행 중인 프로세스뿐만 아니라 모든 지속성 아티팩트를 제거합니다
sudo ./miner-hunter kill
# 그런 다음 강화를 실행하여 워치독을 설치하면 다시 생성되는 경우 알림을 받습니다
sudo ./miner-hunter harden
💡
kill실행 후, 워치독 크론이 5분마다 실행되어/var/log/miner_hunter/watchdog_alerts.log에 기록합니다 — 무언가 다시 나타나면 즉시 알 수 있습니다.
배포 전 사전 강화 — 채굴기 없음, 침해 없음, 그냥 잠금 설정.
# harden 단독 실행 — 스캔이나 kill 필요 없음
sudo ./miner-hunter harden
이것은 다음을 수행합니다:
sshd 감옥과 함께 활성화되어 있는지 확인/usr/bin 무결성 기준 생성 (MD5 체크섬 — 이후 변조된 바이너리 탐지 가능)kill 후, 검증 단계에서 채굴기가 여전히 실행 중일 수 있다고 보고합니다:
⚠️ MINER MAY HAVE RESPAWNED
CPU: 89% | Mining conns: 1
Firewall blocks are in place — miner can't reach pool
Consider a REBOOT or OS REINSTALL
# 1. 방화벽 차단은 이미 설정되어 있음 — 채굴기가 풀에 도달할 수 없음
# 차단이 활성화되어 있는지 확인:
iptables -L OUTPUT -n | grep DROP
# 2. 두 번째 스캔을 실행하여 무엇이 살아남았는지 확인
sudo ./miner-hunter scan
# 3. 프로세스를 숨기는 커널 모듈 루트킷 확인
lsmod | grep -iE 'diamorphine|reptile|kovid|rootkit'
# 4. 0이 아닌 taint 값 = 외부 커널 모듈 로드됨 (루트킷 지표)
cat /proc/sys/kernel/tainted
커널 taint 값이 0이 아니거나 알려진 루트킷 모듈이 나타나면 — 채굴기가 커널 수준 제어권을 가지고 있습니다. 이 시점에서 가장 안전한 방법은 알려진 깨끗한 스냅샷에서 전체 OS를 재설치하는 것입니다.
harden 후, 워치독 크론이 이미 설치되어 있습니다. 사용 방법은 다음과 같습니다:
# 실시간으로 알림 로그 보기
tail -f /var/log/miner_hunter/watchdog_alerts.log
# 워치독 크론 작업이 등록되었는지 확인
cat /etc/cron.d/miner-watchdog
# 기준이 생성된 이후 /usr/bin 바이너리 변경 사항 확인
md5sum --check /var/lib/miner_hunter/usrbin_baseline.md5 --quiet
마지막 명령의 출력이 있으면 기준 이후 시스템 바이너리가 수정되었음을 의미합니다 — 즉시 조사하십시오.
| 기법 | 탐지 대상 |
|---|---|
perf 하드웨어 PMC 프로파일링 | 숨겨진 CPU 소비자 — 루트킷은 하드웨어 카운터를 위조할 수 없음 |
/proc 델타 샘플링 | PID별 직접 커널 수준 CPU 계정 |
| CPU 이상 탐지 | 설명할 수 있는 가시적 프로세스 없이 높은 CPU |
| 기법 | 탐지 대상 |
|---|---|
/proc/net/tcp 직접 읽기 |
sudo ./miner-hunter kill을 실행하면 정확히 다음 순서로 진행됩니다:
DROP 규칙이 종료 전에 적용되어 채굴기가 다시 생성되어도 재연결할 수 없음SIGKILL로 대상 지정perf를 다시 실행하고 /proc/net/tcp를 확인하여 CPU가 낮아지고 연결이 사라졌는지 확인security-checks/ ← repo root (master branch)
├── miner-hunter # Entry point — this is what you run
├── setup.sh # ⚙️ First-time setup — run once after cloning
├── lib/
│ ├── common.sh # Shared utilities: logging, colors, helpers
│ ├── detect_hidden.sh # Hidden process & rootkit detection
│ ├── detect_cpu.sh # CPU profiling via perf & /proc
│ ├── detect_network.sh # Mining pool connection detection
│ ├── detect_persistence.sh # Persistence mechanism detection
│ ├── kill_miner.sh # Process killing & artifact removal
│ └── harden.sh # Post-incident hardening
├── README.md
└── LICENSE
실행할 때마다 다음이 생성됩니다:
이 도구는 다음을 수행하는 암호화폐 채굴기에 대한 실제 침해 대응 중에 구축되었습니다:
next로 이름 변경kthreadd로 이름이 변경된 스레드 그룹 리더 사용/proc/PID/exe → (deleted))ps, top, htop, btop에서 완전히 보이지 않음perf 하드웨어 CPU 카운터 프로파일링을 통해서만 탐지 가능MIT
| 단계 | 설명 |
|---|
| ✅ 권한 | miner-hunter 및 모든 lib/*.sh 스크립트에 chmod +x 적용 |
| ✅ 디렉토리 | /var/log/miner_hunter/ 및 /var/lib/miner_hunter/ 생성 (root 전용, 700) |
| ✅ 의존성 | perf, mpstat, iptables, fail2ban, bc, strings 확인 — 누락된 항목 자동 설치 |
| ✅ 자체 테스트 | ./miner-hunter --version 실행하여 모든 것이 올바르게 연결되었는지 확인 |
| 명령 | 설명 | 시스템 변경? |
|---|
scan | 전체 탐지 스캔 — 숨겨진 프로세스, CPU, 네트워크, 지속성 | ✅ 아니오 |
kill | 식별된 채굴기 종료, 풀 IP 차단, 아티팩트 제거 | ⚠️ 예 |
harden | 사후 강화 — SSH, 방화벽, 워치독, 무결성 기준 | ⚠️ 예 |
full | 스캔 → 종료 → 강화를 단계별 확인 프롬프트와 함께 실행 | ⚠️ 예 |
report | 가장 최근 스캔 보고서 표시 | ✅ 아니오 |
/root/miner_evidence_* 대신 사용자 지정 디렉토리에 증거 저장 |
-h, --help | 도움말 표시 |
-v, --version | 버전 표시 |
| 기법 | 탐지 대상 |
|---|
/proc vs ps 비교 | 사용자 공간 도구에 보이지 않는 프로세스 |
| LD_PRELOAD 하이재킹 | libc를 후킹하여 프로세스를 숨기는 악성 공유 라이브러리 |
| 커널 모듈 루트킷 | Diamorphine, Reptile, Kovid 및 기타 알려진 루트킷 |
| 가짜 커널 스레드 | [kworker], [kthreadd], [kswapd]로 위장하는 채굴기 |
| 변조된 시스템 바이너리 | 교체된 ps, top, ls, ss, netstat |
%user활성 연결 — 후킹된 ss/netstat 우회 |
| 채굴 포트 탐지 | 포트 3333, 4444, 5555, 7777, 9200, 14433, 14444, 45560 |
| 채굴 도메인 확인 | 알려진 풀 도메인을 확인하고 활성 연결과 교차 확인 |
| 소켓-PID 매핑 | 각 채굴 연결을 소유한 프로세스 추적 |
| 위치 | 확인 사항 |
|---|
| Cron | /etc/cron*, /var/spool/cron/, 모든 사용자 crontab |
| Systemd | 의심스러운 항목에 대한 모든 유닛 파일 및 타이머 |
| Udev 규칙 | 장치 이벤트 시 하드웨어 트리거 실행 |
| PM2 | 극심한 재시작 횟수를 가진 Node.js 프로세스 관리자 항목 |
| 셸 프로필 | .bashrc, .bash_profile, /etc/profile, /etc/profile.d/* |
| SSH | 모든 사용자의 authorized_keys 파일 |
| 웹쉘 | Node.js 프로젝트 디렉토리 내 PHP 파일 |
| XMRig 설정 | 일반적인 채굴기 드롭 위치의 config.json |
| 조치 | 세부 사항 |
|---|
| 방화벽 지속성 | 재부팅 시마다 iptables 채굴 차단을 복원하는 systemd 서비스 |
| SSH 감사 | PermitRootLogin, PasswordAuthentication, MaxAuthTries 확인 — 권장 값 출력 |
| Fail2ban 확인 | sshd 감옥이 활성화되어 있는지 확인하고 현재 차단된 IP 보고 |
| 채굴기 워치독 | 5분마다 크론 작업 — CPU 이상, LD_PRELOAD, 채굴 포트, PHP 웹쉘 확인 |
/usr/bin 기준 | /usr/bin의 모든 바이너리에 MD5 체크섬 생성하여 향후 변조 탐지 |
| 요구 사항 | 세부 사항 |
|---|
| OS | Linux — Ubuntu 24.04 LTS, Debian 13에서 테스트됨 |
| 권한 | root (sudo)로 실행해야 함 |
| setup.sh에서 자동 설치 | perf, mpstat (sysstat), bc, strings (binutils) |
| 권장 | fail2ban — 누락 시 플래그 표시, 자동 설치되지 않음 |
| 필수 (자동 설치되지 않음) | iptables — kill/harden 단계에 필요 |
| 출력 | 위치 | 내용 |
|---|
| 증거 디렉토리 | /root/miner_evidence_YYYYMMDD_HHMMSS/ | 캡처된 바이너리, perf 보고서, 채굴기 설정 |
| 로그 파일 | /var/log/miner_hunter/run_YYYYMMDD_HHMMSS.log | 전체 타임스탬프가 찍힌 실행 로그 |
| 보고서 | evidence_dir/report.txt | 심각도와 함께 구조화된 발견 요약 |
| 워치독 알림 | /var/log/miner_hunter/watchdog_alerts.log | harden 이후 지속적인 알림 |
| 무결성 기준 | /var/lib/miner_hunter/usrbin_baseline.md5 | harden 이후 /usr/bin 체크섬 |