热门标签 | 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)
推荐阅读
  • addcslashes—以C语言风格使用反斜线转义字符串中的字符addslashes—使用反斜线引用字符串bin2hex—函数把包含数据的二进制字符串转换为十六进制值chop—rt ... [详细]
  • 使用Python爬虫技术从网页中提取图片链接的方法与示例
    本篇文章将详细介绍如何通过Python编程语言来实现从指定网页上抓取图片链接的功能,并提供了一个实用的代码示例。 ... [详细]
  • 日志记录对于软件开发至关重要,特别是在调试和维护阶段。通过日志,开发者能够追踪错误源头并了解系统的运行状态。本文将探讨如何在Django框架中有效配置和使用日志记录功能。 ... [详细]
  • Python多线程编程详解
    本文深入探讨了Python中的多线程机制,包括线程的基本概念、创建线程的方法以及线程间的通信策略。 ... [详细]
  • 本文介绍了Kettle资源库的基本概念、类型及其管理方法,同时探讨了Kettle的不同运行方式,包括图形界面、命令行以及API调用,并详细说明了日志记录的相关配置。 ... [详细]
  • 使用Bootstrap创建响应式渐变固定头部导航栏的方法
    本文详细介绍了如何利用Bootstrap框架构建一个具有渐变效果的固定顶部响应式导航栏,包括HTML结构、CSS样式以及JavaScript交互的完整实现过程。适合前端开发者和学习者参考。 ... [详细]
  • 本文探讨了如何使用ls -lsh命令排除总大小输出,仅显示文件大小的方法,并提供了几种实现这一目标的解决方案。 ... [详细]
  • Python基础教程(一)
    本篇教程将介绍Python中的字符串格式化方法、用户输入处理以及基本的运算符和控制结构。 ... [详细]
  • AJAX技术允许网页在不重新加载整个页面的情况下进行异步更新,通过向服务器发送请求并接收JSON格式的数据,实现局部内容的动态刷新。 ... [详细]
  • 本文旨在介绍在iOS平台进行直播技术开发前的准备工作,重点讲解AVFoundation框架的基本概念和使用方法。通过对AVFoundation的深入理解,开发者能够更好地掌握直播应用中的音视频处理技巧。 ... [详细]
  • Python 文件操作与异常处理全面指南
    本文详细介绍了Python中文件操作的基本方法和异常处理技巧,包括文件的创建、读写、删除等操作,以及如何通过异常处理机制来增强程序的健壮性。 ... [详细]
  • Python并行处理:提升数据处理速度的方法与实践
    本文探讨了如何利用Python进行数据处理的并行化,通过介绍Numba、多进程处理以及Pandas DataFrame上的并行操作等技术,旨在帮助开发者有效提高数据处理效率。 ... [详细]
  • 本文详细介绍了如何使用Python通过GET和POST方法发送HTTP请求,并接收HTTP响应的具体实现方法。包括示例代码和相关模块的功能说明。 ... [详细]
  • 本文详细介绍了如何在Spring Boot项目中配置Maven的pom.xml文件,包括项目的基本信息、依赖管理及构建插件的设置。 ... [详细]
  • FFPlay 字幕与LRC歌词播放指南
    本文详细介绍了不同媒体容器支持的字幕格式,以及如何使用FFPlay和FFMPEG进行字幕和LRC歌词的播放与转换。涵盖的内容包括字幕显示方法、字体配置、字幕流选择等。 ... [详细]
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社区 版权所有