Дрессированный окунь. Пишем сканер для Acunetix на примере RCE в Craft CMS

Содержание статьи

  • Как работают кастомные чекеры
  • Пишем чекер для CVE-2025-32432
  • Машина для тестов
  • Подробности о CVE
  • Кодим
  • Ставим и запускаем чекер
  • Выводы

Да­вай раз­берем­ся, как писать кас­томные ска­неры для Acunetix, на при­мере реаль­ной CVE. От тебя пот­ребу­ются толь­ко неболь­шие поз­нания в JavaScript или TypeScript и желание сде­лать что‑то инте­рес­ное. Внут­ри — экс­клю­зив, выс­тра­дан­ный потом и кровью.

Acunetix, он же «Окунь», — один из самых мощ­ных ска­неров безопас­ности. Люб­лю его за воз­можность одновре­мен­ного ска­ниро­вания до 25 тар­гетов и за широкий набор чекеров. Но охва­тить все невоз­можно, тем более если у тебя в руках собс­твен­ная 0-day-уяз­вимость.

Я, конеч­но, не спа­лю 0-day, но порабо­таем с инте­рес­ной уяз­вимостью, которая поз­волит рас­крыть нес­коль­ко скры­тых и недоку­мен­тирован­ных механиз­мов в соз­дании сво­их чекеров. Речь о CVE-2025-32432, опас­ной дыре, которая поз­воля­ет хакеру лег­ко получить RCE.

warning

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

 

Как работают кастомные чекеры

Путь к пап­ке с кас­томны­ми скрип­тами в Windows обыч­но выг­лядит так:

C:ProgramDataAcunetixsharedcustom-scripts

В Linux:

/home/acunetix/.acunetix/data/custom-scripts/

Там же мож­но най­ти и демофай­лы, которые дадут базовое понима­ние струк­туры чекеров.

Кас­томные чекеры пред­став­ляют собой обыч­ные фай­лы JavaScript, написан­ные по опре­делен­ным прин­ципам. В струк­туре фай­лов Acunetix есть две спе­циали­зиро­ван­ные пап­ки: target и httpdata. Лежат они пря­мо в custom-scripts. Нас инте­ресу­ет пер­вая. Скрип­ты в target выпол­няют­ся один раз на каж­дом тар­гете — это часть активно­го ска­ниро­вания, ког­да мы фор­миру­ем допол­нитель­ные зап­росы.

info

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

Что­бы интегри­ровать твой код в инфраструк­туру Acunetix, раз­работ­чики пре­дос­тавили три объ­екта:

  • scriptArg — кон­текст вызова скрип­та. Внут­ри три объ­ектных свой­ства, из которых мож­но узнать информа­цию о тар­гете: location, target, http. Нап­ример, location.url даст пол­ную ссыл­ку на объ­ект, а target.ip покажет IP-адрес. Объ­ект http сооб­щает информа­цию о кон­тек­сте вза­имо­дей­ствия с тар­гетом и отно­сит­ся к пас­сивно­му ска­ниро­ванию. Нап­ример, свой­ство http.response может выг­лядеть так: HTTP/1.1 200 OK;
  • scanState — объ­ект, поз­воля­ющий вза­имо­дей­ство­вать с сос­тоянием ска­ниро­вания. Обла­дает широким набором фун­кций, но исполь­зовать будем в основном addVuln(vulnDesckObject);
  • ax — интерфейс, который пре­дос­тавля­ет фун­кции и типы для работы с HTTP-зап­росами, логиро­вани­ем и интегра­цией резуль­татов скрип­та в отчет ска­нера. Нап­ример, при помощи ax.http.job() соз­дает­ся HTTP-задача, а ax.http.execute(job) добав­ляет зап­рос в оче­редь движ­ка Acunetix.

Выг­лядит прос­то и удоб­но, но… Есть боль­шой недос­таток — ужас­ная докумен­тация. Раз­работ­чики из Invicti сде­лали все, что­бы у тебя не воз­никло желания писать свои допол­нения. Они буд­то говорят: рядовым пен­тесте­рам и менед­жерам хва­тит стан­дар­тных воз­можнос­тей, боль­ше нуж­но толь­ко хакерам. Если же ты хакер, смо­жешь разоб­рать­ся и без докумен­тации. Поэто­му 90% свой­ств и методов не докумен­тирова­ны.

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

info

Acunetix при любом про­филе ска­ниро­вания про­ходит три эта­па: Discovery, Analysis, Testing. Discovery — по фак­ту кра­улинг, он может силь­но затянуть про­цесс. Учи­тывай это. Если нужен быс­трый чекер, который про­бежит по спис­ку тар­гетов, луч­ше написать его на Python. Най­ден­ные уяз­вимос­ти всег­да мож­но добавить через Acunetix API. Чекеры пиши для рутин­ной работы или обу­чения.

 

Пишем чекер для CVE-2025-32432

Те­ории мно­го, давай писать пер­вый полез­ный скрипт. Будем чекать CVE-2025-32432. Это уяз­вимость десери­али­зации в Craft CMS, которая лег­ко рас­кру­чива­ется в пол­ноцен­ный Remote Code Execution.

 

Машина для тестов

Для тес­тов мож­но ска­чать, нап­ример, вер­сию Craft CMS v.4.13.1.1. Обра­ти вни­мание, что тебе нуж­на имен­но 4.13.1.1. Без пос­ледней еди­нич­ки, ука­зыва­ющей на патч, ты стол­кнешь­ся с ошиб­ками при попыт­ке уста­нов­ки.

Со­бери в Docker про­ект на базе обра­за php:8.2-apache в качес­тве веб‑сер­вера и mysql:8.0 — для базы дан­ных. Под­клю­чись к кон­тей­неру web. Уста­нови в кон­тей­нер web ком­позер и ска­чай ука­зан­ный выше архив. Выпол­ни composer install, что­бы под­тянулись зависи­мос­ти. Уста­нов­ка CMS выпол­няет­ся через CLI, коман­дой php craft install. Никаких дей­ствий для нас­трой­ки самой Craft CMS не тре­бует­ся.

Убе­дись, что веб‑интерфейс откры­вает­ся. В моем слу­чае это http://localhost:8080/web/.

При­ветс­твен­ный экран Craft CMS

Да­вай добавим тар­гет и прос­каниру­ем в Full-режиме. Убе­дим­ся, что «Окунь» не видит уяз­вимос­ти и есть смысл написать кас­томный чекер.

Тес­товое ска­ниро­вание, что­бы убе­дить­ся, что «Окунь» не видит CVE

Acunetix не нашел серь­езных проб­лем, при том что CVE-2025-32432 точ­но есть!

 

Подробности о CVE

Уяз­вимый путь:

/index.php?p=admin/actions/assets/generate-transform

Это эндпо­инт для тран­сфор­мации изоб­ражений. Легитим­ный зап­рос дол­жен передать иден­тифика­тор assetId и дан­ные о необ­ходимой тран­сфор­мации. В ответ при­ходит объ­ект со ссыл­кой на изме­нен­ное изоб­ражение.

Источник: xakep.ru

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *