Xray会生成config.yaml配置文件,我们通过配置该文件来对扫描进行状态控制。
文档:https://xray.cool/xray/#/tutorial/introduce
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:1111
,upstream_proxy
为 http://127.0.0.1:8080
, 那么浏览器设置代理为 http://127.0.0.1:1111
,整体数据流如下:
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/
。
功能包括
注意,下面的配置删除了没有修改的项目
场景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*'