您现在的位置是:首页 > 手游情报

端口扫描方式有哪一些,你了解多少?

掌游情报站 2024-11-23【手游情报】300人已围观

简介这篇文章我们来了解端口扫描的相关内容,下文讲给大家介绍nmap探测端口、masscan探测端口、socket探测端口、telnet探测端口、nc探测端口这五种端口扫描方式。感兴趣的朋友就继续往下看吧!事件原由笔者在写一个小工具,针对渗透测试中需要搜集的信息,使用脚本自动化采集。而在这个模块中有个很难...

这篇文章我们来了解端口扫描的相关内容,下文讲给大家介绍nmap探测端口、masscan探测端口、socket探测端口、telnet探测端口、nc探测端口这五种端口扫描方式。感兴趣的朋友就继续往下看吧!

事件原由

笔者在写一个小工具,针对渗透测试中需要搜集的信息,使用脚本自动化采集。而在这个模块中有个很难搞的部分就是端口banner信息搜集,起初我尝试使用了python+nmap+多线程扫描,扫描20+的ip,等的花都谢了。。。而笔者目标是扫描200+的ip。下面我就针对端口扫描的技术进行分析。

1、nmap探测端口

nmap在扫描多个主机的时候可以设置参数--min-hostgroup,设置这个参数可以并行扫描多个主机,将这些主机划分成组,然后一次扫描一个组。

举例:

--min-hostgroup50nmap以50个主机为一组,在扫描完50个主机之前不会显示结果。

#coding=utf-8importnmapfromqueueimportQueuefromthreadingimportThreaddefportscan(ip):portlist=[]nm=()(ip,ports='1-10000',arguments='-sS--min-hostgroup'):m=r[1]['scan'][ip]['tcp']forpinm:temp=str(p)+"----"+m[p]['state'](temp)print(portlist)classConsumer(Thread):def__init__(self,q):Thread.__init__(self)=qdefrun(self):():ip=()try:portscan(ip)exceptExceptionase:print(e)continuedefproducer(ip_list):num=10threads=[]q=Queue()foriinip_list:print(i)(i)threads=[Consumer(q)foriinrange(0,int(num))]fortinthreads:()fortinthreads:()ip_list=['120.78.207.76','120.78.207.231','120.78.207.18','120.78.207.233','120.78.207.165','120.78.207.48','120.78.207.112','120.78.207.27','120.78.207.51','120.78.207.8']producer(ip_list)

如图,运行10个ip需要318s。

2、masscan探测端口

(1)调用pythonmasscan

默认情况下,masscan发送的是syn数据包,如果目标主机返回ack+syn,则说明端口开放。具体流程如下

A:192.168.70.142

B:192.168.0.143开放端口3306

(1)A-Bsyn

(2)B-Asyn+ack

(3)A-BRST

探测未开放的端口

A-Bsyn

B-Arst

举例:

defportscan(ip):mas=()(ip,ports='1-65535')print(_result)

使用系统命令探测

使用方法

扫描扫描443端口的B类子网/16-p443扫描80或443端口的B类子网/16-p80,443扫描100个常见端口的B类子网,每秒100,000个数据包/16--top-ports100-rate100000结果输出-oXfilename:输出到filename的XML。-oGfilename:输出到filename在的grepable格式。-oJfilename:输出到filename在JSON格式。

3、socket探测端口

socket探测端口发送的不是完整的三次握手包如下,

A:192.168.70.142

B:192.168.0.143开放端口3306

A接收到B返回的syn+ack数据包后,A把数据丢弃。

探测不开放端口

A发送syn,B没有开放33端口,所以返回RST数据包。

defportscan(ip,port):try:s=(_INET,_STREAM)(0.2)status=_ex((ip,port))ifstatus==0:temp_str=str(ip)+"---"+str(port)+"---open"port_(temp_str)else:passexceptExceptionase:passfinally:()

探测10个ip花费了26.3s差不多一个2.6s。

4、telnet探测端口

telnet探测端口采用完整的三次握手连接,使用命令telnetipport,发包流程如下

A:192.168.70.142

B:192.168.0.143开放端口3306

过程如下:

使用TCP三次握手建立连接:SYN-SYN+ACK+ACK

探测不存在端口,发送SYN数据包,然后RST包丢弃。

如果有返回值,则说明端口开放,否则则端口关闭。

defportscan(ip,port):try:t=(ip,port=port,timeout=0.2)ift:temp_str=str(ip)+'---'+str(port)port_(temp_str)exceptExceptionase:print(e)pass

探测10个ip花费了27.8s差不多一个2.7s。

5、nc探测端口

nc探测端口采用完整的三次握手连接,使用命令nc-v-w1-zipport,发包过程和telent探测一样。

探测开放端口的数据包

探测未开放端口的数据包

端口开放,返回值为0,可以依此作为判断依据。

defportscan(ip,port):command='nc-v-w1-z{0}{1}'.format(ip,port)m=(command)ifm==0:temp_str=str(ip)+"---"+str(port)port_(temp_str)else:pass

备注:比如你想探测某个指定的端口开放情况,推荐使用nc。

总结

nmap作为扫描端口的神器,扫描出的结果比其他几种方式要详细。如果追求效率的话,建议采用socket。相比于nmap,socket会存在漏报情况,笔者在测试某主机时,nmap扫出了8888端口,但是socket没有。

文本转载自PHP中文网

很赞哦!(117)