几种端口扫描方法
Vanilla TCP connect() scanning, 这是基本的一种TCP扫描,连接程序能够连接你想要扫描的机器上的所有感兴趣的端口。如果端口被监听,那么连接成功。这个技术最大的优势在于,你不需要任何的特权。另一个优点是你可以对于目标端口使用大量的包并行处理。 TCP SYN (half open) scanning, 从名字就可以看出,这是个半连接扫描,这么叫是因为在建立TCP连接要经过两次握手,而这种方法在最后就可以成功连接的时候,发给目标机器一个RST包来取消连接,这样就不会被目标机器记录到日志中。但是,这种扫描需要有Root权限。 TCP FIN (stealth) scanning, 有些时候SYN扫描仍然不行,因为有些防火墙会针对特定的端口监视SYN扫描。而FIN可以轻易的通过,这种扫描的中心思想是目标机器上关闭的端口对你发出的FIN包会给出正确的RST包,另一方面,被防火墙保护的端口会忽略这些有问题的包,这样我们就可以进行判断了。然而,有些系统如Microsoft,它会不管端口的状态,都发出RST。这样,我们也可以用来判断目标机器的系统是*NIX还是NT。 TCP ftp proxy (bounce attack) scanning, FTP反弹攻击:因为ftp协议允许代理ftp连接,也就是说,我可以从evil.com连接到目标机器的FTP协议解释器来建立控制通信连接。然后我可以请求服务器初始化一个数据传输进程来发送一个文件到Internet上任何一个地方。但是现在行不通了,然而你可以连接到一个在防火墙后面的ftp服务器,然后扫描被封锁的端口如139,如果服务器允许读写一个目录,你可以发送任意的数据到你发现打开的端口。 SYN/FIN scanning using IP fragments (bypasses packet filters), 我们在进行TCP扫描或者SYN扫描的时候,把包分成很多小的碎片,并对他们进行伪装来通过防火墙。 UDP recvfrom() scanning, 当一个非root用户不能够得到错误目录的时候,Linux可以在他们得到错误返回的时候间接的通知用户。例如,对一个关闭的端口第二次调用write()通常会失败。Recvfrom()在UDP包上通常会得到EAGAIN ("Try Again", errno 13)或者ECONNREFUSED ("Connection refused",errno 111)的回复。 UDP raw ICMP port unreachable scanning,和TCP扫描,基本相似,只是协议比较简单,扫描有些困难。因为打开的端口不需要回复我们的探测,而关闭的端口也不需要发送错误信息包。幸运的是有些主机会发送ICMP_PORT_UNREACH的错误信息的包,当你发送一个UDP请求到关闭端口时。这样你就可以找出那个端口不是打开的,并且可以判断它们是什么端口。 Reverse-ident scanning. 在rfc1413身份协议中,允许通过TCP连接的进程显示用户名字,即使进程没有完成连接初始化。这样我们可以连接到一个HTTP端口,然后察看是不是root用户在使用目标机器。