Системный архитектор
12,0
рейтинг
23 октября 2014 в 18:26

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

imageimageЯ достаточно долгое время вынашивал идею рассмотреть клиентов публичного 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
Критерий довольно хорошо выявляет нездоровый трафик, и если его появилось много из одного источника покупки трафика — есть над чем подумать.
@YourChief
карма
45,5
рейтинг 12,0
Системный архитектор
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Администрирование

Комментарии (43)

  • +1
    А расскажите подробней чем еще различаются разные ОСи?
    • 0
      В смысле умолчаний стэка TCP? Много чем: начальный размер пакета, начальное время жизни пакета, начальный размер окна, значение масштабирования окна, некоторые флаги.
  • –2
    Я достаточно долгое время вынашивал идею рассмотреть клиентов публичного web-сервиса, браузер которых посылает заголовок User-Agent как у браузера в Windows, и которые при этом имеют все признаки сетевого стэка *nix-систем


    Зачем?
    • 0
      Во втором предложении написано.
      • +2
        Предположительно, в этой группе должна быть большая концентрация ботов, запущенных на недорогих хостингах для накрутки трафика или сканирования сайта.


        OK. А чем вам плохо сканирование сайта? И/или почему вы делаете выводы на основе UA?
        Вот как раз недавно пришлось написать модуль RandomUA, как раз потому, что некоторые считают, что раз к ним периодически обращаются, то это нге популярность, а атака.
        • 0
          Плохо, если вы покупаете привод посетителей, а вам подсовывают часть ботов, которые имитируют активность пользователя.
          • 0
            OK, допустим (хотя в мои задачи это не входит). А каким боком тут UA?
            • +1
              Боты маскируются. Пользователи нет
          • 0
            Как Вы считаете, насколько сложно «притворится» другой ОС из под unix?
            Хотя возможно трафик у Вас очень дорогой, и даже такие методы борьбы имеют право на жизнь.
            • 0
              Я думаю, потребуется как минимум кастомное ядро, чтобы соответствовать всем метрикам, и то я не уверен в полном успехе.

              На дешёвом хостинге OpenVZ, ситуация вообще плачевная:
              root@fast63414:~# uname -a
              Linux fast63414.vps 2.6.32-042stab092.2 #1 SMP Tue Jul 8 10:35:55 MSK 2014 x86_64 GNU/Linux
              root@fast63414:~# sysctl -w net.ipv4.ip_default_ttl=128
              sysctl: permission denied on key 'net.ipv4.ip_default_ttl'
              • 0
                А что вы хотели в контейнере? Естественно, ощутимая часть настроек ядра будет заблокирована. В случае ванильных linux containers на namespaces+cgroups (lxc, docker) ситуация та же.
  • –3
    А смысл? Если речь о каких-то ботнетах — то там 99% будет на Windows-машинах, причем самых что ни на есть типичных.
    • +1
      О ботнетах речь не шла, почувствуйте разницу.
      • 0
        Я пока услышал вот в этом комментарии, что хочется защищаться, например, от ситуации, когда рекламное агентство вместо живых людей по рекламе имитирует деятельность:
        Плохо, если вы покупаете привод посетителей, а вам подсовывают часть ботов, которые имитируют активность пользователя.

        На практике, предложенным методом можно будет защититься только от совсем глупых обманщиков. Те, которые поумнее, буду имитировать деятельность не «ботом, запущенном на недорогом хостинге» (у которого, кроме всего прочего, будет еще и очень небольшое число различных IP), а будут как минимум ходить через сеть разнообразных (дырявых) прокси, как максимум — закупят немножко доступа в какой-нибудь ботнет и накрутят через него.
        • 0
          В ботнете тогда придётся иметь на нодах ПО, которое эмулирует весь стэк браузера с флэшем. Вы встречали такие?

          Случай с никсовыми анонимными прокси так же попадает в лог с меткой подозрительного запроса.
          • 0
            Во-первых — зачем? Если речь идет о том, чтобы сделать сколько-то запросов на сайт и поотправлять хиты на счетчики — для этого полноценный браузер и тем более флеш совсем не обязательны.

            Во-вторых, даже если нужно — внезапно, примерно на всех windows-нодах ботнета будет IE, с хоть каким-то флешом.

            Анонимных / неанонимные прокси, собранные по всяким прокси-листам, как правило, половина: наполовину Windows:*nix. И, кстати, да, большие легитимные unix-based proxy (в том числе transparent), будут в вашем методе генерировать false positives.
            • 0
              Во-первых — зачем? Если речь идет о том, чтобы сделать сколько-то запросов на сайт и поотправлять хиты на счетчики — для этого полноценный браузер и тем более флеш совсем не обязательны.

              Конечно обязательны, иначе придётся выискивать счётчики вручную для каждого назначения трафика и всю дорогу следить за изменениями их в вёрстке или флэше.
              Во-вторых, даже если нужно — внезапно, примерно на всех windows-нодах ботнета будет IE, с хоть каким-то флешом.

              Тут трудно спорить, но я полагаю, что это не особо поможет делу. Управлять внешним браузером слишком заметно и для пользователя и для антивирусного ПО.
              Анонимных / неанонимные прокси, собранные по всяким прокси-листам, как правило, половина: наполовину Windows:*nix.

              Небылицы какие-то рассказываете. hideme.ru/proxy-list/ — навскидку я нашёл здесь только 5 из 64 предложенных.
              И, кстати, да, большие легитимные unix-based proxy (в том числе transparent), будут в вашем методе генерировать false positives.

              Легитимные не будут. Насчёт точности я пояснил ещё в самой статье.
              • 0
                Почти все более-менее распространенные накрутчики счетчиков (раз, два, три, четыре и т.д.) именно что детектят код счетчика и генерируют напрямую хиты на коллекторы веб-аналитической системы.

                На их фоне выделяется только всякие автосёрферы / САРы / буксы / т.п. — там используются условно-реальные браузеры, но и люди тоже условно-реальные, можно считать это «добровольным ботнетом».

                Управление внешним браузером ни разу не заметно даже для «продвинутых пользователей» — с легкой руки Microsoft процессы типа iexplore, mshtml* и т.п. почти всегда в системе есть. Да и антивирусов / файрволлов, как правило, к моменту эксплуатации ботнета, на ботах уже нет — это, практически первое, что делает бутстрап — убивает антивирусы и подменяет их на неработающие муляжи.

                По поводу «легитимных» — вы имеете в виду, видимо, неанонимных, добавляющих X-Forwarded-For?
                • 0
                  Почти все более-менее распространенные накрутчики счетчиков (раз, два, три, четыре и т.д.) именно что детектят код счетчика и генерируют напрямую хиты на коллекторы веб-аналитической системы.
                  Там поимённо перечислено, какие счётчики детектятся. Дальше тему развивать надо? И как быть с событиями, отстреливаемыми из ActionScript и Javascript?

                  Про управление внешним браузером на винде ничего не могу сказать определённого, я далёк от этого.

                  «Легитимные» — да, неанонимные.
                  • +1
                    ActionScript
                    А легитимные пользователи совсем не отстреливают flash? Что-то мне казалось, что flashblock'ом пользуются люди, а не роботы…
  • +2
    идея интересная.

    а будет ли это работать для Windows системы за *-nix SOCKSом что определится *nix прокси или windows?
    • –1
      Угу. А еще интересно что будет при заходе через TOR…
    • 0
      адрес попадёт в подозрительные, как и в случае с анонимным HTTP-прокси
    • 0
      Windows за SOCKSv5 на дебиане определяется www.browserleaks.com/whois как «Linux 3.1-3.10 [language:; link: ethernet or modem; distance: 7]»

      Windows за OpenVPN там же определяется как «Windows 7 or 8 [language:; link:; distance: 8]»
  • 0
    кроме этого, есть информация что 99% wifi роутеров меняю TTL на 64 независимо от таго какое значение прописано в ОС
    • +1
      Ваша информация не верна.

      Если бы они так делали то trace стал бы показывать что у вас весь интернет в локалке.
      У меня так было когда я TTL насильно выставлял на внешнем интерфейсе роутера для всего подряд трафика.
      • +1
        я не знаю что вы там сделали что у вас весь интернет стал показываться локальным…

        вот результат эксперимента, разные систем через один и тот-же wifi роутер:

        p0f -i eth0 -v
        p0f — passive os fingerprinting utility, version 2.0.8

        Mac
        x.x.247.3:62459 — UNKNOWN [65535:53:1:64:M1460,N,W4,N,N,T,S,E:P:?:?] (up: 2592 hrs)
        -> x.x.9.23:80 (link: ethernet/modem)

        Windows
        x.x.247.3:62663 — UNKNOWN [65535:53:1:64:M1460,N,W4,N,N,T,S,E:P:?:?] (up: 2593 hrs)
        -> x.x.9.23:80 (link: ethernet/modem)

        Iphone
        x.x.247.3:55120 — UNKNOWN [65535:53:1:64:M1460,N,W4,N,N,T,S,E:P:?:?] (up: 1114 hrs)
        -> x.x.9.23:80 (link: ethernet/modem)

        Mac через socks
        x.x.215.27:34434 — UNKNOWN [S10:48:1:60:M1460,S,T,N,W6:.:?:?] (up: 467 hrs)
        -> x.x.9.23:80 (link: ethernet/modem)

        • 0
          В PF добавил:
          scrub out on $ext_v4_if0 all random-id min-ttl 128

          позже для icmp сделал исключение — добавил перед предыдущим правилом:
          scrub out on $ext_v4_if0 inet proto icmp random-id

          Попробуйте ходить не на 80 порт а на что то не стандартное, сдаётся мне у вас где то прозрачный прокси по пути.

          ТТЛ проходящих пакетов роутеру менять смысла нет, он просто уменьшает на единицу и всё.
          В кинетиках и вроде ещё каких то была опция «не уменьшать ТТЛ».
          В том что показываете вы слишком всё одинаковое, роутеру в TCP заголовках вообще нафик не сдалось ничего менять.
          Надеюсь вы не через опсоса тестируете?
          • 0
            роутер trendnet tew651br
            провайдер onlime

            другие порты:

            mac
            x.x.247.3:64896 — UNKNOWN [65535:53:1:64:M1460,N,W4,N,N,T,S,E:P:?:?] (up: 2600 hrs)
            -> x.x.9.23:12321 (link: ethernet/modem)

            iphone
            x.x.247.3:55140 — UNKNOWN [65535:53:1:64:M1460,N,W4,N,N,T,S,E:P:?:?] (up: 1115 hrs)
            -> x.x.9.23:45654 (link: ethernet/modem)

            • 0
              iphone через опсоса

              x.x.137.203:54272 — UNKNOWN [65535:54:1:64:M1410,N,W4,N,N,T,S,E:P:?:?] (up: 1115 hrs)
              -> x.x.9.23:45654 (link: vtun)
  • +3
    Используйте PF из BSD, там реальный fingerprinting, а не просто TTL.

    Маленькая выдержка из файла с сигнатурами:
    S44:128:1:48:M*,N,N,S: Windows:2000:SP3:Windows Pro SP1, 2000 SP3
    S44:128:1:48:M*,N,N,S: Windows:XP:SP1:Windows Pro SP1, 2000 SP3
    64512:128:1:48:M*,N,N,S: Windows:2000:SP3:Windows SP1, 2000 SP3
    64512:128:1:48:M*,N,N,S: Windows:XP:SP1:Windows SP1, 2000 SP3
    32767:128:1:48:M*,N,N,S: Windows:2000:SP4:Windows SP1, 2000 SP4
    32767:128:1:48:M*,N,N,S: Windows:XP:SP1:Windows SP1, 2000 SP4

    8192:128:1:52:M*,N,W2,N,N,S: Windows:Vista::Windows Vista/7

    В принципе в BSD/Linux можно дорисовать опцию сокета чтобы от туда выгребать эти данные в сыром или готовом виде, просто мало желающих было.
    • 0
      В линуксе есть модуль для iptables, который тоже так делает, но по-моему он не работает как матчер, а просто логирует. Я пробовал его.
  • +2
    ТС, поставьте однопиксельную метку в эту статью на ваш сервер для сбора данных, а потом отпишитесь по результатам. В первые сутки визиты будут в основном от живых людей или от пауков, а они обычно не маскируются.
    В статье конкретика, графики и таблички бы не помешали, а уж с реализацией каждый сам справится. Спасибо.
    • 0
      Пожалуй, это стоящая идея
      • 0
        Не вышло — хабр перезалил мою гифку на свой хабрасторадж.
        • +3
          Можно svg подсунуть — его не перезаливает.
          • 0
            И правда!
    • 0
      Приложил
  • 0
    (deleted)
  • –2
    Был очень расстроен содержимым статьи особенно после ожиданий, которые раздразнил заголовок. Феерические костыли просто.
    • 0
      Работать есть над чем, не спорю. Но что конкретно Вас расстраивает?
    • +1
      Зато рабочие. Если с этим не согласны, то можете опубликовать развёрнутый ответ ;)
  • 0
    Последняя офисная контора, в которой я работал, использовала squid. Который, разумеется, весь из себя linux и tcp у него линуксовый. Это не мешало в UA иметь всякие IE'шки.

    И я думаю, таких контор со скидами — более чем. И не все из них сквидовые хидеры наружу кажут.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.