网络取证技术:Ping扫描、端口扫描与数据包嗅探
1. Ping扫描执行
Ping扫描是网络调查中的一项重要技术,用于识别网络中的活动端点。以下是Ping扫描程序的两次执行示例:
- 第一次运行:使用基础IP地址127.0.0.,选择主机1 - 5进行扫描,并显示结果。
- 第二次运行:选择本地网络192.168.0.作为基础IP地址,扫描主机1 - 7,并记录每次Ping的结果。当任何主机响应时,还会报告时间(或延迟)。
在执行Ping扫描时,需要注意一些主机可能在首次扫描时不可用,因此建议经常运行扫描以覆盖更广泛的端点。
执行Ping扫描的核心代码如下:
# Perform the Ping
delay = ping.do_one(ipAddress, timeout=2)
2. 端口扫描
在识别网络中的端点后,下一步是进行端口扫描。端口扫描是一种用于确定目标主机上哪些端口是开放的技术。以下是关于端口扫描的详细介绍:
2.1 端口的概念
计算机通过端口进行通信,每个唯一的IP地址对应一个16位的协议端口号(范围为0 - 65,535)。端口和IP地址的组合构成了完整的通信地址。端口主要分为以下三类:
| 类别 | 端口范围 | 用途 |
| ---- | ---- | ---- |
| 知名端口 | 0 - 1023 | 由提供广泛使用的网络服务的系统进程使用 |
| 注册端口 | 1024 - 49,151 | 由互联网名称与数字地址分配机构(ICANN)管理 |
| 动态端口 | 49,152 - 65,535 | 通常是临时的,由操作系统根据需要自动分配 |
2.2 常见端口示例
以下是一些常见的知名端口和注册端口示例:
| 服务名称 | 端口号 | 传输协议 | 描述 |
| ---- | ---- | ---- | ---- |
| echo | 7 | tcp/udp | 回显服务 |
| ftp | 21 | tcp/udp | 文件传输控制 |
| ssh | 22 | tcp/udp | 安全外壳协议 |
| telnet | 23 | tcp/udp | 远程登录协议 |
| smtp | 25 | tcp/udp | 简单邮件传输协议 |
| http | 80 | tcp/udp | 万维网HTTP协议 |
| nntp | 119 | tcp/udp | 网络新闻传输协议 |
| ntp | 123 | tcp/udp | 网络时间协议 |
| netbios-ns | 137 | tcp/udp | NETBIOS名称服务 |
| snmp | 161 | tcp/udp | 简单网络管理协议 |
| 服务名称 | 端口号 | 传输协议 | 描述 |
|---|---|---|---|
| nlogin | 758 | tcp/udp | nlogin服务 |
| telnets | 992 | tcp/udp | 通过TLS/SSL的telnet协议 |
| pop3s | 995 | tcp/udp | 通过TLS/SSL的pop3协议 |
2.3 简单端口扫描器的开发
要开发一个简单的Python端口扫描器,需要考虑以下几个方面:
1. 目标IP地址。
2. 要扫描的端口范围。
3. 是否显示所有结果或仅显示开放的端口。
以下是一个简单端口扫描器的Python代码示例:
import wxversion
wxversion.select("2.8")
import wx
import sys
import ping
from socket import *
from time import gmtime, strftime
# Event Handler for the portScan Button Press
def portScan(event):
if portEnd.GetValue() < portStart.GetValue():
dlg = wx.MessageDialog(mainWin, "Invalid Host Port Selection",
"Confirm", wx.OK | wx.ICON_EXCLAMATION)
result = dlg.ShowModal()
dlg.Destroy()
return
mainWin.StatusBar.SetStatusText('Executing Port Scan .... Please Wait')
utcStart = gmtime()
utc = strftime("%a, %d %b %Y %X +0000", utcStart)
results.AppendText("\n\nPort Scan Started: " + utc + "\n\n")
baseIP = str(ipaRange.GetValue()) + '.' + str(ipbRange.GetValue()) + '.' + str(ipcRange.GetValue()) + '.' + str(ipdRange.GetValue())
for port in range(portStart.GetValue(), portEnd.GetValue() + 1):
try:
mainWin.StatusBar.SetStatusText('Scanning: ' + baseIP + ' Port:' + str(port))
reqSocket = socket(AF_INET, SOCK_STREAM)
response = reqSocket.connect_ex((baseIP, port))
if response == 0:
results.AppendText(baseIP + '\t' + str(port) + '\t')
results.AppendText('Open')
results.AppendText("\n")
else:
if displayAll.GetValue() == True:
results.AppendText(baseIP + '\t' + str(port) + '\t')
results.AppendText('Closed')
results.AppendText("\n")
reqSocket.close()
except socket.error as e:
results.AppendText(baseIP + '\t' + str(port) + '\t')
results.AppendText('Failed:')
results.AppendText(e.message)
results.AppendText("\n")
utcEnd = gmtime()
utc = strftime("%a, %d %b %Y %X +0000", utcEnd)
results.AppendText("\nPort Scan Ended: " + utc + "\n\n")
mainWin.StatusBar.SetStatusText('')
# Program Exit Event Handler
def programExit(event):
sys.exit()
# Setup the Application Windows
app = wx.App()
mainWin = wx.Frame(None, title="Simple Port Scanner", size=(1200, 600))
panelAction = wx.Panel(mainWin)
displayAll = wx.CheckBox(panelAction, -1, 'Display All', (10, 10))
displayAll.SetValue(True)
scanButton = wx.Button(panelAction, label='Scan')
scanButton.Bind(wx.EVT_BUTTON, portScan)
exitButton = wx.Button(panelAction, label='Exit')
exitButton.Bind(wx.EVT_BUTTON, programExit)
results = wx.TextCtrl(panelAction, style=wx.TE_MULTILINE | wx.HSCROLL)
ipaRange = wx.SpinCtrl(panelAction, -1, '')
ipaRange.SetRange(0, 255)
ipaRange.SetValue(127)
ipbRange = wx.SpinCtrl(panelAction, -1, '')
ipbRange.SetRange(0, 255)
ipbRange.SetValue(0)
ipcRange = wx.SpinCtrl(panelAction, -1, '')
ipcRange.SetRange(0, 255)
ipcRange.SetValue(0)
ipdRange = wx.SpinCtrl(panelAction, -1, '')
ipdRange.SetRange(0, 255)
ipdRange.SetValue(1)
ipLabel = wx.StaticText(panelAction, label="IP Address: ")
portStart = wx.SpinCtrl(panelAction, -1, '')
portStart.SetRange(1, 1025)
portStart.SetValue(1)
portEnd = wx.SpinCtrl(panelAction, -1, '')
portEnd.SetRange(1, 1025)
portEnd.SetValue(5)
PortStartLabel = wx.StaticText(panelAction, label="Port Start: ")
PortEndLabel = wx.StaticText(panelAction, label="Port End: ")
actionBox = wx.BoxSizer()
actionBox.Add(displayAll, proportion=0, flag=wx.LEFT | wx.CENTER, border=5)
actionBox.Add(scanButton, proportion=0, flag=wx.LEFT, border=5)
actionBox.Add(exitButton, proportion=0, flag=wx.LEFT, border=5)
actionBox.Add(ipLabel, proportion=0, flag=wx.LEFT | wx.CENTER, border=5)
actionBox.Add(ipaRange, proportion=0, flag=wx.LEFT, border=5)
actionBox.Add(ipbRange, proportion=0, flag=wx.LEFT, border=5)
actionBox.Add(ipcRange, proportion=0, flag=wx.LEFT, border=5)
actionBox.Add(ipdRange, proportion=0, flag=wx.LEFT, border=5)
actionBox.Add(PortStartLabel, proportion=0, flag=wx.LEFT | wx.CENTER, border=5)
actionBox.Add(portStart, proportion=0, flag=wx.LEFT, border=5)
actionBox.Add(PortEndLabel, proportion=0, flag=wx.LEFT | wx.CENTER, border=5)
actionBox.Add(portEnd, proportion=0, flag=wx.LEFT, border=5)
vertBox = wx.BoxSizer(wx.VERTICAL)
vertBox.Add(actionBox, proportion=0, flag=wx.EXPAND | wx.ALL, border=5)
vertBox.Add(results, proportion=1, flag=wx.EXPAND | wx.LEFT | wx.BOTTOM | wx.RIGHT, border=5)
mainWin.CreateStatusBar()
panelAction.SetSizer(vertBox)
mainWin.Show()
app.MainLoop()
3. 交互式扫描和探测的局限性
尽管Ping扫描和端口扫描是有效的网络调查技术,但它们也存在一些局限性:
1. 目标主机需要处于开机和正常运行状态才能进行交互。
2. 扫描活动可能被入侵预防系统(IPS)视为攻击,除非进行特殊配置。
3. 恶意服务可能不会响应端口扫描请求。
4. 许多恶意服务使用UDP协议进行通信,在扫描时可能保持静默。
5. 关键基础设施环境的运营商通常不允许对其网络进行主动扫描和探测,因为这可能会导致系统崩溃。
4. 数据包嗅探
数据包嗅探是一种可以提供网络洞察的替代方法。与端口扫描相比,数据包嗅探具有以下三个关键优势:
1. 嗅探器完全静默,不会在网络上发送任何数据包,对网络操作没有影响。
2. 嗅探器可以长时间运行,持续收集信息,更全面地描述本地主机、服务器、网络设备或未被检测到的恶意设备的活动。
3. 可以捕获间歇性或偶发性的隐蔽活动。
要进行数据包嗅探,网络接口必须处于混杂模式,并且需要连接到能够看到所有数据包的端口。现代交换机通常支持端口镜像(SPAN或RSPAN),可以将嗅探器连接到这些端口。
graph LR
A[网络接口] -->|混杂模式| B[数据包嗅探器]
B -->|收集信息| C[分析活动]
综上所述,Ping扫描、端口扫描和数据包嗅探是网络取证中常用的技术,每种技术都有其优缺点。在实际应用中,应根据具体情况选择合适的技术来进行网络调查。
网络取证技术:Ping扫描、端口扫描与数据包嗅探(续)
5. 数据包嗅探的深入探讨
5.1 混杂模式与网络接口设置
在进行数据包嗅探时,网络接口需要设置为混杂模式。以Ubuntu 12.04 LTS为例,设置混杂模式的步骤如下:
1. 打开终端。
2. 使用以下命令查看当前网络接口名称,例如 ifconfig 。
3. 使用 ifconfig <interface> promisc 命令将指定网络接口设置为混杂模式,其中 <interface> 为实际的网络接口名称。
5.2 Python中的原始套接字
在Python中,可以使用原始套接字进行数据包嗅探。以下是一个简单的示例代码,展示了如何在Linux环境下使用原始套接字:
import socket
# 创建一个原始套接字
s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.ntohs(0x0003))
while True:
# 接收数据包
packet, addr = s.recvfrom(65565)
# 处理数据包
print(packet)
上述代码创建了一个原始套接字,并持续接收数据包进行处理。
5.3 数据包缓冲区的解包
在接收到数据包后,需要对数据包的缓冲区进行解包以获取有用信息。以下是一个简单的解包示例:
import struct
# 假设接收到的数据包缓冲区为packet
# 解包以太网头部
eth_header = packet[:14]
eth = struct.unpack('!6s6sH', eth_header)
dst_mac = eth[0]
src_mac = eth[1]
eth_proto = eth[2]
print(f"目的MAC地址: {dst_mac}")
print(f"源MAC地址: {src_mac}")
print(f"以太网协议: {eth_proto}")
6. Python静默网络映射工具(PSNMT)
PSNMT是一个用于网络取证的工具,以下是其相关代码和功能介绍。
6.1 PSNMT的源代码结构
PSNMT主要由以下几个模块组成:
- psnmt.py :主程序文件。
- decoder.py :用于数据包解码。
- commandParser.py :命令解析模块。
- classLogging.py :日志记录模块。
- csvHandler.py :CSV文件处理模块。
6.2 主要模块代码示例
psnmt.py
# psnmt.py源代码
# 此处省略具体代码,可根据实际情况进行补充
decoder.py
# decoder.py源代码
# 此处省略具体代码,可根据实际情况进行补充
commandParser.py
# commandParser.py源代码
# 此处省略具体代码,可根据实际情况进行补充
classLogging.py
# classLogging.py源代码
# 此处省略具体代码,可根据实际情况进行补充
csvHandler.py
# csvHandler.py源代码
# 此处省略具体代码,可根据实际情况进行补充
6.3 程序执行与输出
PSNMT程序执行后,会输出不同类型的结果,例如:
- TCP捕获示例 :捕获TCP数据包的相关信息。
- UDP捕获示例 :捕获UDP数据包的相关信息。
- CSV文件输出示例 :将捕获的信息保存到CSV文件中。
7. 总结与展望
在网络取证中,Ping扫描、端口扫描和数据包嗅探是三种重要的技术。它们各自具有独特的优势和局限性,在实际应用中需要根据具体情况进行选择。
| 技术名称 | 优势 | 局限性 |
|---|---|---|
| Ping扫描 | 可快速识别活动端点 | 目标需开机运行,可能遗漏部分端点 |
| 端口扫描 | 确定开放端口,了解服务情况 | 可能被IPS拦截,恶意服务可能不响应 |
| 数据包嗅探 | 静默收集信息,捕获隐蔽活动 | 需要网络接口支持混杂模式 |
未来,随着网络技术的不断发展,网络取证技术也将不断完善。例如,可以将Ping扫描、端口扫描和数据包嗅探技术进行集成,实现更全面、高效的网络调查。同时,结合人工智能和机器学习技术,可以对捕获的信息进行更深入的分析,提高网络取证的准确性和效率。
graph LR
A[网络取证需求] -->|选择合适技术| B[Ping扫描]
A -->|选择合适技术| C[端口扫描]
A -->|选择合适技术| D[数据包嗅探]
B -->|获取活动端点| E[分析结果]
C -->|确定开放端口| E
D -->|收集数据包信息| E
E -->|结合多种技术| F[更准确的网络调查]
总之,网络取证是一个复杂而重要的领域,需要不断学习和实践,以应对日益复杂的网络安全挑战。
超级会员免费看

6

被折叠的 条评论
为什么被折叠?



