TCP无法在连接建立之前进行认证,对于无连接的UDP而言,或者也将不能。

TCP有fastopen机制,但并不好用,本文的想法就是基于fastopen的,让第一个SYN包携带数据,然而又不能让它到达TCP层,必须在IP层完成认证。

于是顺势就有了所谓的敲门服务。

敲门的意义旨在避免非法连接的干扰,一来二去的,即便构不成DoS,服务端也需要对非法连接的客户端进行回应,这不但不安全,暴露了开放端口信息,也浪费了带宽资源。

互联网是一个开放的环境, 不要与陌生人说话! 默默地丢掉非法连接比回复一个RST要好很多。

本文来玩一个通过TCP重传机制来实现的敲门服务:

假设我们要保护SSH的22端口,首先我们在服务端进行以下配置:

# 以下配置部署在 192.168.56.101 这台Ubuntu上。
ipset create knockset hash:ip,port timeout 60 # 一分钟无活动即断开
iptables -t mangle -F
# 加入set的二元组允许建立连接
iptables -t mangle -A PREROUTING -p tcp --dport 22 -m set --match-set knockset src,src -j ACCEPT
# 过滤敲门包,将成功敲门的二元组加入ipset
iptables -t mangle -A PREROUTING -p tcp --dport 22 -m string --string "skinshoe" --algo bm --to 65535 -j SET --add-set knockset src,src
# 丢弃敲门包,因为正式包(也就是客户端重传的SYN包)马上就会到来
iptables -t mangle -A PREROUTING -p tcp --dport 22 -m string --string "skinshoe" --algo bm --to 65535 -j DROP
# 静默丢弃
iptables -t mangle -A PREROUTING -p tcp --dport 22 ! -s 192.168.56.1/32  -j DROP

下面是客户端一个基于Netfilter的模块:

// padding.c 部署在192.168.56.110上
#include <linux/module.h>
#include <net/netfilter/nf_conntrack.h>
#include <linux/netfilter/nf_conntrack_common.h>
#include <net/tcp.h>int port = 22;
module_param(port, int, 0644);char *templ = NULL;
module_param(templ, charp, 0);unsigned int knock_out_hook(const struct nf_hook_ops *ops, struct sk_buff *skb,const struct net_device *in, const struct net_device *out,const struct nf_hook_state *state)
{struct iphdr *iph = ip_hdr(skb);struct tcphdr *th = NULL;enum ip_conntrack_info ctinfo;struct nf_conn *ct;unsigned int extra, len;char *cookie;if (templ == NULL)return NF_ACCEPT;ct = nf_ct_get(skb, &ctinfo);// 过滤一个连接的第一个SYN包。if (!ct || (ct->status & IPS_CONFIRMED))return NF_ACCEPT;if (iph->version != 4 || iph->protocol != IPPROTO_TCP)return NF_ACCEPT;iph = ip_hdr(skb);th = (struct tcphdr *)((unsigned char *)iph + (iph->ihl * 4));if (ntohs(th->dest) != port)return NF_ACCEPT;// 在一个连接的第一个SYN包后面padding我们的认证魔术字。cookie = kmalloc(32, GFP_ATOMIC);memcpy(cookie, templ, strlen(templ));extra = strlen(templ);skb_put(skb, extra);memcpy((char *)th + sizeof(struct tcphdr), cookie, extra);len = ntohs(iph->tot_len) + extra;iph->tot_len = htons(len);iph->check = 0;ip_send_check(iph);return NF_ACCEPT;
}static struct nf_hook_ops knock_out_ops = {.hook     = knock_out_hook,.owner    = THIS_MODULE,.pf       = AF_INET,.hooknum  = NF_INET_LOCAL_OUT,.priority = NF_IP_PRI_LAST,
};static int __init knock_init(void)
{if (nf_register_hook(&knock_out_ops) < 0) {return -1;}return 0;
}static void __exit knock_exit(void)
{nf_unregister_hook(&knock_out_ops);
}module_init(knock_init);
module_exit(knock_exit);
MODULE_LICENSE("GPL");

来来来,看效果:

# 不加载padding hook的时候:
[root@localhost ~]# ssh zhaoya@192.168.56.101
... # 无响应,抓包无内容,无回复,无RST[root@localhost ~]# insmod ./padding.ko port=22 templ="skinshoe"
[root@localhost ~]# ssh zhaoya@192.168.56.101
zhaoya@192.168.56.101's password:
Welcome to Ubuntu 19.10 (GNU/Linux 5.3.0-62-generic x86_64)
... # 成功连接

值得说明的是:

  • 本文只是一个POC,事实上可以完成很复杂的认证。
  • padding hook也并非一定要部署在客户端本机,它也可以成为一个单独的敲门代理。
  • 该方案独立于DDoS防护,这只是一个想法而已。
  • padding hook利用了conntrack,不要抬杠,conntrack并没有那么不堪,更何况它部署在客户端。
  • 如果将该POC思路用在网页上将可以实现防盗链,但我不懂前端技术,只能放弃。
  • 退一步讲,能不能不使用内核机制,答案是可以,你也可以直接用带外的UDP来完成敲门。

本来是想用systemtap写一个定向fork炸弹来逗运维,经理以及其手下的,没想到搞了这个,哎…


浙江温州皮鞋湿,下雨进水不会胖。

利用TCP重传机制来玩端口敲门服务相关推荐

  1. (七)深入浅出TCPIP之深入浅出TCPIP之TCP重传机制

    目录 TCP重传机制 超时重传机制 快速重传机制 专栏其他文章: 理论篇: (一)深入浅出TCPIP之理解TCP报文格式和交互流程 (二)深入浅出TCPIP之再识TCP,理解TCP三次握手(上) (三 ...

  2. [原创]安全系列之端口敲门服务(Port Knocking for Ubuntu 14.04 Server)

    Port Knocking for Ubuntu 14.04 Server OS:ubuntu 14.04 server 原理简单分析: 端口敲门服务,即:knockd服务.该服务通过动态的添加ipt ...

  3. 互联网协议 — TCP — 重传机制(可靠传输保障)

    目录 文章目录 目录 TCP 的重传机制(可靠性保障) 超时重传 快速重传 SACK 方法 Duplicate SACK ACK 丢包场景 网络延时场景 TCP 的重传机制(可靠性保障) 常见的重传机 ...

  4. TCP重传机制有哪些?

    TCP 实现可靠传输的⽅式之⼀,是通过序列号与确认应答. 在 TCP 中,当发送端的数据到达接收主机时,接收端主机会返回⼀个确认应答消息,表示已收到消息. 1.超时重传 重传机制的其中⼀个⽅式,就是在 ...

  5. tcp分包传图片 如何还原_技术控丨超详细解析TCP重传机制

    作者:Zhang_Jiawen : 来自:Dell技术社区 TCP 的主要任务是很简单:打包和发送数据.TCP 与其他协议的不同之处在于使用滑动窗口来管理基本数据收发过程,同时确保数据流的有效及可靠传 ...

  6. TCP重传与超时机制:解锁网络性能之秘

    目录标题 一.TCP重传(TCP Retransmission) 1.1 重传原理与机制(Retransmission Principles and Mechanisms) 二.TCP超时(TCP T ...

  7. TCP/IP协议栈:TCP超时重传机制

    目录 基础概念 重传超时时间RTO RTO的设定 连接往返时间RTT RTT的计算 Karn算法 往返时间测量 重传 拥塞避免算法 快速重传和快速恢复算法 重新分组 网络数据包丢失,重传和重复确认 是 ...

  8. 第10课 TCP重传技术的研究

    注:此文章为学习B站姜晔老师的<网络数据分析从入门到精通>课程笔记. 1.TCP数据包重传的基本原理 (1)TCP重传机制的必要性 当基于TCP的网络传输出现错误时,最基本的错误恢复方式就 ...

  9. TCP之超时重传机制

    TCP协议是一种面向连接的可靠的传输层协议,它保证了数据的可靠传输,对于一些出错.超时丢包等问题TCP设计了超时重传机制,其基本原理:在发送一个数据之后,就开启一个定时器,若是在这个时间内没有收到发送 ...

最新文章

  1. 安装 Fedora 21 工作站后要做的10件事情
  2. SQL Server 2008的cross apply 和 outer apply
  3. 音乐应用开发Android应用开发--MP3音乐播放器界面设计(2)
  4. 2.shiro工作原理(以集成springboot为例)
  5. 电脑记事本_带日历的电脑桌面记事本?
  6. 【面试招聘】非科班的秋招攻略贴
  7. win8下cocos2dx3.2移植android平台及代码打包APK
  8. 4-3利用神经网络解决分类和回归问题(1)
  9. Java基础 - 变量的定义和使用
  10. nginx 使用自定义 log_format 以及输出自定义http头
  11. 超期天数计算机函数公式大全,Excel计算天数的函数与公式总结
  12. 当当网复工员工确诊,66人集中隔离,负责人被约谈
  13. java的web开发之旅——第1站html
  14. (原創) 如何將16進位的ACSII值轉成相對應的字元? (C/C++) (C)
  15. opencv 数学形态学(2) 膨胀运算:dilate
  16. 阿里P8、P9税后180W及以上到底是什么水平?
  17. ArcGIS pro/ArcGIS 10.6及以上版本的最强工具箱——“WhiteboxTools”(468新功能:GIS分析,水文分析,图像分析,激光雷达分析,数学和统计分析,数据流网络分析和)!
  18. element-ui 阻止冒泡事件
  19. 【正点原子FPGA连载】 第二十八章OV5640 DP显示实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南
  20. 崔希凡JavaWeb笔记day10~day12(2016年8月22日11:59:18)

热门文章

  1. 挑战高薪!学习人工智能,你准备好了吗?
  2. 洛谷 P1135奇怪的电梯
  3. AT32 MCU QR USB HID Keyboard例程
  4. Windows下解压分卷压缩方法
  5. Android M Dialer完全总结
  6. Only老K说-爬取妹子图片(简单入门)
  7. 孙振耀担任海辉董事会主席 自2008年3月生效
  8. Scratch中的坐标系
  9. vue开发项目必备知识
  10. 关于 华为freelace蓝牙耳机 配对电脑的教程