Порой обнаружение ботнета становится нелегкой задачей, особенно если запутаться в различных компонентах, таких как дропперы, инфекторы и прочие неприятные вещи. Около двух недель назад Хосе Назарио из Arbor Networks обратил мое внимание на новый зловред, оказавшийся еще одним P2P-ботом. После исполнения программа устанавливает большое количество всякой всячины, в том числе
- Исполняемый файл, скрытый в альтернативном потоке данных,
- Три генератора («майнера») Bitcoin: Ufasoft miner, RCP miner и Phoenix miner,
- Файл с информацией о географическом расположении IP-адресов.
Однако, пока оставим этот вопрос в стороне и поговорим об архитектуре ботнета, который на самом деле является всего лишь каналом для доставки других вредоносных программ на зараженные машины. Покопавшись в установленных программах, мы, наконец, нашли сам бот, который мы детектируем как Trojan.Win32.Miner.h. Файл защищен от анализа с помощью нескольких слоев обфускации, но в конце концов записывает исполняемый файл, сжатый упаковщиком UPX, в секцию памяти, откуда может быть восстановлен оригинальный код.
Помимо прочего, сразу же привлекает внимание список из 1953 строк IP-адресов, прописанных непосредственно в коде зловреда. Бот обращается к этим адресам на стадии загрузки для присоединения к пиринговой сети.
Список IP-адресов в двоичном коде после деобфускации
Для проверки, является ли удаленный хост на самом деле частью ботнета, он сначала тестируется на порте 62999/tcp. После этого вся последующая коммуникация с этим хостом происходит через HTTP-соединения на порте 8080/tcp. Если бот пытается получить информацию от ботнета, он посылает GET-запрос на URL /search=[resource] другому пиру (ниже выделен красным цветом). Ответ (выделен синим) содержит требуемые данные. В примере, приведенном ниже, бот спрашивает, существует ли файл с названием ip_list_2.
GET /search=ip_list_2.txt HTTP/1.1
Connection: close
Host: 67.230.63.171
HTTP/1.1 200 OK
Server: nginx
Date: Thu, 28 Jul 2011 1:46:30 PM GMT
Content-Type: application/octet-stream
Content-Length: 36
Last-Modified: Thu, 28 Jul 2011 1:46:30 PM GMT
Connection: close
Expires: Thu, 28 Jul 2011 1:46:30 PM GMT
Cache-Control: no-cache
Accept-Ranges: bytes
0|8E2105CC235624452CF4CA5ED5880636
Удаленный пир подтверждает существование файла, отослав обратно MD5 хэш-код содержимого. Несуществующий файл или другой недействительный запрос был бы показан как null. Для загрузки искомого файла в запросе оставлен суффикс .txt:
GET /search=ip_list_2 HTTP/1.1
Connection: close
Host: 67.230.63.171
HTTP/1.1 200 OK
Server: nginx
Date: Thu, 28 Jul 2011 1:46:32 PM GMT
Content-Type: application/octet-stream
Content-Length: 11107
Last-Modified: Thu, 28 Jul 2011 1:46:32 PM GMT
Connection: close
Expires: Thu, 28 Jul 2011 1:46:32 PM GMT
Cache-Control: no-cache
Accept-Ranges: bytes
86.121.101.197
194.44.169.112
77.123.56.166
65.75.122.227
79.115.121.40
89.208.252.138
213.135.179.130
31.43.66.129
67.230.65.87
94.76.96.80
...
Ответ содержит список IP-адресов, принадлежащих другим пирам ботнета. Этой информации достаточно, чтобы рекуррентно опросить пиринговую сеть и узнать IP-адреса ее пиров, или, по крайней мере, той ее части, которая использует публичные IP-адреса. Мы исследовали часть сети и записали полученные IP-адреса. На графической схеме видна сеть с ярко выраженными внутренними связями. Через несколько секунд мы остановили наш алгоритм: при дальнейшей его работе схема стала бы слишком большой, и ее визуализация заняла бы слишком много времени. В результате некоторые узлы на схеме подсоединяются к «тупикам» — пирам, которые далее никуда не ведут.
Части P2P-ботнета Miner
Есть три отдельных списка хостов: ip_list, ip_list_2 и ip_list_3, однако во время наших тестов последний всегда был пуст. Те запуски алгоритма, в которых мы исследовали сети, соответствующие первым двум спискам, заняли семь часов. В результате мы получили 9141 хостов для ip_list и 28675 хостов для ip_list_2, и только 57 хостов присутствовали в обоих списках — в общей сложности это почти 38.000 различных публичных IP-адресов. Учитывая, что сейчас большинство машин находятся за файерволами или шлюзами, реальное количество зараженных машин может быть на порядки выше.
Бот может получить свой IP-адрес, используемый для общения в интернете, через /search=get_my_ip и проверить, можно ли к нему обратиться извне с помощью /search=listen_test. Еще один интересный момент – запрос /search=soft_list, возвращающий список исполняемых файлов:
GET /search=soft_list HTTP/1.1
Connection: close
Host: 91.124.141.114
HTTP/1.1 200 OK
Server: nginx
Date: Thu, 28 Jul 2011 21:54:04 GMT
Content-Type: application/octet-stream
Content-Length: 1235
Last-Modified: Thu, 28 Jul 2011 21:54:04 GMT
Connection: close
Expires: Thu, 28 Jul 2011 21:54:04 GMT
Cache-Control: no-cache
Accept-Ranges: bytes
1881|37055143655159895100072920[...]056290908384488867|iecheck12.exe|8|1
1864|74659789337208584676889842[...]363065321014216383|client_8.exe|24|0
1861|50130190106950587675951378[...]854716588011099242|w_distrib.exe|6|0
1859|17628191893358990544434624[...]934535221101899258|btc_server.exe|22|0
1855|70418953044346961647340893[...]411084368838550531|loader2.exe|2|0
1816|63902848972275419049312273[...]804891227296793639|loader_rezerv.exe|3|0
1714|71450190375046068004318922[...]621691365929209616|gbot_loader.exe|27|0
873|450976523626203858415918223[...]004413953350864628|resetsr.exe|14|0
Этот список содержит несколько файлов, которые бот загружает из пиринговой сети и запускает. Он также запрашивает их, посылая имя файла как параметр для запроса /search= request. У каждого файла есть уникальный идентификационное номер – число перед первым тире. Числовая строка в следующем поле была сокращена в примере выше для более удобного прочтения. Ее назначение еще неизвестно. Похоже, что у более новых файлов более высокие числа ID. К примеру, файлы client_3.exe, client_4.exe, client_6.exe и client_7.exe, которые отсутствуют в списке ПО, однако все же могут загружаться, имеют увеличивающиеся идентификационные номера:
- client_3.exe: 1555
- client_4.exe: 1596
- client_6.exe: 1607
- client_7.exe: 1611
- client_8.exe: 1864
Проверить, рассылается ли новое ПО по ботнету, несложно: нужно всего лишь загрузить список ПО и найти новые идентификационные номера. Мы продолжим мониторинг и будем добавлять сигнатуры для новых зловредов в наше детектирование сразу же после их появления.
Miner-Ботнет: добыча Bitcoin теперь и в пиринговых сетях