Eswlnk Blog Eswlnk Blog
  • 资源
    • 精彩视频
    • 破解专区
      • WHMCS
      • WordPress主题
      • WordPress插件
    • 其他分享
    • 极惠VPS
    • PDF资源
  • 关于我
    • 论文阅读
    • 关于本站
    • 通知
    • 左邻右舍
    • 玩物志趣
    • 日志
    • 专题
  • 热议话题
    • 游戏资讯
  • 红黑
    • 渗透分析
    • 攻防对抗
    • 代码发布
  • 自主研发
    • 知识库
    • 插件
      • ToolBox
      • HotSpot AI 热点创作
    • 区块
    • 快乐屋
    • 卡密
  • 乱步
    • 文章榜单
    • 热门标签
  • 问答中心反馈
  • 注册
  • 登录
首页 › 攻防对抗 › 如何使用Python在线扫描端口

如何使用Python在线扫描端口

Eswlnk的头像
Eswlnk
2023-01-29 22:28:20
如何使用Python在线扫描端口-Eswlnk Blog
智能摘要 AI
本文介绍了两种基于Python的端口扫描工具,旨在解决nmap无法扫描出某些开放端口的问题。第一种工具通过调用第三方在线网站API进行端口扫描,适用于避免nmap被防火墙阻止的情况。第二种工具则采用socket多线程技术实现端口扫描,支持自定义端口范围和线程数。文中提供了详细的代码示例,并提醒用户调整扫描路径、端口范围及线程数以优化性能。特别指出,高线程数可能导致部分开放端口遗漏,建议合理设置线程数以提高准确性。

在渗透过程中,经常会遇到 nmap 扫描不出端口的情况,web 端口确定开放,且用网上的在线端口扫描是可以扫描到的,但是 nmap 就是无法扫出来,因此花了些时间写了 2 个基于 python 端口扫描工具。

基于在线网站调用扫描工具

如何使用Python在线扫描端口-Eswlnk Blog

代码

# -*- coding: utf-8 -*-
import sys, getopt
import requests
import json
import click
 
def banner():
    print('''  _____           _      _____                 
 |  __ \         | |    / ____|                
 | |__) |__  _ __| |_  | (___   ___ __ _ _ __  
 |  ___/ _ \| '__| __|  \___ \ / __/ _` | '_ \ 
 | |  | (_) | |  | |_   ____) | (_| (_| | | | |
 |_|   \___/|_|   \__| |_____/ \___\__,_|_| |_|
                                               
    Author:XiaoWu           Blog:blog.eswlnk.com       
                                               ''')
 
def save(data):
    f = open(r'F:\桌面\端口结果.txt', 'a')  #记得修改此处路径为你要存放结果的路径
    f.write(data + '\n')
    f.close()
 
def run(url):
    try:
        for port in range(1,65536):
            headers ={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36'}
            data = {'port':url,'ports':port}
            data = requests.post('http://www.yzcopen.com/seo/getport',data=data,headers = headers)
            data = json.loads(data.text)
            result = data["restparm"]
            data = " ".join('%s' %a for a in result)
            if "开启" in data:
                click.secho(f"[√] %s   端口开启"%(port), fg="red")
                save("%s:%s   端口开启"%(url,port))
            else:
                print("[×] %s  端口关闭"%(port))
        click.secho(f"[ok] 全部端口扫描完毕", fg="red")
    except:
        pass
 
def main(argv):
    banner()
    try:
        options, args = getopt.getopt(argv, "hp:i:", ["help", "url="])
    except getopt.GetoptError:
        print("使用方法: python portscan.py --url www.baidu.com")
        sys.exit()
 
    for option, value in options:
        if option in ("-h", "--help"):
            print("使用方法: python portscan.py --url www.baidu.com")
        if option in ("-u", "--url"):
            print("目标:%s  端口扫描任务现在开始\n"%(value))
            run(value)
 
if __name__ == '__main__':
    main(sys.argv[1:])

说明

  • 修改代码中 19 行,成功结果保存路径为你自己的路径。
  • 由于是调用第三方,所以并没有加入多线程,否则会触发防火墙拉IP。
  • 工具默认扫描 1-65535 全端口,如果需要扫描指定端口范围,可修改代码 25 行中的 1 (起始端口) 和 65536 (结束端口)

基于 socket 的多线程扫描工具

如何使用Python在线扫描端口-Eswlnk Blog

# -*- coding: utf-8 -*-
# @Author: mrwu
# @Date:   2022-05-12 16:46:09
# @Last Modified by:   mrwu
# @Last Modified time: 2022-05-17 15:23:51
 
# 多线程扫描工具
import queue
import socket
import sys
import threading
import time
 
def banner():
    print('''  _____           _      _____                 
 |  __ \         | |    / ____|                
 | |__) |__  _ __| |_  | (___   ___ __ _ _ __  
 |  ___/ _ \| '__| __|  \___ \ / __/ _` | '_ \ 
 | |  | (_) | |  | |_   ____) | (_| (_| | | | |
 |_|   \___/|_|   \__| |_____/ \___\__,_|_| |_|
                                               
    Author:XiaoWu           Blog:blog.eswlnk.com        
                                               ''')
	
# 定义端口扫描类
# 要想创建一个线程对象,只要继承类threading.Thread,然后在__ init__里边调用threading.Thread.__init__()方法
class PortScaner(threading.Thread):
	def __init__(self, ip, portqueue, timeout=3):
		threading.Thread.__init__(self)
		self.portqueue = portqueue
		self.ip = ip
		self.timeout = timeout
 
	def run(self):
	    while True:
	        # 判断当前端口是否为空,为空跳False跳出循环,否则从队列中取出端口,判断当超过指定时间的话退出等待
	        if self.portqueue.empty():
	            break
	        port = self.portqueue.get(timeout=0.5)
	        time.sleep(0.2)
	        print("\r[-] 正在扫描端口: ".format(port)+str(port)+"/"+str(end_port), end="")
	        try:
	            # Ipv4网络协议        提供面向连接的稳定数据传输,建立可靠的通讯,即TCP协议
	            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
	            # 超时调用,超过时间,就执行
	            s.settimeout(self.timeout)
	            result_code = s.connect_ex((self.ip, port))  # 该方法如果链接成功会返回0,失败会返回errno库中的errorcode中的key,当为0是代表端口开放
	            if result_code == 0:
	                sys.stdout.write(f"\r[!] 目标: {self.ip}:%d 端口开放\n" % port)
	        except Exception as e:
	            print(e)
	        finally:
	            s.close()
 
 
# 根据用户输入的参数来指定目标ip,端口队列的生成以及子线程的生成,同时还支持单个端口的扫描和范围端口的扫描
def StartScan(targetip, start_port, end_port, threadNum):
    portlist = []  # 端口列表
    for i in range(start_port, end_port):
        portlist.append(i)
    # 目标ip地址
    ip = targetip
    # 线程列表
    threads = []
    # 线程数量
    threadNumber = threadNum
    # 端口队列
    portQueue = queue.Queue()
    # 生成端口,加入端口队列
    for port in portlist:
        portQueue.put(port)
    for t in range(threadNumber):
        threads.append(PortScaner(ip, portQueue, timeout=3))
    # 启动线程
    for thread in threads:
        thread.start()
    # 阻塞线程
    for thread in threads:
        thread.join()
 
 
# 主函数
if __name__ == '__main__':
	banner()
	print("----------------------------------------------")
	ip = input('   输入目标IP:')
	if not ip:
		ip = '127.0.0.1'
	print("   >>>>[1] 端口范围    [2] 指定端口")
	dk = input('   根据上述输入选择 (默认1):')
	if not dk:
		dk = '1'
	if dk == '1':
		start_port = input('   输入起始端口 (默认1):')
		if not start_port:
			start_port = 1
		end_port = input('   输入结束端口 (默认65535):')
		if not end_port:
			end_port = 65535
	elif dk == '2':
		start_port = input('   输入指定端口:')
		end_port = start_port
	threadNum = input('   输入线程数 (默认100-太高容易不准确):')
	if not threadNum:
		threadNum = 100
	print("----------------------------------------------")
	#print('\n')
 
StartScan(ip, int(start_port), int(end_port)+1, int(threadNum))
print("\r[√] 所有扫描均已完成!")

说明

  • 线程最好不要太高,太高会漏掉一些开放的端口。
本站默认网盘访问密码:1166
本站默认网盘访问密码:1166
python代码发布网络端口
0
0
Eswlnk的头像
Eswlnk
一个有点倒霉的研究牲站长
赞赏
EmpireCMS漏洞常见漏洞分析及复现
上一篇
Web Hacking Playground本地渗透测试平台
下一篇

评论 (0)

请登录以参与评论
现在登录
    发表评论

猜你喜欢

  • 小工具开发之EdgeOne免费计划兑换工具
  • 研究日志:ERA5-Land数据解析问题
  • 今日热点:伪Clash软件下载陷阱曝光,附防范建议
  • 开发日志:解决Windows平台无法使用Metview解析数据的难题
  • 「攻防对抗」利用 fastjson 原生反序列化与动态代理突破安全限制
Eswlnk的头像

Eswlnk

一个有点倒霉的研究牲站长
1108
文章
319
评论
679
获赞

随便看看

Linux与Rootkit的相爱相杀
2022-04-22 10:47:32
2021数字中国创新大赛虎符网络安全赛道
2023-09-06 23:20:03
「深度解析」有关某木马编程解析
2023-09-11 0:38:24

专题展示

WordPress53

工程实践37

热门标签

360 AI API CDN java linux Nginx PDF PHP python SEO Windows WordPress 云服务器 云服务器知识 代码 免费 安全 安卓 工具 开发日志 微信 微软 手机 插件 攻防 攻防对抗 教程 日志 渗透分析 源码 漏洞 电脑 破解 系统 编程 网站优化 网络 网络安全 脚本 苹果 谷歌 软件 运维 逆向
  • 首页
  • 知识库
  • 地图
Copyright © 2023-2025 Eswlnk Blog. Designed by XiaoWu.
本站CDN由 壹盾安全 提供高防CDN安全防护服务
蜀ICP备20002650号-10
页面生成用时 1.128 秒   |  SQL查询 32 次
本站勉强运行:
友情链接: Eswlnk Blog 网站渗透 倦意博客 特资啦!个人资源分享站 祭夜博客 iBAAO壹宝头条
  • WordPress142
  • 网络安全64
  • 漏洞52
  • 软件52
  • 安全48
现在登录
  • 资源
    • 精彩视频
    • 破解专区
      • WHMCS
      • WordPress主题
      • WordPress插件
    • 其他分享
    • 极惠VPS
    • PDF资源
  • 关于我
    • 论文阅读
    • 关于本站
    • 通知
    • 左邻右舍
    • 玩物志趣
    • 日志
    • 专题
  • 热议话题
    • 游戏资讯
  • 红黑
    • 渗透分析
    • 攻防对抗
    • 代码发布
  • 自主研发
    • 知识库
    • 插件
      • ToolBox
      • HotSpot AI 热点创作
    • 区块
    • 快乐屋
    • 卡密
  • 乱步
    • 文章榜单
    • 热门标签
  • 问答中心反馈