red10057的专栏

一、端口扫描器功能简介:服务器上所开放的端口就是潜在的通信通道,也就是一个入侵通道。对目标计算机进行端口扫描,能得到许多有用的信息,进行端口扫描的方法很多,可以是手工进行扫描、也可以用端口扫描软件进行。扫描器通过选用远程TCP/IP不同的端口的服务,并记录目标给予的回答,通过这种方法可以搜集到很多关于目标主机的各种有用的信息,例如远程系统是否支持匿名登陆、是否存在可写的FTP目录、是否开放TELNET服务和HTTPD服务等。二、常用端口扫描技术:1、TCPconnect()扫描:这 是最基本的TCP扫描,操作系统提供的connect()系统调用可以用来与每一个感兴趣的目标计算机的端口进行连接。如果端口处于侦听状态,那么 connect()就能成功。否则,这个端口是不能用的,即没有提供服务。这个技术的一个最大的优点是,你不需要任何权限。系统中的任何用户都有权利使用 这个调用。另一个好处就是速度,如果对每个目标端口以线性的方式,使用单独的connect()调用,那么将会花费相当长的时间,使用者可以通过同时打开 多个套接字来加速扫描。使用非阻塞I/O允许你设置一个低的时间用尽周期,同时观察多个套接字。但这种方法的缺点是很容易被察觉,并且被防火墙将扫描信息 包过滤掉。目标计算机的logs文件会显示一连串的连接和连接出错消息,并且能很快使它关闭。2、TCPSYN扫描:这种技术通常认为 是“半开放”扫描,这是因为扫描程序不必要打开一个完全的TCP连接。扫描程序发送的是一个SYN数据包,好象准备打开一个实际的连接并等待反应一样(参 考TCP的三次握手建立一个TCP连接的过程)。一个SYN|ACK的返回信息表示端口处于侦听状态:返回RST表示端口没有处于侦听态。如果收到一个 SYN|ACK,则扫描程序必须再发送一个RST信号,来关闭这个连接过程。这种扫描技术的优点在于一般不会在目标计算机上留下记录,但这种方法的缺点是 必须要有root权限才能建立自己的SYN数据包。3、TCPFIN扫描:SYN扫描虽然是“半开放”方式扫描,但在某些时候也不能 完全隐藏扫描者的动作,防火墙和包过滤器会对管理员指定的端口进行监视,,有的程序能检测到这些扫描。相反,FIN数据包在扫描过程中却不会遇到过多问题, 这种扫描方法的思想是关闭的端口会用适当的RST来回复FIN数据包。另一方面,打开的端口会忽略对FIN数据包的回复。这种方法和系统的实现有一定的关 系,有的系统不管端口是否打开都会回复RST,在这种情况下此种扫描就不适用了。另外这种扫描方法可以非常容易的区分服务器是运行Unix系统还是NT系 统。4、IP段扫描:这种扫描方式并不是新技术,它并不是直接发送TCP探测数据包,而是将数据包分成两个较小的IP段。这样就将一个TCP头分成好几个数据包,从而过滤器就很难探测到。但必须小心:一些程序在处理这些小数据包时会有些麻烦。5、TCP反向ident扫描:ident 协议允许(rfc1413)看到通过TCP连接的任何进程的拥有者的用户名,即使这个连接不是由这个进程开始的。例如扫描者可以连接到http端口,然后 用identd来发现服务器是否正在以root权限运行。这种方法只能在和目标端口建立了一个完整的TCP连接后才能看到。6、FTP返回攻击:FTP 协议的一个有趣的特点是它支持代理(proxy)FTP连接,即入侵者可以从自己的计算机self.com和目标主机target.com的 FTPserver-PI(协议解释器)连接,建立一个控制通信连接。然后请求这个server-PI激活一个有效的server-DTP(数据传输进 程)来给Internet上任何地方发送文件。对于一个User-DTP,尽管RFC明确地定义请求一个服务器发送文件到另一个服务器是可以的,但现在这 个方法并不是非常有效。这个协议的缺点是“能用来发送不能跟踪的邮件和新闻,给许多服务器造成打击,用尽磁盘,企图越过防火墙”。7、UDPICMP端口不能到达扫描:这 种方法与上面几种方法的不同之处在于使用的是UDP协议,而非TCP/IP协议。由于UDP协议很简单,所以扫描变得相对比较困难。这是由于打开的端口对 扫描探测并不发送确认信息,关闭的端口也并不需要发送一个错误数据包。幸运的是许多主机在向一个未打开的UDP端口发送数据包时,会返回一个 ICMP_PORT_UNREACH错误,这样扫描者就能知道哪个端口是关闭的。UDP和ICMP错误都不保证能到达,因此这种扫描器必须还实现在一个包 看上去是丢失的时候能重新传输。这种扫描方法是很慢的,因为RFC对ICMP错误消息的产生速率做了规定。同样这种扫描方法也需要具有root权限。8、UDPrecvfrom()和write()扫描:当 非root用户不能直接读到端口不能到达错误时,Linux能间接地在它们到达时通知用户。比如,对一个关闭的端口的第二个write()调用将失败。在 非阻塞的UDP套接字上调用recvfrom()时,如果ICMP出错还没有到达时回返回EAGAIN-重试。如果ICMP到达时,返回 ECONNREFUSED-连接被拒绝。这就是用来查看端口是否打开的技术。三、编写一个简单的端口扫描程序:/********************************************//*端口扫描器源代码*//*PortScanner.cpp*//********************************************/

#include<stdio.h>#include<string.h>#include<winsock.h>

intmain(intargc,char*argv[]){

intmysocket;

intpcount=0;

structsockaddr_inmy_addr;

WSADATAwsaData;

WORDwVersionRequested=MAKEWORD(1,1);

if(argc<3){

printf("usage:%s<host><maxport>/n",argv[0]);

exit(1);

}

if(WSAStartup(wVersionRequested,&wsaData)){

printf("WinsockInitializationfailed./n");

exit(1);

}

for(inti=1;i<atoi(argv[2]);i++){

if((mysocket=socket(AF_INET,SOCK_STREAM,0))==INVALID_SOCKET){

printf("SocketError");

exit(1);

}

my_addr.sin_family=AF_INET;

my_addr.sin_port=htons(i);

my_addr.sin_addr.s_addr=inet_addr(argv[1]);

if(connect(mysocket,(structsockaddr*)&my_addr,sizeof(structsockaddr))==SOCKET_ERROR)

closesocket(mysocket);

else{

pcount++;

printf("Port%d-open/n",i);

}}

printf("%dportsopenonhost-%s/n",pcount,argv[1]);

closesocket(mysocket);

WSACleanup();

去了不同的地方,看了不同的风景,知道了不同的事,

red10057的专栏

相关文章:

你感兴趣的文章:

标签云: