端口扫描器的设计与实现代码_主机端口扫描程序设计代码

hacker|
126

怎么用BAT文件做端口扫描器

首先,给你更正一下,估计是你看了别人的教程或者软件,让你以为BAT可以扫端口,严格意义上说批处理文件BAT是不能真正意义上实现扫端口功能,即使有也是利用TELNET。而且是单线程。是没任何意义的。你看到的我估计是S扫描器,然后别人做成一个批处理,比如流行的扫135,1433,3389或者其他溢出都喜欢用S扫描器,因为它速度一流,而且是命令下操作适合做成BAT文件批量处理。而输出扫描结果这个比较简单,就是写几行批处理来提取S扫描器生成的结果Result.txt文件,然后输出到5.txt中。就这么简单。这些代码网上有现成的,如果你有需要可以给我留言,适当的给你分享分享!

Python 实现端口扫描

一、常见端口扫描的原理

0、秘密扫描

秘密扫描是一种不被审计工具所检测的扫描技术。

它通常用于在通过普通的防火墙或路由器的筛选(filtering)时隐藏自己。

秘密扫描能躲避IDS、防火墙、包过滤器和日志审计,从而获取目标端口的开放或关闭的信息。由于没有包含TCP 3次握手协议的任何部分,所以无法被记录下来,比半连接扫描更为隐蔽。

但是这种扫描的缺点是扫描结果的不可靠性会增加,而且扫描主机也需要自己构造IP包。现有的秘密扫描有TCP FIN扫描、TCP ACK扫描、NULL扫描、XMAS扫描和SYN/ACK扫描等。

1、Connect()扫描

此扫描试图与每一个TCP端口进行“三次握手”通信。如果能够成功建立接连,则证明端口开发,否则为关闭。准确度很高,但是最容易被防火墙和IDS检测到,并且在目标主机的日志中会记录大量的连接请求以及错误信息。

TCP connect端口扫描服务端与客户端建立连接成功(目标端口开放)的过程:

① Client端发送SYN;

② Server端返回SYN/ACK,表明端口开放;

③ Client端返回ACK,表明连接已建立;

④ Client端主动断开连接。

建立连接成功(目标端口开放)

TCP connect端口扫描服务端与客户端未建立连接成功(目标端口关闭)过程:

① Client端发送SYN;

② Server端返回RST/ACK,表明端口未开放。

优点:实现简单,对操作者的权限没有严格要求(有些类型的端口扫描需要操作者具有root权限),系统中的任何用户都有权力使用这个调用,而且如果想要得到从目标端口返回banners信息,也只能采用这一 *** 。

另一优点是扫描速度快。如果对每个目标端口以线性的方式,使用单独的connect()调用,可以通过同时打开多个套接字,从而加速扫描。

缺点:是会在目标主机的日志记录中留下痕迹,易被发现,并且数据包会被过滤掉。目标主机的logs文件会显示一连串的连接和连接出错的服务信息,并且能很快地使它关闭。

2、SYN扫描

扫描器向目标主机的一个端口发送请求连接的SYN包,扫描器在收到SYN/ACK后,不是发送的ACK应答而是发送RST包请求断开连接。这样,三次握手就没有完成,无法建立正常的TCP连接,因此,这次扫描就不会被记录到系统日志中。这种扫描技术一般不会在目标主机上留下扫描痕迹。但是,这种扫描需要有root权限。

·端口开放:(1)Client发送SYN;(2)Server端发送SYN/ACK;(3)Client发送RST断开(只需要前两步就可以判断端口开放)

·端口关闭:(1)Client发送SYN;(2)Server端回复RST(表示端口关闭)

优点:SYN扫描要比TCP Connect()扫描隐蔽一些,SYN仅仅需要发送初始的SYN数据包给目标主机,如果端口开放,则相应SYN-ACK数据包;如果关闭,则响应RST数据包;

3、NULL扫描

反向扫描—-原理是将一个没有设置任何标志位的数据包发送给TCP端口,在正常的通信中至少要设置一个标志位,根据FRC 793的要求,在端口关闭的情况下,若收到一个没有设置标志位的数据字段,那么主机应该舍弃这个分段,并发送一个RST数据包,否则不会响应发起扫描的客户端计算机。也就是说,如果TCP端口处于关闭则响应一个RST数据包,若处于开放则无相应。但是应该知道理由NULL扫描要求所有的主机都符合RFC 793规定,但是windows系统主机不遵从RFC 793标准,且只要收到没有设置任何标志位的数据包时,不管端口是处于开放还是关闭都响应一个RST数据包。但是基于Unix(*nix,如Linux)遵从RFC 793标准,所以可以用NULL扫描。 经过上面的分析,我们知道NULL可以辨别某台主机运行的操作系统是什么操作系统。

端口开放:Client发送Null,server没有响应

端口关闭:(1)Client发送NUll;(2)Server回复RST

