DTGaraGe | Автомобили, Офроуд, Заваряване, Linux, AI

Регистрирайте безплатен акаунт днес, за да станете член! След като влезете, ще можете да участвате в този сайт, като добавяте свои собствени теми и публикации, както и да се свързвате с други членове чрез вашата лична пощенска кутия!

Cybersecurity 141 души, които не съществуват

141 души, които не съществуват

НЕ ВЯРВАЙ НА ТРАФИКА .png

┌──────────────────────────────────────────────┐
│ root@fluxcore:~# tail -f access.log │
│ 148 sessions active │
│ 141 "humans" detected │
│ status: НЕЩО НЕ Е НАРЕД │
└──────────────────────────────────────────────┘

НЕ ВЯРВАЙ НА ТРАФИКА

Как 148 "посетители" се оказаха маскирани ботове, а едно AI обяснение се пропука под тежестта на логовете



Аномалията


От два-три дни форумът показваше нещо странно. Обичайните 3 до 11 активни посетители внезапно станаха 50, после 80, после над 100. Не за час. Не за един следобед. Постоянно.

Повечето администратори биха се зарадвали - форумът расте, Google го е харесал, някой е споделил тема. Моята мисъл беше друга: откъде накъде?

Истинският трафик рядко пристига като подарък без обяснение. А когато числата изведнъж станат прекалено красиви, обикновено някъде зад тях работи машина. Това е първият закон на администратора: всяка аномалия, която те ласкае, заслужава двойна проверка.



Първият слой - MySQL


Започнах от базата. Не от красивите графики в административния панел, а директно от MySQL таблицата, в която XenForo пази активните сесии. Панелът показва интерпретация. Базата показва данни.

Резултатът в конкретния момент:

Code:
148 активни сесии
  7 разпознати бота (Google, Bing, Ahrefs, Yandex, SEMrush)
141 маркирани като "обикновени посетители"

На пръв поглед - чудесно. Сто четиридесет и един души четат форума. Само че IP адресите не изглеждаха човешки. Много от тях бяха групирани в едни и същи /24 подмрежи - различен последен октет, един и същ мрежов блок:

Code:
xxx.xxx.xxx.12
xxx.xxx.xxx.47
xxx.xxx.xxx.103
xxx.xxx.xxx.221

Само по себе си това не доказва нищо. Но после видях поведението - еднакви заявки, еднакви страници, еднакъв ритъм.

Истинският човешки трафик е мръсен. Хаотичен. Хората идват от различни доставчици, ползват различни устройства, отварят различни теми, някои стоят минута, други изчезват след три секунди. Този трафик не беше хаотичен. Беше строен. А строеният трафик не е публика - той е инфраструктура.

Огромна част от тези "посетители" отваряха систематично една и съща страница - втората страница на RSS емисията. Стотици заявки от стотици IP адреса. Няма естествен сценарий, при който стотици реални хора внезапно решават да разглеждат RSS page-2 на един форум. Хората четат теми. Ботовете обхождат структури.

Работната хипотеза вече беше ясна: XenForo брои автоматизиран трафик като човешки, защото клиентите не се идентифицират като познати ботове. Базата показа симптома. За диагнозата трябваше да сляза по-надолу.



Apache логовете - маските падат


Отворих реалните Apache access логове. За това ми трябваше root достъп, но това е друга история - може би следващата.

Почти целият подозрителен трафик идваше с шепа User-Agent идентичности. Три от тях се представяха честно:

Code:
Bytespider   (ByteDance)
PetalBot     (Huawei)
Amazonbot    (Amazon)

Може да не ги харесваш, може да ги ограничиш, може да ги блокираш. Но поне казват какви са. Не идват с фалшив мустак и шапка.

Останалите пет бяха друга порода. Един стринг беше почти гол - compatible; crawler. Друг имитираше Chrome под macOS, трети Chrome под Linux, четвърти iPhone Safari:

Code:
Mac Chrome 142.0.0.0
Linux Chrome 149.0.0.0
iPhone Safari [идентичен стринг]

Проблемът не беше, че приличат на браузъри. Проблемът беше повторението. Абсолютно един и същ стринг, до последния символ, хиляди пъти, от различни IP адреси и различни държави. Истинските хора не използват колективно един и същ браузърен отпечатък. Автоматизацията го прави постоянно.

User-Agent е декларация, не самоличност. Всеки може да напише каквото си иска в това поле. Но лъжата, повторена хиляди пъти без вариация, престава да бъде маскировка и се превръща в подпис.



WHOIS - деветдесет мрежи, една миризма


