長亭科技的xray掃描器的掃描效果還不錯,在國內頗受好評,很有幸以前在長亭科技工作,技術氛圍很好。扯得有點遠了,話不多說,本文是是xray國光的學習記錄,也可以當做新手的xray教程來用,不過我還是建議大家看看官方文檔,只是國光我最近喜歡上了這種學習記錄的感覺,學習效率很高。
簡介
項目地址:https://github.com/chaitin/xray
長亭科技研發的一款完善的安全評估工具,支持常見Web安全問題掃描和自定義POC,雖然Github有項目,但是不開源,只提供社區版本供大家使用。
基本使用
代理模式
代理模式下的基本架構為,掃描器作為中間人,首先原樣轉發流量,並返回服務器響應給瀏覽器等客戶端,通訊兩端都認為自己直接與對方對話,同時記錄該流量,然后修改參數並重新發送請求進行掃描。這種原理和Burpsuite的自帶的漏掃原理是一樣的。
生成ca證書
# 生成 ca 證書 ➜ ./xray genca # 在當前文件夾生成 ca.crt 和 ca.key 兩個文件 ➜ ls ca.crt ca.key config.yaml xray
將生成的ca證書導入到需要代理的設備即可,這樣就可以方便代理https的流量了
啟用代理
第一次啟動 xray 之后,當前目錄會生成 config.yml
配置文件,選擇文件編輯器打開,並按照下方說明修改。定位搜索到如下內容,將*
改為 testphp.vulnweb.com
,這是AWVS的官方靶場,方便檢測漏掃能力。
# 配置解釋見 https://chaitin.github.io/xray/#/configration/mitm mitm: ... restriction: includes: # 允許掃描的域,此處無協議 - 'testphp.vulnweb.com' # 表示允許所有的域名和 path ...
監聽本地的7777
端口,並設置漏洞報告的輸出的文件名為:xray-testphp.html
➜ ./xray webscan --listen 127.0.0.1:7777 --html-output xray-testphp.html
配置代理
Chrome下的SwitchyOmega插件很方便添加各種代理,將xray的代理添加進來,然后瀏覽器開啟xray代理即可:

開始掃描
使用剛剛設置過代理的Chrome瀏覽器訪問:http://testphp.vulnweb.com
然后就可以看到 xray 界面開始輸出漏洞信息,在用戶和網站交互的時候,期間的鏈接xray都會進行安全檢查,然后生成對應的漏洞報告:
下面是幾個快速鏈接,可以點擊用於體驗更多的漏洞類型的掃描
- http://testphp.vulnweb.com/listproducts.php?cat=1
- http://testphp.vulnweb.com/artists.php?artist=2
- http://testphp.vulnweb.com/redir.php?r=http://www.w3.org
可以在上面設置的輸出格式里面看到對應的漏洞檢測結果報告:

爬蟲模式
爬蟲模式是模擬人工去點擊網頁的鏈接,然后去分析掃描,和代理模式不同的是,爬蟲不需要人工的介入,訪問速度要快很多,但是也有一些缺點需要注意。
- xray 的基礎爬蟲不能處理 js 渲染的頁面
- 需要首先人工配置登錄 cookie,必需的 http 頭等,如果登錄失敗,也不容易發現問題
➜ ./xray webscan --basic-crawler http://testphp.vulnweb.com/ --html-output xray-crawler-testphp.html
在這個模式下,相當於主動掃描模式,自主分析頁面的鏈接,然后自動探測是否有漏洞。
服務掃描
xray也支持服務掃描,目前的服務掃描的POC還不夠多,目前只有一個 tomcat-cve-2020-1938 ajp 協議任意文件檢測poc。
參數配置目前比較簡單,支持單個掃描與批量掃描:
# 快速檢測單個目標 ➜ ./xray servicescan --target 127.0.0.1:8009 # 批量檢查的 1.file 中的目標, 一行一個目標,帶端口 ➜ ./xray servicescan --target-file test.file
其中 test.file
的格式為一個行一個 service,如
10.3.0.203:8009
127.0.0.1:8009
也可以將結果輸出到報告中,支持多種格式:
# 將檢測結果輸出到 html 報告中 ➜ ./xray servicescan --target 127.0.0.1:8009 --html-output service.html ➜ ./xray servicescan --target-file test.file --html-output service.html # 將檢測結果輸出到 json 文件中 ➜ ./xray servicescan --target 127.0.0.1:8099 --json-output service.json
完整的servicescan用法可以使用下面命令查看:
➜ ./xray servicescan --help
NAME:
servicescan - Run a service scan task
USAGE:
servicescan [command options] [arguments...]
OPTIONS:
--target value specify the target, for example: host:8009
--target-file value load targets from a local file, one target a line
--json-output FILE output xray results to FILE in json format
--webhook-output value post xray result to url in json format
--html-output FILE output xray result to FILE in HTML format
Aapache Tomcat AJP 文件包含漏洞(CVE-2020-1938)Vulhub環境鏈接
部署完成后,使用xray來檢測看一下效果怎么樣:

配置
命令詳解
查看 -h
基本上我們搞安全的 基本上應該都很容易理解了:
➜ ./xray -h
USAGE:
[global options] command [command options] [arguments...]
COMMANDS:
webscan Run a webscan task
servicescan Run a service scan task
poclint lint yaml poc
reverse Run a standalone reverse server
genca Generate CA certificate and key
upgrade check new version and upgrade self if any updates found
version Show version info
help, h Shows a list of commands or help for one command
GLOBAL OPTIONS:
--config FILE Load configuration from FILE
--log_level value Log level, choices are debug, info, warn, error, fatal
--help, -h show help
GLOBAL OPTIONS
全局配置 如果在這指定了,那么所有命令執行的時候都會生效
# 用於指定配置文件的位置,默認加載同目錄的 config.yaml --config FILE Load configuration from FILE # 用於指定全局的日志配置,默認為info, 可以設置為debug查看更詳細的信息 --log_level value Log level, choices are debug, info, warn, error, fatal --help, -h show help
全局配置的使用時需要緊跟二進制程序,如:
# 正確的用法 ➜ ./xray --log_level debug --config my.yaml webscan --url xxx # 錯誤的用法 全局配置沒有緊跟二進制程序 ➜ ./xray webscan --log_level debug --config my.yaml --url xxx
COMMANDS
命令 | 說明 |
---|---|
webscan | xray核心功能,用來發現探測Web漏洞 |
servicescan | 服務掃描功能 用來探測服務漏洞 |
poclint | 檢測poc是否符合規范 |
reverse | 啟動單獨的盲打平台服務 |
genca | 用於快速生成一個根證書,主要用於被動代理掃描HTTPS流量時用到 |
upgrade | 檢查新版本並自動升級 |
version | 版本信息 |
help | 顯示命令列表或一個命令的幫助 |
subdomain | 子域名掃描 高級本才有的命令 |
subdomain
掃描 example.com
,並將結果輸出到 example.txt
➜ ./xray subdomain --target example.com --text-output example.txtCopyErrorCopied
掃描 example.com
,並使用 console ui 交互式界面,同時記錄結果到 example.txt
➜ ./xray subdomain --target example.com --console-ui --text-output example.txt
webscan
運行 ./xray -h
,可以看到
➜ xray ./xray webscan -h
NAME:
webscan - Run a webscan task
USAGE:
webscan [command options] [arguments...] OPTIONS: --plugins value specify the plugins to run, separated by ',' --poc value specify the poc to run, separated by ',' --listen value use proxy resource collector, value is proxy addr --basic-crawler value use a basic spider to crawl the target and scan the results --url-file FILE read urls from a local file and scan these urls --url value scan a **single** url --data value data string to be sent through POST (e.g. 'username=admin') --raw-request FILE load http raw request from a FILE --json-output FILE output xray results to FILE in json format --html-output FILE output xray result to FILE in HTML format --webhook-output value post xray result to url in json format
掃描插件
--plugins
: 指定要運行的插件,使用,
分隔
--plugins xss
--plugins xss,sqldet,phantasm
--poc
:配置本次掃描啟用哪些POC,使用,
分隔
# 只加載一個 POC, 精准匹配 --plugins phantasm --poc poc-yaml-thinkphp5-controller-rce # 加載內置的所有帶 `thinkphp` 的 POC --plugins phantasm --poc "*thinkphp*" # 加載本地 `/home/test/pocs/` 目錄所有的 POC: --plugins phantasm --poc "/home/test/pocs/*" # 加載 `/home/test/pocs/` 下包含 thinkphp 的 POC --plugins phantasm --poc "/home/test/pocs/*thinkphp*"
該參數支持Glob表達式批量加載,規則還是很靈活的。
輸入來源
--listen
: 啟動一個被動代理服務器作為輸入,如--listen 127.0.0.1:7777
--basic-crawler
: 啟用一個基礎爬蟲作為輸入, 如--basic-crawler http://example.com
--url-file
: 批量從文件中讀取URL--url
: 用於快速測試單個URL,不帶爬蟲,默認為GET請求--data
:指定 data,同時變為POST請求--raw-request
: 加載一個原始的 HTTP 請求並用於掃描,類似於sqlmap -r
輸出格式
--json-output
: 將結果輸出到一個 json 文件中,輸出是JSON格式的結構化數據--html-output
: 將結果輸出為 html 報告--webhook-output
: 將結果發送到一個地址,輸出是JSON格式的結構化數據,需要自己搭建一個Web服務器,接收到xray發送的漏洞信息
在
--json-output
和--html-otput
參數中使用變量__timestamp__
和__datetime__
,這樣文件名中對應位置會自動替換為時間戳或日期時間,避免輸出到同一文件時報錯。如--html-output report-__datetime__.html
將使用report-2019_11_01-10_03_26.html
作為報告文件名。
組合使用
將上面說的一些結合起來使用,就可以滿足多種場景下的使用需求了:
# 使用xss模塊 啟用1111端口的代理服務器進行web漏洞掃描,輸出漏洞報告到1.html中 ➜ ./xray webscan --plugins xss --listen 127.0.0.1:1111 --html-output 1.html # 將日志級別設置為debug 然后使用xss和命令執行插件 使用內置的爬蟲來掃描,輸出漏洞報告到1.json中 ➜ ./xray --log_level debug webscan --plugins xss,cmd_injection --basic-crawler http://example.com --json-output 1.json # 對目標資產進行POST方式漏洞檢測,data為 x=y 並輸出漏洞報告到1.json中 ➜ ./xray webscan --url http://example.com --data "x=y" --html-output 2.html --json-output 1.json # 對目標資產進行單個URL檢測,路燈報告輸出到指定的接受服務器中 ➜ ./xray webscan --url http://example.com/ --webhook-output http://host:port/path ...
交互命令行
交互式的命令行就是新手福利了,提供命令自動補全提示,直接運行 xray 而不加任何參數即可啟動交互式命令行。
配置文件
引擎初次運行時,會在當前目錄內生成一個 config.yaml
文件。通過調整配置中的各種參數,可以滿足不同場景下的需求。
在 xray 快速迭代時期,不保證配置文件向后兼容。如果出錯,可以備份配置文件並重新生成。 實際上建議每次更新版本后都備份配置文件后刪除並重新生成,以免錯過新功能的配置。
插件配置
在具體插件配置之前,plugins 部分有個頂級配置項為 max_parallel
, 表示插件的並發度。舉個例子,如果需要處理 3 個請求,此時啟用了三個插件 sqldet, xss, cmd_injection, 當設置 max_parallel
為 1 時,處理過程為:
sqldet, xss, cmd_injection 同時處理 request1 sqldet, xss, cmd_injection 同時處理 request2 sqldet, xss, cmd_injection 同時處理 request3
當 max_parallel
設置為 3 時,處理過程為:
sql,xss,cmd_injection 同時並發(3並發)處理 request1, request2, request3
理論上時間會算縮短3倍,但這個值並非越大越好,高並發意味着同一時間發包數量大幅增加,這可能會影響遠程 server 的運行和xray 對漏洞的判斷,需要按需設置。
對於其他配置項,一個插件是一個配置單元,每個單元的基本格式為:
pluginName: enabled: true/false otherConfigrations: xxx
enabled
即為是否啟用插件,所以這里只說明部分插件的特殊配置就可以了。
xss
ie_feature
如果此項為 true,則會將一些只能在IE環境下復現的漏洞爆出來,小白請不要開。include_cookie
如果此項為 true, 則會檢查是否存在輸入源在 cookie 中的 xss
baseline
detect_outdated_ssl_version
是否檢測過期的 SSL 版本, 如果目標啟用了 TLS1.1, TLS1.0, SSL3.0 都是會報一個漏洞detect_http_header_config
是否檢查 header 的配置,主要檢查一些安全相關的 http 頭有沒有確實或錯誤detect_cors_header_config
是否檢查 cors 相關的問題detect_server_error_page
檢查響應是不是一個錯誤頁面, 支持主流框架的錯誤信息檢測detect_china_id_card_number
檢查響應中有沒有身份證號信息detect_serialization_data_in_params
檢查參數中是否存在序列化數據,支持 java,php,pythondetect_cookie_password_leak
檢測cookie中是否存在密碼泄漏detect_unsafe_scheme
檢測不安全方案detect_cookie_httponly
檢測cookie是否開啟httponly
cmd_injection
detect_blind_injection
是否使用盲打來檢查命令注入
dirscan
dictionary
配置目錄字典, 需要是絕對路徑dictionary
Web字典的路徑
sqldet
error_based_detection
啟用報錯注入檢測boolean_based_detection
啟用布爾盲注檢測time_based_detection
啟用時間盲注檢測
下面兩個選項很危險,開啟之后可以增加檢測率,但是有破壞數據庫數據的可能性,請務必了解工作原理之后再開啟
dangerously_use_comment_in_sql
允許檢查注入的時候使用注釋dangerously_use_or_in_sql
允許檢查注入的時候使用or
brute_force
-
detect_default_password
檢測默認密碼 -
detect_unsafe_login_method
檢測不安全的登錄方法 -
username_dictionary
弱口令用戶名字典, 需要絕對路徑 -
password_dictionary
弱口令密碼字典, 需要絕對路徑
如果沒有配置將使用內置字典,約 Top8 用戶名和 Top80 密碼。配置后將做字典合並,即用戶字典的與內置的做合並並去重。
phantasm
depth
探測深度, 默認為1, 即只在URL深度為0, 和深度為1時運行該插件(前提是啟用了該插件)poc
定義默認啟用哪些POC。支持寫內置POC名字和本地文件的絕對路徑,如:
phantasm: poc: - poc-yaml-activemq-cve-2016-3088 - /Users/test/1.yml
這樣方便自己添加自己的POC了
被動代理配置
這一部分主要介紹配置項中 mitm
部分相關的內容。
抓取HTTPS流量
對應於 ca_cert
和 ca_key
兩項配置。
和 burp 類似,抓取 https 流量需要信任一個根證書,這個根證書可以自行生成,也可用下列自帶的命令生成:
➜ ./xray genca
運行后將在當前目錄生成 ca.key
和 ca.crt
, 用戶手動導入證書即可,類似於BP導入證書那樣。
Firefox需要單獨在瀏覽器導入。移動端可以掛代理之后訪問 http://xray/ 下載根證書
代理啟用密碼保護
對應於 auth
中的配置。
xray 支持給代理配置基礎認證的密碼,當設置好 auth
中的 username
和 password
后,使用代理時瀏覽器會彈框要求輸出用戶名密碼,輸入成功后代理才可正常使用。
限制漏洞掃描的范圍
在 mitm 的配置中的 restrction
項指示本次漏洞的 URI 限制。
includes
表示只掃描哪些域和路徑。比如*.example.com
只掃描example.com
的子域excludes
表示不掃描哪些域和路徑。比如t.example.com
表示不掃描t.example.com
兩個都配置的情況下會取交集,這兩個配置常用於想要過濾代理中的某些域,或者只想掃描某個域的請求時。
兩項配置都支持 path 過濾,如果輸入的中有 /
, 那么 /
后面的表達式就是 path 的過濾。可以對照如下例子理解:
includes: - 'example.com/test' # 表示允許 example.com/test 這一個路徑 - "example.com/admin*" # 表示允許 example.com 下的 /admin 開頭的所有 path
注意: 這里的 includes 和 excludes 均不支持端口號,如果加上將導致限制失效!
設置代理的IP白名單
配置中的 allow_ip_range
項可以限制哪些 IP 可以使用該代理。支持單個 IP 和 CIDR 格式的地址,如:
allow_ip_range: ["127.0.0.1","192.168.1.1/24"]CopyErrorCopied
留空則允許所有地址訪問,如果來源 IP 沒有在配置的地址內,使用者則會報Proxy Failed
的錯誤。
隊列長度配置
queue: max_length: 10000
經典的生產者消費者問題,如果生產消費速度不匹配,就需要一個中間的隊列來臨時存儲,這個隊列的大小就是 max_length
。如果 max_length
設置的過大,會造成 xray 內存占用過大,甚至可能會造成內存不足 OOM 進程崩潰。
代理請求頭配置
proxy_header: via: "" # 如果不為空,proxy 將添加類似 Via: 1.1 $some-value-$random 的 http 頭 x_forwarded: false # 是否添加 X-Forwarded-{For,Host,Proto,Url} 四個 http 頭
如果開啟 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
代理的代理
假如啟動 xray 時配置的 listen 為 127.0.0.1:1111
,upstream_proxy
為 http://127.0.0.1:8080
, 那么瀏覽器設置代理為 http://127.0.0.1:1111
,整體數據流如下:

該配置僅影響代理本身,不會影響插件在漏洞探測時的發包行為
盲打平台配置
這里知識點比較多,反向盲打平台很多,如果大家對xray的這個功能感興趣建議參考xray的官方文檔,國光這里就不細寫了。
HTTP配置
對於 web 掃描來說,http 協議的交互是整個過程檢測過程的核心。因此這里的配置將影響到引擎進行 http 發包時的行為。
漏洞掃描用的代理 proxy
配置該項后漏洞掃描發送請求時將使用代理發送,支持 http
, https
和 socks5
三種格式,如:
http://127.0.0.1:1111
https://127.0.0.1:1111
socks5://127.0.0.1:1080
基礎爬蟲配置
基礎爬蟲的配置項對應於 basic-crawler
部分,默認的配置如下,用法參照文件中的注釋
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 內置了一個簡單的更新檢查機制,會在每次啟動的時候檢查有無新的版本發布,如果有更新將在界面上顯示最新的 release notes。 如不需要該機制,可以通過下列方法禁用:
在 config.yaml
中添加如下配置即可禁用更新檢查:
update: check: false
xray 進階
xray與Burpsuite聯動
首先 xray 建立起 webscan 的監聽
➜ ./xray webscan --listen 127.0.0.1:7777 --html-output bp.html
進入 Burp 后,打開 User options
標簽頁,然后找到 Upstream Proxy Servers
設置。
點擊 Add
添加上游代理以及作用域,Destination host
處可以使用*
匹配多個任意字符串,?
匹配單一任意字符串,而上游代理的地址則填寫 xray 的監聽地址。

BP的socks代理與頂級代理服務器有沖突,不能同時勾選
接下來BP正常抓包,與此同時BP也會將我們截取到的一些流量包發到xray中進行漏洞檢測。
xray與AWVS聯動
首先 xray 建立起 webscan 的監聽
如果你的AWVS不是安裝在物理機上話,那么你的xray應該填寫你AWVS可以訪問的地址 國光測試填寫127.0.0.1 無法與AWVS進行聯動
➜ ./xray webscan --listen 192.168.31.53:7777 --html-output awvs.html
以 AWVS 13 為例,登入管理頁后,點擊 Targets
, 然后點擊 Add Target
添加掃描目標:
這里演示的是掃描 awvs 的在線靶站 http://testphp.vulnweb.com/

下滑到HTTP
部分,填寫Proxy Server
為對應的xray代理,因為國光的AWVS是在虛擬機運行的,所以我這里填寫的是我物理機的ip地址(之前粗心寫127.0.0.1了沒有啥反應):

最后掃描類型選擇 僅爬取:

此時AWVS的爬蟲會把請求都轉發給xray檢測漏洞了,此時awvs.html
里面就躺好了漏洞:
Django調用xray
因為xray的新版本支持webhook這樣很方便我們寫代碼調用,首先xray監聽本地的7777端口,然后監聽的流量進行漏洞檢測,將漏洞信息同時通過webhook的方式傳輸到http://127.0.0.1:8000/scan/xray/
➜ ./xray webscan --listen 192.168.31.53:7777 --webhook-output http://127.0.0.1:8000/scan/xray/
http://127.0.0.1:8000/scan/xray/
這個是國光用Django寫的接口,下面是這個接口簡單的實現代碼:
import json from django.shortcuts import render from django.views.generic.base import View from django.views.decorators.csrf import csrf_exempt class WebHook(View): @csrf_exempt def dispatch(self, request, *args, **kwargs): return super().dispatch(request, *args, **kwargs) def post(self, request): vul_data = json.loads(request.body) if 'detail' in str(request.body): print('漏洞插件:', vul_data['plugin']) print('漏洞位置:', vul_data['target']['url']) print('漏洞分類:', vul_data['vuln_class']) return render(request, 'test.html', { })
因為Django安全機制問題,xray post提交請求到Django必須填寫CSRF Token才可以,解決方法就是手動關掉這個類的CSRF檢測
@csrf_exempt