Продолжаем цикл статей по написанию BackDoor.
Первые части можно найти здесь
и на http://ww.danil.dp.ua.
Как все, наверное, знают, DrWeb и AVP уже начали
определять мою прогу "DTr" v.1.3. Я решил
это дело пофиксить. Выбрал время, набрал
пива, поставил брейкпоинты на SoftIce, а потом
решил "проверить на вшивость". Изменил
имя приложения, откомпилил, запустил
сканеры. Проверил. Запаковал, запустил
мониторы, переписал туда-сюда. Не ловят.
Цирк. Как говорила одна моя знакомая: "я
забыла сопротивляться". Эти "супер"
антивиры отлавливают пока только имя
приложения. Это значит, что если генерить
имя случайным образом, то по этому
алгоритму работы они вообще его ловить не
будут. А если обозвать приложение именем
какого-нибудь стандарта? Например, "internat.exe"?
Кстати, имя приложения изменяется в 118
строке в значении константы "AppName" в
исходниках (см. ниже). В любом случае, я решил
форсировать процесс и выложить на свою
страницу полные исходники сервера.
Исходники клиента и дополнительной DLL
выкладывать не буду — там столько
используется моих и не моих компонентов и
модулей, что это уже мало похоже на Delphi. Тем
более, клиент и DLL антивирами не
определяются, а в следующих статьях я "освещу"
клиент на "чистом" Delphi. Исходники
особым обилием комментариев не отличаются,
но после внимательного прочтения моих
предыдущих двух статей на эту тему, я думаю,
в них можно разобраться. Единственная
сложность, какая может возникнуть, это
закачка файлов, но общий принцип работы
алгоритма я расскажу в следующих статьях.
Тем более, что особо разбираться и не нужно —
изменить имя приложения можно и так. В этой
статье я дам подробное описание команд,
которые понимает сервер. В сервере замечены
баги на Win95, при перезагрузке компа и т.п. Об
этом я также расскажу в последующих статьях.
Исходники находятся на моей странице в
архиве http://www.danil.dp.ua/dtr_s13s.zip.
Особой красотой алгоритмы не отличаются.
Принцип был один: работает — и ладно, а
оптимизация будет в следующей версии.
Замечу, что пришлось переписывать функцию
преобразования строка-число — под NT
выдавала какой-то бред.

КОМАНДЫ "DTr" v.1.3:

Некоторые обозначения: 
_#13_ — символ с кодом 13;
<параметр> — параметры команды (без <>).
Команды чувствительны к регистру — "helo"
и "HeLo" не одно и то же.

*) Проверка связи. Команда "helo".
Параметров нет. Должно выдать систему
сервера, каталоги, имя юзера и т.д.

*) Файловый менеджер. Команда "ld <каталог>".
Требует от сервера вернуть список файлов и
директорий, находящихся в <каталог>.
Сервер возвращает список из строк,
разделенных символом #13. В начале списка
стоит "[[[ListFile <каталог>_#13_" для
указания клиенту,  что это список файлов,
и вывести его надо в окне файлового
менеджера. ПРИМЕР: "ld C:\WINDOWS\".

*) Список запущенных процессов на удаленном
компьютере. Команда "lp".  Параметров
нет. Должно выдать список процессов в окне
сообщений.  Требует для своей работы
дополнительную DLL (см. в клиенте).

*) Прервать процесс. Команда "dp <№ или ID
процесса>". Прерывает процесс.  № (для
Win9x/ME) или ID (WinNT) — из списка процессов (смю
выше). Требует дополнительную DLL.

ПРИМЕР: "dp 2".

*) Перегрузить удаленный комп. Команда "rbt".
Работает только на Win9x/ME.  Если есть
желание, то можно дописать для NT. Для этого
нужно запросить дополнительные права. На
Delphi это выглядит примерно так :

