Как стать автором
Обновить

Нецензурный троян.

Время на прочтение 6 мин
Количество просмотров 4.1K
В общем, с этим трояном все было понятно с самого начала: что-то он из сети качает. Но в силу некоторых причин (одна из них — детект каспером как P2P-Worm.Win32.Socks.s) я решил его «разобрать». Под катом — технические подробности вскрытия трояна. Внимание, наличествуют не совсем цензурные слова и много технических подробностей!


Сегодня на столе файл services.exe, чуть менее 20000 байт. Не упакован, писан на VC какой-то из версий.
IDA после обработки файла останавливается на WinMain. А в WinMain мы тут же видим:

.text:00403444 push ebp
.text:00403445 mov ebp, esp
.text:00403447 push 0FFFFFFFFh
.text:00403449 push offset unk_404140
.text:0040344E push offset loc_403540
.text:00403453 mov eax, large fs:0
.text:00403459 push eax
.text:0040345A mov large fs:0, esp
.text:00403461 push ecx
.text:00403462 push ecx
.text:00403463 sub esp, 10h
.text:00403466 push ebx
.text:00403467 push esi
.text:00403468 push edi
.text:00403469 mov [ebp+var_18], esp
.text:0040346C and [ebp+var_4], 0
.text:00403470 and dword ptr [ebp+Time+4], 0
.text:00403474 mov eax, dword ptr [ebp+Time+4]
.text:00403477 mov dword ptr [eax], 0DFADBABEh
.text:0040347D or [ebp+var_4], 0FFFFFFFFh
.text:00403481 jmp loc_40352B

.text:0040352B loc_40352B:; CODE XREF: WinMain(x,x,x,x)+3D
.text:0040352B mov ecx, [ebp+var_10]
.text:0040352E mov large fs:0, ecx
.text:00403535 pop edi
.text:00403536 pop esi
.text:00403537 pop ebx
.text:00403538 leave
.text:00403539 retn 10h
.text:00403539 _WinMain@16 endp

Но обратим внимание на код, начинающийся с адреса 0x403470 — явная попытка обратиться к адресу 0x000000! В этом месте вызывается обработчик SEH, и в итоге управление-таки передается куда следует. Подобный трюк используется еще как минимум один раз в WinMain. Но WinMain подготовила еще пару сюрпризов, например управление передается на такой код:

.text:00401EA3 loc_401EA3:; CODE XREF: WinMain(x,x,x,x):loc_4034C9
.text:00401EA3 push ebp
.text:00401EA4 mov ebp, esp
.text:00401EA6 push 0FFFFFFFFh
.text:00401EA8 push offset unk_404120
.text:00401EAD push offset loc_403540
.text:00401EB2 mov eax, large fs:0
.text:00401EB8 push eax
.text:00401EB9 mov large fs:0, esp
.text:00401EC0 push ecx
.text:00401EC1 push ecx
.text:00401EC2 push ecx
.text:00401EC3 push ebx
.text:00401EC4 push esi
.text:00401EC5 push edi
.text:00401EC6 mov [ebp-18h], esp
.text:00401EC9 and dword ptr [ebp-4], 0
.text:00401ECD mov eax, 1
.text:00401ECD; — .text:00401ED2 dw 3F0Fh
.text:00401ED4 dd 45C70B07h, 0FFFFFFFCh, 0FC4D83FFh, 6A14EBFFh, 8BC35801h
.text:00401ED4 dd 6580E865h, 4D8300E7h, 458AFFFCh, 0B002EBE7h, 0F04D8B01h
.text:00401ED4 dd 0D8964h, 5F000000h, 0C3C95B5Eh

Неверный опкод. Olly в этом месте наглухо отказывается перемещаться на следующую инструкцию. То есть имеем своеобразный антиотладочный прием. И последняя хитрость — обнаружение VMWare которое быстро и просто опознается по таким инструкциям:

.text:00401F34 mov eax, 'VMXh'
.text:00401F39 mov ebx, 8685D465h
.text:00401F3E mov ecx, 0Ah
.text:00401F43 mov dx, 5658h
.text:00401F47 in eax, dx

На самом деле, WinMain выполняет две функции: осложняет жизнь исследователю и передает (если все как надо) управление на полезную нагрузку. WinMain я не проходил, а в самом ее начале переместил EIP сразу на PayLoad. Сначала, как и водится, троян подготавливает для своих черных дел данные: расшифровывает все строки и узнает адреса нужных API-функций (LoadLibrary + GetProcAddress, причем не в цикле). Шифрование строк — XOR одним байтом, правда ключ везде разный. Алгоритм легко распознается:

.text:0040100E loc_40100E:; CODE XREF: decryptXor+37 j
.text:0040100E mov eax, [ebp+pos]
.text:00401011 inc eax
.text:00401012 mov [ebp+pos], eax
.text:00401015
.text:00401015 loc_401015:; CODE XREF: decryptXor+C j
.text:00401015 push [ebp+lpString]; lpString
.text:00401018 call ds:lstrlenA
.text:0040101E cmp [ebp+pos], eax
.text:00401021 jge short loc_401039
.text:00401023 mov eax, [ebp+lpString]
.text:00401026 add eax, [ebp+pos]
.text:00401029 movsx eax, byte ptr [eax]
.text:0040102C xor eax, [ebp+key]
.text:0040102F mov ecx, [ebp+lpString]
.text:00401032 add ecx, [ebp+pos]
.text:00401035 mov [ecx], al
.text:00401037 jmp short loc_40100E

На Delphi, кстати, такая функция расшифровки заняла бы страницы две. За что я Delphi и не люблю.
Затем идет вызов WSAStartup — подготовка к работе с Windows Sockets, попытка удалить файл c:\stop (именно по имени этого файла троян однозначно идентифицируется), подготовка строк, содержащих нужные пути. Интересен следующий момент: троян открывает свой файл на чтение, перемещает позицию чтения на 0x43 байт и читает оттуда 8 байт. Смотрю в HIEW на это место… Оппа! Да у нас тут ВРУЧНУЮ модифицированный заголовок! 0x43 — как раз начало строки «This program...», а у нас тут load\0. Следующим номером нашей программы — вычисление некой уникальной строки на основании пути к системному каталогу винды и серийного номера диска. Теперь троян будет проверять наличие в системе двух файлов: %Windows%\system32\drivers\services.exe и svchost.exe в каталоге текущего пользователя. Когда троян не установлен в системе, осуществляется переход на очень интересный код. Сперва из строки (!) через собственную реализацию функции atoi получается число, которое затем умножается на 1000, и полученный результат передается в функцию Sleep, то есть осуществляется регулируемая задержка. Задержка перед тем, как троянец получит аргументы командной строки, соберет их все вместе и передаст в WinExec. Наводит на подозрения, что троян может быть прописан в качестве дефолтной программы для открытия файлов! Отсутствие аргументов обрабатывается корректно. Перед выполнением деструктивных действий троян проверяет наличие в системе мьютекса, и если мьютекс уже есть завершает свою работу. Если же собратьев нет — создает две нити, одна из которых проверяет в цикле наличие файла c:\stop (если он есть — завершает процесс), а вторая осуществляет работу с сетью. Последний штрих — извлечение из своего тела файла ftp34.dll (шифрование XOR'ом, ключ — 1 байт) в каталог пользователя и системный каталог с последующей ее загрузкой. Для усложнения жизни пользователя, дата создания этих файлов будет такой же, как и у системных.

Сетевая активность.
Вся работа с сетью сосредоточена в одном из потоков трояна. В этом же потоке троян копирует себя в %Windows%\system32\drivers\services.exe, файл svchost.exe в каталоге текущего пользователя и файл userinit.exe в «Автозагрузке» в Главном Меню винды (и тоже правит дату). (На этом месте я сдуру выпустил трояна из под контроля и пришлось восстанавливать систему с образа). Прописывает в реестре, как минимум в 5 местах. И, как я и предполагал, прописывается как дефолтная программа для открытия EXE-файлов. Бряку на начало ThreadProc ставить не буду, опять тупо и цинично поменяю EIP на ее начало :-)
Так что же с сетью? Производится попытка запросить URL вида site.com/shl/?&v=load&lid=1033. Whois сообщает, что контактное мыло для этого сайта — на mail.ru, а IP адрес принадлежит российскому хостеру. Что же передается в URL'е? «load» — это как раз тот кусок, который был извлечен из заголовка сайта, а 1033 — идентификатор языка системы. Если зайти браузером на site.com/shl/ — там будет картинка и форма для логина.

Троян Залупко. Логотип с админки сайта
Вот такой вот логотипчик!

Поставил я на венду shttpd, прописал в etc/hosts 127.0.0.1 для site.com. Но есть проблема: shttpd плохо с урлами, содержащими "?" справляется. Проблема решается просто: скачиваем wget'ом нужный файл с сервера, переименовываем его в shl.txt, а перед вызовом InternetReadFile из трояна, патчим в памяти URL, чтобы он стал site.com/shl.txt. Теперь и сервер отдаст файл, и троян его примет. Сначала я думал, что трояну эта страница нужна, чтобы как-то отправить логин и пароль. Но все оказалось проще: троян ищет строку «form method» и если она есть продолжает качать. На этот раз скачивается файл с URL site.com/shl/manda.php?ns=1&id=1212312124, где id — уникальный номер (о получении см выше). Но этот файл у меня уже почему-то не скачался :-( Возможно, стоит блокировка по IP на сервере, кто знает… Но на работе файлик скачался. Там — список URLов открытым текстом. Код довольно простой, и становится понятно, что с указанных URLов качаются файлы и запускаются на исполнение, это производится из отдельного потока.

Итоги.
Касперы ошиблись с названием, а я в очередной раз убедился, что подобные файлы — как минимум Downloader'ы. Авторы трояна — русскоязычные товарищи, продают троянца… Меньше 20% кода детально не разобраны, но судя по описанию на сайте авторов, а также по текстовым строкам, троянец способен собирать email-адреса для спам-рассылок. Библиотека ftp34.dll скорее всего служит для перехвата паролей на доступ к FTP. Думаю, на работе смогу оставшуюся часть расковырять детально. Вот такой он, троян «залупко» :-)

UPDATE Продолжение vilgeforce.habrahabr.ru/blog/44145.html
Теги:
Хабы:
+108
Комментарии 48
Комментарии Комментарии 48

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн