TCP劫持概念验证:利用Scapy实现连接中断工具

本文详细介绍了一个基于Python和Scapy库的TCP连接中断工具,能够通过进程ID或端口号定位TCP连接,捕获会话序列号并发送RST包强制终止连接,同时支持与ipset集成管理防火墙规则。

TCP Hijacking Proof of Concept

概述

这个Python脚本是一个TCP连接中断工具,使用Scapy库来操纵网络数据包。它定义了用于连接处理的自定义异常,并提供通过读取Linux系统的/proc/net/tcp文件来根据进程ID(PIDs)或TCP端口检索端点的功能。

核心功能

TCPBreaker类是功能的核心,允许过滤和拦截与指定本地和远程TCP端口相关的数据包,捕获TCP会话的序列号以发送重置(RST)数据包,从而有效终止连接。

该脚本还可以与ipset交互,添加或删除IP对以管理防火墙规则。它包含一个命令行界面供用户交互,支持指定PID、本地/远程端口以及选择数据包捕获方法(raw或nflog)等选项。

使用方法

1
python tcp_breaker.py [OPTIONS] [ipset_name]

选项

  • ipset_name:(可选)要临时插入本地IP的ipset名称
  • --pid:(可选)要终止连接的进程ID
  • --port:(可选)要关闭的连接的本地TCP端口
  • -d, --remote-port:(可选)将端口参数视为远程端口而非本地端口
  • -c, --capture:(可选)指定捕获方法,选项为"raw"或"nflog"
  • --debug:(可选)启用详细操作模式用于调试

示例命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 通过PID终止连接
python tcp_breaker.py --pid 1234 --port 8080

# 使用ipset终止连接
python tcp_breaker.py my_ipset --pid 1234

# 通过指定本地和远程端口终止连接
python tcp_breaker.py my_ipset --port 80 -d --remote-port

# 使用raw捕获方法而不使用ipset
python tcp_breaker.py --pid 5678 --port 443 --capture raw

注意事项

确保您有运行脚本的必要权限,因为它需要访问/proc/net/tcp,并且可能需要提升权限来修改ipset规则或终止连接。

代码实现

脚本使用Scapy库进行数据包操作,通过读取/proc/net/tcp文件获取当前TCP连接信息,并实现了以下核心类:

  • ConnMultipleMatches: 当找到多个匹配连接时抛出
  • ConnNotFound: 当未找到连接时抛出
  • get_endpoints(): 根据PID或端口获取端点信息
  • TCPBreaker: 主要的连接中断自动化类

技术细节

脚本支持两种捕获模式:

  • raw模式: 直接使用原始套接字捕获数据包
  • nflog模式: 使用netfilter日志系统捕获数据包

通过精确匹配TCP端口对,脚本能够捕获特定会话的数据包,提取序列号并构造RST包强制终止TCP连接。


作者: ClumsyLulz aka SleepTheGod Taylor Christian Newsome

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计