SHA1: 98172e49c3d5d70ffdcefd071f9762c58430a393
Многофункциональная самораспространяющаяся вредоносная программа для ОС Linux, написанная на языке Go. В архитектуре троянца имеется собственная реализация протокола DHT для обмена данными между узлами P2P-ботнета. Троянец запускается как узел P2P-сети, принимающий и обрабатывающий сообщения RPC. Вероятно, вредоносная программа этой версии все еще находится в стадии разработки, поскольку генерирует значительное количество отладочных сообщений, записываемых в файл на устройстве /dev/null.
При получении входного параметра -debug троянец запускает http-сервер на порту 6061. Помимо этого, троянец обрабатывает следующие команды:
Команда | Описание |
---|---|
scan | запустить rpc provider, принимающий задания на сканирование |
elevate | искать в системе пароли и ключи и попытаться повысить свои привилегии через sudo, su или подключение по ssh |
stress | запустить rpc provider, принимающий задания на DDOS-атаки |
-wait <num> | подождать завершения процесса с указанным PID |
При поступлении команды elevate пытается получить данные о пользователях и записать их в структуру следующего вида:
В файлах ищутся закрытые SSH-ключи, а также выполняется синтаксический разбор PHP-файлов в поисках логинов и паролей пользователей. Отдельная функция извлекает учетные записи пользователей из drupalSettingsDatabases. Модуль пытается перезапустить себя с помощью su, sudo и через ssh.
После своего запуска троянец принимает команды из P2P-сети по протоколу HTTPS на порту 5099 и передает их локальным исполнителям. Для передачи заданий потомкам в его архитектуре реализовано межпроцессное взаимодействие (interprocess communication) по протоколу RPC.
На инфицированном узле запускается несколько RPC-плагинов. Плагин Scan применяется для поиска в сети ресурсов по заданному признаку и использует библиотеку https://github.com/natefinch/pie. Плагин использует сканеры со следующими именами:
- Drupal;
- DrupalRESTWS;
- Wordpress;
- magento;
- airos;
- JetSpeed;
- kerner;
- exagrid;
- contactScanner;
- ransomScanner.
Модуль scan
Некоторые структуры, используемые в данном модуле (используется псевдокод, подобный синтаксису Go):
struct SetBinaryRequest{
platform string,
Binary rex.Binary
}
struct SetBinaryResponse{
}
struct scanRequest{
target *scanner.Target;
}
struct scanResponse{
result *scanner.Result;
}
struct scanner.Target{
host string,
port Int,
Username string,
password string,
isHTTP bool,
isTLS bool,
Via string,
Err error, //string
DisableRansom bool,
done *chan struct {}
}
struct scanner.Result{
_ *scanner.Target,
mu sync.Mutex,
Username string
Password string
Domain string
isHTTP Bool
isTLS Bool
Via string
Err err
Emansipated bool
Contacts []scanner.Contact
Ransom *struct { Deadline time.Time; Address string; Amount int;
Step int; Stressed bool }
}
rex.Binary{
SHA1 [20]uint8,
Data []uint8,
}
struct scanner.Service{
nm scanner.networkMapper,
scanner *scanner.ConnScanner,
targets *chan *scanner.Target,
resultsMU sync.Mutex,
results []scanner.Target
}
iface scanner.Dialer{
func Dial;
func DialContext;
}
iface scanner.Scanner{
func Scan;
}
iface scanner.PHPExecutor{
func ExecPHP;
}
struct scanner.ConnScanner {
dialer scanner.Dialer{},<-интерфейс с методами Dial, DialContext
scanners []scanner.Scanner, <-интерфейс с методом Scan
binariesMu sync.Mutex,
binaries *map[string]*rex.Binary,
}
struct scanner.HttpScanner{
dialer scanner.Dialer,
http *scanner.HTTP,
payloadfn *func(string) (io.Reader, error),
scanners []scanner.Scanner
}
struct scanner.HTTP {
client *http.Client,
UserAgent string
}
struct scanner.Drupal{
_ *scanner.HTTP,
dialer scanner.Dialer,
payloadfn *func(string) (io.Reader, error)
}
struct scanner.Wordpress {
_ *scanner.HTTP
payloadfn *func(string) (io.Reader, error)
revslider *scanner.PHP
showbiz *scanner.PHP
wpo *scanner.PHP
}
struct scanner.PHP{
_ scanner.PHPExecutor
_ scanner.Dialer
}
...
Сканер Drupal
В первую очередь троянец проверяет, установлена ли на атакуемом сайте CMS Drupal. Для этого он ищет файл Changelog.TXT и индексную страницу сайта, после чего выполняет их синтаксический разбор. Проверяет наличие уязвимости CVE-2014-3704. Затем с помощью SQL-инъекции в форме для ввода логина троянец выполняет следующий запрос:
update users set name='%s',pass='%s',status='1' where uid='1';
Затем выполняется запрос:
UPDATE filter_format SET status='1' WHERE format='php_core';
Далее выполняется команда:
kill `grep -l \^/tmp/x /proc/*/cmdline|sed s,/proc/,,|sed s,/cmdline,,`
После этого Linux.Rex.1 загружает на скомпрометированный сайт собственную копию и запускает ее:
nohup %s >/tmp/l 2>&1
Сканер DrupalRESTWS
Проверяет на сайте наличие уязвимости https://www.exploit-db.com/exploits/40130/. Никаких иных действий не выполняет.
Сканер Wordpress
Проверяет наличие на атакуемом узле Wordpress, а также ряда известных уязвимостей этой CMS.
Сканер contactScanner
Запрашивает с указанного узла страницу HTML, выполняет ее синтаксический разбор и извлекает из нее адреса электронной почты.
Сканер magento
Ищет уязвимости RCE (remote code execution) в CMS Magento.
Сканер kerner
Атакует удаленный узел с использованием уязвимости типа shellshock.
Сканер airos
Ищет в сети устройства под управлением операционной системы AirOS и пытается обнаружить уязвимость Ubiquiti airOS Arbitrary File Upload.
Сканер exagrid
Проверяет версию ПО Exagrid (приложения для управления системами хранения данных) в поисках закрытых ключей.
Сканер jetspeed
Проверяет наличие уязвимости CVE-2016-0712 (Reflected Cross Site Scripting in URI path).
Сканер RansomScanner
Пытается получить с запрошенной веб-страницы все домены и возвращает те, которые соответствуют переданному IP.
Модуль Stress
Как и в случае с модулем сканера, запускает RPC-сервер c именем "Stresser". Этот модуль отвечает за выполнение DDoS-атак и рассылку сообщений по электронной почте. Выполняются следующие виды DDoS-атак:
- HttpFlood;
- HttpPost;
- slowLoris;
- tlsThc;
- DnsAmp.
Также троянец рассылает по электронной почте сообщения с использованием следующего шаблона:
We are Armada Collective.
All your servers will be DDoS-ed starting {{ .Time.Weekday.String }} ({{ .Time.Format
"Jan 2 2006" }}) if you don't pay {{ .Amount }} Bitcoins @ {{ .Address }}
When we say all, we mean all - users will not be able to access sites host with you at all.
If you don't pay by {{ .Time.Weekday.String }}, attack will start, price to stop will
increase by {{ .Step }} BTC for every day of attack.
If you report this to media and try to get some free publicity by using our name,
instead of paying, attack will start permanently and will last for a long time.
This is not a joke.
Our attacks are extremely powerful - sometimes over 1 Tbps per second. So, no cheap
protection will help.
Prevent it all with just {{ .Amount }} BTC @ {{ .Address }}
Do not reply, we will probably not read. Pay and we will know its you.
AND YOU WILL NEVER AGAIN HEAR FROM US!
Bitcoin is anonymous, nobody will ever know you cooperated.
Или:
We are Anonymous.
All your servers will be DDoS-ed starting {{ .Time.Weekday.String }} ({{ .Time.Format
"Jan 2 2006" }}) if you don't pay {{ .Amount }} Bitcoins @ {{ .Address }}
When we say all, we mean all - users will not be able to access sites host with you at all.
Right now we will start 15 minutes attack on your site's IP {{ .IP }}.
It will not be hard, we will not crash it at the moment to try to minimize eventual damage,
which we want to avoid at this moment.
It's just to prove that this is not a hoax. Check your logs!
If you don't pay by {{ .Time.Weekday.String }}, attack will start, price to stop will
increase by {{ .Step }} BTC for every day of attack.
If you report this to media and try to get some free publicity by using our name,
instead of paying, attack will start permanently and will last for a long time.
This is not a joke.
Our attacks are extremely powerful - sometimes over 1 Tbps per second.
So, no cheap protection will help.
Prevent it all with just {{ .Amount }} BTC @ {{ .Address }}
Do not reply, we will probably not read. Pay and we will know its you.
AND YOU WILL NEVER AGAIN HEAR FROM US!
Bitcoin is anonymous, nobody will ever know you cooperated.
В начале каждого письма следует строка:
FORWARD THIS MAIL TO WHOEVER IS IMPORTANT IN YOUR COMPANY AND CAN MAKE DECISION!
Некоторые структуры, используемые в данном модуле (используется псевдокод, подобный синтаксису Go):
struct stresser.Stresser {
ua *scanner.HTTP,
nworkers Int,
jobsch *chan ransom.Jobs
token *chan struct {}
}
typedef ransom.Jobs map[string]*ransom.Job
struct ransom.Job{
IP net.IP,
DeadLine time.Time,
Address string,
Amount Int,
Step Int,
Stressed Bool
}
struct rpc.StressArgs{
IP net.IP,
Duration time.Time,
Message string,
Yield Bool
}
struct rpc.StressReply{
}
iface stresser.Runner{
func Run;
}
struct rpc.SetRansomJobsArgs{
Jobs ransom.Jobs
}
struct rpc.SetRansomJobsReply{
}
Если троянец запускается без параметров, он работает как новый узел в DHT-сети. Отслеживает обращения на порт 5099. Пытается определить внешний IP-адрес обращением к следующим ресурсам:
https://ipv4.icanhazip.com
https://ipinfo.io/ip
http://www.trackip.net/ip?json
Авторы троянца предусмотрели в его архитектуре собственную реализацию протокола DHT. Для передачи информации между узлами используется библиотека https://github.com/gorilla/rpc.
Используются следующие структуры:
struct node.Node{
ProxyAddr string,
cfg *node.Config,
mu sync.Mutex,
epoch time.Time,
dialer node.Dialer,
ip *net.IP,
targets *chan *scanner.Target,
jobsMu sync.Mutex,
jobs *map[string]chan string,
resultsMu sync.Mutex,
results []*scanner.Result,
key *rsa.PrivateKey,
mcp *rsa.PublicKey,
metrics *map[string]*node.Counter,
nodeMetricsMu sync.Mutex,
nodeMetrics *map[string]map[string]interface {},
report Bool,
safe Bool,
selfUpdate Bool,
ipWhitelist []net.Ip,
public Bool,
binariesMu sync.Mutex,
binaries *map[string]*rex.Binary,
myBinaryHash hash.Hash, <-интерфейс
dht *dht.Node,
stress *chan *node.stressJob,
ransomjobsch *chan ransom.Jobs,
ua *scanner.HTTP
}
struct node.Config {
disableScanner Bool,
disableStresser Bool,
disableRansom Bool,
_ *scanner.ConnScannerConfig
}
struct dht.Node{
cfg dht.NodeConfig,
ContactDir string,
rtMu sync.Mutex,
rt dht.RoutingTable,
s *dht.Store,
addr *net.TCPAddr,
client *dht.Client,
wkeys []*rsa.PublicKey
}
struct dht.NodeConfig {
Bootstrap []string,
SaveContacts string
}
struct dht.Store{
mu sync.Mutex,
m *map[dht.NodeID]*dht.Value
}
typedef dht.NodeID [0x14]uint8
struct dht.Client{
node *dht.Node,
rpc *rpc.Client
}
struct dht.RoutingTable {
_ dht.NodeID,
buckets [160]dht.Bucket
}
typedef dht.Bucket [0x14]dht.Contact
struct dht.Contact {
_ dht.NodeID,
addr string,
time time.Time
}
struct dht.Value{
_ dht.NodeID,
bytes []uint8,
sha1 []uint8,
expires time.Time,
PSS []uint8
}
В троянце хранится список адресов узлов бот-сети, к которым будет произведена попытка подключения. Если внешний IP совпадает с одним из них, то к нему подключение производиться не будет.