программирование

Когда малолетние скрипт-киддисы и другие нехорошие личности совсем достают попытками подбора пароля к SSH, сканированием портов и прочей гадостью, бывает совсем неплохо сообщить об их действиях их провайдеру. Здесь возникает вопрос получения контактной информации технической поддержки провайдера/хостера нарушителя по его IP-адресу. И хотя данная информация является общедоступной (её можно извлечь из данных whois), на практике автоматизировать разбор записей whois не всегда тривиально (abuse-контакт может находиться как в e-mail, remarks, так и в любой другой секции, причём правильным может быть только один адрес).

К счастью, есть два сервиса, позволяющие получить контактную информацию техподдержки по IP-адресу или имени домена:

  1. Network Abuse Clearinghouse — определение контактной информации по домену нарушителя. В основном используется для сообщений о спаме. Проблема в том, что если контактный адрес не зарегистрирован, будут предложены контакты abuse@ и/или postmaster@, что не эффективно, если нарушителю принадлежит весь домен.
  2. Abuse Contact DB — определение контактной информации по IP-адресу нарушителя. Данный сервис «назначает ответственным» не владельца домена, соответствующего IP-адресу, а его провайдера или хостера, что во многих случаях предпочтительнее.

Оба сервиса поддерживают DNS-запросы в стиле RHSBL (abuse.net) и DNSBL (abusix.org).

Ниже приведён простой скрипт на Perl, который извлекает контактную информацию из базы данных Abusix по IP-адресу нарушителя. Скрипт можно использовать вместе с Login Failure Daemon — LFD отправляет отчёты в формате X-ARF пользователю root; используя контактную информацию из Abusix отчеты можно перенаправлять в техподдержку в отдел жалоб и нарушений.

#! /usr/bin/perl

use strict;
use warnings;
use Net::DNS;

my $ip = $ARGV[0] or die("Usage: abusix ip_address");
$ip = join('.', reverse(split(/\./, $ip))) . '.abuse-contacts.abusix.org';

my $res   = Net::DNS::Resolver->new;
my $query = $res->query($ip, 'TXT');

if ($query) {
        foreach my $rr ($query->answer) {
                next unless $rr->type eq 'TXT';
                my $s = $rr->rdatastr;
                $s =~ s/^"//;
                $s =~ s/"$//;
                print $s, "\n";
        }
}
else {
        die('Query failed: ' . $res->errorstring . "\n");
}

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *