emiliano-gza/port-scanner
GitHub: emiliano-gza/port-scanner
一个用 Python 编写的简单 TCP 端口扫描器,用于检测目标主机上指定端口范围内的开放端口及其对应服务名称。
Stars: 0 | Forks: 0
# 端口扫描器
我的第一个 Python 脚本 —— 在学习攻防安全时编写的一个简单的 TCP 端口扫描器。
我的第一个 Python 脚本 —— 一个简单的 TCP 端口扫描器,是在我学习攻防安全时编写的。
```
python scanner.py
```
输出示例 / Salida de ejemplo:
```
Puerto 631 (ipp) abierto
```
## 🇲🇽 脚本报告
我们导入了 `socket`,这是一个用于在我们的计算机上打开 socket 的库。经查阅资料,socket 就像是你计算机的电话:它负责与网络上的服务进行通信并等待响应。此外,我们还导入了 `sys`,也就是系统工具,这仅仅是一个良好的编程习惯。
我编写了一个 `def scan_puertos(host, ports)`。这个 `def` 是一段可重复使用的代码,它要求在使用时为其提供一个 host 和一些 ports。我们使用 `for`,因为它是一个能严格按照你指定的次数进行循环的结构;将它与 `port in ports` 结合使用,就能让 `for` 语句为 ports 中的每一个端口执行一次。
`sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)`:在这一行中,我们准备好通过 IPv4(通过 `AF_INET`;如果我们想使用 IPv6,则是 `AF_INET6`)拨号连接到各个端口,然后我们引入了 TCP 协议,因为它是目前最可靠的协议。
`sock.settimeout(1)`:这里我们设定了一个 1 秒的计时器,用于控制 socket 对端口的呼叫时长。这样可以避免程序陷入死循环,一直等待一个已关闭或被过滤的端口的响应;因此,我们假设如果它在 1 秒内没有响应,就直接跳转到下一个端口。
`result = sock.connect_ex((host, port))`:我们将连接 host 和 port 的结果保存在 `result` 中。`sock.connect_ex` 用于检测端口是否开放,而 `_ex` 的作用是:如果发生错误,不会直接将其标记为程序错误,而是仅仅返回一个数字;其中 0 表示成功,任何非 0 的数字都表示失败。
接着我写了一个 `if` 语句:如果 `result` 等于 0,它会尝试执行 `servicio = socket.getservbyport(port)`,该函数用于查找这个开放端口的名称,同时配合了一个异常处理,这样如果该服务没有名称或被隐藏,就会输出 "desconocido"(未知)。之后我打印出结果:端口及其对应的服务。最后,我关闭了 `sock`,以免留下未关闭的悬空连接。
最后,我只是让代码在一个 host 和一个范围内(也就是 `ports`)运行,结果发现我的计算机上开放了 631 端口,它是用于打印机的 `ipp`。
为什么没有使用 `else`?因为我想设置一个过滤器,让它只向我展示处于开放状态的结果。
## 🇺🇸 脚本报告
我导入了 socket 和 sys,其中 socket 是一个允许你在计算机上打开 socket 的库,这样该 socket 就可以与其他服务进行通信。我编写了一个 def —— def 是一段可重用的代码 —— 名为 `scan_puertos(host, ports)`。这个 def 在被调用时,期望接收一个 host(一个 IP)和 ports(一个范围),随后我继续使用了一个 for 循环。为什么是 for?因为 for 可以运行指定的次数;在这个例子中,次数对应的就是 ports 中的每一个端口,也就是说,对于 ports 中的每一个端口,这个 def 都必须运行一次该代码。
继续看第 6 行,我准备了一个开放式的 socket 来尝试呼叫这些端口,然后我设置了一个 1 秒的超时等待时间,这样 socket 就不会卡在某个端口上。
继续看代码,变量 result 会根据 `sock.connect_ex` 的结果持有 1 或 0,其中 `_ex` 的作用是这样的:如果出现错误,程序不会崩溃,而是返回一个数字 —— 非零表示错误,0 表示成功。
如果一切顺利,程序就会进入一个 try 块去获取端口的名称,如果遇到服务没有名称或其他异常情况,则会通过 except 捕获错误,最后它会关闭该 socket,确保我不会留下未关闭的悬空连接。
最后,我调用了 def `scan_puertos`,并传入了 host 以及一个 `range(1, 1025)`。我发现我的计算机开放了 631 端口,它是一项用于打印机的服务,即 ipp。
仅供教育和授权测试使用。 / Con fines educativos y pruebas autorizadas únicamente.
标签:Python, 插件系统, 数据统计, 无后门, 端口扫描, 网络安全, 网络编程, 逆向工具, 隐私保护