xray Web掃描器學習記錄


長亭科技的xray掃描器的掃描效果還不錯,在國內頗受好評,很有幸以前在長亭科技工作,技術氛圍很好。扯得有點遠了,話不多說,本文是是xray國光的學習記錄,也可以當做新手的xray教程來用,不過我還是建議大家看看官方文檔,只是國光我最近喜歡上了這種學習記錄的感覺,學習效率很高。

簡介

項目地址:https://github.com/chaitin/xray

長亭科技研發的一款完善的安全評估工具,支持常見Web安全問題掃描和自定義POC,雖然Github有項目,但是不開源,只提供社區版本供大家使用。

基本使用

代理模式

代理模式下的基本架構為,掃描器作為中間人,首先原樣轉發流量,並返回服務器響應給瀏覽器等客戶端,通訊兩端都認為自己直接與對方對話,同時記錄該流量,然后修改參數並重新發送請求進行掃描。這種原理和Burpsuite的自帶的漏掃原理是一樣的。

生成ca證書

 
Bash
# 生成 ca 證書 ➜ ./xray genca # 在當前文件夾生成 ca.crt 和 ca.key 兩個文件 ➜ ls ca.crt ca.key config.yaml xray

將生成的ca證書導入到需要代理的設備即可,這樣就可以方便代理https的流量了

啟用代理

第一次啟動 xray 之后,當前目錄會生成 config.yml 配置文件,選擇文件編輯器打開,並按照下方說明修改。定位搜索到如下內容,將* 改為 testphp.vulnweb.com,這是AWVS的官方靶場,方便檢測漏掃能力。

 
Yaml
# 配置解釋見 https://chaitin.github.io/xray/#/configration/mitm mitm: ... restriction: includes: # 允許掃描的域,此處無協議 - 'testphp.vulnweb.com' # 表示允許所有的域名和 path ...

監聽本地的7777端口,並設置漏洞報告的輸出的文件名為:xray-testphp.html

 
Bash
➜ ./xray webscan --listen 127.0.0.1:7777 --html-output xray-testphp.html

配置代理

Chrome下的SwitchyOmega插件很方便添加各種代理,將xray的代理添加進來,然后瀏覽器開啟xray代理即可:

 

 

開始掃描

使用剛剛設置過代理的Chrome瀏覽器訪問:http://testphp.vulnweb.com

然后就可以看到 xray 界面開始輸出漏洞信息,在用戶和網站交互的時候,期間的鏈接xray都會進行安全檢查,然后生成對應的漏洞報告:

下面是幾個快速鏈接,可以點擊用於體驗更多的漏洞類型的掃描

可以在上面設置的輸出格式里面看到對應的漏洞檢測結果報告:

 

wow awesome
wow awesome

 

爬蟲模式

爬蟲模式是模擬人工去點擊網頁的鏈接,然后去分析掃描,和代理模式不同的是,爬蟲不需要人工的介入,訪問速度要快很多,但是也有一些缺點需要注意。

  • xray 的基礎爬蟲不能處理 js 渲染的頁面
  • 需要首先人工配置登錄 cookie,必需的 http 頭等,如果登錄失敗,也不容易發現問題
 
Bash
➜ ./xray webscan --basic-crawler http://testphp.vulnweb.com/ --html-output xray-crawler-testphp.html

在這個模式下,相當於主動掃描模式,自主分析頁面的鏈接,然后自動探測是否有漏洞。

服務掃描

xray也支持服務掃描,目前的服務掃描的POC還不夠多,目前只有一個 tomcat-cve-2020-1938 ajp 協議任意文件檢測poc。

參數配置目前比較簡單,支持單個掃描與批量掃描:

 
Bash
# 快速檢測單個目標 ➜ ./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

也可以將結果輸出到報告中,支持多種格式:

 
Bash
# 將檢測結果輸出到 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用法可以使用下面命令查看:

 
Shell
➜ ./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 基本上我們搞安全的 基本上應該都很容易理解了:

 
Shell
➜ ./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

全局配置 如果在這指定了,那么所有命令執行的時候都會生效

 
Bash
# 用於指定配置文件的位置,默認加載同目錄的 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

全局配置的使用時需要緊跟二進制程序,如:

 
Bash
# 正確的用法 ➜ ./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

 
Bash
➜ ./xray  subdomain --target example.com --text-output example.txtCopyErrorCopied

掃描 example.com,並使用 console ui 交互式界面,同時記錄結果到 example.txt

 
Bash
➜ ./xray  subdomain --target example.com --console-ui --text-output example.txt

webscan

運行 ./xray -h,可以看到

 
Bash
➜  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: 指定要運行的插件,使用,分隔
 
Shell
--plugins xss
--plugins xss,sqldet,phantasm
  • --poc:配置本次掃描啟用哪些POC,使用,分隔
 
Bash
# 只加載一個 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作為報告文件名。

組合使用

將上面說的一些結合起來使用,就可以滿足多種場景下的使用需求了:

 
Bash
# 使用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 時,處理過程為:

 
Powershell
sqldet, xss, cmd_injection 同時處理 request1 sqldet, xss, cmd_injection 同時處理 request2 sqldet, xss, cmd_injection 同時處理 request3

