Dshell实战案例:使用followstream插件还原完整HTTP会话
引言:网络流量分析中的会话还原痛点
在网络取证(Network Forensics)调查中,分析人员经常需要面对一个棘手问题:如何从海量PCAP(Packet Capture,数据包捕获)文件中还原完整的TCP会话,特别是HTTP会话?传统工具如Wireshark虽然提供了"Follow TCP Stream"功能,但在处理大型PCAP文件或需要自动化分析时效率低下。Dshell(Network Forensic Analysis Framework,网络取证分析框架)的followstream插件正是为解决这一痛点而生,它能高效地追踪并还原TCP流中的完整数据交互。
本文将通过实战案例,详细介绍如何使用Dshell的followstream插件从PCAP文件中提取并还原完整的HTTP会话,帮助网络安全分析师快速定位可疑流量、重建攻击过程。
Dshell与followstream插件简介
Dshell框架概述
Dshell是一个开源的网络取证分析框架,旨在提供高效的流量解析、协议识别和数据提取能力。其核心优势在于模块化设计,通过插件系统支持多种协议分析和数据处理功能。框架结构如图1所示:
图1:Dshell插件类结构关系
Dshell的核心模块包括:
- 解码引擎:负责PCAP文件解析和数据包重组
- 插件系统:提供协议分析和数据处理功能
- 输出模块:支持多种格式的结果导出(如彩色终端、HTML、JSON)
followstream插件工作原理
followstream插件位于dshell/plugins/misc/followstream.py,继承自ConnectionPlugin,专门用于追踪TCP流并还原完整会话数据。其核心代码逻辑如下:
class DshellPlugin(dshell.core.ConnectionPlugin):
def __init__(self):
super().__init__(
name="Followstream",
author="amm/dev195",
description="Generates color-coded Screen/HTML output similar to Wireshark Follow Stream",
bpf="tcp", # 仅处理TCP流量
output=ColorOutput(label=__name__),
)
def connection_handler(self, conn):
if (conn.clientbytes + conn.serverbytes > 0):
self.write(conn, **conn.info()) # 输出会话数据
return conn
插件工作流程如图2所示:
图2:followstream插件工作流程
关键特性:
- TCP流追踪:基于四元组(源IP、目的IP、源端口、目的端口)识别TCP连接
- 数据重组:自动处理TCP分段和重传,拼接完整数据流
- 彩色输出:通过
ColorOutput模块区分客户端和服务器数据(类似Wireshark) - BPF过滤:默认使用
tcp过滤表达式,仅处理TCP流量
环境准备与工具安装
系统要求
- 操作系统:Linux(推荐Ubuntu 20.04+或CentOS 7+)
- 依赖包:
- Python 3.6+
- libpcap-dev
- python3-pip
- 相关Python库:
pypacker、pcapy、colorama
安装步骤
-
克隆代码仓库
git clone https://gitcode.com/gh_mirrors/ds/Dshell.git cd Dshell -
安装依赖
pip3 install -r requirements.txt -
验证安装
./scripts/dshell --version若输出Dshell版本信息(如
3.2.1),则安装成功。
测试数据集准备
为演示followstream插件的使用,我们需要一个包含HTTP流量的PCAP文件。可通过以下方式获取:
- 使用示例PCAP:Dshell项目提供了测试数据包
dshell/data/empty.pcap(空数据包,用于功能验证) - 自行捕获:使用tcpdump捕获HTTP流量
tcpdump -i eth0 -w http_traffic.pcap port 80 - 在线资源:从Wireshark Sample Captures下载HTTP相关PCAP文件
followstream插件实战:还原HTTP会话
基本使用语法
followstream插件的基本调用格式为:
./scripts/dshell -r <pcap_file> -P followstream [options]
核心参数说明:
-r <pcap_file>:指定PCAP文件路径-P followstream:加载followstream插件-o <output_file>:指定输出文件(支持HTML、JSON等格式)-v: verbose模式,显示详细信息
案例1:基本HTTP会话还原
目标:从PCAP文件中提取并还原完整的HTTP请求-响应会话。
操作步骤:
-
执行命令
./scripts/dshell -r http_traffic.pcap -P followstream -
输出解读 插件将以彩色文本形式输出TCP流数据,其中:
- 红色文本:客户端发送数据(HTTP请求)
- 蓝色文本:服务器响应数据(HTTP响应)
- 每行前缀格式:
[时间戳] [源IP:端口] -> [目的IP:端口]
典型输出示例:
[2025-09-24 10:15:30] 192.168.1.100:53452 -> 203.0.113.5:80 GET /index.html HTTP/1.1 Host: example.com User-Agent: Mozilla/5.0 Accept: */* [2025-09-24 10:15:30] 203.0.113.5:80 -> 192.168.1.100:53452 HTTP/1.1 200 OK Server: Apache/2.4.41 Content-Length: 1270 Content-Type: text/html <!DOCTYPE html> <html> ...
案例2:导出为HTML格式
目标:将还原的HTTP会话保存为HTML文件,便于分享和进一步分析。
操作步骤:
-
执行命令
./scripts/dshell -r http_traffic.pcap -P followstream -o http_session.html -O html -
查看结果
firefox http_session.htmlHTML输出将以表格形式展示TCP流数据,包含时间戳、源目地址和数据内容。
案例3:过滤特定HTTP会话
目标:仅还原与特定IP地址相关的HTTP会话。
操作步骤:
-
使用BPF过滤
./scripts/dshell -r http_traffic.pcap -P followstream -b "host 203.0.113.5 and port 80"其中
-b参数指定BPF过滤表达式,仅处理目标IP为203.0.113.5且端口为80的流量。 -
按流ID过滤 若已知目标TCP流ID(可通过Wireshark获取),可使用
--stream参数:./scripts/dshell -r http_traffic.pcap -P followstream --stream 5
案例4:与其他插件联动分析
Dshell支持多插件联动,例如结合http插件提取HTTP头信息,再用followstream还原对应会话:
./scripts/dshell -r http_traffic.pcap -P http -P followstream
该命令会先使用http插件解析HTTP协议信息,再通过followstream插件还原相关TCP流数据。
高级应用:自定义followstream插件功能
插件工作原理深入分析
followstream插件的核心逻辑位于connection_handler方法(定义在dshell/plugins/misc/followstream.py第19-22行):
def connection_handler(self, conn):
if (conn.clientbytes + conn.serverbytes > 0):
self.write(conn, **conn.info())
return conn
该方法接收Connection对象(定义在dshell/core.py第584行),包含以下关键属性:
clientbytes/serverbytes:客户端/服务器发送的字节数packets:该连接包含的所有数据包列表blobs:重组后的应用层数据块info():返回连接元数据(时间戳、IP地址、端口等)
自定义输出格式
目标:修改插件,使其输出CSV格式的会话数据,包含时间戳、源IP、目的IP和数据长度。
实现步骤:
-
复制插件文件
cp dshell/plugins/misc/followstream.py dshell/plugins/misc/followstream_csv.py -
修改输出逻辑
# 修改插件名称和描述 def __init__(self): super().__init__( name="FollowstreamCSV", author="your_name", description="Output HTTP sessions in CSV format", bpf="tcp", output=Output(label=__name__), # 使用基础输出模块 ) # 重写connection_handler方法 def connection_handler(self, conn): if (conn.clientbytes + conn.serverbytes > 0): # 构建CSV行 csv_line = f"{conn.starttime},{conn.src},{conn.dst},{conn.clientbytes + conn.serverbytes}" self.write(csv_line) return conn -
使用自定义插件
./scripts/dshell -r http_traffic.pcap -P followstream_csv -o session_stats.csv
性能优化技巧
当处理大型PCAP文件(GB级)时,可采用以下优化措施:
-
增加内存限制
export PYTHON_MEMORY_LIMIT=4G -
分片处理 使用
-s参数指定分片大小(单位:MB)./scripts/dshell -r large_traffic.pcap -P followstream -s 100 -
并行处理 启用多进程模式(需Dshell 3.0+支持)
./scripts/dshell -r large_traffic.pcap -P followstream --parallel 4
常见问题与解决方案
问题1:插件加载失败
症状:执行命令时提示PluginNotFoundError: No plugin named 'followstream'
解决方案:
- 检查插件路径是否正确:
dshell/plugins/misc/followstream.py是否存在 - 验证插件类名是否正确:必须为
DshellPlugin - 检查Python路径:确保当前目录在
PYTHONPATH中export PYTHONPATH=$PYTHONPATH:.
问题2:输出乱码
症状:中文或特殊字符显示为乱码
解决方案:
- 指定输出编码
./scripts/dshell -r http_traffic.pcap -P followstream -o output.html -O html --encoding utf-8 - 更新终端编码
export LC_ALL=en_US.UTF-8
问题3:TCP流不完整
症状:还原的HTTP会话缺少部分请求或响应
可能原因:
- PCAP文件本身不完整(数据包丢失)
- TCP会话未正常关闭(如异常中断)
- 插件超时设置过小
解决方案:
- 调整超时参数(默认1小时)
./scripts/dshell -r http_traffic.pcap -P followstream --timeout 3600 # 超时设为1小时 - 使用
--force-close参数强制关闭超时连接./scripts/dshell -r http_traffic.pcap -P followstream --force-close
总结与展望
本文要点回顾
本文通过实战案例详细介绍了Dshell框架中followstream插件的使用方法,包括:
- Dshell框架与
followstream插件的工作原理 - 环境搭建与测试数据准备
- 基本HTTP会话还原流程
- 高级应用:自定义插件和性能优化
- 常见问题解决方案
进阶学习路径
要深入掌握Dshell的使用,建议进一步学习:
- 其他协议插件:如
dns、ftp、ssl插件的使用 - 输出模块开发:自定义输出格式(如ELK集成)
- 流量可视化:结合
visual/piecharts.py插件生成流量统计图表
后续工作展望
Dshell项目仍在活跃开发中,未来可关注以下方向:
- 机器学习集成:基于流量特征自动识别异常会话
- 实时分析支持:增强对在线流量的实时处理能力
- Web界面:提供直观的图形化操作界面
参考资料
-
官方文档:
-
核心源码:
- followstream插件实现:dshell/plugins/misc/followstream.py
- Connection类定义:dshell/core.py
-
相关技术:
- TCP重组原理:RFC 793
- PCAP文件格式:libpcap File Format
如果本文对你有帮助,请点赞、收藏并关注,后续将推出更多Dshell高级使用技巧!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



