Bro 脚本从 IP 地址查找主机名
Bro Script to look up hostname from IP Address
我已经使用 Input::add_table 函数编写了一个 bro 脚本来查找 IP 及其相应的主机名并将它们插入到 conn_id 记录中 - 所以我有 id.source_name & id.destination_name 在每个日志文件中。这工作正常,除非有隧道事件并且它因分段错误而崩溃。我怀疑这与封装 ID 有关,但我真的不知道。我知道我可以将 src 和 dest 名称添加到每种类型的信息记录中,但这意味着修改每种类型。是我试图做的根本不正确还是隧道代码中存在导致崩溃的错误?或者有更好的方法吗
export {
global host_table: table[addr] of Val = table();
}
redef record conn_id += {
src_name: string &optional &log;
dest_name: string &optional &log;
};
const host_file = “hosts.txt”
event bro_init() &priority=20
{
Input::add_table([$source=host_file, $name =“host_stream”, $idx=Idx, $val=Val, $destination=host_table]);
Input::remove(“host_stream”);
}
event new_connection( c: connection ) {
if( c$id$orig_h in host_table ) {
c$id$src_name = host_table[c$id$orig_h]$host;
}
if( c$id$resp_h in host_table ) {
c$id$dest_name = host_table[c$id$resp_h]$host;
}
}
很遗憾,您不想扩展 conn_id
记录。它在内部以多种方式使用,这种变化会影响。我会扩展 Conn::Info
记录并在其中添加数据。
你的脚本遗漏了一些部分,我想让答案对以后的人更有用,所以我填补了遗漏的地方:
@load base/protocols/conn
module MyHostNames;
export {
## File to load hostnames from.
const host_file = "hosts.txt" &redef;
}
type Idx: record {
host: addr;
};
type Val: record {
hostname: string;
};
global host_table: table[addr] of Val = table();
redef record Conn::Info += {
orig_name: string &optional &log;
resp_name: string &optional &log;
};
event bro_init() &priority=5
{
Input::add_table([$source=host_file,
$name="myhostnames_stream",
$idx=Idx,
$val=Val,
$destination=host_table]);
Input::remove("myhostnames_stream");
}
event connection_state_remove(c: connection)
{
if ( c$id$orig_h in host_table )
{
c$conn$orig_name = host_table[c$id$orig_h]$hostname;
}
if ( c$id$resp_h in host_table )
{
c$conn$resp_name = host_table[c$id$resp_h]$hostname;
}
}
我使用了一个看起来像这样的输入文件(请记住列间数据中的一些文字标签!):
#fields host hostname
#types addr string
1.2.3.4 special-host
我已经使用 Input::add_table 函数编写了一个 bro 脚本来查找 IP 及其相应的主机名并将它们插入到 conn_id 记录中 - 所以我有 id.source_name & id.destination_name 在每个日志文件中。这工作正常,除非有隧道事件并且它因分段错误而崩溃。我怀疑这与封装 ID 有关,但我真的不知道。我知道我可以将 src 和 dest 名称添加到每种类型的信息记录中,但这意味着修改每种类型。是我试图做的根本不正确还是隧道代码中存在导致崩溃的错误?或者有更好的方法吗
export {
global host_table: table[addr] of Val = table();
}
redef record conn_id += {
src_name: string &optional &log;
dest_name: string &optional &log;
};
const host_file = “hosts.txt”
event bro_init() &priority=20
{
Input::add_table([$source=host_file, $name =“host_stream”, $idx=Idx, $val=Val, $destination=host_table]);
Input::remove(“host_stream”);
}
event new_connection( c: connection ) {
if( c$id$orig_h in host_table ) {
c$id$src_name = host_table[c$id$orig_h]$host;
}
if( c$id$resp_h in host_table ) {
c$id$dest_name = host_table[c$id$resp_h]$host;
}
}
很遗憾,您不想扩展 conn_id
记录。它在内部以多种方式使用,这种变化会影响。我会扩展 Conn::Info
记录并在其中添加数据。
你的脚本遗漏了一些部分,我想让答案对以后的人更有用,所以我填补了遗漏的地方:
@load base/protocols/conn
module MyHostNames;
export {
## File to load hostnames from.
const host_file = "hosts.txt" &redef;
}
type Idx: record {
host: addr;
};
type Val: record {
hostname: string;
};
global host_table: table[addr] of Val = table();
redef record Conn::Info += {
orig_name: string &optional &log;
resp_name: string &optional &log;
};
event bro_init() &priority=5
{
Input::add_table([$source=host_file,
$name="myhostnames_stream",
$idx=Idx,
$val=Val,
$destination=host_table]);
Input::remove("myhostnames_stream");
}
event connection_state_remove(c: connection)
{
if ( c$id$orig_h in host_table )
{
c$conn$orig_name = host_table[c$id$orig_h]$hostname;
}
if ( c$id$resp_h in host_table )
{
c$conn$resp_name = host_table[c$id$resp_h]$hostname;
}
}
我使用了一个看起来像这样的输入文件(请记住列间数据中的一些文字标签!):
#fields host hostname
#types addr string
1.2.3.4 special-host