说明:Null扫描和前面的TCP Connect()和SYN的判断条件正好相反。在前两种扫描中,有响应数据包的表示端口开放,但在NUll扫描中,收到响应数据包表示端口关闭。反向扫描比前两种隐蔽性高些,当精确度也相对低一些。

用途:判断是否为Windows系统还是Linux。

4、FIN扫描

与NULL有点类似,只是FIN为指示TCP会话结束,在FIN扫描中一个设置了FIN位的数据包被发送后,若响应RST数据包,则表示端口关闭,没有响应则表示开放。此类扫描同样不能准确判断windows系统上端口开 *** 况。

·端口开放:发送FIN,没有响应

·端口关闭:(1)发送FIN;(2)回复RST

5、ACK扫描

扫描主机向目标主机发送ACK数据包。根据返回的RST数据包有两种 *** 可以得到端口的信息。 *** 一是: 若返回的RST数据包的TTL值小于或等于64,则端口开放,反之端口关闭。

6、Xmas-Tree扫描

通过发送带有下列标志位的tcp数据包。

·URG:指示数据时紧急数据,应立即处理。

·PSH:强制将数据压入缓冲区。

·FIN:在结束TCP会话时使用。

正常情况下,三个标志位不能被同时设置,但在此种扫描中可以用来判断哪些端口关闭还是开放,与上面的反向扫描情况相同,依然不能判断windows平台上的端口。

·端口开放:发送URG/PSH/FIN,没有响应

·端口关闭:(1)发送URG/PSH/FIN,没有响应;(2)响应RST

XMAS扫描原理和NULL扫描的类似,将TCP数据包中的ACK、FIN、RST、SYN、URG、PSH标志位置1后发送给目标主机。在目标端口开放的情况下,目标主机将不返回任何信息。

7、Dump扫描

也被称为Idle扫描或反向扫描,在扫描主机时应用了第三方僵尸计算机扫描。由僵尸主机向目标主机发送SYN包。目标主机端口开发时回应SYN|ACK,关闭时返回RST,僵尸主机对SYN|ACK回应RST,对RST不做回应。从僵尸主机上进行扫描时,进行的是一个从本地计算机到僵尸主机的、连续的ping操作。查看僵尸主机返回的Echo响应的ID字段,能确定目标主机上哪些端口是开放的还是关闭的。

二、Python 代码实现

1、利用Python的Socket包中的connect *** ,直接对目标IP和端口进行连接并且尝试返回结果,而无需自己构建SYN包。

2、对IP端口进行多线程扫描,注意的是不同的电脑不同的CPU每次最多创建的线程是不一样的,如果创建过多可能会报错,需要根据自己电脑情况修改每次扫描的个数或者将seelp的时间加长都可以。

看完了吗?感觉动手操作一下把!

python学习网,免费的在线学习python平台,欢迎关注!

本文转自:

想用nmap扫描主机开放端口的命令是什么

nmap命令

1.  各种代码举例。 扫描单一的一个主机:#nmap nxadmin.com#nmap 192.168.1.2,扫描整个子网:#nmap 192.168.1.1/24,扫描多个目标:#nmap 192.168.1.2 192.168.1.5, 扫描一个范围内的目标:#nmap 192.168.1.1-100 。

2有关IP的代码。扫描和namp在同一目录下的IP为txt的所有主机:#nmap -iL target.txt,关于你扫描的所有主机的列表:#nmap -sL 192.168.1.1/24,扫描除过某一个ip外的所有子网主机:#nmap192.168.1.1/24-exclude192.168.1.1,扫描特定主机上的80,21,23端口:#nmap-p80,21,23192.168.1.1,扫描除过某一个文件中的ip外的子网主机:#nmap192.168.1.1/24-excludefilexxx.txt。

资料拓展:

扫描模式分类:

1.  FINscan(sF)扫描有时不是更佳的扫描模式,因为有防火墙的存在.目标主机有时候可能有IDS和IPS系统的存在,防火墙会阻止掉SYN数据包。发送一个设置了FIN标志的数据包并不需要完成TCP的握手:

a href="mailto:root@bt:~#nmap-sF192.168.1.8"root@bt:~#nmap-sF192.168.1.8/a/p pStartingNmap5.51at2012-07-0819:21PKTNmapscanreportfor192.168.1.8Hostisup(0.000026slatency).Notshown:999closedportsPORTSTATESERVICE111/tcpopen|filteredrpcbind

版本检测(sV)版本检测是用来扫描目标主机和端口上运行的软件的版本.它不同于其它的扫描技术,它不是用来扫描目标主机上开放的端口,不过它需要从开放的端口获取信息来判断软件的版本.使用版本检测扫描之前需要先用TCPSYN扫描开放了哪些端口:#nmap-sV192.168.1.1。

Idlescan(sL)是一种先进的扫描技术,它不是用你真实的主机Ip发送数据包,而是使用另外一个目标 *** 的主机发送数据包:#nmap-sL192.168.1.6192.168.1.1。