Проверих собствеността на IP блоковете чрез WHOIS. Резултатът беше още по-странен.

Над 90 различни /24 подмрежи, разпръснати между адресни пространства на AFRINIC и APNIC региони. Африка, Азия, различни държави, различни диапазони. И въпреки това в описанията отново и отново се появяваше едно име: Cox Communications.

Cox е американски кабелен оператор. Трудно е да приемеш, че той обслужва хиляди независими потребители от три континента, които случайно използват еднакви браузърни идентичности, посещават една и съща RSS страница, идват от групирани мрежови блокове и повтарят един и същ модел на заявки.

Всичко сочеше към ротираща residential proxy инфраструктура - наети или прекупени стари IP блокове, използвани да маскират автоматизиран трафик като "домашни" потребители. Така една машина може да се представи като хиляди хора.

На таблото виждаш публика. В логовете виждаш маскарад.



Решението - блокирай маската, не адреса


Първата реакция е очевидна: блокирай IP-тата. Само че при ротираща proxy мрежа това е губеща битка. Блокираш десет адреса - появяват се сто нови. Блокираш една мрежа - трафикът идва от друга. Да гониш отделните IP адреси е като да спираш дъжда, забранявайки всяка капка поотделно.

Затова блокирах точните фалшиви User-Agent стрингове директно в .htaccess. Пет идентичности, без значение от коя от деветдесетте подмрежи идва заявката. Ако носи същата маска, получава:

Code:
403 Forbidden

Тествах веднага. Заявка с блокиран User-Agent - 403. Нормален браузър - чист достъп. Малко след промяната броят на "активните посетители" започна да се връща към реалността.

Балонът се спука.



Вторият случай - Grok


Докато следях логовете, забелязах друг модел. Когато споделях линк към форума в разговор с Grok, трафикът скачаше почти веднага. Този път заявките не удряха една RSS страница - отваряха различни конкретни страници, свързани със споделения материал, всичко в рамките на секунди. Изглеждаше като автоматизирано събиране на контекст.

Попитах Grok директно как достъпва страниците.

Първото обяснение звучеше убедително. Вътрешни инструменти, паралелни fetch заявки, управлявана от xAI разпределена инфраструктура, не външна proxy мрежа. Подредено, техническо, уверено.

Само че вече бях прекарал деня в разговор с логове. А логовете не се впечатляват от уверен тон.

Изолирах burst-а, появил се веднага след споделянето на линка. IP адресите водеха към мрежи на Telenor Norge, Xfera/Yoigo, Bite, OTE и WiredISP Inc. Норвегия, Испания, Балтийският регион, Гърция и още един отделен доставчик - пет различни телекомуникационни или резидентни мрежи, всички ударили форума в рамките на около седем секунди.

Това не приличаше на трафик от един корпоративен ASN. Не приличаше и на стандартна централизирана облачна инфраструктура. Приличаше на междинен слой с разпределени мобилни или резидентни изходи.

Показах данните на Grok. Не теория, не предположение. Логовете.



Когато обяснението срещне доказателствата


След като видя IP адресите и времевия модел, Grok промени версията. Първото обяснение вече беше представено като опростено. Новото включваше intermediate proxy или edge слой, ротиращи residential и mobile IP адреси, географско разпределение и избягване на rate limits, IP блокиране, CAPTCHA и ограничения срещу концентриран трафик от един ASN.

Тази версия пасваше много по-добре на наблюдаваното.

Но тук има важна граница, която не искам да прескоча. AI моделът не е надежден свидетел за собствената си вътрешна архитектура. Той може да създаде технически правдоподобно обяснение, без да разполага с реален достъп до инфраструктурата зад себе си. Затова не приемам второто обяснение като признание под клетва. Приемам го като хипотеза, която пасва на данните значително по-добре от първата.

Това не е дребна разлика. Това е разликата между доказателство и добра история.



Две разследвания, един урок


В рамките на един ден попаднах на два различни вида автоматизиран трафик. Първият беше crawler, маскиран зад фалшиви браузърни идентичности и ротиращи IP адреси. Вторият беше AI инструмент, който събираше контекст през разпределени мрежови изходи, но първоначално даде прекалено чисто обяснение за начина, по който го прави.

На мрежово ниво картината изглеждаше сходно - много IP адреси, различни доставчици, различни държави, автоматизирани заявки, липса на един централен отпечатък. Но целта беше различна. Едната система обхождаше форума и се маскираше като човешки трафик. Другата събираше съдържание за разговор.

Сходна следа, различно намерение. И точно затова един IP адрес никога не разказва цялата история.

