Comments 67
вообще странно, что в pma до сих пор не предлагает удалить / переименовать скрипты установки после настроки параметров. Хотя, размещение pma не по стандартному example.com/phpmyadmin тоже спасло бы от многих проблем.
0
По нестандартному адресу если разместить — пользователи его постоянно будут забывать и либо постоянно звонить спрашивать либо ставить свои необновляемые версии к себе в папку сайта.
Также, как я смотрю по логам, боты не скупятся на перебор разных вариантов адресов:
GET /phpMyAdmin/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /phpmyadmin1/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /phpmyadmin3/scripts/setup.php HTTP/1.1" 200 14083 "-" «ZmEu»
GET /phpadmin/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /phpmanager/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /pma/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /pmaold/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /www/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /admin/pma/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /admin/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /db/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /dbadmin/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /myadmin/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /mysql-admin/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /mysql/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /mysqladmin/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /mysqlmanager/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /sqladmin/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /sqlweb/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /typo3/phpmyadmin/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /web/phpMyAdmin/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /webadmin/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /websql/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /xampp/phpmyadmin/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /phpMyAdmin-2.2.3/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
и т.п., полный список переборов которые я нашёл в логах — тут: pastebin.com/YqJ3L59v
Также, как я смотрю по логам, боты не скупятся на перебор разных вариантов адресов:
GET /phpMyAdmin/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /phpmyadmin1/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /phpmyadmin3/scripts/setup.php HTTP/1.1" 200 14083 "-" «ZmEu»
GET /phpadmin/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /phpmanager/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /pma/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /pmaold/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /www/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /admin/pma/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /admin/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /db/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /dbadmin/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /myadmin/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /mysql-admin/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /mysql/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /mysqladmin/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /mysqlmanager/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /sqladmin/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /sqlweb/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /typo3/phpmyadmin/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /web/phpMyAdmin/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /webadmin/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /websql/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /xampp/phpmyadmin/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
GET /phpMyAdmin-2.2.3/scripts/setup.php HTTP/1.1" 404 345 "-" «ZmEu»
и т.п., полный список переборов которые я нашёл в логах — тут: pastebin.com/YqJ3L59v
+8
Баг бородатый, но подробный анализ очень порадовал. Спасибо!
+5
Спасибо, интересно! А бот похоже, управляется через IRC.
0
curl_exec зря заблокировали, curl ом после этого пользоваться будет нельзя:
Execute the given cURL session.
This function should be called after initializing a cURL session and all the options for the session are set.
Execute the given cURL session.
This function should be called after initializing a cURL session and all the options for the session are set.
0
Я лично вот эти функции у себя повырубал:
disable_functions = «apache_child_terminate, apache_note, apache_setenv, chgrp, closelog, curl_exec, debugger_off, debugger_on, define_sys, define_syslog_variables, disk_total_space, diskfreespace, dl, escapeshellarg, escapeshellcmd, eval, exec, fp, fput, ftp_connect, ftp_exec, ftp_get, ftp_login, ftp_nb_fput, ftp_put, ftp_raw, ftp_rawlist, get_current_user, getmygid, getmyuid, highlight_file, ini_alter, ini_get_all, ini_restore, inject_code, leak, listen, log_variables, mysql_pconnect, openlog, passthru, phpAds_XmlRpc, phpAds_remoteInfo, phpAds_xmlrpcDecode, phpAds_xmlrpcEncode, php_uname, phpinfo, popen, posix_getegid, posix_geteuid, posix_getpwuid, posix_kill, posix_mkfifo, posix_setpgid, posix_setsid, posix_setuid, posix_uname, proc_close, proc_get_status, proc_nice, proc_open, proc_terminate, shell_exec, syslog, system, xmlrpc_entity_decode»
Мои скрипты эти функции не используют по крайней мере — и всё работает.
После выключения этих функций не работает по крайней мере два известных php-шелла.
disable_functions = «apache_child_terminate, apache_note, apache_setenv, chgrp, closelog, curl_exec, debugger_off, debugger_on, define_sys, define_syslog_variables, disk_total_space, diskfreespace, dl, escapeshellarg, escapeshellcmd, eval, exec, fp, fput, ftp_connect, ftp_exec, ftp_get, ftp_login, ftp_nb_fput, ftp_put, ftp_raw, ftp_rawlist, get_current_user, getmygid, getmyuid, highlight_file, ini_alter, ini_get_all, ini_restore, inject_code, leak, listen, log_variables, mysql_pconnect, openlog, passthru, phpAds_XmlRpc, phpAds_remoteInfo, phpAds_xmlrpcDecode, phpAds_xmlrpcEncode, php_uname, phpinfo, popen, posix_getegid, posix_geteuid, posix_getpwuid, posix_kill, posix_mkfifo, posix_setpgid, posix_setsid, posix_setuid, posix_uname, proc_close, proc_get_status, proc_nice, proc_open, proc_terminate, shell_exec, syslog, system, xmlrpc_entity_decode»
Мои скрипты эти функции не используют по крайней мере — и всё работает.
После выключения этих функций не работает по крайней мере два известных php-шелла.
+2
Спасибо за хорошее описание разбора полетов.
Сам недавно наткнулся на аналогичное, очень интересно и полезно поизучать чужой опыт.
Сам недавно наткнулся на аналогичное, очень интересно и полезно поизучать чужой опыт.
-1
Очень полезно еще отключать выполнение скриптов в разделе /tmp, если он отдельный. Флаг noexec в /etc/fstab.
+2
«Получается что каждый сервер с базовыми настройками php», получается, что не каждый а только со старым phpmyadmin.
+2
Эцсамое, стоит phpmyadmin из репов, там этого setup.php просто нет. Я правильно понимаю, что в данном случае сервер не подвержен уязвимости?
+3
>Данный phpmyadmin был поставлен мной довольно давно вручную
ну вот, а еще некоторые спрашивают, почему не нужно ставить ничего руками, а ставить из репозитария.
ну вот, а еще некоторые спрашивают, почему не нужно ставить ничего руками, а ставить из репозитария.
+1
К примеру, в ubuntu 10.10 в репозитории он тянет за собой apache2, он часто бывает не нужен
0
А если нужно несколько админок с разными настройками на нескольких хостах? Ну можно, конечно, устроить ссылочный ужастик…
0
Можно вопрос. Как Вы включили strace для уже запущенного процесса?
0
Вырубать функции не сильно хорошо. Можно сделать так — в фаерволе закрыть порты исходящей почты для всех кроме почтового сервера, предварительно попытки соединиться настроив на действие LOG, тобишь так, чтобы пользователи могли отправлять из пхп функцией mail или из perl/php вызовом sendmail, а напрямую соединяться не моги. В почтовом сервере сделать ограничения на отправку почты. К сожалению как работает на дебиане я не знаю, решение у меня есть на exim+iptables.
И еще, /tmp желательно монтировать отдельно с опцией noexes, нельзя чтобы была возможность что-то из нее запустить
И еще, /tmp желательно монтировать отдельно с опцией noexes, нельзя чтобы была возможность что-то из нее запустить
0
Ну кроме рассылки почты боты могут много всего разного делать, в том числе и по безобидному 80 порту, а также по другим нестандартным. А отправка почты средствами php у меня уже настроена, всё файло складывается в файл и если хост начинает много отправлять — то включается паника ;) В php 5.3 даже появилась отдельная опция для этого:
The mail.log directive allows you to specify the file where each call to mail() will be logged. The log file will contain the path and line # of the calling script in addition to all of the headers indicated by the user.
А то в 5.2 и старше логгирование почты делалось мягко говоря — через Ж:
sendmail_path = /usr/local/sbin/sendmail-wrapper-php
auto_prepend_file = /usr/local/sbin/php_set_envs.php
The mail.log directive allows you to specify the file where each call to mail() will be logged. The log file will contain the path and line # of the calling script in addition to all of the headers indicated by the user.
А то в 5.2 и старше логгирование почты делалось мягко говоря — через Ж:
sendmail_path = /usr/local/sbin/sendmail-wrapper-php
auto_prepend_file = /usr/local/sbin/php_set_envs.php
0
Ещё не надо забывать про /dev/shm =)
0
Спасибо за подробный анализ и объяснения, буду знать, как анализировать ситуацию в таких случаях.
Но на счет повода я согласен с предыдущими комментаторами — ССЗБ, нельзя не обновлять софт, который торчит наружу.
Но на счет повода я согласен с предыдущими комментаторами — ССЗБ, нельзя не обновлять софт, который торчит наружу.
+1
phpmyadmin на продакшн хосте это как приглашение — ломать тут…
+2
тонкий политический вопрос (слабонервным отвернуться):
как можно кастрировать perl что бы он не мог сокеты поднимать? и на сколько это пагубно для системы, freebsd, например?
ЗЫ сам не админ.
как можно кастрировать perl что бы он не мог сокеты поднимать? и на сколько это пагубно для системы, freebsd, например?
ЗЫ сам не админ.
+1
>4 Можно ли как-нибудь настроить в php логгирование выполнения функций exec и подобных?
Я использую вот это: habrahabr.ru/blogs/sysadm/69790/
Чертовски полезная штука.
Я использую вот это: habrahabr.ru/blogs/sysadm/69790/
Чертовски полезная штука.
+2
Дурацкий вопрос. Стоит старая версия (обновлять буду позже). Этот setup.php можно удалить или переименовать. Он вообще в работе используется после установки?
0
По поводу upd2: в iptables есть owner match:
+1
(пардон, отправилось рано)
выдержка из man:
выдержка из man:
owner This module attempts to match various characteristics of the packet creator, for locally-generated packets. It is only valid in the OUTPUT chain, and even this some packets (such as ICMP ping responses) may have no owner, and hence never match. --uid-owner userid Matches if the packet was created by a process with the given effective user id. --gid-owner groupid Matches if the packet was created by a process with the given effective group id. --pid-owner processid Matches if the packet was created by a process with the given process id. --sid-owner sessionid Matches if the packet was created by a process in the given session group. --cmd-owner name Matches if the packet was created by a process with the given command name. (this option is present only if iptables was compiled under a kernel supporting this feature) NOTE: pid, sid and command matching are broken on SMP
+2
Спасибо! Но, к сожалению, как раз та которая нужна (--cmd-owner) в последних версиях ядра почему-то убрана (причём уже лет 5 как) — www.spinics.net/lists/netfilter/msg49716.html, так что моя первоначальная идея похоже не реализуема, ограничивать получится только по uid и gid :(
Ну или через selinux шаманить.
Ну или через selinux шаманить.
0
Так она не «почему-то» убрана, а именно потому, что на SMP не работает.
По этой же причине она же вам бы не помогла.
Жаль, конечно, идея отличная была бы.
По этой же причине она же вам бы не помогла.
Жаль, конечно, идея отличная была бы.
0
>Мой самописный скрипт, который обнаружил это соединение
Привели бы уж для кучи и исходники скрипта. Может какие-то его куски полезными народу будут :)
Привели бы уж для кучи и исходники скрипта. Может какие-то его куски полезными народу будут :)
+5
Вот кстати, на одном полуподшефном серваке такая вот гадость тоже через pma проникла.
И регулярно пытается слать пароли по почте на lostsoul2k@ymail.com. Адрес почтовый yahoo походу, уже прибило, но письма все равно уходят.
Т.к. ssh зарезан достаточно сурово, толку от этих паролей нет, поэтому пока больше интересно, как бы выловить того, кто письма шлет?
И регулярно пытается слать пароли по почте на lostsoul2k@ymail.com. Адрес почтовый yahoo походу, уже прибило, но письма все равно уходят.
Т.к. ssh зарезан достаточно сурово, толку от этих паролей нет, поэтому пока больше интересно, как бы выловить того, кто письма шлет?
0
Можно еще ограничить доступ к phpmyadmin в .htaccess:
Options -Indexes
Deny from all
Allow from IP
Allow from IP
Allow from IP
Ну и конечно-же не забывать периодически проверять и устанавливать обновления.
Options -Indexes
Deny from all
Allow from IP
Allow from IP
Allow from IP
Ну и конечно-же не забывать периодически проверять и устанавливать обновления.
0
Заголовок статьи отдает явной желтизной. Проблема была вызвана не дырой в phpmyadmin, а в неправильных настройках PHP на конкретном сервере автора.
Как следствие — есть ли на сервере определенного хостера phpmyadmin с дырой или нет — это вообще не важно, а важно то, как настроен этот сервер. Если сервер настроен нормально, подобных проблем никогда не возникнет.
Как следствие — есть ли на сервере определенного хостера phpmyadmin с дырой или нет — это вообще не важно, а важно то, как настроен этот сервер. Если сервер настроен нормально, подобных проблем никогда не возникнет.
-4
UFO just landed and posted this here
имхо то что phpmyadmin или любой другой управляющий скрипт открыто доступен уже дыра. Я на production закрываю все через ssl+авторизация+фильтры на брутфорс
0
теперь этот ZmEu, брутит pma еще с какой-то командой :D
Отрывок из лога:
Отрывок из лога:
202.43.34.25 — - [14/Dec/2010:03:24:47 +0300] «GET //phpMyAdmin-2.11.11-all-languages/ HTTP/1.1» 404 481 "-" «Made by ZmEu @ WhiteHat Team — www.whitehat.ro»
202.43.34.25 — - [14/Dec/2010:03:24:48 +0300] «GET //phpMyAdmin-2.11.1-all-languages/ HTTP/1.1» 404 481 "-" «Made by ZmEu @ WhiteHat Team — www.whitehat.ro»
202.43.34.25 — - [14/Dec/2010:03:24:50 +0300] «GET //htdocs/ HTTP/1.1» 404 462 "-" «Made by ZmEu @ WhiteHat Team — www.whitehat.ro»
0
Хабр эффект на сайт Змеи.
Статья стильная. Я зачитался. А есть режисерская версия, в которой самому злодею засылают его бота? :D
Статья стильная. Я зачитался. А есть режисерская версия, в которой самому злодею засылают его бота? :D
0
>Как можно узнать реальную команду запуска процесса и путь к нему, если она уже перезаписана самим процессом
readlink /proc/123/exe (123 заменить на номер процесса)
или ещё: ps -p 123 -o comm
>Можно ли как-нибудь настроить через firewall (насколько я понимаю для linux это будет iptables) ограничение доступа к сети конкретных процессов?
такое есть в selinux. там же есть много другого, например можно запретить вебсерверу запускать процессы. единственное, я понятия не имею, как обстоят дела в поддержкой selinux именно в debian
readlink /proc/123/exe (123 заменить на номер процесса)
или ещё: ps -p 123 -o comm
>Можно ли как-нибудь настроить через firewall (насколько я понимаю для linux это будет iptables) ограничение доступа к сети конкретных процессов?
такое есть в selinux. там же есть много другого, например можно запретить вебсерверу запускать процессы. единственное, я понятия не имею, как обстоят дела в поддержкой selinux именно в debian
+1
«Кстати, данная дыра похоже по-прежнему остаётся не закрытой во многих phpmyadmin из репозиториев, например в Debian Lenny идёт 4:2.11.8.1-5+lenny6»
Вы уверенны в этом, или просто предположение? Дело в том что в Debian принято применять патчи безопасности к предидущим версиям а не обновляться, по-этому вполне вероятно уязвимость закрыта.
Вы уверенны в этом, или просто предположение? Дело в том что в Debian принято применять патчи безопасности к предидущим версиям а не обновляться, по-этому вполне вероятно уязвимость закрыта.
0
Только предположение, сам не проверял, может патчами уже закрыли. Если закрыта — отпишите плиз, обновлю тему.
0
Конечно же закрыта, причем более года назад. Вот пруфлинк:
www.debian.org/security/2009/dsa-1824
www.debian.org/security/2009/dsa-1824
0
хммм… ботмастер своих ботов с канала #god куда то увел :( и не спит — акиллы раздает любопытным :)
0
Хорошая обзорная статья получилась. Отдельное спасибо за пример и лекбез по полезным выхлопам lsof и ps. Замечание одно — сервер поимели таки не в базовой конфигурации и вовсе не из-за её.
0
Я один читал «ридми» в phpMyAdmin и удалил «setup.php» после установки?
0
Sign up to leave a comment.
Анализ проникновения бота через эксплоит в старых версиях phpmyadmin и рекомендации по настройкам безопасности php-хостинга