灰盒漏洞扫描工具 openrasp-iast

openrasp-iast 是一款灰盒漏洞扫描工具,能够结合应用内部hook点信息精确的检测漏洞。传统黑盒扫描器依赖于页面响应检测漏洞,不但需要发送大量的请求,还有误报的可能。对于SSRF、文件上传等漏洞,在页面没有回显、主机没有外网权限的情况下,还可能会漏报。openrasp-iast 很好的解决了上述问题,下面我们来看下如何安装它。

另外,IAST 污点追踪功能已经在开发中,将会跟随商业版本发布。若要了解当前的系统架构,请参考 二次开发 – 架构说明 – 灰盒扫描器 文档。

快速体验

我们提供了一整套的测试环境,包含 IAST 扫描器OpenRASP 管理后台 以及 漏洞测试用例。如果你已经安装了docker-compose, 首先修改 vm.max_map_count (参考这篇文档])

sudo sysctl -w vm.max_map_count=262144

然后执行如下命令,即可启动环境:

git clone https://github.com/baidu-security/openrasp-iast.git
cd openrasp-iast/docker/iast-cloud
docker-compose up

之后,请按照顺序分别:

安装或升级扫描器

本工具仅支持Linux平台,在开始之前,请先确保安装:

  1. OpenRASP 管理后台 版本 >= 1.2.0,并至少有一台在线主机
  2. Python 3.6 或者更高版本
  3. MySQL 5.5.3, 或者更高版本

使用 pip3 安装 openrasp-iast,以及依赖的库:

pip3 install --upgrade git+https://github.com/baidu-security/openrasp-iast

也可以直接下载 PyInstaller 打包的二进制版本,我们每隔2小时自动更新一次:

wget https://packages.baidu.com/app/openrasp/openrasp-iast-latest -O /usr/bin/openrasp-iast

配置 MySQL 数据库,建立名为 openrasp 的数据库,并为 rasp@% 授权,密码为 rasp123(建议使用强度更高的密码,这里只是举例)。请用 root 账号连接 mysql 并执行如下语句:

DROP DATABASE IF EXISTS openrasp;
CREATE DATABASE openrasp default charset utf8mb4 COLLATE utf8mb4_general_ci;
grant all privileges on openrasp.* to 'rasp'@'%' identified by 'rasp123';
grant all privileges on openrasp.* to 'rasp'@'localhost' identified by 'rasp123';

配置管理后台

打开云控管理后台,左上角选择一个IAST扫描器使用的应用,若没有可以在应用管理创建一个。扫描器检出的报警都可以在这里查看。

然后在 插件管理 里,上传并下发 IAST 插件。若在插件列表里无法看到名为 iast: 2019-XXXX-YYYY 的插件,可以手动从 baidu/openrasp 下载并上传。

接着在 防护设置 -> Fuzz 服务器地址 里填入 openrasp-iast 所监听的URL,e.g

http://IAST服务器地址:25931/openrasp-result

最后在 系统设置 -> 通用设置中,修改检测配置:

  1. [插件] 单个hook点最大执行时间 设置为 5000
  2. 开启文件过滤器: 当文件不存在时不调用检测插件 设置为 关闭
  3. LRU 大小 设置为 0

点击保存后,以上配置需要等待一个心跳周期后生效(默认90秒)。如果想要立即生效,请手动重启下 Tomcat/PHP 等服务器。

配置并启动扫描器

在云控后台右上角 添加主机 -> Fuzz 工具安装 找到 fuzz 工具安装命令。执行后会自动创建配置文件,并修正云控相关字段:

openrasp-iast config -a APP_ID -b APP_SECRET -c BACKEND_URL -m mysql://rasp:rasp123@127.0.0.1/openrasp

若要在前台启动,请使用如下命令:

openrasp-iast start -f

若要在后台启动,请去掉 -f 参数:

openrasp-iast start

若启动成功,我们默认会监听 18664 端口,可以直接使用浏览器打开 YOUR_IP:18664 访问 IAST 控制台。

IAST 控制台

openrasp-iast 是被动扫描模式,不会使用爬虫技术去获取URL信息。当 iast.js 下发成功,Java/PHP 内部的探针会自动在请求结束时,将本次请求的参数、hook点信息提交给 openrasp-iast 服务器进行分析,并选择性的 Fuzz 目标。

通常,我们会将 OpenRASP 部署至测试环境,并长期运行。在QA、RD做单元测试、功能测试时自动的进行漏洞检测。检测的目标按照 IP:PORT 或者 HOST 进行分组,每个目标可以有不同的配置。若勾选 自动启动扫描 选项,则会在发现新目标时自动启动扫描任务:

灰盒漏洞扫描工具 openrasp-iast
灰盒漏洞扫描工具 openrasp-iast

在任何状态下,都可点击 设置 按钮对某个任务进行配置,设置会立即生效。

URL 白名单

若要避免扫描某些URL,比如注销页面 /logout.php,可以在 IAST 控制台设置一个正则表达式,e.g

^/logout\.php.*

控制台会在保存时自动校验正则表达式是否合法。

扫描并发速率控制

openrasp-iast 会自动调节扫描速率,默认最大并发是 20,扫描间隔是 0 ~ 1000ms。若扫描速率过快可能会造成拒绝服务,请谨慎修改。

FAQ

1. 目前支持哪些漏洞的检测?

目前支持的漏洞触发条件均为用户输入的参数直接拼接产生的漏洞,尚不支非持非http参数、参数编解码方式触发的漏洞,包含以下类型:

  • 命令注入
  • 目录遍历
  • PHP eval代码执行
  • 文件上传
  • 文件包含
  • 任意文件读取
  • 任意文件写入
  • SQL注入
  • SSRF
  • Java XXE

2. 调试日志说明

openrasp-iast 包含如下几类日志,默认存储路径为 ~/openrasp-iast/logs:

文件名文件内容
error.log所有模块的错误日志,ERROR级的日志会打印到这个文件
MainProcess.log主进程日志
Preprocessor.log预处理模块日志,包含对rasp agent传入信息的处理日志
Monitor.log监控模块日志,包含web后台操作、扫描任务启停等日志
Scanner_*扫描任务日志目录,每个任务对应一个目录,包含主线程日志Scanner.log,和所有插件的日志 plugin_插件名.log

3. 常见错误说明

启动失败:

  • OSError: [Errno 48] Address already in use指定的http服务端口被占用,检查openrasp-iast是否已在运行,或是其他应用占用了配置项中preprocessor.http_port和monitor.console_port指定的端口
  • OSError: [Errno 24] Too many open files文件描述符超过限制,使用 ulimit -n 10240 命令修改当前文件描述符数量限制后再启动

4. 找不到 openrasp-iast 命令

如果是 pip3 安装后没有 openrasp-iast 命令,那么它可能是被安装到了 python3 所在的目录,如 /usr/local/lib/python3.7/bin

解决方法有:

  1. 添加软链接,比如以 root 执行 ln -s /usr/local/lib/python3.7/bin/openrasp-iast /usr/bin 命令
  2. 将该目录加入 $PATH,比如在当前shell下执行 export PATH=$PATH:/usr/local/lib/python3.7/bin

5. 在 IAST 控制台清空或删除任务之后,原先的漏洞无法再次检出

  1. 请先确认漏洞是否已经修复
  2. 如果漏洞未修复,请检查 云控后台 -> 系统设置 -> 通用设置->LRU 大小 的设置是否为 0

6. IAST 控制台看不到任务

  1. 尝试在目标系统进行一些操作,触发一些API接口调用
  2. 检查 logs/preprocessor.log 中是否有收到请求信息的日志
  3. 检查 openrasp-iast 服务器是否能够访问目标地址
    • 扫描器默认会使用 服务器 IP + HTTP头host字段的PORT 方式发起请求
    • 如果扫描器无法直接连接目标地址,你可以改为 HOST 方式扫描
    • 在后台 防护设置 -> 使用 HOST 直接访问的服务 里填入 .* 或者 匹配对应 host 的正则即可,被正则命中的HOST将作为扫描目标地址
  4. 检查mysql系统变量
    • 如果 select @@lower_case_table_names 配置为1,请改为0或2并重新创建数据库
  5. 检查agent端/rasp/logs/plugin/plugin.log 是否有连接错误
  6. 如果还是没有任务,请将 ~/openrasp-iast/logs 打包提交给我们

7. IAST 启动任务后扫描不到任何漏洞

  1. 如果使用的是官方测试环境,检查agent版本是否 > 1.2
  2. 如果是自建靶场,查看~/openrasp-iast/logs/preprocessor.log中的请求日志,检查是否正确获取了hook_info

8. IAST 扫描一直没有完成

iast是被动模式的扫描,在启动扫描后会保持运行状态,对新获取的url进行实时扫描,扫描器无法预知是否还会有新请求被获取,当 总任务=已扫描+已失败 时,所有当前获取到的url已扫描完毕,如果没有继续扫描的需求,手动停止扫描即可

9. MySQL 出现 Too many connections 错误

MySQL 默认的最大连接数为 100,启动的扫描进程过多会导致MySQL连接数超过100并报错,只需在 my.ini 文件中添加或修改以下条目增加最大连接数即可

max_connections = 10000

攻击检测能力说明

OWASP TOP 10 覆盖说明

编号分类说明攻击类型危害说明
A1注入SQL注入高危
命令注入高危
LDAP 注入高危暂无计划
NOSQL 注入高危正在开发
XPATH 注入高危暂无计划
A2失效的身份认证和会话管理Cookie 篡改低危暂无计划
后台爆破中危尚未实现
A3敏感数据泄露敏感文件下载高危
任意文件读取高危
数据库慢查询高危
文件目录列出低危
A4XML 外部实体(XXE)XXE中危
A5失效的访问控制任意文件上传高危
CSRF中危暂无计划
SSRF高危
文件包含高危
A6安全配置错误打印敏感日志信息低危正在开发
Struts OGNL 代码执行高危
远程命令执行高危
A7跨站脚本(XSS)反射型 XSS低危
存储型 XSS高危测试中,暂不发布
A8不安全的反序列化反序列化用户输入高危
A9使用含有已知漏洞的组件资产弱点识别低危开发中
A10不足的日志记录和监控WebShell 行为高危 

CVE 漏洞覆盖说明

本列表还在不断更新中,如果你有任何疑问,请联系我们

大部分漏洞环境都可以在 baidu-security/app-env-docker – 基于 Docker 的真实应用测试环境 找到,如果你需要进行测试,参考上面的文档操作即可。

Java 漏洞

Struts OGNL 系列

Spring 系列

反序列化系列

任意文件下载

任意代码执行

未分类

PHP 漏洞

任意文件上传

SQLi

任意文件写入 – 需要开启 writeFile_script 算法

任意文件包含

任意文件下载

目录遍历漏洞

代码执行

反序列化

SSRF

项目地址: github
具体文档内容: https://rasp.baidu.com/doc/install/iast.html