Linux 應急響應入門——入侵排查
賬號安全:
1、使用者資訊檔案/etc/passwd
#格式:account:password:UID:GID:GECOS:directory:shell
#使用者名稱:密碼:使用者ID:組ID:使用者說明:家目錄:登陸之後的 shell
root:x:0:0:root:/root:/bin/bash
#檢視可登入使用者:
cat/etc/passwd|grep/bin/bash
#檢視UID=0的使用者
awk-F:'$3==0{print$1}'/etc/passwd
#檢視sudo許可權的使用者
more/etc/sudoers|grep-v"^#\|^$"|grep"ALL=(ALL)"
注意:無密碼只允許本機登陸,遠端不允許登陸
2、影子檔案:/etc/shadow
#使用者名稱:加密密碼:密碼最後一次修改日期:兩次密碼的修改時間間隔:密碼有效期:密碼修改到期到的警告天數:密碼過期之後的寬限天數:賬號失效時間:保留
root:$6$oGs1PqhL2p3ZetrE$X7o7bzoouHQVSEmSgsYN5UD4.kMHx6qgbTqwNVC5oOAouXvcjQSt.Ft7ql1WpkopY0UV9ajBwUt1DpYxTCVvI/:16809:0:99999:7:::
3、檢視當前登入使用者及登入時長
who#檢視當前登入系統的所有使用者(tty本地登陸pts遠端登入)
w#顯示已經登入系統的所用使用者,以及正在執行的指令
uptime#檢視登陸多久、多少使用者,負載狀態
4、排查使用者登入資訊
- 檢視最近登入成功的使用者及資訊
#顯示loggedin表示使用者還在登入
#pts表示從SSH遠端登入
#tty表示從控制檯登入,就是在伺服器旁邊登入
last
- 檢視最近登入失敗的使用者及資訊:
#ssh表示從SSH遠端登入
#tty表示從控制檯登入
sudolastb
- 顯示所有使用者最近一次登入資訊:
lastlog
在排查伺服器的時候,黑客沒有線上,可以使用last
命令排查黑客什麼時間登入的有的黑客登入時,會將/var/log/wtmp
檔案刪除或者清空,這樣我們就無法使用last命令獲得有用的資訊了。
在黑客入侵之前,必須使用chattr +a
對/var/log/wtmp
5、sudo使用者列表
/etc/sudoers
入侵排查:
#查詢特權使用者特權使用者(uid為0):
awk-F:'$3==0{print$1}'/etc/passwd
#查詢可以遠端登入的帳號資訊:
awk'/\$1|\$6/{print$1}'/etc/shadow
#除root帳號外,其他帳號是否存在sudo許可權。如非管理需要,普通帳號應刪除sudo許可權:
more/etc/sudoers|grep-v"^#\|^$"|grep"ALL=(ALL)"
#禁用或刪除多餘及可疑的帳號
usermod-Luser#禁用帳號,帳號無法登入,/etc/shadow第二欄為!開頭
userdeluser#刪除user使用者
userdel-ruser#將刪除user使用者,並且將/home目錄下的user目錄一併刪除
通過.bash\_history
檔案檢視帳號執行過的系統命令:
開啟 /home 各帳號目錄下的 .bash_history,檢視普通帳號執行的歷史命令。
為歷史的命令增加登入的 IP 地址、執行命令時間等資訊:
#1、儲存1萬條命令:
sed-i's/^HISTSIZE=1000/HISTSIZE=10000/g'/etc/profile
#2、在/etc/profile的檔案尾部新增如下行數配置資訊:
USER_IP=`who-uami2>/dev/null|awk'{print$NF}'|sed-e's/[()]//g'`
if["$USER_IP"=""]
then
USER_IP=`hostname`
fi
exportHISTTIMEFORMAT="%F%T$USER_IP`whoami`"
shopt-shistappend
exportPROMPT_COMMAND="history-a"
#3、讓配置生效
source/etc/profile
注意:歷史操作命令的清除:history -c
該操作並不會清除儲存在檔案中的記錄,因此需要手動刪除.bash\_profile
檔案中的記錄
檢查埠連線情況:
netstat-antlp|more
使用 ps 命令,分析程序,得到相應pid號:
psaux|grep6666
檢視 pid 所對應的程序檔案路徑:
#$PID為對應的pid號
ls-l/proc/$PID/exe或file/proc/$PID/exe
分析程序:
#根據pid號檢視程序
lsof-p6071
#通過服務名檢視該程序開啟的檔案
lsof-csshd
#通過埠號檢視程序:
lsof-i:22
檢視程序的啟動時間點:
ps-p6071-olstart
根據pid強行停止程序:
kill-96071
注意:如果找不到任何可疑檔案,檔案可能被刪除,這個可疑的程序已經儲存到記憶體中,是個記憶體程序。這時需要查詢PID 然後kill掉
檢查開機啟動項:
系統執行級別示意圖:
執行級別 | 含義 |
---|---|
0 | 關機 |
1 | 單使用者模式,可以想象為windows的安全模式,主要用於系統修復 |
2 | 不完全的命令列模式,不含NFS服務 |
3 | 完全的命令列模式,就是標準字元介面 |
4 | 系統保留 |
5 | 圖形模式 |
6 | 重啟動 |
檢視執行級別命令:
runlevel
開機啟動配置檔案:
/etc/rc.local
/etc/rc.d/rc[0~6].d
啟動Linux系統時,會執行一些指令碼來配置環境——rc指令碼。在核心初始化並載入了所有模組之後,核心將啟動一個守護程序叫做init
或init.d
。這個守護程序開始執行/etc/init.d/rc
中的一些指令碼。這些指令碼包括一些命令,用於啟動執行Linux系統所需的服務
開機執行指令碼的兩種方法:
- 在/etc/rc.local的exit 0語句之間新增啟動指令碼。指令碼必須具有可執行許可權
- 用update-rc.d命令新增開機執行指令碼
1、編輯修改/etc/rc.local
2、update-rc.d:此命令用於安裝或移除System-V風格的初始化指令碼連線。指令碼是存放在/etc/init.d/
目錄下的,當然可以在此目錄建立連線檔案連線到存放在其他地方的指令碼檔案。
此命令可以指定指令碼的執行序號,序號的取值範圍是 0-99,序號越大,越遲執行。
當我們需要開機啟動自己的指令碼時,只需要將可執行指令碼丟在/etc/init.d
目錄下,然後在/etc/rc.d/rc_.d
檔案中建立軟連結即可
語法:
update-rc.d 指令碼名或服務 <remove|defaults|disable|enable>
#1、在/etc/init.d目錄下建立連結檔案到後門指令碼:
ln-s/home/b4yi/kali-6666.elf/etc/init.d/backdoor
#2、用update-rc.d命令將連線檔案backdoor新增到啟動指令碼中去
sudoupdate-rc.dbackdoordefaults99
開機即執行。
入侵排查:
more/etc/rc.local
/etc/rc.d/rc[0~6].d
ls-l/etc/rc.d/rc3.d/
計劃任務排查:
需要注意的幾處利用cron的路徑:
crontab-l#列出當前使用者的計時器設定
crontab-r#刪除當前使用者的cron任務
上面的命令實際上是列出了/var/spool/cron/crontabs/root
該檔案的內容:
/etc/crontab
只允許root使用者修改/var/spool/cron/
存放著每個使用者的crontab任務,每個任務以建立者的名字命名/etc/cron.d/
將檔案寫到該目錄下,格式和/etc/crontab
相同- 把指令碼放在
/etc/cron.hourly/
、/etc/cron.daily/
、/etc/cron.weekly/
、/etc/cron.monthly/
目錄中,讓它每小時/天/星期/月執行一次
小技巧:
more/etc/cron.daily/*檢視目錄下所有檔案
入侵排查:
重點關注以下目錄中是否存在惡意指令碼;
/var/spool/cron/*
/etc/crontab
/etc/cron.d/*
/etc/cron.daily/*
/etc/cron.hourly/*
/etc/cron.monthly/*
/etc/cron.weekly/
/etc/anacrontab
/var/spool/anacron/*
入侵排查:
查詢已安裝的服務:
RPM 包安裝的服務:
chkconfig--list檢視服務自啟動狀態,可以看到所有的RPM包安裝的服務
psaux|grepcrond檢視當前服務
系統在3與5級別下的啟動項
中文環境
chkconfig--list|grep"3:啟用\|5:啟用"
英文環境
chkconfig--list|grep"3:on\|5:on"
原始碼包安裝的服務:
檢視服務安裝位置,一般是在/user/local/
servicehttpdstart
搜尋/etc/rc.d/init.d/檢視是否存在
異常檔案檢查:
按照三種方式查詢修改的檔案:
- 按照名稱
- 依據檔案大小
- 按照時間查詢
-
根據名稱查詢檔案
find/-namea.Test
#如果檔名記不全,可使用萬用字元*來補全
#如果不區分大小寫,可以將-name替換為-iname
- 依據檔案大小查詢:
find/-size+1000M
#+1000M表示大於1000M的檔案,-10M代表小於10M的檔案
- 依據時間查詢:
#-atime檔案的訪問時間
#-mtime檔案內容修改時間
#-ctime檔案狀態修改時間(檔案許可權,所有者/組,檔案大小等,當然檔案內容發生改變,ctime也會隨著改變)
#要注意:系統程序/指令碼訪問檔案,atime/mtime/ctime也會跟著修改,不一定是人為的修改才會被記錄
#查詢最近一天以內修改的檔案:
find/-mtime-1-ls|more
#查詢50天前修改的檔案:
find./-mtime+50-ls
- 根據屬主和屬組查詢:
-user根據屬主查詢
-group根據屬組查詢
-nouser查詢沒有屬主的檔案
-nogroup查詢沒有屬組的檔案
#檢視屬主是root的檔案
find./-userroot-typef
#-typef表示查詢檔案,-typed表示查詢目錄
#注意:系統中沒有屬主或者沒有屬組的檔案或目錄,也容易造成安全隱患,建議刪除。
- 按照CPU使用率從高到低排序:
ps-ef--sort-pcpu
- 按照記憶體使用率從高到低排序:
ps-ef--sort-pmem
補充:
1、檢視敏感目錄,如/tmp目錄下的檔案,同時注意隱藏資料夾,以“..”為名的資料夾具有隱藏屬性。
2、得到發現WEBSHELL、遠控木馬的建立時間,如何找出同一時間範圍內建立的檔案?
可以使用find命令來查詢,如find /opt -iname "*" -atime 1 -type f 找出 /opt 下一天前訪問過的檔案。
3、針對可疑檔案可以使用 stat 進行建立修改時間。
系統日誌檢查:
日誌預設存放位置:/var/log/
必看日誌:secure、history
檢視日誌配置情況:more /etc/rsyslog.conf
日誌檔案 | 說明 |
---|---|
/var/log/cron | 記錄了系統定時任務相關的日誌 |
/var/log/cups | 記錄列印資訊的日誌 |
/var/log/dmesg | 記錄了系統在開機時核心自檢的資訊,也可以使用dmesg命令直接檢視核心自檢資訊 |
/var/log/mailog | 記錄郵件資訊 |
/var/log/message | 記錄系統重要資訊的日誌。這個日誌檔案中會記錄Linux系統的絕大多數重要資訊,如果系統出現問題時,首先要檢查的就應該是這個日誌檔案 |
/var/log/btmp | 記錄錯誤登入日誌,這個檔案是二進位制檔案,不能直接vi檢視,而要使用lastb命令檢視 |
/var/log/lastlog | 記錄系統中所有使用者最後一次登入時間的日誌,這個檔案是二進位制檔案,不能直接vi,而要使用lastlog命令檢視 |
/var/log/wtmp | 永久記錄所有使用者的登入、登出資訊,同時記錄系統的啟動、重啟、關機事件。同樣這個檔案也是一個二進位制檔案,不能直接vi,而需要使用last命令來檢視 |
/var/log/utmp | 記錄當前已經登入的使用者資訊,這個檔案會隨著使用者的登入和登出不斷變化,只記錄當前登入使用者的資訊。同樣這個檔案不能直接vi,而要使用w,who,users等命令來查詢 |
/var/log/secure | 記錄驗證和授權方面的資訊,只要涉及賬號和密碼的程式都會記錄,比如SSH登入,su切換使用者,sudo授權,甚至新增使用者和修改使用者密碼都會記錄在這個日誌檔案中 |
/var/log/wtmp 登入進入,退出,資料交換、關機和重啟紀錄
/var/log/lastlog 檔案記錄使用者最後登入的資訊,可用 lastlog 命令來檢視。
/var/log/secure 記錄登入系統存取資料的檔案,例如 pop3/ssh/telnet/ftp 等都會被記錄。
/var/log/cron與定時任務相關的日誌資訊
/var/log/message系統啟動後的資訊和錯誤日誌
/var/log/apache2/access.logapacheaccesslog
日誌分析技巧:
1、定位有多少IP在爆破主機的root帳號:
grep"Failedpasswordforroot"/var/log/secure|awk'{print$11}'|sort|uniq-c|sort-nr|more
定位有哪些IP在爆破:
grep"Failedpassword"/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"Failedpassword"/var/log/secure|perl-e'while($_=<>){/for(.*?)from/;print"$1\n";}'|uniq-c|sort-nr
2、登入成功的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}'
3、增加一個使用者kali日誌:
Jul1000:12:15localhostuseradd[2382]:newgroup:name=kali,GID=1001
Jul1000:12:15localhostuseradd[2382]:newuser:name=kali,UID=1001,GID=1001,home=/home/kali
,shell=/bin/bash
Jul1000:12:58localhostpasswd:pam_unix(passwd:chauthtok):passwordchangedforkali
#grep"useradd"/var/log/secure
4、刪除使用者kali日誌:
Jul1000:14:17localhostuserdel[2393]:deleteuser'kali'
Jul1000:14:17localhostuserdel[2393]:removedgroup'kali'ownedby'kali'
Jul1000:14:17localhostuserdel[2393]:removedshadowgroup'kali'ownedby'kali'
#grep"userdel"/var/log/secure
5、su切換使用者:
Jul1000:38:13localhostsu:pam_unix(su-l:session):sessionopenedforusergoodbyroot(uid=0)
sudo授權執行:
sudo-l
Jul1000:43:09localhostsudo:good:TTY=pts/4;PWD=/home/good;USER=root;COMMAND=/sbin/shutdown-rnow
webshell查殺:
河馬 WebShell 查殺:http://www.shellpub.com
Linux安全檢查指令碼:
https://github.com/grayddq/GScan
https://github.com/ppabc/security_check
https://github.com/T0xst/linux