Pull to refresh

Пассивный фингерпринтинг для выявления синтетического трафика

Reading time3 min
Views29K
imageЯ достаточно долгое время вынашивал идею рассмотреть клиентов публичного web-сервиса, браузер которых посылает заголовок User-Agent как у браузера в Windows, и которые при этом имеют все признаки сетевого стэка *nix-систем. Предположительно, в этой группе должна быть большая концентрация ботов, запущенных на недорогих хостингах для накрутки трафика или сканирования сайта.

Коротко о предмете


Различные реализации стэка TCP/IP в операционных системах имеют отличающиеся значения параметров по умолчанию. Это позволяет с неплохой степенью достоверности делать вывод о том, какая операционная система сформировала пакет.
В этом контексте набор характерных для операционной системы параметров пакета называют OS fingerprint. Поскольку этот метод предполагает только наблюдение проходящего трафика без отправки каких-либо запросов, метод называют passive OS fingerprinting.

Я использую nginx в качестве фронт-сервера, и для него нет mod_p0f как для apache, поэтому маркировать запросы по признаку фингерпринта в нём — задача непростая, но решаемая. Ниже я предлагаю к рассмотрению решение, которым я достиг результата.

Решение


Как упоминалось выше, интересная для меня группа — никсовые машины, которые выдают себя за виндовые. Нужно иметь внутри nginx понимание, от какой ОС соединение. Я решил маркировать искомые соединения, направив их на отдельный порт порт nginx по критерию TTL.
iptables -A PREROUTING -t nat -p tcp -m tcp --dport 80 -m ttl --ttl-lt 64 -j REDIRECT --to-ports 8123

В nginx тогда всё становится достаточно просто.
Добавим дополнительный порт:
        listen   80;
        listen   8123;

Отметим переменной запросы, пришедшие на этот выделенный порт.
    map $server_port $is_specialport {
    default         0;
    8123            1;
    }

Пометим прокси-серверы. Таких запросов много из-за Opera Turbo и им подобных.
    map $http_x_forwarded_for $is_proxy {
    default         0;
    ~^.            1;
    }

Признак виндового юзер-агента.
    map $http_user_agent $is_windows {
    default         0;
    "~Windows"      1;
    }

И, наконец, определим переменную-флаг для случаев, когда запрос имеет виндовый юзер-агент, не проксирован, имеет низкий TTL:
    map $is_windows$is_specialport$is_proxy $is_suspected {
    default             "";
    "110"    is_suspicious;
    }

Залогируем значение флага для всех запросов:
    log_format  custom  '$remote_addr - $remote_user [$time_local] '
                      '"$request" $status $bytes_sent '
                      '"$http_referer" "$http_user_agent" "$upstream_addr" '
                      '"$gzip_ratio" "[$upstream_response_time]" "$upstream_cache_status" "$request_time" "$is_suspected"';
    access_log  /var/log/nginx/nginx.access.log custom buffer=128k;


Выводы


Конечно же я не полагаю, что метод даёт большую точность, но наблюдение логов выявило:
  • клиентов, от которых исходили запросы исключительно к счётчикам статистики
  • ботов, которые были нацелены на парсинг ВКонтакта, но забрели на сайт по ссылке из соцсетей
  • нечисть особого рода, которая тоже не является живым пользователем

Доля попаданий весьма хорошая, присмотреться действительно стоило.

P.S.
Разумеется, я знаю, что умолчания легко изменить и, конечно же, TTL — не единственный критерий, который мог бы работать в этом механизме.

UPDATE:
По предложению в комментариях, в теле статьи был установлен счётчик. По его данным:

Сохранение реферера в рассматриваемой группе
Всего Нет реферера (% от всех) Подозрительных (% от всех) Подозрительных без реферера (% от всех) Подозрительных без реферера (% от запросов без реферера)
144623 2.12968% 6.70156% 0.407957% 19.1558%

Доля запросов с известных анонимных прокси, приходящаяся на рассматриваемую группу
По данным MaxMind GeoIP2 от 21.10.2014
Всего Запросов из АП Подозрительные запросы с АП Доля группы среди запросов с АП
144623 160 124 77.5%

Сырые данные: gist.github.com/Snawoot/d1f6ce46099555c668ca
Критерий довольно хорошо выявляет нездоровый трафик, и если его появилось много из одного источника покупки трафика — есть над чем подумать.
Tags:
Hubs:
Total votes 33: ↑27 and ↓6+21
Comments43

Articles