我不介意可怕的黑客攻击
这就是你要说的。我猜您尝试的工具不起作用,因为它们会嗅探流量以获取可接受的 ACK 号以终止连接。如果没有流量,他们就无法掌握它。
您可以尝试以下方法:
探测所有序列号
在那些工具失败的地方,你仍然可以做到。使用 scapy 制作一个简单的 python 脚本,为每个序列号发送一个RST
带有正确 4 元组(端口和地址)的段。最多有 40 亿个(假设一个像样的窗口实际上更少 - 你可以免费使用找到窗口ss -i
)。
制作一个内核模块来获取套接字
此时,您可以密切访问您的套接字。所以
这是我用来打印已建立的套接字的函数 - 我从内核中搜罗了一些零碎的东西来制作它:
#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, node, &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);
}
}
您应该能够将它弹出到一个简单的“Hello World”模块中,在安装它之后,dmesg
您将看到套接字(很像ss
or netstat
)。