Web自动化漏洞检测工具之 Xray配置检测

Xray会生成config.yaml配置文件,我们通过配置该文件来对扫描进行状态控制。

文档:https://xray.cool/xray/#/tutorial/introduce

一、config.yaml的构成:

1、日志输出

log:
  level: info # 支持 debug, info, warn, error, fatal
  debug会输出发包取包等信息

2、plugins插件配置

plugins:
  max_parallel: 30  并发数,比如需要检测3个请求,只有一个并发,就会1->2->3这样一个个进行检测,如果是3个并发数,则直接对3个请求同时进行检测,并发数默认30个。
  xss:
    enabled: true  是否启用插件
    ie_feature: false  如果此项为 true,则会将一些只能在 IE 环境下复现的漏洞爆出来,小白请不要开。主要包括 expression xss、hidden tag xss、utf-7 和 content type sniffing 导致的 xss 。
    include_cookie: false  如果此项为 true, 则会检查是否存在输入源在 cookie 中的 xss
  baseline:
    enabled: true  是否启用插件
    detect_outdated_ssl_version: false  是否检测过期的 SSL 版本, 如果目标启用了 TLS1.1, TLS1.0, SSL3.0 都是会报一个漏洞
    detect_http_header_config: false  是否检查 header 的配置,主要检查一些安全相关的 http 头有没有确实或错误
    detect_cors_header_config: true  是否检查 cors 相关的问题
    detect_server_error_page: false  检查响应是不是一个错误页面, 支持主流框架的错误信息检测
    detect_china_id_card_number: false  检查响应中有没有身份证号信息
    detect_serialization_data_in_params: true   检查参数中是否存在序列化数据,支持 java,php,python
    detect_cookie_password_leak: true
    detect_unsafe_scheme: false
    detect_cookie_httponly: false
    detect_dark_chain: false
    detect_host_injection: false
  cmd_injection:
    enabled: true  是否启用插件
    detect_blind_injection: false  是否使用盲打来检查命令注入
  crlf_injection:
    enabled: true  是否启用插件
  dirscan:
    enabled: true  是否启用插件
    depth: 1
    dictionary: ""  配置目录字典, 需要是绝对路径
  jsonp:
    enabled: true  是否启用插件
  path_traversal:
    enabled: true  是否启用插件
  redirect:
    enabled: true  是否启用插件
  sqldet:
    enabled: true  是否启用插件
    error_based_detection: true  启用报错注入检测
    boolean_based_detection: true  启用布尔盲注检测
    time_based_detection: true  启用时间盲注检测
    # 下面两个选项很危险,开启之后可以增加检测率,但是有破坏数据库数据的可能性,请务必了解工作原理之后再开启
    dangerously_use_comment_in_sql: false  允许检查注入的时候使用注释
    dangerously_use_or_in_sql: false  允许检查注入的时候使用 or
  ssrf:
    enabled: true  是否启用插件
  xxe:
    enabled: true  是否启用插件
  upload:
    enabled: true  是否启用插件
  brute_force:
    enabled: true  是否启用插件
    detect_default_password: true  
    detect_unsafe_login_method: false  
    username_dictionary: ""  弱口令用户名字典, 需要绝对路径
    password_dictionary: ""  弱口令密码字典, 需要绝对路径
  phantasm:
    enabled: true  是否启用插件
    depth: 1  探测深度, 默认为 1, 即只在 URL 深度为 0, 和深度为 1 时运行该插件(前提是启用了该插件)
    poc:...这里省略,后面有很多poc...

3、被动代理配置

mitm:
  ca_cert: ./ca.crt  ca 根证书
  ca_key: ./ca.key  ca 根秘钥
  auth:   为代理添加认证
    username: ""
    password: ""
  restriction:
    includes: # 允许扫描的域,此处无协议,就是域名不需要 + https://头
    #- '*' # 表示允许所有的域名和 path
    #- 'example.com' # 表示允许 example.com 下的所有 path
    #- '*.example.com' # 表示允许除 example.com 下的所有 子域名的 path
    #- "example.com/admin*" # 表示允许 example.com 下的 /admin 开头的 path
    excludes: # 不允许扫描的域,此处无协议,就是域名不需要 + https://头
    #- 'a.example.com' # 表示排除 a.example.com 的扫描
  allow_ip_range: []  限制哪些 IP 可以使用该代理。支持单个 IP 和 CIDR 格式的地址
  #allow_ip_range: ["127.0.0.1","192.168.1.1/24"]
  queue:  队列长度配置
    max_length: 3000
  proxy_header:  代理请求头配置
    via: "" # 如果不为空,proxy 将添加类似 Via: 1.1 $some-value-$random 的 http 头
    x_forwarded: false # 是否添加 X-Forwarded-{For,Host,Proto,Url} 四个 http 头
  upstream_proxy: "" 代理的代理# mitm 的全部流量继续使用 proxy

