Python 原生Socket实现端口扫描

举报
微软技术分享 发表于 2022/12/21 17:47:14 2022/12/21
【摘要】 端口扫描,就是逐个对一段端口或指定的端口进行扫描。通过扫描结果可以知道一台计算机上都提供了哪些服务,Python中使用Socket即可实现对特定端口的探测,以及对C段的扫描。扫描目标主机Banner: 为了让函数获得完整的屏幕控制权,这里使用一个信号量,它能够阻止其他线程运行而避免出现多线程同时输出造成的乱码和失序等情况.#coding=utf-8from socket import *fr...

端口扫描,就是逐个对一段端口或指定的端口进行扫描。通过扫描结果可以知道一台计算机上都提供了哪些服务,Python中使用Socket即可实现对特定端口的探测,以及对C段的扫描。

扫描目标主机Banner: 为了让函数获得完整的屏幕控制权,这里使用一个信号量,它能够阻止其他线程运行而避免出现多线程同时输出造成的乱码和失序等情况.

#coding=utf-8
from socket import *
from threading import *

#定义一个信号量
screenLock = Semaphore(value=1)

def ScanBanner(addr,port):
    try:
        conn = socket(AF_INET,SOCK_STREAM)
        conn.connect((addr,port))
        conn.send(bytes("hello lyshark\r\n",encoding="utf-8"))
        res = conn.recv(200)
        # 加锁
        screenLock.acquire()
        print("[+] 主机: {} Banner: {}".format(addr,res))
    except Exception:
        # 加锁
        screenLock.acquire()
        print("[-] 主机: {} 不存在或已经关闭.".format(addr))
        pass
    finally:
        # 执行释放锁的操作
        screenLock.release()
        conn.close()

setdefaulttimeout(1)
for i in range(0,25):
    a = "192.168.1.{}".format(i)
    t = Thread(target=ScanBanner,args=(a,80))
    t.start()

针对域名C段扫描: 首先通过域名解析出目标主机对应的IP地址,然后使用C段扫描找出该C段所有的主机IP.

import socket,threading
import argparse

def PortScan(addr, port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        result = sock.connect_ex((addr, port))
        sock.close()
        if result==0:
            return 1
        else:
            return 0
    except Exception as err:
        return 0

def CalculationIP(Addr_Count):
    IP_List = []
    try:
        IP_Start = str(Addr_Count.split("-")[0]).split(".")
        IP_Heads = str(IP_Start[0] + "." + IP_Start[1] + "." + IP_Start[2] +".")
        IP_Start_Range = int(Addr_Count.split(".")[3].split("-")[0])
        IP_End_Range = int(Addr_Count.split("-")[1])
        for item in range(IP_Start_Range,IP_End_Range+1):
            IP_List.append(IP_Heads+str(item))
        return IP_List
    except Exception:
        return 0

def StartScanner(addr,port):
    for item in port:
        ret = PortScan(addr,item)
        if ret != 0:
            print("address => {} flag => {} port = > {}".format(addr,ret,item))

def Banner():
    print("  _          ____  _                _    ")
    print(" | |   _   _/ ___|| |__   __ _ _ __| | __")
    print(" | |  | | | \___ \| '_ \ / _` | '__| |/ /")
    print(" | |__| |_| |___) | | | | (_| | |  |   < ")
    print(" |_____\__, |____/|_| |_|\__,_|_|  |_|\_\\")
    print("       |___/                             \n")
    print("E-Mail: me@lyshark.com")

if __name__ == '__main__':
    # 使用方式: main.py -a 192.168.1.1-100 -p 80,443,445,135,139
    Banner()
    parser = argparse.ArgumentParser()
    parser.add_argument("-a", "--addr", dest="ip", help="设置要扫描的C段地址")
    parser.add_argument("-p", "--port", dest="port", help="设置要扫描的端口列表")
    args = parser.parse_args()

    # map = >['80','443'] 转为 => [80,443]
    temp = list(str(args.port).split(','))
    port = map(eval,temp)
    thread = []
    if args.ip and args.port:
        addr = CalculationIP(args.ip)
        for i in addr:
            t = threading.Thread(target=StartScanner,args=(i,port))
            t.start()
            thread.append(t)
    for t in thread:
        t.join()
    else:
        parser.print_help()

例如需要探测特定80,443,445,135,139端口:

  • main.py -a 192.168.1.1-100 -p 80,443,445,135,139
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。