基于python的端口扫描

 

前言

端口扫描,就是逐个对一段端口或指定的端口进行扫描。通过扫描结果可以知道一台计算机上都提供了哪些服务,然后就可以通过所提供的这些服务的己知漏洞就可进行攻击。其原理是当一个主机向远端一个服务器的某一个端口提出建立一个连接的请求,如果对方有此项服务,就会应答,如果对方未安装此项服务时,即使你向相应的端口发出请求,对方仍无应答,利用这个原理,如果对所有熟知端口或自己选定的某个范围内的熟知端口分别建立连接,并记录下远端服务器所给予的应答,通过查看一记录就可以知道目标服务器上都安装了哪些服务,这就是端口扫描,通过端口扫描,就可以搜集到很多关于目标主机的各种很有参考价值的信息。例如,对方是否提供FTP服务、WWW服务或其它服务。

端口扫描的工具:

Nmap

Nmap -p -sV  ip   通过nmap 进行端口扫描

 

 

 如上图所示,开放端口 22 80 111 57695

 

如果不是内网靶机,推荐在线端口扫描工具

https://www.qtool.net/port

 

 

 

在线扫描不会暴露自己的IP地址安全。

Python是实现端口扫描

基于python-nmap模块的端口扫描

注意:如果采用windows系统,安装nmap模块 安装 python-nmap模块

import nmap

def NmapScan(targetIP, targetPort):

       nm = nmap.PortScanner()

       try:

              result = nm.scan(hosts=targetIP, arguments='-p'+targetPort)

              for i in targetPort.split(','):

                     i=int(i.strip())

                     port_infor = result['scan'][targetIP]['tcp'][i]

                     print("[{}] : [{}]".format(i, port_infor['state'] ))

       except Exception as e:

              print(e)

NmapScan("192.168.159.130",'80,48,445,20')
View Code
 

基于socket的端口扫描

加入了线程

 

from os import name

import threading

from socket import *

import tqdm                                 # 进度条,可自行加上

 

lock = threading.Lock()                     # 确保 多个线程在共享资源的时候不会出现脏数据

openNum=0                                   # 端口开放数量统计

threads=[]                                  # 线程池

 

def portscanner(host,port):

    global openNum

    try:

        s=socket(AF_INET,SOCK_STREAM)

        s.connect((host,port))

        lock.acquire()

        openNum+=1

        print(f"{port} open")

        lock.release()

        s.close()

    except:

        pass

 

def main(ip,ports=range(65535)):            # 设置 端口缺省值0-65535

    setdefaulttimeout(1)

    for port in ports:

        t=threading.Thread(target=portscanner,args=(ip,port))

        threads.append(t)

        t.start()

    for t in threads:

        t.join()

    print(f"PortScan is Finish ,OpenNum is {openNum}") 

 

if __name__ == '__main__':

    ip='10.0.11.11'

    # main(ip,[22,101,8080,8000])          # 输入端口扫描

    main(ip)                               # 全端口扫描
View Code

 

posted on 2022-07-26 10:25  a阿军  阅读(1057)  评论(0编辑  收藏  举报

导航