现在你已经理解了需要寻找什么东西了,可以使用下面的工具来帮助你:
● 规则检测器:尽管IDtables不支持规则检测,但ipchains-C命令允许你检查你现有的规则是如何操作的。它将返回关于包是否被丢弃或接收的信息。对此信息的操作将由你来决定。
● 端口扫描器:简单的端口扫描可以帮助你判断你的防火墙上哪些端口是开放的。使用像Telnet和Netcat这样的应用程序,你可以判断什么程序在背后监听那个端口。
● 包生成器:使用类似SendlP这样的应用程序,可以生成包来测试你的防火墙规则是否正确工作。
下面是对一些允许你快速测试防火墙规则的工具的讨论。
6.1 Ipchains
ipchains-C选项允许你发送包以检测你创建的规则是否正确工作。编写此书时,Iptables还没有类似的功能。在检测Ipchains规则时,你需要将.C(确保你使用的是大写字母盘C)放到规则的前面部分。顺便说一下,-check和-C选项是等价的。如果包被禁发了,你将会获得相应的通知。例如,假设你在Ipchains里创建了如下规则:
ipchains—I input—i eth0一s O/O—d O/0一p icmp—j DENY
为了测试这个规则,你需要在同一个系统中输入下面的命令:
ipchains—C input—i eth0一p icmp—s O/O 1一d 0/O l
然后Ipchains将通知你包被拒绝了。如果在测试时你记录的是同一个系统的话,那么这个工具将是十分方便的,并且你会对现有的规则越来越熟悉,希望将包发送出去以检测规则工作的状态如何。
6.2 Telnet
还有更多的通用测试方法。简单的Telnet应用程序在测试防火墙时仍是有用的。但是,
不要用它来登录。你可以用它测试某一防火墙规则是否是按照你希望的那样工作的。例如,
假设你允许所有的访问,但是却很明显地被一个规则拒绝,且你已经在Iptables中按照如下信息配置防火墙了:
iptables—A INPUT—i eth0一s 0/O—p tcp一一dport 80—j LOG
iptables—A INPUT—i eth0一s O/O—p tcp一一dport 80—j REJECT
你可以通过指定记录和阻塞的端口来使用你的Telnet客户端检查它是否正常工作:
prompts telnet firewall.yournetwork.com 80
然后,你可以使用tail命令来读用来为你的系统存储核心信息的文件。为了方便起见,使用_f选项,这样可以在得到任何结果时来直接查看结果:
tail—f/var/log/messages
下面介绍使用多终端。
如果你是已经以交互式的方式登录进入防火墙了,那么打开两个终端将会十分有用。你
可以使用第一个终端来输入telnet命令,使用第二个终端来在/var/lo∥messages文件中查看结果。记住,如果你指定了更多复杂的记录选项,并且发送了太多的包,那么内核将在某一时期后(每小时三个记录事件,只有头五个包被记录)停止记录信息流。如果你不想记住这点的话,你可能会错误地认为某个规则没有起作用,而事实上它确实起作用了。
6.3 Netcat
你不会在使用Telnet时受限。Netcat是建立接口的一个很棒的工具,尤其是对于测试防火墙来说,在http://freshmeat.net/redir/netcat/7041/url tgz/ncll0.tgz上可以找到这个工具。Netcat功能是十分全面的,它自称为“网络中的瑞士陆军刀”。黑客和系统管理员都以同样的方式将其作为一个工具来引导扫描,与开放端口通信,甚至在主机间转发信息。由于它的功能十分全面,它也可以用来攻击你,所以,如果可能的话,你应该只在客户端系统安装这样的应用程序,而不是在路由器端安装。这是由于它可以用来在你的系统上打开一个后门。但是,小心地使用这个程序仍然可以快速监听你的防火墙。
Netcat在其最简配置下很像一个Telnet客户端,因为它可以用来到达任何远程主机的任何端口。为了链接到名为firewall.youmetwork.tom的80端口,你将需要输入下面的命令:
./nc firewall.yournetwork.com 80
然后,你将必须输入C仃l—c来退出程序。如果端口是打开的,那么你可以输入任何你想要的命令。对于80端口来说,一旦建立了链接,你便可以尝试输入一些无用的数据,Web服务器将返回一个错误信息,通常这个信息会包括Web服务器的名字。偶尔端口也会无法识别你的命令,但是为了测试防火墙,你通常都仅仅是想看看端口是否打开并在监听。netcat-h命令提供了可用选项的列表,如表6.1所示。
表6.1 Ne~at选项
选项 | 描述 |
一ivalue | 告知Neteat延迟特定的秒数以后再发送包。例如,为了使Neteat在扫描端口之间等待5秒, 可以指定一i 5 |
一n | Netcat报告信息只使用IP地址。这个选项在引导查询扫描,或当你没有任何DNS支持时 是很有用的 |
-pvalue | 一个端口伪装选项。允许你指定发送包的端口号。例如,如果希望在一个包被从主机的端 口53发送出去时显示出来,可以输入呻53.呻 |
·r | 允许你使得Netcat随机扫描端口,而不是简单的一个接一个 |
.svalue | 伪装包的源地址。但是,这个选项不是在所有的系统上都可以生效的 |
-U | Netcat默认发送TCP包。这个选项允许你发送用户数据报协议(UDP) |
-V | Verbose模式。报告关于你做的链接的附加信息。如果你指定了.v两次(.v.v),你将接收 两倍的信息量 |
.wvalue | 设置Netcat将等待响应端口的时间(按秒)。这个选项通常与.z组合使用 |
续表
选项 | 描述 |
-Z | 称为“zero-I/O mode'’,这个选项使得Netcat禁止任何源系统的讹。如果你不使用这个选项,Netcat将在其响应的端口不时地“挂起”。这个选项在使用Netcat作为一个扫描器时 更像是一个应用程序 |
一l | 使Netcat打开一个监听端口。使用附加选项,它很可能将root层用来监听portlisten模式, 此模式会导致一此安全问题 |
1.Netcat命令例子
为了以一种更熟练并且更有用的方式来使用Netcat,你必须使用下面的语法:
nc[options]hostname port[s][ports]
例如,如果你想扫描防火墙上的端口1到1023的所有端口,并且确保Netcat将不会“挂”在任何端口上,可以输入下面的命令:
./nc—z—w 2一v—v firewall.yournetwork.com 1—1023
一z和一w 2选项通知Netcat不要绑定端口,并且如果偶然地建立了链接后只需等候两秒钟即可。两个.v选项将Netcat置为ultra verbose的模式。尽管似乎只有特定的一组端口将在不安全的防火墙上打开。例如,下面的命令仅仅对一些特定的端口和一组端口进行扫描:
./nc—z—w 2一v—v firewall.yournetwork.com 20一30,53,80,100—112,443,
6000—6050
2.Netcat扫描分析
上述扫描将会寻找和端口相关的一些协议,包括:
● FTP(20和21)
● SSH(22)
●Telnet(23)
● DNS(53)
● WWW(80和443)
● x(6000范围内的端口)
图6.1示意了对留有一些放开端口的路由器扫描的结果。
![](https://i-blog.csdnimg.cn/blog_migrate/81e0b609dd6d1ce3977d633a2b232ba7.png)
图6.1扫描开放路由器
比如这个防火墙,仍然允许到简单邮件传送协议(SMTP)的链接,服务(端口111),sunrpc端口映射服务和x。当然你可以指定一些附加的端口。例如,从00到20和从5900到7000可以显示出一些常用的端口。向你的/etc/services文件询问更多的信息。
3.附加的Netcat命令
如果正确地编译后,Netcat也可以伪装IP地址。如果你希望伪装IP地址源,那么可以使用一s选项:
./nc—s 10.100.100.1一z—w 2一v—v firewall.yournetwork.com 20一30,53,
80,i00—112,443,6000—6050
但是,你应该注意到一s选项在一些操作系统上工作的并不好。因为Netcat对TCP来说是默认的,可以使用州选项来向端口发送UDP包:
4.UDP扫描
./nc—u—w 2 firewall.yournetwork.com 80,443
必须按Enter键两次才能完成这个命令。根据你设置的规则(你将使用Ipchains中的一l选项和Iptables中的一i LOG目标来明确地记录UDP),你的防火墙将记录下此通信。
5.测试源端口
如果你设置了防火墙规则来拒绝特定的源端口,则可以用Netcat来测试它。例如,如果你已经禁止了所有从端口l到1023上进行访问的主机,那么可以通过输入下面的命令来测试:
./nc—p 80—w 2一v—v firewall.yournetwork.com 1—1023
6.测试DNS链接
许多情况下,如果需要界定一个范围,你会希望允许UDP和TCP从端口53和到端口53
的访问。为了测试这个端口是否会打开,你将需要输入下面的命令:
./nc—p 53一w 2一v—v firewall.yournetwork.com 53
./nc—u—p 53一w 2一V—V firewall.yournetwork.com 53
你也可以扫描使用Netcat的一系列端口。例如,如果你想对从l到1023的所有端口扫描,应该输入下面的命令:
./nc firewall firewall.yournetwork.com 1—1023
7.附加Netcat属性
如果你想让Netcat打开一个层并且监听内部链接(在大多数情况下是不推荐这样做),可以使用下面的语法:
nc—l—p port[一options][hostname】[port】
另外,Netcat还有一些脚本和应用程序。这其中的一些是针对黑客群来配置的,而其他的提供对常见问题的快速解决方案。而这大部分却又没有那么实用。例如,如果你想要测试端口的重定向,那么可以使用此脚本目录下的webproxy和webrelay应用程序。
通过阅读README文件(本身带有一些源代码),你可以学习更多关于用这种方法使用
Netcat的知识。对于那些对使用Netcat来打开监听链接真正感兴趣的朋友,可以使用一个允许你验证身份以及对某种信息流进行加密的补丁,这种信息流指的是在相对立的服务器上运行的Netcat版本间发送的数据流。这个补丁叫做aes-netcat,你可以从packetstorm.securi够com和其他站点上下载。
8.使用Netcat
(1)建立一个新的名为netcat的目录并且对其做修改。这个步骤是必要的,因为tafball
将会把不同的文件存入目标路径下。
(2)从http://tieshmeat.net/redir/netcat/7041/url tgz/ncllO.tgz上获得Netcatl.10版本。
(3)一旦你获得了Netcat并且将其存入netcat目录下,将其解压缩:
tar—zxvf ncllO.tgz
(4)大部分Linux版本用下面的编译选项将完成得很好:
make generic
但是,你可能希望读取makefile文件,并且查看你的操作系统是否被它明确地列出了。
(5)一旦编译了Netcat,nc二进制编码将会在当前的目录中创建。将其拷贝到/bW目录下。或者,如果你愿意的话,你可以仅仅把它放到当前的目录中,并且当其在同一个目录下时在命令的前面使用./。既然Netcat已经可以投入使用了,那么建立一些防火墙规则来记录端口扫描。
(6)打开防火墙上的终端来查看/Var/log/messages文件:
tail—f/var/log/messages
(7)现在,用你的防火墙来引导一个端口扫描范例:
./nc—w 2一v—v firewall 1一1023
现在你可以靠防火墙使用Netcat来执行测试。
6.4 SendIP:包伪造器
尽管Netcat确实有在某种特定实例中建立包的能力,但是它却不是一个真正的包生成器。SendIP是用来允许你建立你自己所选择的包的。这个功能通常叫做“随机包的产生”。SendIP允许你建立你自己的IP、因特网控制信息协议(ICMP)、TCP和UDP包。例如,你可以用FIN、ACK和SYN位根据你的测试需求来生成TCP包。你可以从一些站点上获得SendIP,包括www.earth.1卸rojectl)urple/progs/sendi.d.html。
1.SendIP语法
尽管SendIP有许多选项,SendIP语法还是相对直截了当的:
sendip [hostname】 -p<type>-d<data><options>
2.SendIP选项
-p选项指定了你想生成的协议,-d选项允许你进入随机文本串。这些选项,大部分在表6.2中列出,允许你定制你生成的包的内容。
表6.2 SendlP选项
选项 | 描述 |
Ipvalue | 此选项决定SendlP将创建何种类型的包。它的值包括ip、icmp、tep和udp |
-lS | 指定一个你自己选择的源IP地址。缺省情况下, “真正”的本地主机IP地址被使用 |
.id | 为你生成的包指定源IP地址 |
.m | 定制IP头部长度 |
。ly | 为包设置服务类型(ToS)域。可以输入的值请参考前面的章节。缺省值是将所有的域都置空 |
.il | 设置包的长度 |
.it | 为你生成的包设置Time-To-Live(TTL)。缺省值是255字节 |
续表
选项 | 描述 |
-lp | 告知SendIP建立IP包 |
-ct value | 用来生成ICMP包类型。缺省情况下是返回(8),但是你可以指定任何其他类型,比如.ct 03 |
-ux | 指定UDP包的源端口。缺省值是当包发送出去时随机给它分配的端口 |
-ud | UDP包的目的端口。你必须指定一个目的端口 |
-ts | 指定一个TCP包的源端口。缺省值是当包发送出去时随机给它分配的端口 |
-td | 设置TCP包的目的端口。你必须指定一个目的端口 |
-tn | 允许你指定TCP序列号。缺省情况下,这个号是随机的 |
-tfa | 在TCP包上设置ACK位。缺省情况下,这个值是不设定的,除非你将.ta选项和-tfa选项一 起使用。这是因为ACK包是用来结束断掉一个链接过程的 |
-ta | 允许你请求~个acknowledgment(肯定应答)包,它是用来肯定TCP链接准备好断掉了 |
-tfr | 创建RESET包 |
-tfs | 修改包,将SYN位设定 |
-tu | 创建一个带有URGENT指针的包。这个指针定义了确定优先信息流过程的开始 |
-tfu | 在一个TCP包中设置URGENT位。缺省值是0,除非你将InJ选项和-tfu选项同时使用。若想 获得更多信息,参考RFCI 122 |
-tfr | 设置FIN位 |
-r | 随机制定所有的选项。例如,如果你指定了IP协议,那么-r选项自动随机发送一个IP地址 |
SendIP手册包含了附加选项。你可以看到,SendlP允许你伪造TCP会话的任何部分,以及IP的任何元素、UDP或ICMP包。SendIP还可以允许你伪造所有IPv6地址元素,并且可以允许你伪造路由信息协议(RIP)包。
这个工具对于防火墙来说十分有用,因为它允许你模仿任何环境。ipchains.C命令有同样的功能。但是,你可以在任何位置安装SendIP,尽管许多新版本的内核并不支持Ipchains。另外,使用SendIP,你可以只了解一个应用程序。
3.使用SendIP来检测防火墙
(1)源文件和RPM没有太大区别。从www.earth.1i/projectpurple/progs,sendi.n.h砌上下载SendIP RPM。
(2)作为基础,输入下面的语句:
rpm—ivh sendip—1.5—1.i386.rpm
(3)既然你已经在这个系统上安装了SendIP,那么它可以叫做“进攻主机”。现在你将
在这个进攻主机上使用SendIP来检测你的防火墙阻塞来自外部接口的伪装包的能力。为了检查防火墙的配置,在你的防火墙外部设置一台机器,然后将IP地址赋予你的防火墙作为缺省的网关。
(4)假设你仅仅有内部网络192.168.2.0/24和10.100.100.0/24,并且一个简单的LiIIux客户端使用192.168.2.37 IP地址。你希望测试你的防火墙来查看从网络外部来的被伪装的包是否能够从你的Linux客户端通过你的防火墙。为了测试这个,在你的内部网络上配置系统(例如,用192.168.2.37的IP地址)来使用一个类似于Tcpdump或Ethereal的包探测器来查看所有192.168.2.0网络上的包。这将是内部的主机。
(5)将内部主机的NIC置为verbose模式下,这样它将可以获得你将要发送的伪装包。伪装包很可能无法通过。
(6)将下面的命令从进攻主机输入到内部主机上:
sendip 192.168.2.37一p icmp—is 192.168.2.36
(7)你刚刚用你的防火墙和内部网络将伪装性的攻击输入。现在停止在你内部主机上捕获包。你能够从192.168.2.36上看到一个回复的请求么?192.168.2.37发出了回复么?你看到有DNS的通信似乎在试图解析192.168.2.37IP地址么?如果你看得到,那么检查一下你的伪装规则。如果你没有看到,很可能你已经在你的防火墙上正确配置了反伪装功能。
记住,如果你是在一个交换式的网络上,那么你将需要在作为牺牲品的主机上配置一个包探测器,并且直接ping这个主机。这是因为一个交换式的网络,它不使用广播技术而是使用一个标准的基于网络集线器(hub)的网络。
(8)如果你对这类的包启用了记录功能,那么你需要在你的防火墙上使用tail—f命令来查看内核记录是否捕获了这个包。
(9)现在,尝试用另一个协议实现伪装功能:
sendip 192.168.2.37一p tcp—ts 2一td 80—tn—is 192·168·2·36
这个命令用源端口2将一个tcp包发送到192.168.2.37主机的80端口上。你的防火墙应该阻塞这个包,因为它不应该允许包从有权限的端口(1023以下端口)进入到内部网络中。
(10)当你很确定你的防火墙正在阻塞伪装性的包,将下面的命令从你的进攻主机上输出:
sendip 192.168.2.37一p tcp—ts 2一td 80—tn—is 45·2·5·6
(11)这个命令几乎完成的是同一个功能,但是,它创建了一个更可能通过你的防火墙的包。为什么?因为很显然,这个包来自于45.2.5.6主机,这是一个看似来自于因特网的地址。另外,至少为了这个操作的目的,这个地址并不存在于你的网络内部。但是,这个包也将不会通过,因为它来自于一个有特权的端口并且是发往一个有特权的端口(80)。最后,输入下面的命令:
sendip 192.168.2.37一p tcp—ta 1一ts 4356一td 6450—tn—is 45·2·5·6
(12)根据你的防火墙配置,这个包可能被允许通过。这是由于ACK位是用一ta选项设置的。因此,防火墙规则可能允许它通过,因为它是已经建立起的会话的一部分。另外,注意源和目的端口是短暂的,并且也鲜为人知(1023以下)。考虑使用附加的命令来进一步测试你的防火墙。在不影响你所期望提供的服务的情况下,做一些必要的修改。
注意:像类似于SendlP和Netcat的应用程序经常被黑客们使用。注意你不能允许你网络上所有的用户访问这样的应用程序。事实上,即使用前面所示意的方法来使用Telnet也是不推荐的,除非你拥有所扫描的系统,或者你从系统操作员那里得到了明确的允许,能够扫描。对你的IT职员应该作一定的培训,让他们小心使用这个软件,并且他们必须知道他们永远都不允许扫描或将其他的包发送到系统上,这不是他们的职责范围。
为了提防像这类应用程序的非法使用,考虑将一个注释放到你的安全策略中来达到这种
效果:只有一定的用户允许访问扫描和IP伪装软件来实现安全监听的目的。