queue:在做被动扫描时,xray 收到一个请求可能要发出去上百个请求进行扫描,所以获取请求和消耗请求的速度不一定匹配,这是一个经典的生产者消费者问题,如果生产消费速度不匹配,就需要一个中间的队列来临时存储,这个队列的大小就是 max_length。xray 将每 10s 打印一下当前任务队列长度,一旦堆积的数量达到 max_length,代理将会 “卡住”,新请求无法通过,等待队列中的请求被处理后再继续生效。默认配置的 10000 表示最多允许堆积 10000 个请求。如果发现队列长度经常变满,可能是扫描速度太慢,可以尝试减少请求超时的时间和增加最大并发请求数,详见 http 配置章节。如果 max_length 设置的过大,会造成 xray 内存占用过大,甚至可能会造成内存不足 OOM 进程崩溃。比如我们假设一个 http 请求加响应为 20kb,那 3000 个请求理论上内存占用至少为 60Mb,实际场景下可能会比理论值还要大很多。

proxy_header:如果开启 proxy_header,代理会添加 via 头和 X-Forwarded-* 系列头。如果在请求中就已经存在了同名的 HTTP 头,那么将会追加在后面。比如 curl http://127.0.0.1:1234 -H "Via: test" -H "X-Forwarded-For: 1.2.3.4" -v,后端实际收到的请求将会是

GET / HTTP/1.1
Host: 127.0.0.1:1234
User-Agent: curl/7.54.0
Accept: */*
Via: test, 1.1 xray-1fe7f9e5241b2b150f32
X-Forwarded-For: 1.2.3.4, 127.0.0.1
X-Forwarded-Host: 127.0.0.1:1234
X-Forwarded-Proto: http
X-Forwarded-Url: http://127.0.0.1:1234/
Accept-Encoding: gzip

upstream_proxy:该项配置仅对 http 代理本身生效,不对漏洞扫描发出的请求生效。仅影响代理本身,不会影响插件在漏洞探测时的发包行为。假如启动 xray 时配置的 listen 为 127.0.0.1:1111upstream_proxy 为 http://127.0.0.1:8080, 那么浏览器设置代理为 http://127.0.0.1:1111,整体数据流如下:

Web自动化漏洞检测工具之 Xray配置检测_第1张图片

3、HTTP配置

http:
  proxy: "" # 配置该项后漏洞扫描发送请求时将使用代理发送,支持 http, https 和 socks5 三种格式
#http://127.0.0.1:1111
#https://127.0.0.1:1111
#socks5://127.0.0.1:1080
  dial_timeout: 5 # 建立 tcp 连接的超时时间
  read_timeout: 10 # 读取 http 响应的超时时间,不可太小,否则会影响到 sql 时间盲注的判断
  fail_retries: 1 # 请求失败的重试次数,0 则不重试
  max_redirect: 5 # 单个请求最大允许的跳转数
  max_qps: 1 # 每秒最大请求数,为了避免被ban,会把该值改的小一些,极限情况支持设置为 1, 表示每秒只能发送一个请求。
  max_conns_per_host: 50 # 同一 host 最大允许的连接数,可以根据目标主机性能适当增大。
  max_resp_body_size: 8388608 # 8M,单个请求最大允许的响应体大小,超过该值 body 就会被截断
  headers: # 每个请求预置的 http 头
    User-Agent:
      - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169
  cookies: # 每个请求预置的 cookie 值,效果上相当于添加了一个 Header: Cookie: key=value
    key: value
  allow_methods: # 允许使用 http 方法
    - HEAD
    - GET
    - POST
    - PUT
    - DELETE
    - OPTIONS
    - CONNECT
    - PROPFIND
    - MOVE
  tls_skip_verify: true # 是否验证目标网站的 https 证书。
  enable_http2: false # 是否启用 http2

4、盲打平台配置

reverse:
  db_file_path: ""  用于存储反连平台获取的请求信息,用于后续查询,默认为空,将存储在系统临时文件夹。
  token: ""  用于防止 api 被非法调用,默认为空,将自动生成。
  http:
    enabled: true
    listen_ip: 127.0.0.1  监听的 ip
    listen_port: ""  默认为空,将自动选择,要注意本端口被防火墙放行,尤其是自动选择端口的时候。
  dns:  (如果启用,可能需要权限才能监听 53 端口)
    enabled: false
    listen_ip: 127.0.0.1  监听的 ip
    domain: ""  在 dns 查询的时候的一级域名,默认为空,将使用随机域名。
    is_domain_name_server: false  如果上述域名的 ns 服务器就是反连平台的地址,那么直接使用 dig random.domain.com 就可以让 dns 请求到反连平台,否则需要 dig random.domain.com @reverse-server-ip 指定 dns 服务器才可以。本配置项是指有没有配置 ns 服务器为反连平台的地址,用于提示扫描器内部 payload 的选择。
    # 静态解析规则
    resolve:  类似常见的 dns 配置,如果反连平台收到配置的域名的解析请求,将按照配置的结果直接返回。
    - type: A # A, AAAA, TXT 三种
      record: localhost
      value: 127.0.0.1
      ttl: 60
  client:
    http_base_url: ""  是客户端访问的时候使用,详见下方的场景。
    dns_server_ip: ""  是客户端发起 dns 查询的时候,使用的 ip,详见下方场景。
    remote_server: false  是客户端访问的时候,如何和反连平台建立连接,详见下方的场景。

新版的反连平台新增了管理界面,可以访问反连平台 http 地址,url 为 /cland/

功能包括

  • 生成自定义 url,并记录访问记录
  • 生成自定义域名,并记录解析记录
  • 使用平台预制 payload,记录抓取的数据

 

 

Web自动化漏洞检测工具之 Xray配置检测_第2张图片

Web自动化漏洞检测工具之 Xray配置检测_第3张图片

注意,下面的配置删除了没有修改的项目

场景1 - xray 和被扫描目标可以使用 ip 双向互联

可以使用默认配置,配置监听 ip 就可以,以 192.168.1.2 为例。

因为下方端口留空,xray 将随机选择一个端口,以 24568 为例。

reverse:
  http:
    enabled: true
    listen_ip: 192.168.1.2
  dns:
    enabled: true
    listen_ip: 192.168.1.2
  rmi:
    enabled: true
    listen_ip: 192.168.1.2
CopyErrorCopied

扫描期间,用于连接反连平台的 url 将为 http://192.168.1.2:24678/url

场景2 - xray listen 的地址和被扫描目标访问的地址不一样

比如一些云主机,虽然公网 ip 可以访问,但是本地并无法直接 listen 那个 ip

首先要获取到云主机的外网 ip,以 100.100.100.100 为例。

reverse:
  http:
    enabled: true
    listen_ip: 0.0.0.0
  dns:
    enabled: true
    listen_ip: 0.0.0.0
  rmi:
    enabled: true
    listen_ip: 0.0.0.0
  client:
    http_base_url: "http://100.100.100.100:${port}"
    dns_server_ip: "100.100.100.100"
    rmi_server_addr: "100.100.100.100:${port}"
CopyErrorCopied

如果将使用域名代替 ip 地址,对照替换即可。

场景3 - xray 可以访问扫描目标,但是反向不行

这是非常常见的情况,比如在办公网运行 xray,扫描生产网的目标。

这时候需要在双方都可以访问到个的地方也部署一份反连平台,比如一台公网云主机,然后扫描器和靶站都去连接它。

对于单独部署的反连平台,使用 ./xray reverse 启动,配置如下,以公网云主机 ip 地址 100.100.100.100,端口 80(http) 和 8080(rmi) 为例。

reverse:
  db_file_path: "reverse.db"
  token: "a_verrrry_long_token"
  http:
    listen_ip: 0.0.0.0
    listen_port: "80"
  dns:
    enabled: true
    listen_ip: 0.0.0.0
    domain: "domain.com"
  rmi:
    enabled: true
    listen_ip: 0.0.0.0
    listen_port: 8088
CopyErrorCopied

对于扫描器端,配置如下。

reverse:
  token: "a_verrrry_long_token"
  http:
    enabled: false
  dns:
    enabled: false
    domain: "domain.com"
  rmi:
    enabled: false
  client:
    http_base_url: "http://100.100.100.100:80"
    dns_server_ip: "100.100.100.100"
    rmi_server_addr: "100.100.100.100:8088"
    remote_server: true
CopyErrorCopied

要注意的是,两边的 xray 请使用相同版本的,否则可能存在 api 不兼容的问题。

5、爬虫配置

basic_crawler:
  max_depth: 0 # 爬虫最大深度, 0 为无限制
  max_count_of_links: 0 # 本次扫描总共爬取的最大连接数, 0 为无限制
  allow_visit_parent_path: false # 是否允许访问父目录, 如果扫描目标为 example.com/a/, 如果该项为 false, 那么就不会爬取 example.com/ 这级目录的内容
  restriction: # 和 mitm 中的写法一致, 有个点需要注意的是如果当前目标为 example.com 那么会自动添加 example.com 到 includes 中。
    includes: []
    excludes:
    - '*google*'

 

 

 

 

 

你可能感兴趣的:(#,漏洞扫描之Xray,只有走过才知道多难)