
背景
“爆破与未授权检测” 虽然并不是一个难做的工作,属于脏活累活,但是又是基础工作。实际在做过这个工作和模块编写的同学们都非常清楚,里面有很多细节可以抠,实现基础功能和做 “好 / 精致” 是两个概念,这个功能可以发挥的空间其实非常大。
服务特定决定合适的爆破方式
我们可以举一些典型的例子和处理方案来介绍 “爆破” 其实并没有那么简单。例如众多服务会自带防爆破的机制,在目标有了“特定反应(比如告诉你 not allowed)”的时候,就不应该继续执行任务了。
SSH 服务登陆检查
SSH 爆破分为好几个阶段:
判断 SSH 服务允许的认证方式( password / key / empty)
如果不允许密码认证,就无法爆破;
如果允许密码登陆,尝试一次 root 空密码,然后尝试其他密码。
SSH 服务极度不适合针对同一个目标并发爆破,服务器会限制登录频率,出现大量 Connection Refused 或者 Timeout 造成资源浪费
SSH 用户名枚举漏洞 (CVE-2018-15473)可以极大缩短爆破的时长,也是大家经常忽略的一个问题。
Redis 服务登陆检查
Redis 不需要用户名,所以要求通用爆破框架自动忽略用户名的处理。
出现 Redis 未授权访问的时候,就不应该进行爆破了。
如果出现大量 Connection Refused,将意味着 “防火墙机制” 启动了,这个时候暂停爆破或者说停止对这个目标的探测其实是最好的办法。
MySQL 服务登陆检查
如果 MySQL 开启了登陆 IP 白名单,将会出现 “is not allowed to connect” 的问题。这个时候应该停止对该目标的检测。
需要注意的一些细节:
细节一:单目标并发与多目标并发
大量的实践都证明,一些不够“精致”的爆破手段喜欢增加并发,并发无脑加到了“单个目标”上,导致爆破很快遭到察觉和封禁。
比较合适的手段应该是可以同时爆破“多个目标”,每个目标低并发。这样在有多个目标的时候,并不会影响效率,而且单个目标也不会过快 “打草惊蛇”。
细节二:随机Sleep 来规避“反制爆破的策略”
在我们“多个目标并发”的爆破策略下,有时候还是难以解决被 Ban 的问题。虽然我们并有从根源上解决这个 “被 ban” 的问题。
但是以我作为一个 “研发” 的角度来讲,我如果要 ban 爆破行为的话,我会设置一个时间窗口,短时间时间窗口被打满我会认为发生了爆破事件
如果可以再 “放缓” 针对单个目标的测试强度,其实有可能可以缓解这个问题,所以我们可以通过这种设置参数来解决这个问题。
细节三:未授权应该放在爆破前做检查
很多时候,我们无脑在爆破的时候,未授权和指纹检查其实已经可以发现一些可用的信息。遇到这种情况,我们可以决定到底要不要爆破。
通过未授权检测其实已经 “成功进入” 系统了,哪还有必要进行额外爆破呢?
Yak 中的爆破框架schema
yaklang.io 的爆破框架其实解决了上面提到的大多数细节问题,在 yak 的 brute 模块中,我们定义了如下内容:
每个服务,我们会设置默认用户名和密码,同时为每一个模块编写 “UnAuthVerify”:
这个函数的意义是,进行 “预检查”,在这个模块中,可以检查 TCP 的状态,检查 banner
当然这个函数的精髓其实是每一个 “目标” 只会执行一次
我们以 MySQL 来举例:
很多时候,我们虽然同时支持 “多目标并发” 和 “单目标并发”,但是多目标并发仍然绕不开 “too many open sockets/files” 魔咒,当遇到这种情况,用户需要手动修改本机的配置,ulimit 等。
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
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