procedure ReBoot;
var
hToken: THandle;
tkp: TTokenPrivileges;
RetLen: DWORD;
PreviousState: TTokenPrivileges;
Ver: TOsVersionInfo;
begin
try
Ver.dwOSVersionInfoSize := SizeOf(Ver);
GetVersionEx(Ver);
if Ver.dwPlatformId=VER_PLATFORM_WIN32_NT then begin // если WinNT
if not OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or
TOKEN_QUERY, hToken) then exit;
if not LookupPrivilegeValue( Nil, ‘SeShutdownPrivilege’,tkp.Privileges[0].Luid)
then exit;
PreviousState := tkp;
tkp.PrivilegeCount := 1;
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
if not(AdjustTokenPrivileges(hToken, FALSE, tkp, SizeOf(PreviousState),
PreviousState, RetLen)) then exit;
end; 
ExitWindows(EWX_REBOOT,0); // перезагрузить
except
end;
end;

*) Выключить компьютер. Команда "sd".
Работает только на Win9x/ME. 

*) Запуск win-приложения. Команда "start <имя
файла>_#13_<параметры>_#13_<вид>".
Запускает приложение. Может запустить и
связанный файл: например "*.doc".  <вид>
— способ запуска (число):
0 : скрыто; 
1 : минимизировано;
2 : нормально;
3 : на весь экран.
ПРИМЕР: "start C:\WINDOWS\1.doc_#13_#13_3".

*) Запуск DOS-приложения. Команда "startDOS <имя
файла>_#13_<параметры>_#13_<вид>".
Запускает приложение. <вид> — способ
запуска (число). ПРИМЕР: "startDOS C:\WINDOWS\COMMAND\deltree.exe_#13_/Y
C:\_#13_0".

*) Проверка дополнительной DLL. Команда "dll
DTrTestDLL_#13_<строка>".  Проверяет
доступность и инициализацию
дополнительной DLL. Служит для проверки DLL
при переименовании и переносе.
Предполагается в следующих версиях этой
командой запускать функции из
дополнительной библиотеки ("dlll <команда>_#13_<параметры>
"). Сервер должен вернуть <строка> или
сообщение об ошибке. Само собой, на сервере
необходима дополнительная DLL.
ПРИМЕР: "dll DTrTestDLL_#13_ddddd".

*) Образ экрана. Команда "scr <файл>".
Сканирует экран и переносит в gif-файл.
Требует для своей работы дополнительную DLL.
ПРИМЕР: "scr C:\scr.gif".

*) Высветить сообщение. "sm <вид> <заголовок>_#13_<текст
сообщения>". Высветить 
сообщение. <вид> — иконка (число):
0 : нету; 
1 : Stop;
2 : !;
3 : ?;
4 : Info.
ПРИМЕР: "sm 1 Error_#13_System FAILURE".

*) Минимизировать и закрыть активное
приложение. Команды "mnwn" и "clwn" 
соответсвенно. 

*) Выключить экран, мышь и клаву. Команды "clsc",
"clms" и "clkl". ВНИМАНИЕ. 
Используются команды "rundll32.exe user,disableoemlayer",
"rundll32.exe mouse,disable" 
и "rundll32.exe keyboard,disable". Обратные команды
типа "rundll32.exe mouse,enable" 
не работают. Комп придется перегружать. 

*) Убрать с экрана и показать панель задач.
Команды "ht" и "st" соответственно.

*) Пробипать динамиком. Команда "bp <кол-во
раз>". 
ПРИМЕР: "bp 13".

*) Просмотр подключей выбранного ключа
реестра. Команда "RegVKey <ключ>_#13_<HK>".
<HK>:
0 : HKCU;
1 : HKLM;
2 : HKU;
3 : HKCC.
ПРИМЕР: "RegVKey Software_#13_1" — просмотр всех
подключей в HKEY_LOCAL_MACHINE\SOFTWARE.

*) Просмотр параметров выбранного ключа
реестра. Команда "RegVPar <ключ>_#13_<HK>".
ПРИМЕР: "RegVPar Software_#13_1" — просмотр всех
параметров в HKEY_LOCAL_MACHINE\SOFTWARE.

*) Создать подключ в выбранном ключе реестра.
Команда "RegCKey <ключ>_#13_<подключ>_#13_<HK>".
ПРИМЕР: "RegCKey Software_#13_sss_#13_1" — создать
подключ "sss" в HKEY_LOCAL_MACHINE\SOFTWARE.

