Бро скрипт для чтения списка Ips и доменов - PullRequest
0 голосов
/ 21 мая 2019

Я пытаюсь прочитать файл со списком IP-адресов, а другой - с доменами, в качестве доказательства концепции Input Framework, определенной в https://docs.zeek.org/en/stable/frameworks/input.html

Я подготовил следующие скрипты:

reading.bro:

type Idx: record {
        ip: addr;
};

type Idx: record {
        domain: string;
};


global ips: table[addr] of Idx = table();
global domains: table[string] of Idx = table();

event bro_init() {
    Input::add_table([$source="read_ip_bro", $name="ips",
                      $idx=Idx, $destination=ips, $mode=Input::REREAD]);

    Input::add_table([$source="read_domain_bro", $name="domains",
                      $idx=Idx, $destination=domains, $mode=Input::REREAD]);

    Input::remove("ips");
    Input::remove("domains");
}

И скрипт bad_ip.bro, который проверяет, есть ли IP в черном списке, который загружает предыдущий:

bad_ip.bro

@load reading.bro

module HTTP;

event http_reply(c: connection, version: string, code: count, reason: string)
        {
        if ( c$id$orig_h in ips )
                print fmt("A malicious IP is connecting: %s", c$id$orig_h);
        }

Однако, когда я запускаю братан, я получаю ошибку:


error: Input stream ips: Table type does not match index type. Need type 'string':string, got 'addr':addr
Segmentation fault (core dumped)

1 Ответ

2 голосов
/ 23 мая 2019

Вы не можете назначить тип string типу addr.Для этого необходимо использовать служебную функцию to_addr().Конечно, было бы целесообразно сначала проверить, что эта строка содержит действительный addr.Например:

 if(is_valid_ip(inputString){
   inputAddr = to_addr(inputString)
 } else { print "addr expected, got a string"; }
...