All pages
Powered by GitBook
1 of 2

Loading...

Loading...

安装灰盒扫描工具

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

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

快速体验

我们提供了一整套的测试环境,包含 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应用查看扫描结果

安装或升级扫描器

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

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

  2. 或者更高版本

  3. , 或者更高版本

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

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

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

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

配置管理后台

打开云控管理后台,左上角选择一个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 等服务器。

配置并启动扫描器

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

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

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

IAST 控制台

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

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

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

URL 白名单

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

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

扫描并发速率控制

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

FAQ

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

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

  • 命令注入

  • 目录遍历

  • PHP eval代码执行

  • 文件上传

2. 调试日志说明

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

文件名
文件内容

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 中是否有收到请求信息的日志,如果收到请求依然没有任务,请将 ~/openrasp-iast/logs 打包提交给我们

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

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

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

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

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

    • 扫描器默认会使用 服务器 IP + HTTP头host字段的PORT

8. IAST 扫描一直没有完成

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

9. MySQL 出现 Too many connections 错误

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

max_connections = 10000

10. 阿里云RDS兼容性问题

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

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

11. IAST 启动后报错400

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

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

文件包含
  • 任意文件读取

  • 任意文件写入

  • SQL注入

  • SSRF

  • Java XXE

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

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

  • error.log

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

    MainProcess.log

    主进程日志

    Preprocessor.log

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

    Monitor.log

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

    Scanner_*

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

    OpenRASP 管理后台
    Python 3.6
    MySQL 5.5.3
    baidu/openrasp
    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 高级配置选项

    启动参数

    指定其他配置文件

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

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

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

    • ~/openrasp-iast/config.yaml

    • /etc/openrasp/config.yaml

    • ./config.yaml

    配置文件

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

    预处理模块

    参数名
    说明
    默认值

    监控模块

    参数名
    说明
    默认值

    扫描模块

    参数名
    说明
    默认值

    云控配置

    参数名
    说明
    默认值

    CPU核心绑定

    参数名
    说明
    默认值

    日志配置

    参数名
    说明
    默认值

    数据库配置

    参数名
    说明
    默认值
    openrasp-iast config -o /path/to/config.yaml -a X -b Y -c Z -m mysql://xxx

    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 start -f -c /path/to/config.yaml