Windows和Linux应急响应以及IP封堵

目录

1、Windows入侵排查思路

[1.1 检查系统账号安全](#1.1 检查系统账号安全)

[1.2 检查异常端口、进程](#1.2 检查异常端口、进程)

[1.3 检查启动项、计划任务、服务](#1.3 检查启动项、计划任务、服务)

[1.4 检查系统相关信息](#1.4 检查系统相关信息)

[1.5 自动化查杀](#1.5 自动化查杀)

[1.6 日志分析](#1.6 日志分析)

系统日志分析

[Web 访问日志](#Web 访问日志)

[2、Linux 入侵排查思路](#2、Linux 入侵排查思路)

[2.1 账号安全](#2.1 账号安全)

2.1.1、基本使用

2.1.2、入侵排查

[2.2 历史命令](#2.2 历史命令)

2.2.1基本使用

2.2.2入侵排查

[2.3 检查异常端口](#2.3 检查异常端口)

[2.4 检查异常进程](#2.4 检查异常进程)

[2.5 检查开机启动项](#2.5 检查开机启动项)

2.5.1基础使用

2.5.2入侵排查

[2.6 检查定时任务](#2.6 检查定时任务)

2.6.1基本使用

2.6.2入侵排查

[2.7 检查服务](#2.7 检查服务)

2.7.1服务自启动

2.7.2入侵排查

[2.8 检查异常文件](#2.8 检查异常文件)

[2.9 检查系统日志](#2.9 检查系统日志)

2.9.1基础使用

2.9.2日志分析

3、封堵IP

[3.1基本使用:iptables封堵 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/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

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

bash 复制代码
#需求:
#封堵在一分钟内爆破次数超过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

注意事项

  1. 脚本中使用了for循环来处理多个超过访问限制的IP。
  2. 清空access.log的操作是可选的,根据实际情况决定是否执行。
  3. 确保脚本具有执行权限,可以使用chmod +x deny.sh来赋予权限。

3.2.2示例运行结果

假设access.log中有多个IP超过了访问限制,运行脚本后,getip.txt文件可能包含以下内容:

php 复制代码
deny 192.168.1.1;
deny 192.168.1.2;

3.2.3使用crontab来定时执行上述脚本

编辑crontab

python 复制代码
crontab -e

在crontab文件中添加一行,每分钟执行一次:

python 复制代码
* * * * * /usr/local/nginx/logs/deny.sh

注意:确保脚本路径正确,且脚本具有执行权限。

重启crond服务,使配置生效

python 复制代码
systemctl restart crond.service