*) Создать/Изменить строковой параметр в
выбранном ключе реестра. Команда  "RegCPar
<ключ>_#13_<параметр>_#13_<значение>_#13_<HK>".
ПРИМЕР: "RegCPar Software_#13_sss_#13_ddd_#13_1" —
создать/изменить параметр "sss" с
значением "ddd" в HKEY_LOCAL_MACHINE\SOFTWARE.

*) Создать/Изменить числовой параметр в
выбранном ключе реестра. Команда "RegCWPr <ключ>_#13_<параметр>_#13_<значение>_#13_<HK>".
ПРИМЕР: "RegCWPr Software_#13_sss_#13_666_#13_1" —
создать/изменить параметр "sss" с
значением "666" в HKEY_LOCAL_MACHINE\SOFTWARE.

*) Удалить подключ в реестре. Команда "RegDKey
<подключ>_#13_<HK>". ПРИМЕР: "RegDKey
Software\sss_#13_1" — удалить подключ "sss" в
HKEY_LOCAL_MACHINE\SOFTWARE.

*) Удалить параметр в ключе реестра. Команда
"RegDPar <ключ>_#13_<параметр>_#13_<HK>".
ПРИМЕР: "RegDPar Software\sss_#13_ddd_#13_1" — удалить
параметр "ddd" в HKEY_LOCAL_MACHINE\SOFTWARE\sss.

Для всех нижеследующих команд необходима
дополнительная DLL.

*) Включить клавиатурный шпион. Команда "KeySpyON
<файл>". Включить кл. шпион с записью в
<файл>. Файл потом закачивается с помощью
файлового менеджера. Файл имеет атрибут
системный и для юзера в проводнике не виден.

*) Выключить клавиатурный шпион. Команда
"KeySpyOFF".

*) Получить кешированные инет-пароли.
Команда "CrckP". Сервер должен вывести
все пароли, на свойствах соединения которых
стоит "Сохранять пароли". Только для
Win9x/ME.

*) Получить инет-пароли из EType Dialer. Команда
"CrkED".

*) Получить список доступных по сети
компьютеров. Команда "UserList". 

*) Получить список зарегестрированных в
WinNT-server пользователей на удаленном
компьютере. Команда "ServList". Только для
WinNT-server.

Команды файлового манеджера.

*) Показать список зарегистрированных в
системе дисков — "ld". Возвращает список
дисков со строкой "[[[ListDrvr " в начале.

*) Показать список файлов и каталогов в
указанной директории — "ld <каталог>".
В начале списка стоит "[[[ListFile <каталог>_#13_".

*) Создать каталог в текущей директории — "MakeDir
<имя>". ПРИМЕР: "MakeDir 111". 

*) Переименовать/перенести, скопировать
файл, каталог — "CopFile <родительский
каталог>_#13_<имя файла, каталога>_#13_<куда>_#13_<вид>".
<вид>:
0 : копировать каталог со всем содержимым;
1 : перенести/переименовать каталог;
2: копировать файл;
3 : перенести/переименовать файл.
ПРИМЕР: "CopFile C:\WINDOWS\_#13_win.com_#13_C:\TEMP\1.tmp_#13_3". 

*) Удалить файл, пустой каталог — "DelFile <имя>".
Удаляет файл или пустой каталог. Если
каталог, то на конце должно быть "\". <имя>
— полный путь. ПРИМЕР: "DelFile C:\WINDOWS\win.com"
или "C:\WINDOWS\". 

*) Показать атрибуты файла, каталога — "ShowAttr
<имя>". ПРИМЕР: "ShowAttr C:\WINDOWS\win.com".

*) Изменить атрибуты файла, каталога — "SetAttrb
<имя>_#13_<атрибут>". ПРИМЕР: "SetAttrb C:\WINDOWS\win.com_#13_0".

*) Получить файл с сервера — "LoadFile <полный
путь к файлу на сервере>_#13_<размер буфера>".Файл
передается по частям и <размер буфера> —
размер передаваемого буфера для файла. На
разных компах была замечена такая
особенность: клиент и сервер получают не
столько, сколько указано, а столько, сколько
захотят (т.е. он может принять подряд 4800, 6800,
8600, и т.д.). Поэтому была сделана возможность
установки размера буфера приема и отправки.
ПРИМЕР: "LoadFile C:\WINDOWS\win.com_#13_4000".

*) Отправить файл на сервер. Файл
разбивается (в случае необходимости) на
части. Размер частей зависит от буфера
обмна. Вначале посылается команда "SaveFile
<полный путь и имя файла на сервере>_#13_<размер>".
Потом шлются команды "SconFile <размер>_#13_<часть
файла>", где на сервер отправляется весь
файл по частям. Сервер после получения и
записи должен отвечать. Последняя часть
файла идет так: "SendFile <часть файла>". 
Это говорит серверу что нужно записать и
закрыть файл.

Функции дополнительной DLL ("nb003.dll"):

1) DTrTestDLL. Проверка дополнительной DLL. Входной
параметр — указатель на строку, выходной
параметр — указатель на строку вида: "Проверка
DLL выполнена. Полученная строка — …".

2) DTrLstProc. Список запущенных процессов.
Входной параметр — число, определяющее
систему сервера (0-Win9x/ME,1-WinNT). Выходной
параметр — указатель на список строк,
содержащий названия и номер всех
запущенных приложений.

3) DTrDelProc. Прервать процесс по номеру или ID.
Входные параметры — число, определяющее
систему сервера и номер или ID удаляемого
процесса. Выходной параметр- указатель на
строку с информацией о результате
выполнения операции.

4) DTrGetScr. Получение снимка экрана в файл.
Входной параметр — указатель на строку с
полным путем и именем gif-файла. Выходной
параметр- указатель на строку с информацией
о результате выполнения операции.

5) DTrEDPass. Получить пароли EType Dialer. Входной
параметр — число, определяющее систему
сервера. Выходной параметр — указатель на
список строк, содержащий все полученные
пароли или сообщение о неудаче выполнения
операции. 

6) DTrCrkPass. Получить кэшированные инет-пароли.
Входной параметр — число, определяющее
систему сервера. Выходной параметр —
указатель на список строк, содержащий все
полученные пароли или сообщение о неудаче
выполнения операции. 

7) DTrSrvLst. Получить список пользователей
WinNT-server. Входной параметр — число,
определяющее систему сервера. Выходной
параметр — указатель на список строк,
содержащий инфу обо всех юзерах или
сообщение о неудаче выполнения операции. 

8) DTrUsrLst. Получить список подключенных к
серверу компов. Входной параметр — число, 
определяющее систему сервера. Выходной
параметр — указатель на список строк,
содержащий имена всех компьютеров или
сообщение о неудаче выполнения операции. 

9) DTrKeyProc. Функция клавиатурного шпиона. 

Теперь о багах. Почему-то, если сервер стоит
на Win95, то в окне получаемых сообщений, если
предыдущая посланная строка была больше
текущей, выводится полученная строка и
окончание предыдущей. Это все фиксится
обнулением буфера отправки или отправкой
только стольких байт, сколько есть в
подготовленной строке. Т.е. или перед
отправкой надо ставить:

mov ecx,6666
mov edi,offset BufStr0
lll_1: mov byte ptr [edi],0
inc edi
loop lll_1

или, лучше, конструкцию:

invoke send,client,addr BufStr0,sizeof BufStr0,0

Надо переписать так:

invoke lstrlen, addr BufStr0
invoke send,client,addr BufStr0, eax,0

Пока все. В следующих статьях мы рассмотрим:

* как запускать приложения на сервере;
* как редактировать реестр сервера;
* как издеваться над юзером;
* как сделать файловый менеджер на клиенте
для сервера;
* как закачивать файлы на сервер и с сервера;
* как получать дополнительную информацию с
сервера;
* как сделать снимок экрана сервера;
* как управлять запущенными процессами на
сервере;
и т.д.

P.S. Статья и программа предоставлена в целях
обучения и вся ответственность за их
использование ложится на твои хилые плечи.

Оставить мнение

Check Also

Скрытая сила пробела. Эксплуатируем критическую уязвимость в Apache Tomcat

В этой статье мы поговорим о баге в Apache Tomcat, популярнейшем веб-сервере для сайтов на…