还剩6页未读,继续阅读
文本内容:
一、端口扫描器功能简介:服务器上所开放的端口就是潜在的通信通道,也就是一个入侵通道对目标计算机进行端口扫描,能得到很多有用的信息,进行端口扫描的方法很多,可以是手工进行扫描、也可以用端口扫描软件进行扫描器通过选用远程TCP/IP不同的端口的服务,并纪录目标赐予的回答,通过这种方法可以搜集到很多关于目标主机的各种有用的信息,例如远程系统是否支持匿名登陆、是否存在可写的FTP名目、是否开放TELNET服务和HTTPD服务等
二、常用端口扫描技术
1、TCPconnect扫描:这是最基本的TCP扫描,操作系统供应的connect系统调用可以用来与每一个感爱好的目标计算机的端口进行连接假如端口处于侦听状态,那么connect就能胜利否则,这个端口是不能用的,即没有供应服务这个技术的一个最大的优点是,你不需要任何权限系统中的任何用户都有权利使用这个调用另一个好处就是速度,假如对每个目标端口以线性的方式,使用单独的connect调用,那么将会花费相当长的时间,使用者可以通过同时打开多个套接字来加速扫描使用非堵塞I/O允许你设置一个低的时间用完周期,同时观看多个套接字但这种方法的缺点是很简洁被察觉,并且被防火墙将扫描信息包过滤掉目标计算机的logs文件会显示一连串的连接和连接出错消息,并且能很快使它关闭
2、TCPSYN扫描:这种技术通常认为是半开放扫描,这是由于扫描程序不必要打开一个完全的TCP连接扫描程序发送的是一个SYN数据包,好象预备打开一个实际的连接并等待反应一样(参考TCP的三次握手建立一个TCP连接的过程X一个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反向idem扫描:ident合同允许(rfcl413)看到通过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权限8SUDPrecvfrom和write扫描:当非root用户不能直接读到端口不能到达错误时zLinux能间接地在它们到达时通知用户比如,对一个关闭的端口的其次个write调用将失败在非堵塞的UDP套接字上调用recvfrom时,假如ICMP出错还没有到达时回返回EAGAIN-重试假如ICMP到达时,返回ECONNREFUSED-连接被拒绝这就是用来查看端口是否打开的技术三.编写一个简洁的端口扫描程序/********************************************I/*端口扫描器源代码V/*PortScanner.cpp*//********************************************I#include#include#includeintmainintargcchar*argv[]{intmysocket;intpcount=0;structsockaddrjnmy_addr;WSADATAwsaData;WORDwVersionRequested=MAKEWORDlzl;ifargc3{printfusage:%s\nzargv
[0];exitl;ifWSAStartupwVersionRequestedwsaData{printfWinsockInitializationfailed.\n;exitl;forinti=l;iatoiargv
[2];i++{if{mysocket=socketAFJNETSOCK_STREAMzO==INVALID_SOCKET{printfSocketError;exitl;my_addr.sin_family=AFJNET;my_addr.sin_port=htonsi;my_addr.sin_addr.s_addr=inet_addrargv[l];ifconnectmysocket/structsockaddr*my_addr/sizeofstructsockaddr==SOCKET_ERRORclosesocketmysocket;else{pcount++;printfPort%d-open\rTi;}printf%dportsopenonhost-%s\npcountargv[l];closesocketmysocket;WSACIeanupO;return0;这个程序使用BorlandC++编译,程序中关键代码是my_addr.sin_port=htonsi”由于变量i是一个循环量,它从一开头到使用者设定值结束,而htonsi则是对连接远程服务器需要使用的端口进行定义,之后使用connect函数连接指定端口,通过返回值推断这个端口是否打开,这样一个端口扫描的思路就消失了程序中用到的socket函数库是特地实现网络连接的一套综合函数库,这套函数内容丰富,在各种流行编程语言中都有,黑客在学习了C语言和socket函数库以后,便可以快速把握各种编程语言、并能够编写出相当数量的黑客工具。