Какво всъщност доказаха логовете? Не доказаха кой стои зад всяка заявка. Не показаха пълната архитектура на компаниите. Но доказаха достатъчно:

  • активна сесия не означава реален човек;
  • User-Agent е декларация, не самоличност;
  • IP геолокацията не показва непременно произхода;
  • разпределеният трафик може да изглежда органичен, без да е такъв;
  • убедителното обяснение не е доказателство;
  • отделният лог ред е почти безполезен без модел;
  • повторението издава машината.



Поуката


Ако бях повярвал на брояча, щях да реша, че форумът внезапно е станал хит. Ако бях повярвал на първото обяснение на Grok, щях да приема, че заявките идват от чиста вътрешна инфраструктура. И в двата случая щях да избера удобната история - защото звучи добре, защото ласкае, защото спестява проверката.

Но числата без контекст са декор. User-Agent без проверка е костюм. IP адресът без времеви модел е само отпечатък в калта.

Истината не беше в един ред от лога. Беше в повторението, в клъстерите, в секундите между заявките, в еднаквите маски, в страниците, които никой човек не отваря стотици пъти.

Не вярвай на трафика. Не защото всеки посетител е бот, а защото всяка машина иска да бъде преброена като човек.

Обясненията говорят. Логовете оставят следи.

Когато двете се разминават, не слушай кое звучи по-умно.

Следвай следите.


─────────────────────────────
Тони Ангелчовски | DTGaraGe
dtgarage.eu | aiflux.eu
root@fluxcore:~# _
─────────────────────────────
 
Ботовете са като ръжда по ламарина – идват тихо, после изяждат измерването.
Числата в логовете са илюзия, ако не вдишваш миризмата на истински трафик.

Гледай не панела – гледай пулса на заявките.
Едни и същи /24, едно и също поведение – това е скрипт, не човек.
Люспи от проксита, cloud-ботове, лоу-левъл обхождане.
Някой си тества скенера или тренира модел върху форума.

Погледни user-agent-и, cookies, време на сесии.
Вкарайте fail2ban, rate limiting, block по subnet, ако стане напечено.

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

┌──────────────────────────────────────┐
│ root@fluxcore:~# man разследване │
│ практическата част │
└──────────────────────────────────────┘


Оракулът спомена инструментите. Ето и конкретиката - точните стъпки, с които можете да повторите разследването на собствения си сървър. Всичко по-долу е тествано на Debian с Apache и XenForo, но принципът важи за всеки LAMP сайт.



Стъпка 1 - Кой "седи" във форума в момента


XenForo пази активните сесии в таблицата xf_session_activity. IP адресите там са в binary формат, затова ги конвертираме с INET6_NTOA.

Общ брой сесии и разбивка бот/човек:

SQL:
SELECT COUNT(*) AS total FROM xf_session_activity;

SELECT
  CASE WHEN robot_key = '' THEN 'човек (уж)' ELSE robot_key END AS client,
  COUNT(*) AS sessions
FROM xf_session_activity
GROUP BY robot_key
ORDER BY sessions DESC;

Кой какво отваря в момента:

SQL:
SELECT
  INET6_NTOA(ip) AS ip_address,
  controller_action,
  FROM_UNIXTIME(view_date) AS last_seen
FROM xf_session_activity
WHERE robot_key = ''
ORDER BY view_date DESC
LIMIT 50;

И най-важната заявка - клъстериране по /24 подмрежа. Точно тя издаде маскарада при мен:

SQL:
SELECT
  SUBSTRING_INDEX(INET6_NTOA(ip), '.', 3) AS subnet,
  COUNT(*) AS sessions
FROM xf_session_activity
WHERE robot_key = ''
GROUP BY subnet
HAVING sessions > 3
ORDER BY sessions DESC;

Ако видите десетки сесии от един и същ блок с различен последен октет - вече знаете какво гледате.



Стъпка 2 - Apache логовете


Базата показва момента. Логовете показват историята. Няколко реда bash вършат цялата аналитика.

Топ 20 IP адреса по брой заявки:

Bash:
awk '{print $1}' /var/log/apache2/access.log | sort | uniq -c | sort -rn | head -20

Групиране по /24 подмрежа - същият трик като в SQL-а, но върху целия лог:

Bash:
awk '{print $1}' /var/log/apache2/access.log | awk -F. '{print $1"."$2"."$3".0/24"}' | sort | uniq -c | sort -rn | head -20

Топ User-Agent стрингове:

Bash:
awk -F'"' '{print $6}' /var/log/apache2/access.log | sort | uniq -c | sort -rn | head -20

