样本网络行为查询
接口说明
根据样本文件hash的md5查询网络行为,主要10种通讯行为(通讯协议)http,dns,adb,usb,ftp,ghost,smtp,icmp,tcp,udp的目的IP和端口,域名,URL,数据包长度,数据包大小,提交方式,客户端基本信息等。可选择添加字段startDate、endDate控制网络行为数据的时间范围。
请求地址
https://api.f.360.cn/files/std/internal/v2/network_behavior
请求方法
POST
请求参数
| 参数名 | 类型 | 位置 | 是否必填 | 示例值 | 说明 |
|---|---|---|---|---|---|
| query | object | body | 是 | | 查询条件,所有请求参数的父级结构 |
| query.keywords | Array(object) | body | 是 | | 查询条件,所有请求参数的子级结构 |
| query.keywords.[0].field | string | body | 是 | md5 | 查询条件的字段名,支持的字段有:md5 |
| query.keywords.[0].value | string | body | 是 | 0000e75ad071b5b5a7a35a0ba42c35c5 | 查询条件的字段值 |
| query.keywords.[1].field | string | body | 否 | startDate | 查询控制字段,支持的key为startDate,控制网络行为数据的开始日期 |
| query.keywords.[1].value | string | body | 否 | “202110” | 日期格式:“yyyyMM”,默认值:近36个月 |
| query.keywords.[2].field | string | body | 否 | endDate | 查询控制字段,支持的key为endDate,控制网络行为数据的结束日期 |
| query.keywords.[2].value | string | body | 否 | “202112” | 日期格式:“yyyyMM”,默认值:当前时间 |
响应参数
| 名称 | 类型 | 示例值 | 描述 | 应用说明 |
|---|---|---|---|---|
| code | integer | 0 | 返回代码 | |
| data | object | |||
| data.additional | object | 除以上网络行为外的一些额外补充 | ||
| data.additional.related_cat | string | 456game | AD下行报文当中设置的NDCAT域的标识符(ND Category);云端下发进程相关的标记 | |
| data.additional.related_domain | string | androidworldit.disqus.com | DNS反查域名 : nd.ip在本地缓存里反查出的域名 | |
| data.Connect | Array(object) | 未知的通讯协议 | ||
| data.Connect.ip | string | 87.5.4.3 | 网络访问目标IP | |
| data.Connect.port | string | 9887 | 网络访问目标端口 | |
| data.dns | Array(object) | 通讯协议的一种 | ||
| data.dns.domain | string | wwww.so.com | 域名 | |
| data.dns.ip | string | 31.130.251.70 | 网络访问目标IP | |
| data.ghost | Array(object) | 通讯协议的一种 | ||
| data.ghost.hdata | string | 27ed2408... | Ghost远控协议数据包头部数据Hex值,前256字节,hex编码 | |
| data.ghost.ip | string | 12.43.56.88 | 网络访问目标IP | |
| data.ghost.port | string | 7654 | 网络访问目标端口 | |
| data.http | Array(object) | 通讯协议的一种 | ||
| data.http.method | string | POST | HTTP协议Method | 协议只要有:'GET', 'POST', 'HEAD', 'PUT', 'DELETE', |
| data.http.port | string | 8090 | 网络访问目标端口 | |
| data.http.refer | number | http://so.com/index.html | HTTP Referer,父通讯地址 | |
| data.http.url | string | http://so.com/index.html | Http Url,完整URL | |
| data.https | Array(object) | 通讯协议的一种 | ||
| data.https.ip | string | 31.130.251.70 | 网络访问目标IP | |
| data.https.method | string | POST | HTTPS协议Method | 协议只要有:'GET', 'POST', 'HEAD', 'PUT', 'DELETE', |
| data.https.port | string | 9087 | 网络访问目标端口 | |
| data.https.url | string | http://so.com/index.html | Http Url,完整URL | |
| data.icmp | Array(object) | 通讯协议的一种 | ||
| data.icmp.ip | string | 43.43.5.6 | 网络访问目标IP | |
| data.icmp.port | string | 9809 | 网络访问目标I端口 | |
| data.tcp | Array(object) | 通讯协议的一种 | ||
| data.tcp.ip | string | 32.56.4.2 | 网络访问目标IP | |
| data.tcp.port | string | 8865 | 网络访问目标端口 | |
| data.udp | Array(object) | 通讯协议的一种 | ||
| data.udp.ip | string | 43.2.1.3 | 网络访问目标IP | |
| data.udp.port | string | 6579 | 网络访问目标端口 | |
| msg | string | ok | ||
| status | integer | 0 |
请求示例
支持cUrl、Python、Java、PHP、Go语言的请求,示例如下
#!/usr/bin/env bash
set -euo pipefail
APPID="" # apikey
SECRET="" # salt
URL="https://api.f.360.cn/files/std/internal/v2/network_behavior"
BODY='{"query":{"keywords":[{"field":"md5","value":"00eac5b6fb1f31292898e7c51640ee40"}]}}'
NONCE=$(printf '%08d' $((RANDOM % 100000000)))
TIMESTAMP=$(date +%s)
BODY_MD5=$(printf '%s' "$BODY" | openssl dgst -md5 -hex | awk '{print $NF}')
SIGNATURE=$(printf '%s' "${BODY_MD5}${APPID}${NONCE}${TIMESTAMP}${SECRET}" | openssl dgst -md5 -hex | awk '{print $NF}')
SIGNATURE=${SIGNATURE:16}
curl --location --request POST "$URL" \
--header "Content-Type: application/json" \
--header "X-360-Key: ${APPID}" \
--header "X-360-Nonce: ${NONCE}" \
--header "X-360-Timestamp: ${TIMESTAMP}" \
--header "X-360-Signature: ${SIGNATURE}" \
--data "${BODY}"# python3.6.8
# -*- coding:utf-8 -*—
import hashlib
import json
import random
import time
import requests
APPID = "" # apikey
SECRET = "" # salt
def make_headers(appid, secret, body):
headers = {}
headers["X-360-Key"] = appid
headers["X-360-Nonce"] = str(random.randint(0, 99999999)).zfill(8)
headers["X-360-Timestamp"] = str(int(time.time()))
s = (
hashlib.md5(body.encode("utf8")).hexdigest()
+ headers["X-360-Key"]
+ headers["X-360-Nonce"]
+ headers["X-360-Timestamp"]
+ secret
)
md5 = hashlib.md5(s.encode("utf8")).hexdigest()
headers["X-360-Signature"] = md5[16:]
headers["Content-Type"] = "application/json"
return headers
def do_post(url, body):
res = requests.post(
url,
data=json.dumps(params),
headers=make_headers(APPID, SECRET, json.dumps(body)),
)
print(res.text)
if __name__ == "__main__":
# 请求地址
url = "https://api.f.360.cn/files/std/internal/v2/network_behavior" # openapi
params = {
"query": {
"keywords": [{"field": "md5", "value": "00eac5b6fb1f31292898e7c51640ee40"}]
}
}
do_post(url, params)import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.concurrent.ThreadLocalRandom;
public class Demo {
static String md5(String input) throws Exception {
byte[] digest = MessageDigest.getInstance("MD5")
.digest(input.getBytes(StandardCharsets.UTF_8));
StringBuilder sb = new StringBuilder();
for (byte b : digest) {
sb.append(String.format("%02x", b & 0xff));
}
return sb.toString();
}
public static void main(String[] args) throws Exception {
String appid = ""; // apikey
String secret = ""; // salt
String url = "https://api.f.360.cn/files/std/internal/v2/network_behavior";
String body = "{\"query\":{\"keywords\":[{\"field\":\"md5\",\"value\":\"00eac5b6fb1f31292898e7c51640ee40\"}]}}";
String nonce = String.format("%08d", ThreadLocalRandom.current().nextInt(100000000));
String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
String signature = md5(md5(body) + appid + nonce + timestamp + secret).substring(16);
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Content-Type", "application/json")
.header("X-360-Key", appid)
.header("X-360-Nonce", nonce)
.header("X-360-Timestamp", timestamp)
.header("X-360-Signature", signature)
.POST(HttpRequest.BodyPublishers.ofString(body, StandardCharsets.UTF_8))
.build();
HttpClient client = HttpClient.newHttpClient();
HttpResponse<String> response = client.send(
request, HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8));
System.out.println(response.body());
}
}<?php
// apikey
$appid = "";
// salt
$secret = "";
$url = 'https://api.f.360.cn/files/std/internal/v2/network_behavior';
$body = json_encode([
'query' => ['keywords' => [['field' => 'md5', 'value' => '00eac5b6fb1f31292898e7c51640ee40']]],
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
$nonce = str_pad((string) random_int(0, 99999999), 8, "0", STR_PAD_LEFT);
$timestamp = (string) time();
$signature = substr(md5(md5($body) . $appid . $nonce . $timestamp . $secret), 16);
$ch = curl_init($url);
$options = [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-360-Key: {$appid}",
"X-360-Nonce: {$nonce}",
"X-360-Timestamp: {$timestamp}",
"X-360-Signature: {$signature}",
],
];
$options[CURLOPT_POST] = true;
$options[CURLOPT_POSTFIELDS] = $body;
curl_setopt_array($ch, $options);
$response = curl_exec($ch);
if ($response === false) {
echo curl_error($ch), PHP_EOL;
} else {
echo $response, PHP_EOL;
}
curl_close($ch);package main
import (
"bytes"
"crypto/md5"
"encoding/hex"
"fmt"
"io"
"math/rand"
"net/http"
"time"
)
func md5Hex(s string) string {
sum := md5.Sum([]byte(s))
return hex.EncodeToString(sum[:])
}
func main() {
appid := "" // apikey
secret := "" // salt
url := "https://api.f.360.cn/files/std/internal/v2/network_behavior"
body := []byte(`{"query":{"keywords":[{"field":"md5","value":"00eac5b6fb1f31292898e7c51640ee40"}]}}`)
nonce := fmt.Sprintf("%08d", rand.Intn(100000000))
timestamp := fmt.Sprintf("%d", time.Now().Unix())
signature := md5Hex(md5Hex(string(body)) + appid + nonce + timestamp + secret)[16:]
req, err := http.NewRequest(http.MethodPost, url, bytes.NewReader(body))
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("X-360-Key", appid)
req.Header.Set("X-360-Nonce", nonce)
req.Header.Set("X-360-Timestamp", timestamp)
req.Header.Set("X-360-Signature", signature)
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
respBody, err := io.ReadAll(resp.Body)
if err != nil {
panic(err)
}
fmt.Println(string(respBody))
}响应示例
业务正常响应
{
"_oid": 1,
"code": "0",
"data": {
"additional": {
"dltool": {
"1": 820,
"1001": 8,
"1002": 2,
"1003": 3
},
"related_cat":[
"powershell",
"sp_all"
],
"related_domain": [
"198.198.198.254",
"99.98.54.105",
"rpraqmrigh.com",
"api-sh33-1.hprtcloud.com"
],
"self_cat": [
"powershell",
"spoolsv_cloud",
"powershell,powershell",
"ldsmaster",
"stratumssl",
"sp_all",
"yuankong_gray"
]
},
"dns":[
{
"domain": "192.168.1.18",
"ip": "0.0.0.0",
"topdomain": ""
},
{
"domain": "192.168.1.107",
"ip": "0.0.0.0",
"topdomain": ""
},
{
"domain": "192.168.110.197",
"ip": "0.0.0.0",
"topdomain": ""
}
],
"ftp": [
{
"ip": "117.135.214.14",
"port": "110",
"source": "ycs"
}
],
"ghost":[
{
"hdata": "05000b1310000000a000000002000000d016d016",
"ip": "120.77.242.231",
"port": "1688"
},
{
"hdata": "05000B1310000000A000000002000000D016D016",
"ip": "162.223.90.90",
"port": "1688"
}
],
"http":[
{
"ip": "198.198.198.98",
"method": "post",
"port": "3911",
"refer": "",
"url": "http://198.198.198.98:3911"
}
],
"https": [
{
"ip": "192.168.50.219",
"method": "post",
"port": "631",
"url": "https://192.168.50.219:631/ipp/print"
}
],
"icmp": [
{
"ip": "8.243.116.215",
"port": "0"
},
{
"ip": "19.111.107.171",
"port": "0"
}
],
"tcp":[
{
"ip": "20.190.177.82",
"port": "443"
},
{
"ip": "192.192.192.142",
"port": "49668"
}
],
"udp": [
{
"hdata": "304d02010004067075626c6963a040020300f0440201000201003033300f060b2b060102011903020105010500300f060b2b060102011903050101010500300f",
"ip": "192.158.158.247",
"port": "161"
}
]
}
}业务异常响应
{
"code": "GS00301",
"msg": "param missing"
}