當 max_parallel 設置為 3 時,處理過程為:

 
Shell
sql,xss,cmd_injection 同時並發(3並發)處理 request1, request2, request3

理論上時間會算縮短3倍,但這個值並非越大越好,高並發意味着同一時間發包數量大幅增加,這可能會影響遠程 server 的運行和xray 對漏洞的判斷,需要按需設置。

對於其他配置項,一個插件是一個配置單元,每個單元的基本格式為:

 
Yaml
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,python
  • detect_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名字和本地文件的絕對路徑,如:
 
Yaml
phantasm: poc: - poc-yaml-activemq-cve-2016-3088 - /Users/test/1.yml

這樣方便自己添加自己的POC了

被動代理配置

這一部分主要介紹配置項中 mitm 部分相關的內容。

抓取HTTPS流量

對應於 ca_cert 和 ca_key 兩項配置。

和 burp 類似,抓取 https 流量需要信任一個根證書,這個根證書可以自行生成,也可用下列自帶的命令生成:

 
Bash
➜ ./xray genca

運行后將在當前目錄生成 ca.key 和 ca.crt, 用戶手動導入證書即可,類似於BP導入證書那樣。

Firefox需要單獨在瀏覽器導入。移動端可以掛代理之后訪問 http://xray/ 下載根證書

代理啟用密碼保護

對應於 auth 中的配置。

xray 支持給代理配置基礎認證的密碼,當設置好 auth 中的 username 和 password 后,使用代理時瀏覽器會彈框要求輸出用戶名密碼,輸入成功后代理才可正常使用。

限制漏洞掃描的范圍

在 mitm 的配置中的 restrction 項指示本次漏洞的 URI 限制。

  1. includes表示只掃描哪些域和路徑。比如 *.example.com 只掃描 example.com 的子域
  2. excludes 表示不掃描哪些域和路徑。比如 t.example.com 表示不掃描 t.example.com

兩個都配置的情況下會取交集,這兩個配置常用於想要過濾代理中的某些域,或者只想掃描某個域的請求時。

兩項配置都支持 path 過濾,如果輸入的中有 /, 那么 / 后面的表達式就是 path 的過濾。可以對照如下例子理解:

 
Yaml
includes: - 'example.com/test' # 表示允許 example.com/test 這一個路徑 - "example.com/admin*" # 表示允許 example.com 下的 /admin 開頭的所有 path 

注意: 這里的 includes 和 excludes 均不支持端口號,如果加上將導致限制失效!

設置代理的IP白名單

配置中的 allow_ip_range 項可以限制哪些 IP 可以使用該代理。支持單個 IP 和 CIDR 格式的地址,如:

 
Yaml
allow_ip_range: ["127.0.0.1","192.168.1.1/24"]CopyErrorCopied

留空則允許所有地址訪問,如果來源 IP 沒有在配置的地址內,使用者則會報Proxy Failed的錯誤。

隊列長度配置

 
Yaml
queue: max_length: 10000

經典的生產者消費者問題,如果生產消費速度不匹配,就需要一個中間的隊列來臨時存儲,這個隊列的大小就是 max_length。如果 max_length 設置的過大,會造成 xray 內存占用過大,甚至可能會造成內存不足 OOM 進程崩潰。

代理請求頭配置

 
Yaml
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,后端實際收到的請求將會是

 
Http
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:1111upstream_proxy 為 http://127.0.0.1:8080, 那么瀏覽器設置代理為 http://127.0.0.1:1111,整體數據流如下:

 

 

該配置僅影響代理本身,不會影響插件在漏洞探測時的發包行為

盲打平台配置

這里知識點比較多,反向盲打平台很多,如果大家對xray的這個功能感興趣建議參考xray的官方文檔,國光這里就不細寫了。

HTTP配置

對於 web 掃描來說,http 協議的交互是整個過程檢測過程的核心。因此這里的配置將影響到引擎進行 http 發包時的行為。

漏洞掃描用的代理 proxy

配置該項后漏洞掃描發送請求時將使用代理發送,支持 httphttps 和 socks5 三種格式,如:

 
 
http://127.0.0.1:1111
https://127.0.0.1:1111
socks5://127.0.0.1:1080

基礎爬蟲配置

基礎爬蟲的配置項對應於 basic-crawler 部分,默認的配置如下,用法參照文件中的注釋

 
Yaml
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 中添加如下配置即可禁用更新檢查:

 
Yaml
update: check: false 

xray 進階

xray與Burpsuite聯動

首先 xray 建立起 webscan 的監聽

 
Bash
➜ ./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進行聯動

 
Bash
➜ ./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了沒有啥反應):

 

Docker版本的AWVS國光沒有成功聯動過
Docker版本的AWVS國光沒有成功聯動過

 

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

 

 

此時AWVS的爬蟲會把請求都轉發給xray檢測漏洞了,此時awvs.html里面就躺好了漏洞:

Django調用xray

因為xray的新版本支持webhook這樣很方便我們寫代碼調用,首先xray監聽本地的7777端口,然后監聽的流量進行漏洞檢測,將漏洞信息同時通過webhook的方式傳輸到http://127.0.0.1:8000/scan/xray/

 
Bash
➜ ./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寫的接口,下面是這個接口簡單的實現代碼:

 
Python
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

參考資料

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM