目錄
1、Windows入侵排查思路
1.1 檢查系統賬號安全
1.2 檢查異常端口、進程
1.3 檢查啟動項、計劃任務、服務
1.4 檢查系統相關信息
1.5 自動化查殺
1.6 日志分析
系統日志分析
Web 訪問日志
2、Linux 入侵排查思路
2.1?賬號安全
2.1.1、基本使用
2.1.2、入侵排查
2.2 歷史命令
2.2.1基本使用
2.2.2入侵排查
2.3 檢查異常端口
2.4 檢查異常進程
2.5 檢查開機啟動項
2.5.1基礎使用
2.5.2入侵排查
2.6 檢查定時任務
2.6.1基本使用
2.6.2入侵排查
2.7 檢查服務
2.7.1服務自啟動
2.7.2入侵排查
2.8 檢查異常文件
2.9 檢查系統日志
2.9.1基礎使用
2.9.2日志分析
3、封堵IP
3.1基本使用:iptables封堵 IP
3.2自動封堵IP(deny.sh)
3.2.1deny.sh腳本要求:實現自動封堵IP,失敗三次后自動使用iptables封堵爆破IP
3.2.2示例運行結果
3.2.3使用crontab來定時執行上述腳本
1、Windows入侵排查思路
1.1 檢查系統賬號安全
-
查看服務器是否有弱口令,遠程管理端口是否對公網開放。
-
查看服務器是否存在可疑賬號、新增賬號。
-
查看服務器是否存在隱藏賬號、克隆賬號。
-
結合日志,查看管理員登錄時間、用戶名是否存在異常。
1.2 檢查異常端口、進程
- 檢查端口連接情況,是否有遠程連接、可疑連接。
- 檢查是否有可疑進程。
- 檢查小技巧:看端口對應的 PID:`netstat -ano | findstr "port"`;查看進程對應的 PID:任務管理器 -- 查看 -- 選擇列 -- PID 或者 `tasklist ?| findstr "PID"`;查看進程對應的程序位置(任務管理器 -- 選擇對應進程 -- 右鍵打開文件位置,運行輸入wmic,cmd 界面輸入process?);tasklist /svc? ?進程 -- PID -- 服務;查看Windows服務所對應的端口(%systemroot%/system32/drivers/etc/services(一般 %systemroot% 就是 C:\Windows 路徑))。
1.3 檢查啟動項、計劃任務、服務
- 檢查服務器是否有異常的啟動項。
- 檢查計劃任務。
- 服務自啟動。
1.4 檢查系統相關信息
- 查看系統版本以及補丁信息。
- 查找可疑目錄及文件。
- 發現并得到 WebShell、遠控木馬的創建時間。
1.5 自動化查殺
- 病毒查殺
? ? ? ? ?檢查方法:下載安全軟件,更新最新病毒庫,進行全盤掃描。
- webshell查殺
? ? ? ? ?檢查方法:選擇具體站點路徑進行webshell查殺,建議使用兩款 WebShell 查殺工具同時查殺,可相互補充規則庫的不足。
1.6 日志分析
系統日志分析
- 前提:開啟審核策略,若日后系統出現故障、安全事故則可以查看系統的日志文件,排除故障,追查入侵者的信息等。
- Win+R 打開運行,輸入 "eventvwr.msc",回車運行,打開"事件查看器"。
- 導出應用程序日志、安全日志、系統日志,利用 [Log Parser](https://www.microsoft.com/en-us/download/details.aspx?id=24659) 進行分析。
Web 訪問日志
- 找到中間件的web日志,打包到本地方便進行分析。
- 推薦工具:Windows 下,推薦用 EmEditor 進行日志分析,支持大文本,搜索效率還不錯。Linux 下,使用 Shell 命令組合查詢分析。
2、Linux 入侵排查思路
2.1?賬號安全
2.1.1、基本使用
- 用戶信息文件 /etc/passwd
- 影子文件 /etc/shadow
- who ? ? 查看當前登錄用戶(tty 本地登陸 ?pts 遠程登錄)
- w ? ? ? 查看系統信息,想知道某一時刻用戶的行為
- uptime ?查看登陸多久、多少用戶,負載狀態
2.1.2、入侵排查
(1)查詢特權用戶特權用戶(uid 為0)
[root@localhost ~]# awk -F: '$3==0{print $1}' /etc/passwd
(2)查詢可以遠程登錄的帳號信息
[root@localhost ~]# awk '/\$1|\$6/{print $1}' /etc/shadow
(3)除root帳號外,其他帳號是否存在sudo權限。如非管理需要,普通帳號應刪除sudo權限
[root@localhost ~]# more /etc/sudoers | grep -v "^#\|^$" | grep "ALL=(ALL)"
(4)禁用或刪除多余及可疑的帳號
? ? usermod -L user ? ?禁用帳號,帳號無法登錄,/etc/shadow 第二欄為 ! 開頭
?? ?userdel user ? ? ? 刪除 user 用戶
?? ?userdel -r user ? ?將刪除 user 用戶,并且將 /home 目錄下的 user 目錄一并刪除
2.2 歷史命令
2.2.1基本使用
通過 .bash_history 文件查看帳號執行過的系統命令
1、root 用戶的歷史命令
histroy
2、打開 /home 各帳號目錄下的 .bash_history,查看普通帳號執行的歷史命令。
為歷史的命令增加登錄的 IP 地址、執行命令時間等信息:
1)保存1萬條命令
sed -i 's/^HISTSIZE=1000/HISTSIZE=10000/g' /etc/profile
2)在/etc/profile的文件尾部添加如下行數配置信息:
######jiagu history xianshi#########
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"
######### jiagu history xianshi ##########
3)source /etc/profile 讓配置生效
生成效果: 1 ?2018-07-10 19:45:39 192.168.204.1 root source /etc/profile
3、歷史操作命令的清除:history -c
但此命令并不會清除保存在文件中的記錄,因此需要手動刪除 .bash_profile 文件中的記錄。
2.2.2入侵排查
進入用戶目錄下,導出歷史命令。
cat .bash_history >> history.txt
2.3 檢查異常端口
使用 netstat 網絡連接命令,分析可疑端口、IP、PID
netstat -antlp | more
查看下 pid 所對應的進程文件路徑,
運行 ls -l /proc/$PID/exe 或 file /proc/$PID/exe($PID 為對應的 pid 號)
2.4 檢查異常進程
使用 ps 命令,分析進程
使用 ps 命令,分析進程
2.5 檢查開機啟動項
2.5.1基礎使用
系統運行級別示意圖:
查看運行級別命令 `runlevel`
2.5.2入侵排查
啟動項文件:
more /etc/rc.local
/etc/rc.d/rc[0~6].d
ls -l /etc/rc.d/rc3.d/
2.6 檢查定時任務
2.6.1基本使用
crontab -l ? 列出某個用戶cron服務的詳細內容
Tips:默認編寫的crontab文件會保存在 (/var/spool/cron/用戶名 例如: /var/spool/cron/root
crontab -r ? 刪除每個用戶cront任務(謹慎:刪除所有的計劃任務)
crontab -e ? 使用編輯器編輯當前的crontab文件?
如:*/1 * * * * echo "hello world" >> /tmp/test.txt 每分鐘寫入文件
2.6.2入侵排查
重點關注以下目錄中是否存在惡意腳本:
/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/*more /etc/cron.daily/* ?查看目錄下所有文件
2.7 檢查服務
2.7.1服務自啟動
第一種修改方法:
chkconfig [--level 運行級別] [獨立服務名] [on|off]
chkconfig –level ?2345 httpd on ?開啟自啟動
chkconfig httpd on (默認level是2345)
第二種修改方法:
修改 /etc/re.d/rc.local 文件
加入 /etc/init.d/httpd start
第三種修改方法:
使用 ntsysv 命令管理自啟動,可以管理獨立服務和 xinetd 服務。
2.7.2入侵排查
查詢已安裝的服務:
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/ ?查看是否存在
2.8 檢查異常文件
- 查看敏感目錄,如/tmp目錄下的文件,同時注意隱藏文件夾,以“..”為名的文件夾具有隱藏屬性
- 得到發現WEBSHELL、遠控木馬的創建時間,如何找出同一時間范圍內創建的文件?
?? ? ? ? ? ? ? ? ?可以使用find命令來查找,如 ?find /opt -iname "*" -atime 1 -type f 找出 /opt 下一天前訪問過的文件
- 針對可疑文件可以使用 stat 進行創建修改時間。
2.9 檢查系統日志
2.9.1基礎使用
日志默認存放位置:/var/log/
查看日志配置情況:more /etc/rsyslog.conf
2.9.2日志分析
1、定位有多少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
?
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日志:
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/secure5、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
3、封堵IP
3.1基本使用:iptables封堵 IP
sudo iptables -A INPUT -s 192.168.1.100 -j DROP? ? -------封堵單個IP
sudo iptables -A INPUT -s 192.168.1.0/24 -j DROP? ?-------封堵IP段
sudo iptables -L -n? ? ?-------查看當前規則
sudo iptables -D INPUT -s 192.168.1.100 -j DROP? ? -------解除封禁
3.2自動封堵IP(deny.sh)
3.2.1deny.sh腳本要求:實現自動封堵IP,失敗三次后自動使用iptables封堵爆破IP
#需求:
#封堵在一分鐘內爆破次數超過100次的IP#!/bin/bash
# 日志文件路徑
logfile=/usr/local/nginx/logs
last_minutes=1
# 開始時間1分鐘之前(這里可以修改,如果要幾分鐘之內攻擊次數多少次,這里可以自定義)
start_time=`date -d"$last_minutes minutes ago" +"%d/%m/%Y:%H:%M:%S"`
echo $start_time
# 結束時間現在
stop_time=`date +"%d/%m/%Y:%H:%M:%S"`
echo $stop_time
cur_date="`date +%d/%m/%Y`"
echo $cur_date
# 過濾出單位之間內的日志并統計最高ip數,請替換為你的日志路徑
tac $logfile/access.log | awk -v st="$start_time" -v et="$stop_time" '{t=substr($4,2);if(t>=st && t<=et){print $1}}' |sort | uniq -c | sort -nr > $logfile/log_ip_top10
#ip_top=`cat $logfile/log_ip_top10 | head -1 | awk '{print $1}'`
# 出現橫杠使用sed去掉第一行
#sed -i '1d' $logfile/log_ip_top10
# 單位時間[1分鐘]內單ip訪問次數超過200次的ip記錄入black.txt
ip=`cat $logfile/log_ip_top10 | awk '{if($1 > 100)print $2}'`
for line in $ip
do
echo $line >> $logfile/getip.txt
echo $line
iptables -I INPUT -p tcp -m multiport --dport 80,443 -s $line -j DROP
done
注意事項:
- 腳本中使用了for循環來處理多個超過訪問限制的IP。
- 清空access.log的操作是可選的,根據實際情況決定是否執行。
- 確保腳本具有執行權限,可以使用chmod +x deny.sh來賦予權限。
3.2.2示例運行結果
假設access.log中有多個IP超過了訪問限制,運行腳本后,getip.txt文件可能包含以下內容:
deny 192.168.1.1;
deny 192.168.1.2;
3.2.3使用crontab來定時執行上述腳本
編輯crontab
crontab -e
在crontab文件中添加一行,每分鐘執行一次:
* * * * * /usr/local/nginx/logs/deny.sh
注意:確保腳本路徑正確,且腳本具有執行權限。
重啟crond服務,使配置生效
systemctl restart crond.service