热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入解析多种端口扫描技术

本文探讨了在渗透测试中信息收集阶段使用的几种端口扫描技术,包括nmap、masscan、socket、telnet及nc等工具的应用与比较。
在开发一款用于渗透测试的小工具时,为了实现信息的自动化采集,特别是在处理大量IP地址的端口信息收集上,遇到了一些挑战。初始尝试通过Python结合nmap和多线程技术来完成任务,但面对200+ IP地址时,效率问题显得尤为突出。因此,本文将深入分析几种常见的端口扫描方法及其适用场景。

### 1. 使用nmap进行端口扫描
nmap是一款功能强大的网络扫描工具,能够高效地执行主机发现、端口扫描以及服务版本检测等多种任务。在扫描大量主机时,可以通过设置`--min-hostgroup`参数来优化性能,该参数允许同时扫描多个主机,将它们分组处理。例如,使用`--min-hostgroup 50`命令可以将50个主机作为一个批次进行扫描,直到完成这批主机的扫描前不会显示任何结果。更多细节可查阅nmap官方文档。

### 代码示例
```python
#coding=utf-8
import nmap
from queue import Queue
from threading import Thread
def portscan(ip):
portlist = []
nm = nmap.PortScannerYield()
for r in nm.scan(ip, ports='1-10000', arguments='-sS --min-hostgroup'):
m = r[1]['scan'][ip]['tcp']
for p in m:
temp = str(p) + "----" + m[p]['state']
portlist.append(temp)
print(portlist)

class Consumer(Thread):
def __init__(self, q):
Thread.__init__(self)
self.q = q
def run(self):
while not self.q.empty():
ip = self.q.get()
try:
portscan(ip)
except Exception as e:
print(e)
continue

def producer(ip_list):
num = 10
threads = []
q = Queue()
for i in ip_list:
print(i)
q.put(i)
threads = [Consumer(q) for _ in range(num)]
for t in threads:
t.start()
for t in threads:
t.join()

ip_list = ['120.78.207.76', '120.78.207.231', '120.78.207.18', '120.78.207.233', '120.78.207.165', '120.78.207.48', '120.78.207.112', '120.78.207.27', '120.78.207.51', '120.78.207.8']
producer(ip_list)
```
上述代码片段展示了如何利用nmap和多线程技术提高扫描效率。然而,即便如此,对于较大规模的IP地址集合,这种方法仍有待优化。

### 2. 使用masscan进行快速扫描
masscan以其极高的扫描速度著称,适用于大规模网络环境下的快速扫描需求。它默认使用SYN扫描模式,即向目标主机发送SYN包,如果收到SYN+ACK响应,则表明端口开放;若收到RST响应,则表示端口关闭。

#### Python接口调用
```python
def portscan(ip):
mas = masscan.PortScanner()
mas.scan(ip, ports='1-65535')
print(mas.scan_result)
```
#### 命令行使用
- 扫描B类子网中的443端口:`masscan 10.11.0.0/16 -p443`
- 同时扫描80和443端口:`masscan 10.11.0.0/16 -p80,443`
- 高速扫描100个常用端口:`masscan 10.11.0.0/16 --top-ports 100 -rate 100000`

### 3. 利用socket进行端口探测
socket方法直接使用Python标准库中的socket模块来实现端口扫描。这种方式简单直接,但可能不如nmap或masscan那样全面,尤其是在处理复杂网络环境时。

```python
import socket
def portscan(ip, port):
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(0.2)
result = s.connect_ex((ip, port))
if result == 0:
print(f'{ip}:{port} is open')
s.close()
except Exception as e:
print(e)
```

### 4. 使用telnet进行端口探测
虽然telnet通常用于远程登录,但它也可以用来检查特定端口是否开放。此方法涉及完整的TCP三次握手过程。

```python
import telnetlib
def portscan(ip, port):
try:
with telnetlib.Telnet(ip, port, timeout=0.2) as tn:
print(f'{ip}:{port} is open')
except Exception as e:
print(e)
```

### 5. 通过nc命令进行端口探测
nc(Netcat)是一个非常灵活的网络工具,可以用来建立TCP连接或发送UDP数据包。使用`nc -v -w 1 -z ip port`命令可以轻松地探测目标主机上的端口状态。

```python
import os
def portscan(ip, port):
command = f'nc -v -w 1 -z {ip} {port}'
result = os.system(command)
if result == 0:
print(f'{ip}:{port} is open')
```

### 总结
不同的端口扫描工具有各自的优缺点。nmap提供了最详尽的扫描结果,适合于需要深入了解目标网络的情况;而masscan则以其惊人的速度赢得了广泛的认可,特别适用于大规模网络环境。相比之下,基于socket的方法虽然简单,但在某些情况下可能会出现误报。根据实际需求选择合适的工具和技术至关重要。

#### 参考资料
- [nmap官方文档](https://nmap.org/book/man-performance.html)
- [安全脉搏](https://www.secpulse.com/archives/95604.html)
推荐阅读
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 导航栏样式练习:项目实例解析
    本文详细介绍了如何创建一个具有动态效果的导航栏,包括HTML、CSS和JavaScript代码的实现,并附有详细的说明和效果图。 ... [详细]
  • ImmutableX Poised to Pioneer Web3 Gaming Revolution
    ImmutableX is set to spearhead the evolution of Web3 gaming, with its innovative technologies and strategic partnerships driving significant advancements in the industry. ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 掌握远程执行Linux脚本和命令的技巧
    本文将详细介绍如何利用Python的Paramiko库实现远程执行Linux脚本和命令,帮助读者快速掌握这一实用技能。通过具体的示例和详尽的解释,让初学者也能轻松上手。 ... [详细]
  • 本文介绍了在Windows环境下使用pydoc工具的方法,并详细解释了如何通过命令行和浏览器查看Python内置函数的文档。此外,还提供了关于raw_input和open函数的具体用法和功能说明。 ... [详细]
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
author-avatar
ZhuJiongJiongnu_441
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有