开发手册 欢迎您!
软件开发者资料库

Python网络扫描仪

Python渗透测试Python网络扫描仪 - 从基本到高级概念的简单简单步骤学习Python渗透测试,包括简介,评估方法,网络通信入门,套接字及其方法,Python网络扫描仪,网络数​​据包嗅探, ARP欺骗,无线网络测试,应用层,客户端验证,DoS和DDoS攻击,SQLi Web攻击,XSS Web攻击。

端口扫描可以定义为监视技术,用于定位特定主机上可用的开放端口.网络管理员,渗透测试人员或黑客可以使用这种技术.我们可以根据我们的要求配置端口扫描程序,以便从目标系统获取最大信息.

现在,考虑运行端口扫描后我们可以得到的信息 :

  • 有关开放端口的信息.

  • 有关正在运行的服务的信息每个端口.

  • 有关目标主机的操作系统和MAC地址的信息.

端口扫描就像一个小偷想要通过检查每扇门和窗户进入房子,看看哪些是打开的.如前所述,用于通过互联网进行通信的TCP/IP协议套件由两种协议组成,即TCP和UDP.两种协议都有0到65535个端口.因为总是建议关闭我们系统的不必要的端口,因此基本上有超过65000个门(端口)可以锁定.这些65535端口可以划分为以下三个范围 :

  • 系统或众所周知的端口:从0到1023

  • 用户或注册端口:1024到49151

  • 动态或私有端口:全部> 49151

使用套接字的端口扫描程序

在上一章中,我们讨论了套接字是什么.现在,我们将使用socket构建一个简单的端口扫描程序.以下是使用socket : 的端口扫描程序的Python脚本;

from socket import *import timestartTime = time.time()if __name__ == '__main__':   target = input('Enter the host to be scanned: ')   t_IP = gethostbyname(target)   print ('Starting scan on host: ', t_IP)      for i in range(50, 500):      s = socket(AF_INET, SOCK_STREAM)            conn = s.connect_ex((t_IP, i))      if(conn == 0) :         print ('Port %d: OPEN' % (i,))      s.close()print('Time taken:', time.time() - startTime)

当我们运行上面的脚本时,它会提示输入主机名,您可以提供任何主机名,如任何网站的名称,但要小心,因为端口扫描可被视为或被视为犯罪.未经您所定位的服务器或计算机所有者的明确书面许可,我们绝不应对任何网站或IP地址执行端口扫描程序.端口扫描类似于去某人的房子并检查他们的门窗.这就是为什么建议在localhost或您自己的网站上使用端口扫描程序(如果有的话).

输出

以上脚本生成以下内容输出 :

Enter the host to be scanned: localhostStarting scan on host: 127.0.0.1Port 135: OPENPort 445: OPENTime taken: 452.3990001678467

输出显示在50到500的范围内(如提供的那样)在脚本中),这个端口扫描程序找到了两个端口 - 端口135和445,打开.我们可以更改此范围并可以检查其他端口.

使用ICMP的端口扫描程序(网络中的实时主机)

ICMP不是端口扫描,但它用于ping远程主机以检查主机是否已启动.当我们必须检查网络中的多个实时主机时,此扫描很有用.它涉及向主机发送ICMP ECHO请求,如果该主机是活动的,它将返回ICMP ECHO Reply.

使用ICMP的端口扫描程序

上述发送ICMP请求的过程也称为ping扫描,由操作系统的ping命令提供.

Ping扫描的概念

实际上,在一种或另一种意义上,ping扫描也称为ping扫描.唯一的区别是ping扫描是在特定网络范围内查找多个计算机可用性的过程.例如,假设我们想要测试完整的IP地址列表然后使用ping扫描,即操作系统的ping命令,逐个扫描IP地址将非常耗时.这就是为什么我们需要使用ping扫描脚本.以下是一个Python脚本,用于通过使用ping sweep : 来查找实时主机;

import osimport platformfrom datetime import datetimenet = input("Enter the Network Address: ")net1= net.split('.')a = '.'net2 = net1[0] + a + net1[1] + a + net1[2] + ast1 = int(input("Enter the Starting Number: "))en1 = int(input("Enter the Last Number: "))en1 = en1 + 1oper = platform.system()if (oper == "Windows"):   ping1 = "ping -n 1 "elif (oper == "Linux"):   ping1 = "ping -c 1 "else :   ping1 = "ping -c 1 "t1 = datetime.now()print ("Scanning in Progress:")for ip in range(st1,en1):   addr = net2 + str(ip)   comm = ping1 + addr   response = os.popen(comm)      for line in response.readlines():      if(line.count("TTL")):         break      if (line.count("TTL")):         print (addr, "--> Live")         t2 = datetime.now()total = t2 - t1print ("Scanning completed in: ",total)

上面的脚本分为三个部分.它首先选择IP地址范围来ping扫描扫描,然后将它分成几部分.然后使用该函数,它将选择ping命令根据操作系统扫描,最后它给出了主机的响应和完成扫描过程所需的时间.

