目录
3.2.1deny.sh脚本要求:实现自动封堵IP,失败三次后自动使用iptables封堵爆破IP
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/secure4、删除用户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