强制套接字断开而不伪造RST,Linux

强制套接字断开而不伪造RST,Linux,第1张

概述我有一个网络客户端,它停留在不受我控制的服务器上,24小时后可能永远不会响应.该程序处理了大量数据,所以我不想杀死它;我希望它放弃当前的连接并继续. (如果recvfrom返回EOF或-1,它将正确执行.)我已经尝试了几个不同的程序,声称能够通过伪造RST来断开过时的TCP通道(tcpkill,cutter,killcx);没有任何影响,该计划仍然停留在recvfrom.我也尝试过关闭网络接口;再 我有一个网络客户端,它停留在不受我控制的服务器上,24小时后可能永远不会响应.该程序处理了大量数据,所以我不想杀死它;我希望它放弃当前的连接并继续. (如果recvfrom返回EOF或-1,它将正确执行.)我已经尝试了几个不同的程序,声称能够通过伪造RST来断开过时的TCP通道(tcpkill,cutter,killcx);没有任何影响,该计划仍然停留在recvfrom.我也尝试过关闭网络接口;再一次,没有效果.

在我看来,确实应该有一种方法来强制断开套接字API级别而不伪造网络数据包.我不介意可怕的黑客攻击,包括手工挖掘内核数据结构;这是灾难恢复的情况.有什么建议?

(为清楚起见,根据lsof,此处讨论的TCP通道处于ESTABliSHED状态.)

解决方法

I do not mind horrible Hacks

这就是你要说的.我猜测你尝试的工具不起作用,因为他们嗅到流量以获得可接受的ACK号来终止连接.没有交通流量,他们无法掌握它.

您可以尝试以下方法:

探测所有序列号

如果这些工具失败了,你仍然可以做到.制作一个简单的python脚本并使用scapy,为每个序列号发送一个带有正确的4元组(端口和地址)的RST段.最多有40亿(假设一个像样的窗口实际上更少 – 你可以使用ss -i免费找到窗口).

创建一个内核模块以获取套接字

>使内核模块获取TCP套接字列表:查找sk_nulls_for_each(sk,node,& tcp_hashinfo.ehash [i] .chain)
>识别您的受害者sk

此时,您可以密切访问您的套接字.所以

>您可以在其上调用tcp_reset或tcp_disconnect.您将无法直接调用tcp_reset(因为它没有EXPORT_SYMBol)但您应该能够模仿它:它调用的大多数函数都被导出
>或者你可以从tcp_sk(sk)获得预期的ACK号,并直接用scapy伪造一个RST包

这是我用来打印已建立的套接字的函数 – 我在一段时间之前从内核中搜集了一些碎片:

#include <net/inet_hashtables.h>#define NIPQUAD(addr) \    ((unsigned char *)&addr)[0],\    ((unsigned char *)&addr)[1],\    ((unsigned char *)&addr)[2],\    ((unsigned char *)&addr)[3]#define NIPQUAD_FMT "%u.%u.%u.%u"extern struct inet_hashinfo tcp_hashinfo;/* DecIDes whether a bucket has any sockets in it. */static inline bool empty_bucket(int i){    return hList_nulls_empty(&tcp_hashinfo.ehash[i].chain);}voID print_tcp_socks(voID){    int i = 0;    struct inet_sock *inet;    /* Walk hash array and lock each if not empty. */    printk("Established ---\n");    for (i = 0; i <= tcp_hashinfo.ehash_mask; i++) {        struct sock *sk;        struct hList_nulls_node *node;        spinlock_t *lock = inet_ehash_lockp(&tcp_hashinfo,i);        /* Lockless fast path for the common case of empty buckets */        if (empty_bucket(i))            continue;        spin_lock_bh(lock);        sk_nulls_for_each(sk,&tcp_hashinfo.ehash[i].chain) {            if (sk->sk_family != PF_INET)                continue;            inet = inet_sk(sk);            printk(NIPQUAD_FMT":%hu ---> " NIPQUAD_FMT                ":%hu\n",NIPQUAD(inet->inet_saddr),ntohs(inet->inet_sport),NIPQUAD(inet->inet_daddr),ntohs(inet->inet_dport));        }        spin_unlock_bh(lock);    }}

您应该能够将其d出到一个简单的“Hello World”模块中,并在修改它之后,在dmesg中您将看到套接字(很像ss或netstat).

总结

以上是内存溢出为你收集整理的强制套接字断开而不伪造RST,Linux全部内容,希望文章能够帮你解决强制套接字断开而不伪造RST,Linux所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1018882.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存