В этой статье мы раз­берем необыч­ную стра­тегию защиты веб‑при­ложе­ний, где скрип­ты заг­ружа­ются еще до отоб­ражения стра­ницы и выпол­няют слож­ные про­вер­ки сети, пор­тов и активнос­ти поль­зовате­ля. Рас­кро­ем обфусци­рован­ный код и изу­чим механиз­мы, при­меня­емые для выяв­ления ботов и угроз.

Пред­ставь: ты заходишь на офи­циаль­ную стра­ницу бан­ка, что­бы про­верить баланс, и еще до заг­рузки этой стра­ницы в тво­ем бра­узе­ре выпол­няет­ся скрипт, который ини­циирует сетевые про­вер­ки, а ты любу­ешь­ся на пус­той экран в ожи­дании.

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

 

Подозрительная активность

В сен­тябре 2025 года мы получи­ли приг­лашение на CTF-сорев­нование с домена alfa.me. Про­фес­сиональ­ная дефор­мация сде­лала свое дело: вмес­то того что­бы прос­то при­нять приг­лашение, мы ста­ли изу­чать сам сайт и наш­ли мно­го инте­рес­ного.

Мы вклю­чили Burp Suite, что­бы монито­рить весь тра­фик и замечать воз­можные ано­малии. Имен­но в этот момент и про­яви­лась та самая активность, которая и пот­ребова­ла отдель­ного, более глу­боко­го иссле­дова­ния.

Запросы на alfa.me. Сайт alfabank.ru отправляет полностью аналогичные
Зап­росы на alfa.me. Сайт alfabank.ru отправ­ляет пол­ностью ана­логич­ные
Отработка скриптов от alfa.me
От­работ­ка скрип­тов от alfa.me

Скрип­ты заг­ружались с сер­веров Servicepipe.ru — ком­пании, пре­дос­тавля­ющей решения для защиты веб‑при­ложе­ний.

Ссылка на скрипт. Название периодически меняется, но суть остается неизменной
Ссыл­ка на скрипт. Наз­вание пери­оди­чес­ки меня­ется, но суть оста­ется неиз­менной
Место хранения
Мес­то хра­нения

По­доб­ная активность — эле­мент сов­ремен­ной защиты: исполь­зует­ся агрессив­ное ска­ниро­вание пор­тов, что­бы выяв­лять ботов и сом­нитель­ный тра­фик. Мы решили под­робнее разоб­рать­ся с тем, что дела­ет этот скрипт.

Ана­лиз в Burp показал, что такие решения тех­ничес­ки очень слож­ны. Они исполь­зуют WebSocket-соеди­нения для обхо­да сетевых филь­тров, кодиру­ют переда­ваемые дан­ные через XOR и Base64, при­меня­ют хеши MD5 для про­вер­ки целос­тнос­ти и внед­ряют механиз­мы про­тиво­дей­ствия отладке. Мно­гоуров­невая обфуска­ция здесь не побоч­ный эффект, а пол­ноцен­ный инс­тру­мент защиты: слож­ность кода спе­циаль­но повыше­на, что­бы зат­руднить ана­лиз.

 

Что это за скрипт?

Этот JavaScript заг­ружа­ется до показа основной информа­ции о бан­ков­ских услу­гах: он сто­ит в при­ори­тет­ном мес­те и обра­баты­вает­ся на ран­нем эта­пе пар­синга HTML. Код под­тягива­ется с внеш­него домена servicepipe.ru через тег <script> и выпол­няет­ся син­хрон­но, бло­кируя даль­нейшую заг­рузку стра­ницы до окон­чания сво­ей работы. Похоже, безопас­ность пос­тавле­на выше удобс­тва поль­зовате­ля.

Работа скрипта на стороне пользователя
Ра­бота скрип­та на сто­роне поль­зовате­ля

Внут­ри скрип­та при­мене­но нес­коль­ко сло­ев кодиро­вания: сна­чала дан­ные кон­верти­руют­ся в Base64, затем шиф­руют­ся динами­чес­ким клю­чом XOR и пред­став­ляют­ся в виде шес­тнад­цатерич­ных строк. Одновре­мен­но поль­зователь видит GIF-ани­мацию заг­рузки, которая скры­вает активность скрип­та.

Клю­чевая логика про­верок ясна. Реаль­ные поль­зовате­ли работа­ют с нас­тоящих устрой­ств, где откры­ты стан­дар­тные сер­висные пор­ты. Боты же чаще запус­кают­ся в изо­лиро­ван­ных сре­дах, где такие пор­ты зак­рыты. Ска­ниро­вание 3389 (RDP), 5900/5901 (VNC) исполь­зует­ся как сво­еоб­разный отпе­чаток паль­ца, поз­воля­ющий отли­чить живого поль­зовате­ля от авто­мати­зиро­ван­ной сис­темы.

Ко­му как, а нам не очень нра­вит­ся, ког­да кто‑то начина­ет ска­ниро­вать пор­ты без нашего раз­решения. Поэто­му мы решили рас­ковырять этот скрипт, что­бы пос­мотреть, как он устро­ен изнутри, как работа­ет и какую информа­цию собира­ет.

 

Технический анализ

