xray webhook
xray可以通过webhook传递扫描信息,官方文档也是一笔带过,可能大多数人都不清楚,或者仅仅知道有这么个东西,但是不知道怎么使用,webhook是xray被动监听模式下的一种输出结构和方式。相比输出Json和txt格式,webhook输出漏洞是实时的,试问谁不想第一时间看到漏洞信息呢。前阵子我通过抓取流量的方式抓到了参数,然后把这个请求解了,开放给大家看下,免得再在解包上浪费精力
go
type Webhookpara struct {
Data interface{} `json:"data"`
Type string `json:"type"`
}
// web_vuln模式下的xray结构:
type ExtraParam struct {
Param map[string]interface{} `json:"param"`
}
type Detail struct {
Addr string `json:"addr"`
Extra ExtraParam `json:"extra"`
Payload string `json:"payload"`
Snapshot [][]string `json:"snapshot"`
}
type Target struct {
Url string `json:"url"`
}
type VulnData struct {
CreateTime int64 `json:"create_time"`
Detail Detail `json:"detail"`
Plugin string `json:"plugin"`
Target Target `json:"target"`
}
// web_statistic模式下的xray结构
type StatisticData struct {
AverageResponseTime float64 `json:"average_response_time"`
NumFoundUrls int `json:"num_found_urls"`
NumScannedUrls int `json:"num_scanned_urls"`
NumSentHttpRequests int `json:"num_sent_http_requests"`
RatioFailedHttpRequests float64 `json:"ratio_failed_http_requests"`
RatioProgress float64 `json:"ratio_progress"`
}
// 传输类型为statistic的json结构体结构:扫描器状态信息
func StatistictoJSON(a interface{}) StatisticData {
jsonStr, err1 := json.Marshal(a)
if err1 != nil {
fmt.Println("序列化xray web_statistic类型数据失败", err1)
logging.RuntimeLog.Error(err1)
}
var res StatisticData
if err := json.Unmarshal([]byte(jsonStr), &res); err != nil {
fmt.Println("反序列化xray web_statistic类型数据失败", err)
logging.RuntimeLog.Error(err)
}
return res
}
// 传输类型为vuln的json结构体结构:详细漏洞信息
func VulntoJSON(a interface{}) VulnData {
jsonstr, err1 := json.Marshal(a)
if err1 != nil {
fmt.Println("序列化xray web_vuln类型数据失败", err1)
logging.RuntimeLog.Error(err1)
}
var res VulnData
if err := json.Unmarshal([]byte(jsonstr), &res); err != nil {
fmt.Println("反序列化xray web_vuln类型数据失败", err)
logging.RuntimeLog.Error(err)
}
return res
}
上面是结构及解析,下面是一个基于golang gin使用例子,有的字段时有时无,这种字段我都放弃掉了,如果都要判断代码量会很多,type 的类型有 :"web_statistic" ,"web_vuln","host_vuln" ,"subdomain"等类型,但是被动下只有web_statistic和web_vuln才有意义。
go
// XrayWebHook 用于接收xray json请求
func XrayWebHook(c *gin.Context) {
var req Webhookpara
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(400, gin.H{
"status": 1,
"mes": err.Error(),
})
return
}
if req.Type == "web_statistic" {
var r StatisticData
fmt.Println("xray web_statistic原始数据:", req.Data)
r = StatistictoJSON(req.Data)
if r.AverageResponseTime == 0 {
//为0扫描结束,可以将此状态做进一步处理
}
if req.Type == "web_vuln" {
var r VulnData
r = VulntoJSON(req.Data)
fmt.Println("扫描目标:", r.Target.Url)
fmt.Println("漏洞类型:", r.Plugin)
fmt.Println("payload:", r.Detail.Payload)
}
c.JSON(200, gin.H{
"status": 0,
"mes": "successfully",
})
}