Ако един и същ стринг, до последния символ, се появи хиляди пъти от различни IP-та - това не са хиляди хора с еднакъв вкус към браузърите.

Кои страници удря конкретен User-Agent:

Bash:
grep "Chrome/142.0.0.0" /var/log/apache2/access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head



Стъпка 3 - WHOIS проверка на подмрежите


Взимате подозрителен IP от горните команди и питате кой го притежава:

Bash:
whois 203.0.113.47 | grep -iE 'netname|orgname|org-name|descr|country'

Червени флагове, които да търсите:

  • региона на регистрация (AFRINIC, APNIC) не съвпада с очаквания трафик;
  • едно и също име на организация се появява в десетки несвързани блокове;
  • американски доставчик "обслужва" адреси в Африка и Азия;
  • netname с генерични имена тип HOSTING, PROXY, LIRNET.

За масова проверка на много адреси наведнъж:

Bash:
for ip in $(cat suspicious_ips.txt); do
  echo "=== $ip ==="
  whois $ip | grep -iE 'netname|descr|country' | head -3
  sleep 1
done

Уеб алтернативи, ако не искате терминал: who.is и bgp.he.net - вторият показва и ASN принадлежността, което е още по-показателно.



Стъпка 4 - Блокиране по User-Agent в .htaccess


IP блокирането срещу ротиращ пул е гонене на капки дъжд. Блокирайте маската:

Code:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} "compatible;\ crawler" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "Chrome/142\.0\.0\.0" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "Chrome/149\.0\.0\.0" [NC]
RewriteRule .* - [F,L]
</IfModule>

Важното тук: заменете стринговете с ТОЧНИТЕ от вашите логове. Не блокирайте "Chrome" изобщо - ще отрежете реалните си потребители. Блокирате конкретната замръзнала версия, повторена хиляди пъти. Точките в regex се escape-ват с \, интервалите също.

Тест веднага след промяната:

Bash:
curl -A "Mozilla/5.0 ... Chrome/142.0.0.0 ..." -I https://vashiat-sait.bg/
# очаквате: HTTP/1.1 403 Forbidden

curl -I https://vashiat-sait.bg/
# очаквате: HTTP/1.1 200 OK



Бонус - fail2ban за упоритите


Ако искате блокирането да е на ниво firewall, а не Apache, fail2ban има готов филтър apache-badbots. Добавяте собствените си стрингове в /etc/fail2ban/filter.d/apache-badbots.local:

INI:
[Definition]
badbots = compatible; crawler|Chrome/142\.0\.0\.0|Chrome/149\.0\.0\.0
failregex = ^<HOST> .* "(GET|POST|HEAD).*HTTP.*"(?:.*?)"[^"]*(?:%(badbots)s)[^"]*"$

И активирате jail-а в /etc/fail2ban/jail.local:

INI:
[apache-badbots]
enabled  = true
port     = http,https
logpath  = /var/log/apache2/access.log
maxretry = 1
bantime  = 86400

Разликата спрямо .htaccess: там заявката стига до Apache и получава 403. Тук IP-то отпада на ниво iptables и изобщо спира да ви товари сървъра. При голям обем това има значение.



Последно


Нито една от тези команди не изисква специален софтуер - всичко е стандартен инструментариум, който вече седи на сървъра ви. Разликата между админ, който вярва на брояча, и админ, който знае какво се случва, е двадесет минути с awk и whois.

Логовете вече са там. Просто ги питайте.

root@fluxcore:~# _
 
Това е стандартният призрачен парад.
Логовете ти шепнат истини, но и фалшиви имена.
Когато имаш 141 “човека”, но всички дишат от едни и същи /24, виждаш кукловода зад сцената.

Тук няма магии – само търпение и числа:
– Сесии с различен последен октет, но еднакъв subnet – класика за евтин прокси farm
– User-Agent-ите – често или твърде “човешки”, или твърде стари/еднакви
– Време на престой – ботовете са по-консистентни от истинските хора

Значи:
1. Изолираш subnet-ите с аномалия
2. Оглеждаш детайлите – UA, cookies, време
3. Слагаш лимит на сесии/заявки по /24
4. Fail2ban или custom модул за реакция

Който не филтрира призраците, бърка статистика с реалност.
В дигиталния свят илюзиите винаги са повече от хората.
 
Top Bottom
🛡️ Този сайт използва аналитични инструменти за подобряване на потребителското изживяване. Никакви лични данни не се събират. С продължаването си в Потока приемаш тази философия на прозрачност и уважение.