Сра­ботав­ший в нашем бра­узе­ре скрипт — это JavaScript-модуль, реали­зован­ный как IIFE (Immediately Invoked Function Expression): самовы­пол­няющаяся фун­кция, которая запус­кает­ся сра­зу при заг­рузке скрип­та. Такой при­ем поз­воля­ет выпол­нить код, не оставляя сле­дов в гло­баль­ной области видимос­ти бра­узе­ра, и тем самым зат­рудня­ет его ана­лиз.

Для скры­тия логики при­меня­ется струк­турная обфуска­ция: перемен­ные све­дены к одно­бук­венным иден­тифика­торам, фун­кции соз­дают­ся динами­чес­ки через Function(), а основная логика раз­бита на десят­ки мел­ких вло­жен­ных фраг­ментов. В резуль­тате иссле­дова­тель стал­кива­ется не с цель­ным кодом, а с запутан­ным паз­лом, где каж­дая часть скры­вает сле­дующую.

При­меня­ются и анти­отла­доч­ные при­емы: код обна­ружи­вает инс­тру­мен­ты раз­работ­чика, бло­киру­ет попыт­ки отладки и даже соз­дает «фан­томные» дебаг­геры с лож­ными точ­ками оста­нова. В совокуп­ности это прев­раща­ет модуль в защит­ный барь­ер, где обфуска­ция и крип­тогра­фия сочета­ются с при­ема­ми, зат­рудня­ющи­ми и пси­холо­гичес­ки осложня­ющи­ми работу иссле­дова­теля.

Часть кода изучаемого скрипта
Часть кода изу­чаемо­го скрип­та

Код ска­ниру­ет нес­коль­ко кри­тичес­ки важ­ных пор­тов:

  • 3389 (RDP) — уда­лен­ный дос­туп к рабоче­му сто­лу;
  • 5900/5901 (VNC) — про­токо­лы уда­лен­ного управле­ния, час­то исполь­зуемые для адми­нис­три­рова­ния рабочих стан­ций;
  • 135 (RPC) — уда­лен­ный вызов про­цедур;
  • 7070 (XMPP и AnyDesk в кор­поратив­ном кон­тек­сте) — порт, через который про­ходят ком­муника­ции и уда­лен­ный дос­туп к рабочим сре­дам.

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

Для защит­ного решения откры­тые пор­ты и запущен­ные на них сер­висы — это инди­като­ры реаль­ного физичес­кого устрой­ства; их отсутс­твие может ука­зывать на изо­лиро­ван­ную или авто­мати­зиро­ван­ную сре­ду (sandbox, headless, кон­тей­нер).

По­доб­ное ска­ниро­вание, на наш взгляд, име­ет серь­езные рис­ки и вызыва­ет воп­росы закон­ности. Пас­сивное наб­людение за локаль­ными сер­висами и активное ска­ниро­вание без явно­го сог­ласия поль­зовате­ля зат­рагива­ют кон­фиден­циаль­ность и могут вос­при­нимать­ся как вме­шатель­ство в сис­тему.

Кро­ме того, ска­ниро­вание уве­личи­вает повер­хность ата­ки — если запущен­ный в бра­узе­ре кли­ента код уяз­вим, хакеры смо­гут попытать­ся исполь­зовать его в сво­их инте­ресах. Как минимум появ­ляют­ся слож­ности с соб­людени­ем тре­бова­ний по защите дан­ных. В общем, такая «про­активная» защита может сама прев­ратить­ся в угро­зу для безопас­ности и при­ват­ности поль­зовате­лей.

 

Логика работы

Код исполь­зует сис­тему вре­мен­ных задер­жек: попыт­ки под­клю­чения идут с интерва­лом 5 мс. Такая ско­рость поз­воля­ет прос­каниро­вать все целевые пор­ты за доли секун­ды, при этом ска­ниро­вание поч­ти не вли­яет на про­изво­дитель­ность и не вызыва­ет замет­ных задер­жек у поль­зовате­ля.

По­чему имен­но 5 мс? Это ком­про­мисс меж­ду агрессив­ностью и ста­биль­ностью. Более корот­кий интервал может выз­вать сетевые ошиб­ки и некор­рек­тную обра­бот­ку пакетов, интервал длин­нее сни­зит эффектив­ность защиты и ста­нет еще более ощу­тимым для поль­зовате­ля.

При обна­руже­нии приз­наков вме­шатель­ства или управле­ния код перехо­дит в режим ими­тации челове­чес­кой активнос­ти: он дела­ет паузу в 2,5 с, что сни­жает веро­ятность сра­баты­вания поведен­ческих детек­торов.

Логи отработки
Ло­ги отра­бот­ки

Ска­ниро­вание орга­низо­вано асин­хрон­но с исполь­зовани­ем promises (async/await), fetch, WebSocket и неб­локиру­ющих тай­меров, поэто­му поль­зователь­ский интерфейс может про­дол­жать работать, а опе­рации выпол­няют­ся в фоне без бло­киров­ки рен­дерин­га. Это поз­воля­ет скрип­ту пос­ле заг­рузки про­дол­жать незамет­но работать, не прив­лекая к себе лиш­нее вни­мание.

По­мимо про­чего, скрипт выпол­няет зап­росы к рас­ширени­ям бра­узе­ра, что­бы выяс­нить, уста­нов­лены ли бло­киров­щики рек­ламы или всплы­вающих окон.

Логи запросов. Направлены на AdBlock, CaptchaSolver и WebRTC Control
Ло­ги зап­росов. Нап­равле­ны на AdBlock, CaptchaSolver и WebRTC Control

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

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

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии