tonijanssen-sec/port-scanner

GitHub: tonijanssen-sec/port-scanner

一个用 Python 学习项目编写的简单 TCP 端口扫描器,通过 Socket 连接探测 IPv4 目标上的开放端口。

Stars: 0 | Forks: 0

# 端口扫描器 一个用 Python 编写的端口扫描器。它搜索 IPv4 上的开放端口并将其输出。 ### 为什么以及为了什么? 这是一个关于循环的练习,因为在接下来的职业再培训中马上要进行一场编程技术的考试。 我希望掌握更多技能,开发专门针对网络安全 / 攻击性安全的自定义工具和自动化脚本。 这也为我即将到来的 IT 安全实习做准备。 ``` import socket import argparse portliste = (22, 23, 25, 53, 67, 68, 80, 110, 123, 143, 443, 445 ) #ein tuple, unveränderbar im Prozess def main(): parser = argparse.ArgumentParser(description="Einfacher TCP-Port-Scanner. Prüft eine oder mehrere Ziel-IPs auf offene Ports. by tonijanssen-sec") #parser erstellen parser.add_argument('ziele', type=str, nargs='+', help="Eine oder mehrere Ziel-IPs. Mehrere durch Leerzeichen trennen (kein Komma).") # Pflichtangabe: mindestens eine Ziel-IP (String), mehrere möglich = nargs'+' parser.add_argument('--ports', type=int, nargs='*', default=portliste, help="Zu scannende Ports, durch Leerzeichen getrennt (kein Komma). Ohne Angabe: Standard Portliste.") #parser Argument erstellen, ports sind optional sonst default Wert parser.add_argument('--timeout', type=float, default=1.0, help="Timeout pro Port in Sekunden (Standard 1.0). LAN: 0.1-0.2; über VPN höher.") #default timeout ist auf 1.0 gesetzt, kann im LAN auch auf 0.2 gesetzt werden args = parser.parse_args() # parsed die Argumente for ziel in args.ziele: # zieht sich die Ziele aus der Eingabe des Benutzers for port in args.ports: # zieht die Zielports aus der Eingabe des Benutzers fStringOffen = f"Ziel-IP: {ziel} mit der Portnummer {port} ist offen." #fString = formattierter String s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Modul socket → Funktion socket(), AF_INET = IPv4, SOCK_STREAM = TCP s.settimeout(args.timeout) #socket timeout nach 1.0 sek ergebnis = s.connect_ex((ziel, port)) # 0 = offen, sonst Fehlercode (errno) = zu/gefilter if ergebnis == 0: # also wenn ergebnis offen ist, printe es print(fStringOffen) s.close() # schließt alle Sockets, WICHTIG, bei sehr vielen sprich 65.535 Ports scans kann System sonst abschmieren! if __name__ == "__main__": #prüft: wird das skript direkt aufgerufen? Wenn ja rufe main() funktion auf main() ``` ### 作为 CLI 工具使用 #### 使用示例 1 **显示帮助和所有选项** ``` python port_scanner.py -h ``` #### 使用示例 2 **扫描多个目标** ``` python port_scanner.py [weitere IPs] [--ports ...] [--timeout ...] ``` #### 使用示例 3 **自定义端口和较短的 LAN 超时时间** ``` python port_scanner.py --ports 22 23 25 80 443 --timeout 0.2 ``` #### 使用示例 4 **两个目标并带有更高的超时时间** ``` python port_scanner.py --timeout 1.5 ``` ### 我从这个项目中学到了什么 - Python 中的变量和数据类型(str, int, float, bool) - Tuple 与 List 的区别以及何时使用它们 - if 分支在没有 else 的情况下也能工作 - 对 Tuple 进行 for 循环(单个和嵌套) - f-strings 用于格式化输出 - Sockets: - 创建 Socket - 如何设置超时时间 - 如何进行连接 - 如何关闭 Socket - `connect_ex` 在成功时返回 0,否则返回错误代码 - 嵌套循环,多个目标 × 多个端口 - argparse – 命令行参数,使得该工具无需修改代码即可配置 - 必需参数 vs 可选参数(位置参数不带 `--` 编程,可选参数带 `--` 并且通过声明和初始化的值设置 default) - main() 函数以及 if __name__ == "__main__": 干净地封装代码并仅在直接调用时启动
标签:Python, 云原生安全, 学习项目, 插件系统, 数据统计, 无后门, 端口扫描, 网络安全, 逆向工具, 隐私保护