Serverless扫描技术研究及应用
本篇文章参考风起大佬的博客,主要针对Serverless(云函数)扫描技术的进一步研究
本文所用到的源码
https://github.com/wikiZ/ServerlessScan
上篇文章谈到 云函数的代理IP利用面 简单的介绍了下云函数的部署 以及本地代理工具的结合以实现扫描的简单防溯源,但是上篇文章存在俩个弊端
- 由于 单个用户在某个地域只能有5个随机出口IP,也就是说如果这五个IP均被封禁了那么我们的扫描就无法继续进行了
- 同时在扫描的过程中,我们查看Apache access.log日志发现 header头中的U-A头存在了很明显的特征
首先解决第一个问题
单个用户在某个地域只能有5个随机出口IP
单个用户在某一地域只能有五个出口IP,那么我们就建立多个地域即可
和前面一样首先建立云函数
云函数代码为以下,无论是云函数还是域前置或者反向代理等手段,本质都是流量转发,所以我们在云函数上编写的核心代码就是实现了单次扫描返回信息的功能,剩下的控制代码则由我们本地编写的代码执行。
这里以风起大佬的源码为基础
# -*- coding: utf8 -*-
import requests
def main_handler(event, context):
headers=event["headers"]
url=event["queryString"]["url"]
path = event["queryString"]["path"]
crake_url=str(url+path)
try:
r = requests.get(crake_url,timeout=5,headers=headers,verify=False)
status = r.status_code
except Exception:
status = None
pass
return status,crake_url
配置好云函数代码后,继续进入 触发管理 选项
触发器配置如图所示,注意取消勾选集成响应。
编辑API配置中,将路径设置为 / ,然后点击 立即完成
然后得到了两个API网关的公网域名,这时我们就已经完成了基本配置。可以通过这两个公网域名实现对我们上面编写的云函数功能的触发实现。
然后重复上面的操作,创建一个一模一样的云函数,API网关也为相同配置,但是需要注意的是选择的地域要为不同的地方,因为 单个用户在某个地域只能有5个随机出口IP
将两个不同地域的云函数的API网关域名地址 添加到代理工具 或者是扫描器配置文件中即可
这样就能完美绕过只有五个IP均被封禁的情况
例如
扫描后查看日志 IP随机地域
在更大流量的扫描下,我们还可以通过分批次的方式进行扫描,如果是端口扫描,我们就可以创建多个云函数且为不同地域分工扫描不同端口,在态势感知来看就是这n*5个IP地址在进行扫描,也就解决了单个地域只能有5个IP的窘境。同样进一步思考,我们也可以在相同的云函数下创建多个地域的云函数,再创建其他厂商的云函数,实现了IP地址的多元化,在这个基础上再创建不同地域,理论上可以这样一直叠加,实现单兵大流量扫描。
对于大集团目标,通常每天态势感知都会有很大的扫描流量,那么在这种情况下,如果给我们的云函数扫描再加上一定程度的随机延时扫描,那么在态势列表中看到的就是一堆不连续的单次请求,如果是目录扫描则会直接认为是正常的请求,因为IP的随机性以及请求包的合法性、不连续性根本无法联想这是一次扫描事件,更不要谈溯源的问题了,根本无法还原攻击链,这样的攻击只会比C2隐匿反弹更难缠。
扫描器ua头存在明显特征问题
创建一个 get_ua-header.py文件,其中创建了一个UA数组,存放了大量不同的User-Agent。
这里导入我们刚才创建的UA数组,然后在第二个箭头所指处设置header的User-Agent每次都随机获取UA数组中的值,再在发送请求中指定header,当然这里仅为了演示,如果真实场景下,可以将header头自定义设置更多选项让它看起来更像是一个合法的请求
这里云函数中获取到了我们本地请求API网关域名的headers然后在转发时将它的header替换为我们本地请求包中的header从而实现了自定义header的效果。
发现在Apache日志中,User-Agent已经为我们本地请求的随机信息,那么通过继续自定义本地控制代码中的header信息让他看起来更加合理,就可以实现更加隐匿的扫描啦。
关于Serverless扫描技术的知识点就总结到这里,本文可能实际上没有啥技术含量,但是写起来还是比较耗费时间的,在这个喧嚣浮躁的时代,个人博客越来越没有人看了,写博客感觉一直是用爱发电的状态。如果你恰巧财力雄厚,感觉本文对你有所帮助的话,可以考虑打赏一下本文!