攻防演練之藍隊視角下的Linux信息收集
日志
Linux系統的日志功能非常強大且完善,幾乎可以保存所有的操作記錄,藍隊的信息收集主要就是針對日志的信息收集,先從系統自身的日志來說起。
系統上跑了很多程序,那么每個程序都會有相應的日志產生,而這些日志就被記錄到這個目錄下,具體在 /var/log 目錄下

/var/log 下存放著各種程序的 Log 文件,特別是 login (/var/log/wtmp log 所有到系統的登錄和注銷) 和 syslog (/var/log/messages 里存儲所有核心和系統程序信息. /var/log 里的文件經常不確定地增長,應該定期清除.
還有其中幾個比較常用的日志文件:
?/var/log/dmesg : 核心啟動日志,系統啟動時會在屏幕顯示與硬件有關的信息,這些信息會保存在這個文件里面.?/var/log/spooler : UUCP 和 news 設備相關的日志信息?/var/log/cron : 與定時任務相關的日志信息
?/var/log/btmp : 記錄錯誤登錄日志,這個文件是二進制文件,可以使用 lastb 命令查看?/var/log/boot : 系統引導日志?/var/log/lastlog : 記錄系統中所有用戶最后一次登錄時間的日志,這個文件是二進制文件,可以使用 lastlog 命令查看?/var/log/mailog : 記錄郵件信息
內核及系統日志
內核為2.6.18時候使用的是 syslog 服務
注: 內核為2.6.32以后 syslog 被命名為 rsyslog,所以配置文件名稱也不一樣
這種日志由 syslog 統一管理,根據其主配置文件 /etc/syslog.conf 中的設置決定將內核消息及各種系統程序消息記錄到什么位置。用戶日志:這種日志數據用于記錄 Linux 系統用戶登錄及退出系統的相關信息,包括用戶名、登錄的終端、登錄時間、來源主機、正在使用的進程操作等。程序日志:有些應用程序運會選擇自己來獨立管理一份日志文件(而不是交給 syslog 服務管理),用于記錄本程序運行過程中的各種事件信息。由于這些程序只負責管理自己的日志文件,因此不同的程序所使用的日志記錄格式可能會存在極大差異。
通過查看 /etc/rsyslog.conf ,可查看相關系統日志配置情況。

message 日志,一般內核及大多數系統消息都被記錄到公共日志文件 /var/log/messages 中,而其他一些程序消息被記錄到不同的文件中,日志消息還能夠記錄到特定的存儲設備中,或者直接向用戶發送。

secure 是應急中最常用的文件,主要記錄系統存取數據的文件,如 POP3、ssh、telnet、ftp 等相關記錄,從日志中可看出系統服務是否遭受到安全威脅,從如下日志中可看到 SSH 服務一直在被破解。

用戶日志
wtmp 日志記錄了用戶的登錄、退出、重啟等情況,可以查看系統是否存在異常用戶登錄,判斷攻擊者是否已經登錄服務器,由于 wtmp 日志為二進制文件,所以利用用 last 命令查看,last -t 20190426120950 ,可查看這個時間之前的日志。

lastlog 命令,用于顯示系統中所有用戶最近一次登錄信息。lastlog 文件在每次有用戶登錄時被查詢。可以使用 lastlog 命令檢查某特定用戶上次登錄的時間,并格式化輸出上次登錄日志 /var/log/lastlog 的內容。它根據 UID 排序顯示登錄名、端口號(tty)和上次登錄時間。如果一個用戶從未登錄過,lastlog 顯示 Never logged。注意需要以 root 身份運行該命令。

所以查詢登錄情況的幾個命令,本質上就是在查日志 /var/log/btmp、/var/log/lastlog、/var/log/wtmp
last #登錄成功記錄 lastb #登錄失敗記錄 lastlog #最后一次登錄
日志分析技巧
查看嘗試暴力破解機器密碼的人
# Debian 系的發行版sudo grep "Failed password for root" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr | more
# Red Hat 系的發行版sudo grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more
查看暴力猜用戶名的人
# 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 | moregrep "Failed password" /var/log/secure | awk {'print $9'} | sort | uniq -c | sort -nrgrep -o "Failed password" /var/log/secure|uniq -cgrep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11}
IP 信息
# 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
登錄成功
# 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 -nrgrep "Accepted " /var/log/secure* | awk '{print $1,$2,$3,$9,$11}'
系統
系統完整性
通過 rpm 自帶的 -Va 來校驗檢查所有的 rpm 軟件包,查看哪些命令是否被替換了
rpm -Va > rpm.log # 如果一切均校驗正常將不會產生任何輸出,如果有不一致的地方,就會顯示出來,輸出格式是8位長字符串,每個字符都用以表示文件與RPM數據庫中一種屬性的比較結果 ,如果是. (點) 則表示測試通過。 驗證內容中的8個信息的具體內容如下: - S 文件大小是否改變 - M 文件的類型或文件的權限(rwx)是否被改變 - 5 文件MD5校驗是否改變(可以看成文件內容是否改變) - D 設備中,從代碼是否改變 - L 文件路徑是否改變 - U 文件的屬主(所有者)是否改變 - G 文件的屬組是否改變 - T 文件的修改時間是否改變
查看對外開放端口
檢查異常端口
ss -tnlp ss -tnlp | grep ssh ss -tnlp | grep ":22" netstat -tnlp netstat -tnlp | grep ssh
這里推薦一個很好用的防止端口掃描腳本 https://github.com/EtherDream/anti-portscan
防火墻
firewall-cmd --state # 顯示防火墻狀態firewall-cmd --get-zones # 列出當前有幾個 zonefirewall-cmd --get-active-zones # 取得當前活動的 zonesfirewall-cmd --get-default-zone # 取得默認的 zonefirewall-cmd --get-service # 取得當前支持 servicefirewall-cmd --get-service --permanent # 檢查下一次重載后將激活的服務 firewall-cmd --zone=public --list-ports # 列出 zone public 端口firewall-cmd --zone=public --list-all # 列出 zone public 當前設置
用戶
awk -F: '{if($3==0||$4==0)print $1}' /etc/passwd # 查看 UID\GID 為0的帳號awk -F: '{if($7!="/usr/sbin/nologin")print $1}' /etc/passwd # 查看能夠登錄的帳號lastlog # 系統中所有用戶最近一次登錄信息lastb # 顯示用戶錯誤的登錄列表users # 打印當前登錄的用戶,每個用戶名對應一個登錄會話。如果一個用戶不止一個登錄會話,其用戶名顯示相同次數
計劃任務和啟動項
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].drunlevel # 查看運行級別命令crontab -l # 計劃任務列表ls -alh /var/spool/cron # 默認編寫的 crontab 文件會保存在 /var/spool/cron/用戶名 下ls -al /etc/ | grep cronls -al /etc/cron*cat /etc/cron*cat /etc/at.allowcat /etc/at.denycat /etc/cron.allowcat /etc/cron.denycat /etc/crontabcat /etc/anacrontabcat /var/spool/cron/crontabs/root
可疑文件
查看敏感目錄,如/tmp目錄下的文件,同時注意隱藏文件夾,以“..”為名的文件夾具有隱藏屬性,針對可疑文件查看創建修改時間。
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信息
后門檢查
1.檢查 /etc/passwd 文件是否有異常2.檢測對應 vim 進程號虛擬目錄的 map 文件是否有 python 字眼.3.通過排查 shell 的配置文件或者 alias 命令即可發現,例如 ~/.bashrc 和 ~/.bash_profile 文件查看是否有惡意的 alias 問題.4.進入 /home 各帳號目錄下的 .bash_history 查看普通帳號的歷史命令5.Rootkit檢查chkrootkit或Rootkit Hunter工具進行
分割日志工具
目前大部分 linux 系統都會默認安裝有 logrotate,日志分割工具.而這個工具的功能就是大家在 /var/log/ 目錄下面看到的形如 messages-20181028 樣式的日志,在使用 logrotate 進行配置后就可以按照時間或者大小對日志進行分割存儲.如果對 /etc/logrotate.conf 文件和 /etc/logrotate.d/ 目錄沒有改動,可以看到 /etc/logrotate.conf 默認配置:
vim /etc/logrotate.conf
# 按周輪訓
weekly
# 保留4周日志備份
rotate 4# 標記分割日志并創建當前日志
create
# 使用時間作為后綴
dateext
# 對 logrotate.d 目錄下面的日志種類使用
include /etc/logrotate.d
# 對于wtmp 和 btmp 日志處理在這里進行設置
/var/log/wtmp {
monthly
create 0664 root utmp
minsize 1M
rotate 1
}
/var/log/btmp {
missingok
monthly
create 0600 root utmp
rotate 1
}
此外,如果你在服務器上面安裝了mysql,httpd 或者其他應用服務后,logrotate 它會自動在 /etc/logrotate.d/ 下面創建對應的日志處理方式,基本是繼承 logrotate.conf. 因此,不論是你服務器上面系統日志還是應用日志,面對日志量太大的問題,都可以使用 logrotate 進行設置處理. 當然還有 Loganalyzer 這類日志收集系統,這里由于篇幅緣故,就不細講了。
總結
本文模擬了常見的應急場景,通過各種技術手段,在機器上捕捉紅隊人員的痕跡,并且排查是否有后門殘留。在實際環境中,會存在各種復雜的場景,特別是針對系統上不同的應用,存在各種隱藏后門的手段,藍方人員不僅需要掌握系統、應用的加固知識還需要掌握相應的漏洞利用知識,熟悉紅隊的進攻手段,才可以做到更好的防護。