LINUX.ORG.RU
ФорумAdmin

Изучение запросов на сервер от ботов

 


0

1

В обшем я написал такую вещь, которая среди посетителей сервака отсеивает лысых обезьян по юзер-агенту:

http {
  map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
  }

  # Юзер-агенты
  # curl/8.10.1
  # python-requests/2.32.3
  # python-httpx/0.27.2
  # Python/3.12 aiohttp/3.9.5
  # Go-http-client/2.0

  # Фильтруем запросы от ботов
  map $http_user_agent $is_bot {
    default 0;
    ~*curl 1;
    ~*Wget 1;
    ~*python-requests 1;
    ~*python-httpx 1;
    ~*aiohttp 1;
    ~*Go-http-client 1;
  }

  # удобно с помощью jq искать нужные данные
  # TODO: добавить cookie, все заголовки
  log_format json_combined escape=json
    '{'
      '"local_time":"$time_iso8601",'
      '"ip_addr":"$remote_addr",'
      '"user_agent":"$http_user_agent",'
      '"http_cookie":"$http_cookie",'
      '"http_authorization":"$http_authorization",'
      '"referrer":"$http_referer",'
      '"content_type":"$http_content_type",'
      '"request_method":"$request_method",'
      '"request_uri":"$request_uri",'
      # '"request_url":"$scheme://$host$request_uri",'
      # '"body_bytes_sent":"$body_bytes_sent",'
      '"request_body":"$request_body",'
      '"response_status":$status,'
      '"response_content_type":"$sent_http_content_type"'
    '}';

  access_log /var/log/bot_access.log.json json_combined if=$is_bot;
  # ...
}

Что-то такое в логе имеем:

{"local_time":"2024-11-07T13:22:47+00:00","ip_addr":"45.155.91.226","user_agent":"python-requests/2.27.1","http_cookie":"","http_authorization":"Basic QURNSU46QzFzYzA=","referrer":"","content_type":"","request_method":"GET","request_uri":"/level/15/exec/-/sh/run/CR","request_body":"","response_status":404,"response_content_type":"text/html; charset=UTF-8"}

За айпи этот можете не переживать, он принадлежит говнохостингу для дорвеев из Бахрейна (dedires точка com чтобы рекламу не создавать). И в месяц он пару тысяч запросов делает. Я этих подонков не баню, хотя часто они флудят какими-то уязвимостями, которые известны с 2017 и ранее… Это скорее всего просто чей-то сайт на вротпрессе взломали через какой-нибудь плагин типа ЦЗ Super Cache…

Я запросы изучаю с целью создания сплойтов, так как детали многих уязвимостей не раскрываются либо намеренно искажаются.

И вот вопрос: а по каким юзерагентам их еще можно палить? Или есть надежнее способ?

Ну, как минимум
https://fake-useragent.readthedocs.io/en/latest/

Надёжно наверное будет анализировать как выполняются запросы в рамках какого-то промежутка времени.
К примеру боту вот ни к чему не сдалось тянуть js/css он точечно один запрос сделает явно игнорируя не нужные ему доп запросы, которые браузер явно выполнит

Flotsky ★★
()
Ответ на: комментарий от Flotsky

то бесполезная либа

def random_chrome_useragent() -> str:
    platform = random.choice(
        [
            "Windows NT 10.0; Win64; x64",
            "Macintosh; Intel Mac OS X 10_15_7",
            "X11; Linux x86_64",
        ]
    )

    return (
        f"Mozilla/5.0 ({platform}) AppleWebKit/537.36 "
        f"(KHTML, like Gecko) Chrome/{random.randint(88, 130)}.0.0.0 Safari/537.36"
    )

вот тебе и рандомный агент

rtxtxtrx ★★
() автор топика
Ответ на: комментарий от guyvernk

через куки никто не работает. сейчас токены популярны и REST-подход, когда не хранится состояние, что позволяет лучше параллелить приложение (горизонтальное масштабирование, ага, как в гробу)

rtxtxtrx ★★
() автор топика
Ответ на: комментарий от yandrey

Accept-Encoding: gzip, deflate, br, zstd

Я уж подумал про brotli… с ней боты не заморачиваются. По br в Accept-Encoding можно людей от нелюдей отличить. А в той библиотеке наивный способ определения ботов

rtxtxtrx ★★
() автор топика

среди посетителей сервака отсеивает лысых обезьян по юзер-агенту

Не совсем понятно ради чего вы переизобрели fail2ban. Там не только по юзер агенту, но и по частоте обращения, вхождениям request uri и прочим паттернам можно настроить. Баны гибкие, можно указать перманентные или на определенное время, например на сутки. Конфиг fail2ban на любой вкус в сети валяется.

мимо еще не лысый обезъян

Obezyan
()
Ответ на: комментарий от Obezyan
  # Фильтруем запросы от ботов по User-Agent
  map $http_user_agent $is_bot_useragent {
    default 0;
    ~curl 1;
    ~Wget 1;
    ~python-requests 1;
    ~python-httpx 1;
    ~aiohttp 1;
    ~Go-http-client 1;
    # Мне эти гуглоботы не нужны в логах
    # ~*bot\b 1;
  }

  # Проверка на наличие br в Accept-Encoding
  map $http_accept_encoding $not_brotli {
    default 0;
    !~*\bbr\b 1;
  }

  # Объединяем результаты проверки по User-Agent и Accept-Encoding
  map $is_bot_useragent$not_brotli $is_bot {
    default 0;
    ~1 1; # Если юзер-агент как у бота или не используется brotli
  }

  # удобно с помощью jq искать нужные данные
  log_format json_combined escape=json
    '{'
      '"local_time":"$time_iso8601",'
      '"ip_addr":"$remote_addr",'
      '"user_agent":"$http_user_agent",'
      '"http_cookie":"$http_cookie",'
      '"http_authorization":"$http_authorization",'
      '"referrer":"$http_referer",'
      '"content_type":"$http_content_type",'
      '"request_method":"$request_method",'
      '"request_uri":"$request_uri",'
      '"request_body":"$request_body",'
      '"response_status":$status,'
      '"response_content_type":"$sent_http_content_type"'
    '}';

  access_log /var/log/bot_access.log.json json_combined if=$is_bot;

Я логирую данные всего тела запроса не чтобы их банить, а чтобы изучать атаки на сервер, для выявления неизвестных, представляющих определенную ценность… Все мои серваки - это по факту ханипоты. Сегодня просто руки дошли старье переделать

rtxtxtrx ★★
() автор топика

Этот бот, кстати, CISCO искал, чтобы выполнить зловредную команду. Используя, эти логин и пароль:

atob('bmVzdGxlOm5lc3RsZQ==')
'nestle:nestle'

Так его…

sudo iptables -A INPUT -s 45.155.91.226 -j DROP

А еще лучше весь этот хостинг:

sudo iptables -A INPUT -s 45.155.91.0/24 -j DROP
rtxtxtrx ★★
() автор топика