默认suricata的http body是单独输出的,现在我们想在eve.json输出http请求的时候输出请求和响应体。
下载源码
这儿下载的是5.0.3,好像最新源码和这个版本的不太相同,这儿只是做个笔记。
输出httpBody
- 修改源码
打开 src目录下 output-json-http.c 文件(以下源码文件皆在src目录下)。找到 JsonHttpLogJSON 方法。将此方法改为:
static void JsonHttpLogJSON(JsonHttpLogThread *aft, json_t *js, htp_tx_t *tx, uint64_t tx_id)
{
LogHttpFileCtx *http_ctx = aft->httplog_ctx;
json_t *hjs = json_object();
if (hjs == NULL) {
return;
}
JsonHttpLogJSONBasic(hjs, tx);
/* log custom fields if configured */
if (http_ctx->fields != 0)
JsonHttpLogJSONCustom(http_ctx, hjs, tx);
if (http_ctx->flags & LOG_HTTP_EXTENDED)
JsonHttpLogJSONExtended(hjs, tx);
if (http_ctx->flags & LOG_HTTP_REQ_HEADERS)
JsonHttpLogJSONHeaders(hjs, LOG_HTTP_REQ_HEADERS, tx);
if (http_ctx->flags & LOG_HTTP_RES_HEADERS)
JsonHttpLogJSONHeaders(hjs, LOG_HTTP_RES_HEADERS, tx);
//加入下面7行代码
if (tx) {
HtpTxUserData *htud = (HtpTxUserData *)htp_tx_get_user_data(tx);
if (htud != NULL) {
BodyPrintableBuffer(hjs, &htud->request_body, "http_request_body");
BodyPrintableBuffer(hjs, &htud->response_body, "http_response_body");
}
}
json_object_set_new(js, "http", hjs);
}
- 查看结果
这块我访问了下百度,结果如下:
cat eve.json
响应体里面应该是把汉语变成.................了
- 解决中文无法显示问题
上述可知,输出的结果中把中文变成...了。现在查看源码文件 output-json-http.c
上述加入的函数为BodyPrintableBuffer(),查看此函数定义:
可知该函数调用了PrintStringsToBuffer() 方法。全局搜索下,发现在 util-print.c(util-print.h是对应的头文件)中找到该函数的定义。
点入查看该函数,发现在此函数中对输出进行了判断,如果字符串为可打印字符(isprint函数)或者换行等字符则输出,否则输出'.'
汉字'中'的ASCII码是4e2d,验证下是否为可打印字符
可见中文为不可打印字符。替换上述代码为:
void PrintStringsToBuffer(uint8_t *dst_buf, uint32_t *dst_buf_offset_ptr, uint32_t dst_buf_size,
const uint8_t *src_buf, const uint32_t src_buf_len)
{
uint32_t ch = 0;
for (ch = 0; ch < src_buf_len; ch++) {
// PrintBufferData((char *)dst_buf, dst_buf_offset_ptr, dst_buf_size,
// "%c",
// (isprint((uint8_t)src_buf[ch]) ||
// src_buf[ch] == '\n' ||
// src_buf[ch] == '\r') ? (uint8_t)src_buf[ch] : '.');
PrintBufferData((char *)dst_buf, dst_buf_offset_ptr, dst_buf_size,
"%c",
(uint8_t)src_buf[ch]);
}
dst_buf[dst_buf_size - 1] = 0;
return;
}
保存后重新编译安装,查看效果如下:
修改请求头及响应头格式
为了减少后期工作,想直接把源码输出的格式改成想要的 。修改output-json-http.c的JsonHttpLogJSONHeaders方法如下:
static void JsonHttpLogJSONHeaders(json_t *js, uint32_t direction, htp_tx_t *tx) {
htp_table_t *headers = direction & LOG_HTTP_REQ_HEADERS ?
tx->request_headers : tx->response_headers;
char name[MAX_SIZE_HEADER_NAME] = {0};
char value[MAX_SIZE_HEADER_VALUE] = {0};
char head[6];
size_t n = htp_table_size(headers);
if (direction & LOG_HTTP_REQ_HEADERS) {
strcpy(head, "_ReqH");
} else {
strcpy(head, "_ResH");
}
for (size_t i = 0; i < n; i++) {
htp_header_t *h = htp_table_get_index(headers, i, NULL);
if (h == NULL) {
continue;
}
size_t size_name = bstr_len(h->name) < MAX_SIZE_HEADER_NAME - 1 ?
bstr_len(h->name) : MAX_SIZE_HEADER_NAME - 1;
memcpy(name, bstr_ptr(h->name), size_name);
name[size_name] = '\0';
size_t size_value = bstr_len(h->value) < MAX_SIZE_HEADER_VALUE - 1 ?
bstr_len(h->value) : MAX_SIZE_HEADER_VALUE - 1;
memcpy(value, bstr_ptr(h->value), size_value);
value[size_value] = '\0';
strcat(name, head);
json_object_set_new(js,name, SCJsonString(value));
}
}
最后结果为:这儿就是把请求头和响应头都单独拿出来了,没有用数组。请求头都以_ReqH结尾。响应头皆以_ResH结尾