Idlescan是一种理想的匿名扫描技术,它通过目标 *** 中的192.168.1.6向主机192.168.1.1发送数据,来获取192.168.1.1开放的端口有需要其它的扫描技术,这里就比如说FTPbounce(FTP反弹,fragmentationscan(碎片扫描),IPprotocolscan(IP协议扫描),以上讨论的是几种最主要的扫描方式。

Nmap的OS检测(O):Nmap最重要的特点之一是能够远程检测操作系统和软件,Nmap的OS检测技术在渗透测试中用来了解远程主机的操作系统和软件是非常有用的,通过获取的信息你可以知道已知的漏洞。Nmap有一个名为的nmap-OS-DB数据库,该数据库包含超过2600操作系统的信息。

Nmap把TCP和UDP数据包发送到目标机器上,然后检查结果和数据库对照:InitiatingSYNStealthScanat10:21Scanninglocalhost(127.0.0.1)[1000ports]Discoveredopenport111/tcpon127.0.0.1CompletedSYNStealthScanat10:21,0.08selapsed(1000totalports)InitiatingOSdetection(try#1)againstlocalhost(127.0.0.1)RetryingOSdetection(try#2)againstlocalhost(127.0.0.1)。

2.  Nmap的操作系统指纹识别技术:设备类型(路由器,工作组等)运行(运行的操作系统)操作系统的详细信息(操作系统的名称和版本) *** 距离(目标和攻击者之间的距离跳)如果远程主机有防火墙,IDS和IPS系统,你可以使用-PN命令来确保不ping远程主机,因为有时候防火墙会组织掉ping请求.-PN命令告诉Nmap不用ping远程主机:#nmap-O-PN192.168.1.1/24Nmap检测的基础是有开放和关闭的端口,当OSscan无法检测至少一个开放或关闭的端口时:

Warning:OSScanresult *** aybeunreliablebecausewecouldnotfindatleast1openand1closedportOSScan的结果是不可靠的,因为没有发现至少一个开放或者关闭的端口,这种情况是非常不理想的,应该是远程主机做了针对操作系统检测的防范。

如果Nmap不能检测到远程操作系统类型,那么就没有必要使用-osscan_limit检测,想好通过Nmap准确的检测到远程操作系统是比较困难的,需要使用到Nmap的猜测功能选项,–osscan-guess猜测认为最接近目标的匹配操作系统类型:#nmap-O--osscan-guess192.168.1.1。

3.  Tcp SYN Scan (sS) 这是一个基本的扫描方式,它被称为半开放扫描:#nmap -sS 192.168.1.1,Tcp connect() scan(sT)如果不选择SYN扫描,这个扫描就是默认的扫描模式:#nmap -sT 192.168.1.1,Udp scan(sU)扫描技术用来寻找目标主机打开的UDP端口:#nmap -sU 192.168.PINGScan(sP),PING扫描需要ROOT权限,否则PING扫描将会使用connect()调用:#nmap-sP192.168.1.11.1。

假设要判断某台机器打开了哪些tcp端口 该如何设计端口扫描程序

直接在命令提示符里面输入 netstat -a 就可以了。

netstat -a 查看开启了哪些端口,常用netstat -a

netstat -n 查看端口的 *** 连接情况,常用netstat -an

设计一个判断端口是否开启的扫描器程序的源代码怎么写?

for(int i=0;i6;i++)

{

for(int j=0;j10;j++)

{

theport[j].rmt_host=rmt_host;

theport[j].p=port[i*10+j];

theport[j].n=j;

Thread[j]=AfxBeginThread(pScan,(LPVOID)theport[j]);

//启动端口扫描线程

hThread[j]=Thread[j]-m_hThread;

Sleep(1);

}

WaitForMultipleObjects(10,hThread,TRUE,120000);

}

//扫描模块代码

SOCKET sockfd;

SOCKADDR_IN addr;

sockfd = socket(AF_INET, SOCK_STREAM, 0);

if (sockfd 0)

{

exit(0);

}

addr.sin_family = AF_INET;

addr.sin_port = htons(port);

addr.sin_addr.s_addr = inet_addr(rmt_host);

int r = connect(sockfd,(struct sockaddr *) addr, sizeof(addr));

//尝试连接端口进行检测

closesocket(sockfd);

//连接返回值处理

if (r!=-1)

{

::PostMessage(hWnd,WM_DISPLAY,port,0);

}

//显示端口扫描结果

LONG CScanDlg::OnDisplay(LONG lParam, UINT wParam)

{

LPSERVENT bar;

CString open;

int p=lParam;

bar = getservbyport(htons(p),"tcp");

open.Format("\t%d号端口(%s)开放!\r\n",p,(bar == NULL) ? "未知" :

bar-s_name);

m_HistoryEdit.AppendString (open);

return 0;

}

0条大神的评论

发表评论