背景与前情提要
在 “抽象的黑盒漏洞扫描与风险技术评估方法论” 中,我们提出了反连的各种姿势,简单总结一下:
- 通过实现通信协议来进行反连检测:DNSLog / RMI / LDAP / HTTP 等
- TCP 随机端口反连检测
- ICMP 反连:以特定长度 ICMP 包作为依据实现反连检测
我们在 Yakit v1.0.14-sp6 版本中实现了上述描述的所有细节的 GUI 版本
现状
绝大多数的现有方案(例如:http://dnslog.cn / http://ceye.io / xray等)使用 DNSLog / HTTP / RMI 来检测特定协议携带 token 的域名 / URI。当然这些确实是久经验证且非常有效的方式。
这些方式通常对应了我们说的 “第一种方案”:通过实现通信协议来进行反连检测。
然而,通过其他“信道”的观测,我们可以用其他指标来确定 “是否还有其他办法” 检测反连,就是我们今天要介绍的比较少见且有效的 TCP / ICMP Size Log。
我们做了什么?
ICMP Size Logger:
原理解释
众所周知,ICMP 最简单的触发应该是 ping 命令:如果我们在受害主机上 ping 我们自己控制的公网服务器,那么如果 Ping 通了,我们就马上会尝试测试 TCP 反连之类的各种操作。
那这中间可能会有其他的问题:
- 如果 ICMP 通,但是 TCP 禁止出网外连怎么办?能想办法缩短检测路径吗?
- 如果 ICMP 通了,但是没有回显,不知道到底通了没有,怎么办?
经过思考后,我们发现如果我们自己控制的公网服务器能告诉我们 “有人 Ping 了我” 就再好不过。
基于这种朴素的想法,我们觉得思路完全 Ok,所以只要知道 “谁” ping 了我。这个问题就已经解决了。于是我们使用 ping 命令的 ping -s [len] yakbridge 可以 ping 到我们的目标主机。
为此,我们在 Yakit 中的 “反连管理” 中新增了一个 “ICMP Size Log” 的新页面,在这个页面中,实现了我们上面描述的操作内容:
- 我们生成一个可用的 ICMP 长度
- 使用这个长度渲染 ping 命令,可供用户使用
- 在用户 ping 命令执行后,可以自动观测到 “谁 ping 了我”。
ICMP Size Log 实机演示如下
00:15
TCP Random Port Logger:
原理解释
实际上对于除了 DNS 之外的大多数场景来说,绝大多数反连的 “检测” 都是以 TCP 作为基础协议的,我们可以通过对基于 TCP 协议进行实现从而实现多种应用写的复杂兼容:
- 常见的 HTTP 反连检测,我们一般使用 Path 作为 Token 的标注位置,来区分 “到底是哪个漏洞触发”:http://example.com/[token]
- 常见的 RMI 类似 jndi:rmi://http://example.com/[token]
- ...
但是实际上,上面的各种用例都是需要用户具体监听某个端口来实现的,在于 @奶权 师傅的交流中,我们实现了一种更 “通用的” 检测手段,并成功把它进行了工程化实现:
为此,我们同样也实现了一个 GUI 版本,大家可以在 Yakit - “反连管理” 中直接使用
TCP Port Log 实机演示如下
00:14
关于公网服务器:
配置公共 Yak Bridge
目前 Yakit 内置了一个公网服务器供大家在 Yakit 中使用上述功能。当然,这个服务器的搭建十分简单:
通过一个 “docker-compose” 即可实现该服务器的搭建。
HTTPversion: "2"services: bridge: image: v1ll4n/yak-bridge:latest network_mode: host restart: always command: yak bridge --dnslog --domain [your-root-domain] --log-level error |
---|
搭建之后,可以直接连接默认的 64333 端口 (grpc)。
如果用户要在 Yakit 中使用自己的服务器连接:使用 YAK_DNSLOG_BRIDGE_ADDR=[your-bridge]:[port] yak grpc 然后使用 Yakit 连接自己的 Yak 引擎即可
配置加密的私有 Yak Bridge?
目前引擎虽然支持配置私有加密 Yak Bridge,但是这个功能应该在 Yakit 上进行 GUI 输入并本地记住用户的配置选项。
不过当前可以通过右上角 “配置” 选择 “全局配置” 来配置 “公网反连服务器(Yak Bridge)”。
需要注意的是,这个 Yak Bridge 目前并不会在 ICMP Log / TCP Port / DNSLog 中生效,这个配置目前只针对 yaklang 在自动进行漏洞扫描的时候生效。
在进行一些配置转换和调整之后,这个配置将可以在 GUI 服务中生效,同时也会把这部分配置更简单明确的放出。
小总结:
- 这两种方式并不一定完全代替 DNSLog,例如 FastJSON 检测的场景。
- 这种方式某种角度上来说,比 DNSLog 更快:因为 DNSLog 需要额外进行一次 dns 查询(查询 NS 记录),然后再去连接 NS 记录对应的主机发送 DNS 请求(UDP/TCP 53)
- TCP / ICMP Log 可以迅速判断受害主机到攻击机 TCP / ICMP 是否通畅,这是非常好的一个技术补充。
- 不止用在 “漏洞检测” 方面,可以用这个方式来判断用户的 “网络隔离” 配置是否生效。
Yak官方资源
Yak 语言官方教程:
https://yaklang.com/docs/intro/
Yakit 视频教程:
https://space.bilibili.com/437503777
Github下载地址:
https://github.com/yaklang/yakit
Yakit官网下载地址:
https://yaklang.com/
Yakit安装文档:
https://yaklang.com/products/download_and_install
Yakit使用文档:
https://yaklang.com/products/intro/
常见问题速查:
https://yaklang.com/products/FAQ