arrow-left

All pages
gitbookPowered by GitBook
1 of 2

Loading...

Loading...

安装灰盒扫描工具

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

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

hashtag
快速体验

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

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

之后,请按照顺序分别:

  • 访问 http://127.0.0.1:18662/vulns/ 触发PHP测试用例

  • 访问 http://127.0.0.1:18661/ IAST控制台启动扫描 (1.3版本后IAST后台合并到云控后台,此端口的后台删除)

  • 访问 http://127.0.0.1:18660/ 云控后台(账号openrasp/admin@123),左上角选择IAST应用查看扫描结果

hashtag
安装或升级扫描器

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

  1. 版本 >= 1.2.0,并至少有一台在线主机

  2. 或者更高版本

  3. , 或者更高版本

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

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

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

注意: 如果管理后台是 v1.3.0 之前的版本,你可以使用这个命令安装老版本的 openrasp-iast:

hashtag
配置管理后台

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

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

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

这里需要保证你的WebServer(安装agent的机器) 可以访问IAST服务器地址,否则请自行配置代理或调整网络架构

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

  • [插件] 单个hook点最大执行时间 设置为 5000

  • 开启文件过滤器: 当文件不存在时不调用检测插件 设置为 关闭

  • LRU 大小 设置为 0

如果使用1.2.2以上版本,还需在 系统设置 -> 应用加固中,修改检测配置:

  • 自定义 X-Protected-By 头 设置为非空

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

hashtag
配置并启动扫描器

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

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

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

hashtag
IAST 控制台

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

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

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

hashtag
URL 白名单

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

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

hashtag
扫描并发速率控制

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

hashtag
FAQ

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

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

  • 命令注入

  • 目录遍历

  • PHP eval代码执行

  • 文件上传

hashtag
2. 调试日志说明

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

文件名
文件内容

hashtag
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 命令修改当前文件描述符数量限制后再启动

hashtag
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

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

  1. 请先确认漏洞是否已经修复

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

hashtag
6. IAST 控制台看不到任务

  1. 尝试在目标系统进行一些操作,触发一些API接口调用

  2. 检查 logs/preprocessor.log 中是否有收到请求信息的日志,如果收到请求依然没有任务,请将 ~/openrasp-iast/logs 打包提交给我们

  3. 检查agent端/rasp/logs/plugin/plugin.log 是否有报错,一般插件timeout可能意味着Fuzz 服务器地址配置错误,请参考上文进行配置

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

  1. 如果使用的是官方测试环境,检查agent版本是否 > 1.2

  2. 如果是自建靶场,查看~/openrasp-iast/logs/preprocessor.log中的请求日志,检查是否正确获取了hook_info

  3. 检查 openrasp-iast 服务器是否能够访问目标地址

hashtag
8. IAST 扫描一直没有完成

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

hashtag
9. MySQL 出现 Too many connections 错误

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

max_connections = 10000

hashtag
10. 阿里云RDS兼容性问题

开源版本的IAST使用MySQL来存储扫描任务,并需要开启 lower-case-table-names 配置。由于云上的RDS通常为托管状态,无法修改此选项,所以请单独部署MySQL服务器。

值得注意的是,这个仅影响IAST本身。如果你要扫描的业务使用了云上的RDS,是完全不受影响的。

hashtag
11. IAST 启动后报错400

IAST启动后,持续抛出 ConnectionError: Connection failed, status code:400 异常

检查iast连接的云控是否配置了代理,如nginx等,导致http无法upgrade为websocket;如果配置了http代理,那么需要给websocket也配置相应代理

文件包含

  • 任意文件读取

  • 任意文件写入

  • SQL注入

  • SSRF

  • Java XXE

  • 扫描器默认会使用 服务器 IP + HTTP头host字段的PORT 方式发起请求

  • 如果扫描器无法直接连接目标地址,你可以改为 HOST 方式扫描

  • 在后台 防护设置 -> 使用 HOST 直接访问的服务 里填入 .* 或者 匹配对应 host 的正则即可,被正则命中的HOST将作为扫描目标地址

  • error.log

    所有模块的错误日志,ERROR级的日志会打印到这个文件

    MainProcess.log

    主进程日志

    Preprocessor.log

    预处理模块日志,包含对rasp agent传入信息的处理日志

    Monitor.log

    监控模块日志,包含web后台操作、扫描任务启停等日志

    Scanner_*

    扫描任务日志目录,每个任务对应一个目录,包含主线程日志Scanner.log,和所有插件的日志 plugin_插件名.log

    OpenRASP 管理后台arrow-up-right
    Python 3.6arrow-up-right
    MySQL 5.5.3arrow-up-right
    baidu/openrasparrow-up-right
    web_console
    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
    pip3 install --upgrade git+https://github.com/baidu-security/openrasp-iast
    wget https://packages.baidu.com/app/openrasp/openrasp-iast-latest -O /usr/local/bin/openrasp-iast
    # 如果是 MySQL 8.X 以及更高版本
    DROP DATABASE IF EXISTS openrasp;
    CREATE DATABASE openrasp default charset utf8mb4 COLLATE utf8mb4_general_ci;
    CREATE user 'rasp'@'%' identified with mysql_native_password by 'rasp123';
    grant all privileges on openrasp.* to 'rasp'@'%' with grant option;
    grant all privileges on openrasp.* to 'rasp'@'localhost' with grant option;
    
    # 如果是低版本 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';
    pip3 install --upgrade git+https://github.com/baidu-security/openrasp-iast@v1.2
    http://IAST服务器地址:25931/openrasp-result
    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
    openrasp-iast start
    ^/logout\.php.*

    IAST 高级配置选项

    hashtag
    启动参数

    hashtag
    指定其他配置文件

    在配置阶段,可以使用 -o 参数将配置文件生成到其他路径,e.g

    在启动阶段,可以使用 -c 加载你指定的配置文件,e.g

    若启动阶段没有指定配置文件,openrasp-iast 会从如下几个路径寻找,找不到无法启动:

    • ~/openrasp-iast/config.yaml

    • /etc/openrasp/config.yaml

    • ./config.yaml

    hashtag
    配置文件

    目前支持的配置内容如下,修改后需要重启 openrasp-iast 进程生效:

    hashtag
    预处理模块

    参数名
    说明
    默认值

    hashtag
    监控模块

    参数名
    说明
    默认值

    hashtag
    扫描模块

    参数名
    说明
    默认值

    hashtag
    云控配置

    参数名
    说明
    默认值

    hashtag
    CPU核心绑定

    参数名
    说明
    默认值

    hashtag
    日志配置

    参数名
    说明
    默认值

    hashtag
    数据库配置

    参数名
    说明
    默认值

    preprocessor.max_buffer_size

    http服务器接受请求的缓冲区大小, 单位Bytes

    104857600

    preprocessor.plugin_name

    使用的去重插件名

    default

    scanner.retry_times

    扫描请求失败重试次数

    3

    scanner.max_module_instance

    最大并发扫描任务数量

    16

    database.db_name

    数据库名

    openrasp

    preprocessor.http_port

    与rasp agent通信的http服务监听端口

    25931

    preprocessor.process_num

    http服务进程数

    2

    preprocessor.request_lru_size

    每个http服务进程的每个扫描目标对应一个LRU,用于存储32byte hash,总大小: 进程数 * 扫描目标数 * lru_size

    1000

    preprocessor.api_path

    rasp agent发送数据的目标 url的path

    /openrasp-result

    monitor.schedule_interval

    扫描速率自动调整策略执行间隔(s)

    1.000

    monitor.max_cpu

    cpu使用率上限,超过限制会降低并发扫描速率

    98

    monitor.min_cpu

    cpu使用率上限下限,低于该值会增加并发扫描速率

    85

    monitor.console_port

    web管理后台使用的端口

    18664

    scanner.max_concurrent_request

    单个扫描任务最大扫描并发线程数

    20

    scanner.min_request_interval

    每个扫描线程最小扫描请求间隔(ms)

    0

    scanner.max_request_interval

    每个线程最大扫描请求间隔(ms)

    1000

    scanner.request_timeout

    扫描请求超时时间(s)

    5

    cloud_api.enable

    是否上传结果到云控

    True

    cloud_api.backend_url

    云控地址

    http://127.0.0.1

    cloud_api.app_secret

    云控的secret_key

    无

    cloud_api.app_id

    云控的app_id

    无

    affinity.enable

    是否以绑定CPU核心的方式运行

    False

    affinity.core_num

    绑定的核心数量

    1

    log.level

    日志级别,可选: DEBUG INFO WARNING ERROR

    INFO

    log.path

    log文件路径, 为空时使用 /home/user/openrasp-iast/log

    空

    log.rotate_size

    单个日志文件触发rotate的日志大小,单位MB

    5

    log.rotate_num

    rotate文件最多保存份数,不包括当前日志文件

    2

    database.host

    mysql数据库地址

    localhost

    database.port

    mysql端口

    3306

    database.username

    用户名

    root

    database.password

    连接密码

    空

    openrasp-iast config -o /path/to/config.yaml -a X -b Y -c Z -m mysql://xxx
    openrasp-iast start -f -c /path/to/config.yaml