输出

上面的脚本生成以下输出 :

Enter the Network Address: 127.0.0.1Enter the Starting Number: 1Enter the Last Number: 100Scanning in Progress:Scanning completed in: 0:00:02.711155

以上输出显示没有实时端口,因为防火墙已打开且ICMP入站设置也被禁用.更改这些设置后,我们可以获取t中的实时端口列表输出中提供的范围是1到100.

使用TCP扫描的端口扫描程序

要建立TCP连接,主机必须执行三次 - 握手.按照以下步骤执行操作 :

步骤1 : 号;设置了SYN标志的数据包

在此步骤中,尝试启动连接的系统以设置了SYN标志的数据包开始.

第2步和第2步;设置了SYN-ACK标志的数据包

在此步骤中,目标系统返回带有SYN和ACK标志集的数据包.

步骤3 : 设置了ACK标志的数据包

最后,启动系统会将数据包返回到原始目标系统并设置ACK标志.

然而,这里出现的问题是,如果我们可以使用ICMP回应请求和回复方法(ping扫描扫描程序)进行端口扫描,那么为什么我们需要TCP扫描?其背后的主要原因是假设我们关闭ICMP ECHO回复功能或使用防火墙到ICMP数据包然后ping扫描扫描器将无法工作,我们需要TCP扫描.

import socketfrom datetime import datetimenet = input("Enter the IP address: ")net1 = net.split('.')a = '.'net2 = net1[0] + a + net1[1] + a + net1[2] + ast1 = int(input("Enter the Starting Number: "))en1 = int(input("Enter the Last Number: "))en1 = en1 + 1t1 = datetime.now()def scan(addr):   s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)   socket.setdefaulttimeout(1)   result = s.connect_ex((addr,135))   if result == 0:      return 1   else :      return 0def run1():   for ip in range(st1,en1):      addr = net2 + str(ip)      if (scan(addr)):         print (addr , "is live")         run1()t2 = datetime.now()total = t2 - t1print ("Scanning completed in: " , total)
上述脚本分为三部分.它通过将其拆分为多个部分来选择要扫描扫描的IP地址范围.然后使用扫描地址的函数,进一步使用套接字.稍后,它会给出有关主机的响应以及完成扫描过程所需的时间.结果= s. connect_ex((addr,135))语句返回错误指示符.如果操作成功,则错误指示符为0,否则,它是errno变量的值.在这里,我们使用端口135;此扫描程序适用于Windows系统.另一个在这里工作的端口是445(Microsoft-DSActive Directory)并且通常是打开的.

输出

上面的脚本生成以下输出:
Enter the IP address: 127.0.0.1Enter the Starting Number: 1Enter the Last Number: 10127.0.0.1 is live127.0.0.2 is live127.0.0.3 is live127.0.0.4 is live127.0.0.5 is live127.0.0.6 is live127.0.0.7 is live127.0.0.8 is live127.0.0.9 is live127.0.0.10 is liveScanning completed in: 0:00:00.230025

用于提高效率的螺纹端口扫描器

正如我们在上述情况中看到的那样,端口扫描可能会很慢.例如,您可以看到使用套接字端口扫描程序扫描端口50到500所用的时间是452.3990001678467.为了提高速度,我们可以使用线程.以下是端口扫描程序使用线程的示例:

import socketimport timeimport threadingfrom queue import Queuesocket.setdefaulttimeout(0.25)print_lock = threading.Lock()target = input('Enter the host to be scanned: ')t_IP = socket.gethostbyname(target)print ('Starting scan on host: ', t_IP)def portscan(port):   s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)   try:      con = s.connect((t_IP, port))      with print_lock:         print(port, 'is open')      con.close()   except:      passdef threader():   while True:      worker = q.get()      portscan(worker)      q.task_done()      q = Queue()   startTime = time.time()   for x in range(100):   t = threading.Thread(target = threader)   t.daemon = True   t.start()   for worker in range(1, 500):   q.put(worker)   q.join()print('Time taken:', time.time() - startTime)

在上面的脚本中,我们需要导入内置的线程模块在Python包中.我们使用线程锁定概念 thread_lock = threading.Lock()来避免一次多次修改.基本上,threading.Lock()将允许单个线程一次访问变量.因此,不会发生双重修改.

稍后,我们定义一个threader()函数,它将从worker for循环中获取工作(端口).然后调用portscan()方法连接到端口并打印结果.端口号作为参数传递.任务完成后,调用q.task_done()方法.

现在运行上面的脚本后,我们可以看到扫描50到500个端口的速度差异.它只花了1.3589999675750732秒,这远远小于452.3990001678467,套接字端口扫描程序扫描相同数量的localhost端口所花费的时间.

输出

上面的脚本生成以下输出 :

Enter the host to be scanned: localhostStarting scan on host: 127.0.0.1135 is open445 is openTime taken: 1.3589999675750732