12.7 去除XP SP2/SP3对raw socket的一些限制 https://scz.617.cn/windows/200701091750.txt A: scz@nsfocus.com 2007-01-09 17:50 现在已经是众所周知,XP SP2对raw socket做了一些限制,最引人注目的有两条: 1) 不能通过raw socket发送TCP报文。做此尝试时会得到10004号错误。 2) 不能通过raw socket发送伪造源IP的UDP报文。 另有一条就不太引人注目: 3) 不能通过raw socket发送IP碎片。做此尝试时会得到10004号错误。 不知微软在哪次对2000 SP4的修补中实现了类似上述第三条的限制,只是要宽松一些: 3) 不能通过raw socket发送全部IP碎片,只有第一个碎片可被发送出去。试图发送 后续碎片时会得到10004号错误。 尚未在2003 SP1上测试第三条限制。 微软做这些限制时,有两种方案,一种是完全没有实现相关代码,另一种是在全功能 代码中增加一些判断语句。想了想,第二种可能居多,最后事实证明确实如此。 微软在tcpip.sys中固化了这些限制,没有注册表项对之调整。 曾在"12.3 XP SP2对raw socket所做的改动"中提过,可以考虑剁了tcpip.sys,但不 推荐。 为了调整XP SP2并发半开出连接上限,已经硬剁了tcpip.sys。对于我们来说,硬剁 tcpip.sys面临的诸多风险中最大的就是BSOD,便如杀人是要偿命的。杀一个人是死, 杀两个人也是死,索性全家上下三代都给杀了图个痛快。基于这种信念,我一直奇怪 外界流传的现成工具为何只剁了ActiveOpenProgressThreshold,按说这帮人也不是 什么善主,在其本机使用raw socket是很正常的需求啊。以前多在*nix上做点事, root想怎么用raw socket就怎么用,如今早已背叛了*nix,手头*nix的测试环境甚少 启用。最近工作机被迫升级至XP SP2后,被这些限制搞得很不爽。剁掉tcpip.sys的 这些限制已经成了心病。 下面以英文版XP SP2上的5.1.2600.2892版tcpip.sys为例进行介绍。用自己熟悉的16 进制编辑工具按如下说明进行修改(已包含对校验和的修改): > fc /b tcpip.sys.old tcpip.sys 00000130: 65 BA 00000131: F8 FD 0002403A: 8A EB 0002403B: 41 45 0004F5A2: 0A FE 0004F5A3: 00 FF 0004F5A4: 00 FF 将临时目录里修改好的tcpip.sys严格地按如下顺序复制到相应目录: %systemroot%\ServicePackFiles\i386\ %systemroot%\system32\dllcache\ %systemroot%\system32\drivers\ 在资源管理器里确认%systemroot%\system32\drivers\tcpip.sys未因SFC而被自动恢 复成某个早期版本。重启OS使之生效。 剁了tcpip.sys之后用sendto()发送所有IP碎片均不会返回10004号错误。第一个IP碎 片肯定可以发送出去,但后续IP碎片会被XP SP2 PFW默默丢弃,用户态程序得不到任 何提示,伪造源IP的报文也会被PFW默默丢弃。关闭PFW后这些问题都得到解决。PFW 的限制与tcpip.sys本身的限制是两回事,是两层不同的限制。PFW的限制可以热取消, tcpip.sys本身的限制是固化的,无法正常取消。总之,关闭PFW再测试raw socket。 实测表明,用IP碎片可以对2003 SP1进行syn-flood攻击,当指定正确的源IP时,可以 收到SYN+ACK或RST。 顺便说一句,这个版本的tcpip.sys不允许用raw socket发送IP-ENCAP、IPv6报文, 剁了之后这些限制一并绕过。 A: scz@nsfocus 2008-01-26 21:11 安装MS08-001/KB941644之后将会替换MS06-032/KB917953,现在tcpip.sys的版本是 5.1.2600.3244。 改了一下cracktcpip.exe,使之同时对MS06-032/KB917953、MS08-001/KB941644有效。 https://scz.617.cn/windows/cracktcpip.exe 以英文tcpip.sys(5.1.2600.3244/xpsp_sp2_qfe.071030-1255)为例: >cracktcpip.exe -v cracktcpip.exe ver 2008-01-26 21:11 >cracktcpip.exe -h Usage: cracktcpip.exe [-h] [-v] [-i infile] [outfile] >cracktcpip.exe infile : tcpip.sys outfile : tcpip.sys size : 0x00058180 oldsum : 0x000649A2 sum[0] : 0x00064EF7 sum[1] : 0x00064EF7 succeeded >fc /b tcpip.sys.old tcpip.sys 00000130: A2 F7 00000131: 49 4E 00023F6A: 8A EB 00023F6B: 41 45 0004F8C6: 0A FE 0004F8C7: 00 FF 0004F8C8: 00 FF 以英文tcpip.sys(5.1.2600.3244/xpsp_sp2_gdr.071030-1259)为例: >cracktcpip.exe >fc /b tcpip.sys.old tcpip.sys 00000130: B6 0B 00000131: 25 2B 00024016: 8A EB 00024017: 41 45 0004F6A2: 0A FE 0004F6A3: 00 FF 0004F6A4: 00 FF A: scz@nsfocus 2008-07-22 11:00 改了一下cracktcpip.exe,使之同时对MS06-032/KB917953、MS08-001/KB941644、 MS08-037/KB953230有效,并同时对XP SP2、SP3有效。 >cracktcpip.exe -v cracktcpip.exe ver 2008-07-22 09:12 以英文tcpip.sys(5.1.2600.3394/xpsp_sp2_gdr.080620-1245)为例。 >cracktcpip.exe -i tcpip.sys.old tcpip.sys infile : tcpip.sys.old outfile : tcpip.sys size : 0x00057F80 oldsum : 0x00064997 sum[0] : 0x00064EEC sum[1] : 0x00064EEC succeeded >fc /b tcpip.sys.old tcpip.sys 00000130: 97 EC 00000131: 49 4E 00023FE6: 8A EB 00023FE7: 41 45 0004F7A2: 0A FE 0004F7A3: 00 FF 0004F7A4: 00 FF 以英文tcpip.sys(5.1.2600.5625/xpsp_sp3_gdr.080620-1249)为例。 >cracktcpip.exe -i tcpip.sys.old tcpip.sys infile : tcpip.sys.old outfile : tcpip.sys size : 0x00058480 oldsum : 0x0005ED6B sum[0] : 0x0005F2C0 sum[1] : 0x0005F2C0 succeeded >fc /b tcpip.sys.old tcpip.sys 00000130: 6B C0 00000131: ED F2 00023FB2: 8A EB 00023FB3: 41 45 0004FB46: 0A FE 0004FB47: 00 FF 0004FB48: 00 FF