Pull to refresh

Comments 67

вообще странно, что в pma до сих пор не предлагает удалить / переименовать скрипты установки после настроки параметров. Хотя, размещение pma не по стандартному example.com/phpmyadmin тоже спасло бы от многих проблем.
По нестандартному адресу если разместить — пользователи его постоянно будут забывать и либо постоянно звонить спрашивать либо ставить свои необновляемые версии к себе в папку сайта.

Также, как я смотрю по логам, боты не скупятся на перебор разных вариантов адресов:
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
Баг бородатый, но подробный анализ очень порадовал. Спасибо!
Спасибо, интересно! А бот похоже, управляется через IRC.
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.
Я лично вот эти функции у себя повырубал:
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-шелла.
надо было еще «echo» и «print» вырубить
Опять минусуют =) Не пойму, чем плохо вырубать вредные функции в продакшне?
Спасибо за хорошее описание разбора полетов.
Сам недавно наткнулся на аналогичное, очень интересно и полезно поизучать чужой опыт.
Очень полезно еще отключать выполнение скриптов в разделе /tmp, если он отдельный. Флаг noexec в /etc/fstab.
Да, тоже полезная вещь, но в данном случае не спасло т.к. запускалось perl /tmp/god.txt а не сам файл, поэтому флаг noexec не помог бы :(
Положите вместо /usr/bin/perl обёртку, которая будет проверять кошерность скрипта, а затем уже вызывать настроящий перл.
«Получается что каждый сервер с базовыми настройками php», получается, что не каждый а только со старым phpmyadmin.
На каждом сервере с новым phpmyadmin вёбмастер может в любой момент закачать свой старый лично для себя на сайте. Да и кроме phpmyadmin ещё немало дырок и в других скриптах может быть, в том числе и свежих.
Эцсамое, стоит phpmyadmin из репов, там этого setup.php просто нет. Я правильно понимаю, что в данном случае сервер не подвержен уязвимости?
Кокой философский ответ :)
>Данный phpmyadmin был поставлен мной довольно давно вручную

ну вот, а еще некоторые спрашивают, почему не нужно ставить ничего руками, а ставить из репозитария.
К примеру, в ubuntu 10.10 в репозитории он тянет за собой apache2, он часто бывает не нужен
врете, не тянет.

Depends: libapache2-mod-php5 | php5-cgi | php5, php5-mysql | php5-mysqli, php5-mcrypt, perl, debconf (>= 0.5) | debconf-2.0, dbconfig-common, ucf (>= 0.28), libjs-mootools
Recommends: apache2 | lighttpd | httpd, php5-gd, mysql-client
А если нужно несколько админок с разными настройками на нескольких хостах? Ну можно, конечно, устроить ссылочный ужастик…
Конфиг phpmyadmin позволяет это сделать. И даже если Вы хотите управлять mysql-базами с друной машины, останется лишь разрешить для удалённого mysql принимать соединения с машины, на которой есть phpmyadmin.
Можно вопрос. Как Вы включили strace для уже запущенного процесса?
маны уже не в моде? strace -p
либо можно попроще и в более юзер-френдли виде: запускаете htop, выделяете интересующий процесс и нажимаете 's'
Вырубать функции не сильно хорошо. Можно сделать так — в фаерволе закрыть порты исходящей почты для всех кроме почтового сервера, предварительно попытки соединиться настроив на действие LOG, тобишь так, чтобы пользователи могли отправлять из пхп функцией mail или из perl/php вызовом sendmail, а напрямую соединяться не моги. В почтовом сервере сделать ограничения на отправку почты. К сожалению как работает на дебиане я не знаю, решение у меня есть на exim+iptables.

И еще, /tmp желательно монтировать отдельно с опцией noexes, нельзя чтобы была возможность что-то из нее запустить
Ну кроме рассылки почты боты могут много всего разного делать, в том числе и по безобидному 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
Ещё не надо забывать про /dev/shm =)
Спасибо за подробный анализ и объяснения, буду знать, как анализировать ситуацию в таких случаях.
Но на счет повода я согласен с предыдущими комментаторами — ССЗБ, нельзя не обновлять софт, который торчит наружу.
Дело в том, что за обновлением своего я услежу, а уследить за пользователями, которые ставят старые версии и дырявые скрипты, плюс ещё многие и своими руками их творят — практически невозможно. Поэтому лучше обезопаситься заранее чем по факту.
phpmyadmin на продакшн хосте это как приглашение — ломать тут…
Это не продакшн хост, а хостинговый сервер, на котором есть аккаунты всяких юзеров, а эти юзера могут туда что-угодно закачать, в том числе и дырявое как дуршлак.
тонкий политический вопрос (слабонервным отвернуться):
как можно кастрировать perl что бы он не мог сокеты поднимать? и на сколько это пагубно для системы, freebsd, например?

ЗЫ сам не админ.
Подсунуть перлу библиотеку, в которой будут ваши обёртки для сокетных функций. Точную инструкцию сейчас не дам, просто погуглите LD_PRELOAD и LD_LIBRARY_PATH.
>4 Можно ли как-нибудь настроить в php логгирование выполнения функций exec и подобных?
Я использую вот это: habrahabr.ru/blogs/sysadm/69790/
Чертовски полезная штука.
Дурацкий вопрос. Стоит старая версия (обновлять буду позже). Этот setup.php можно удалить или переименовать. Он вообще в работе используется после установки?
нет, не используется
Можно смело грохать, после установки он не нужен.
(пардон, отправилось рано)

выдержка из 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 
Спасибо! Но, к сожалению, как раз та которая нужна (--cmd-owner) в последних версиях ядра почему-то убрана (причём уже лет 5 как) — www.spinics.net/lists/netfilter/msg49716.html, так что моя первоначальная идея похоже не реализуема, ограничивать получится только по uid и gid :(
Ну или через selinux шаманить.
Так она не «почему-то» убрана, а именно потому, что на SMP не работает.

По этой же причине она же вам бы не помогла.

Жаль, конечно, идея отличная была бы.
Ну можно было допилить для поддержки SMP.
На Android 2.2 и выше, кстати, работает эта штука как-то, а он на двухпроцессорных системах тоже есть.
В Droidwall правила выглядят так: owner UID match app_13
Попробую расковырять поглубже.
>Мой самописный скрипт, который обнаружил это соединение
Привели бы уж для кучи и исходники скрипта. Может какие-то его куски полезными народу будут :)
Вот кстати, на одном полуподшефном серваке такая вот гадость тоже через pma проникла.
И регулярно пытается слать пароли по почте на lostsoul2k@ymail.com. Адрес почтовый yahoo походу, уже прибило, но письма все равно уходят.
Т.к. ssh зарезан достаточно сурово, толку от этих паролей нет, поэтому пока больше интересно, как бы выловить того, кто письма шлет?
Можно еще ограничить доступ к phpmyadmin в .htaccess:

Options -Indexes
Deny from all
Allow from IP
Allow from IP
Allow from IP

Ну и конечно-же не забывать периодически проверять и устанавливать обновления.
Заголовок статьи отдает явной желтизной. Проблема была вызвана не дырой в phpmyadmin, а в неправильных настройках PHP на конкретном сервере автора.

Как следствие — есть ли на сервере определенного хостера phpmyadmin с дырой или нет — это вообще не важно, а важно то, как настроен этот сервер. Если сервер настроен нормально, подобных проблем никогда не возникнет.
Да, и правда немного желтовато звучит — переименовал ;) К концу написания статьи уже назначение статьи и основная тема немного поменялись, а заголовок старый остался висеть.
UFO just landed and posted this here
Спасибо, поправил. Я что-то сразу не почитал внимательно, думал она закачивает файл и исполняет его, поэтому сразу на неё поставил чёрную метку ;) Убрал из списка.
имхо то что phpmyadmin или любой другой управляющий скрипт открыто доступен уже дыра. Я на production закрываю все через ssl+авторизация+фильтры на брутфорс
теперь этот 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»

Хабр эффект на сайт Змеи.

Статья стильная. Я зачитался. А есть режисерская версия, в которой самому злодею засылают его бота? :D
>Как можно узнать реальную команду запуска процесса и путь к нему, если она уже перезаписана самим процессом

readlink /proc/123/exe (123 заменить на номер процесса)
или ещё: ps -p 123 -o comm

>Можно ли как-нибудь настроить через firewall (насколько я понимаю для linux это будет iptables) ограничение доступа к сети конкретных процессов?

такое есть в selinux. там же есть много другого, например можно запретить вебсерверу запускать процессы. единственное, я понятия не имею, как обстоят дела в поддержкой selinux именно в debian
вот бы вводную статью про selinux…
Да, я им сам всё интересуюсь но никак не найду время осилить доки и начать уже использовать в полную силу.
«Кстати, данная дыра похоже по-прежнему остаётся не закрытой во многих phpmyadmin из репозиториев, например в Debian Lenny идёт 4:2.11.8.1-5+lenny6»

Вы уверенны в этом, или просто предположение? Дело в том что в Debian принято применять патчи безопасности к предидущим версиям а не обновляться, по-этому вполне вероятно уязвимость закрыта.
Только предположение, сам не проверял, может патчами уже закрыли. Если закрыта — отпишите плиз, обновлю тему.
Спасибо за инфу, сам что-то не нашёл, обновил топик.
хммм… ботмастер своих ботов с канала #god куда то увел :( и не спит — акиллы раздает любопытным :)
Хорошая обзорная статья получилась. Отдельное спасибо за пример и лекбез по полезным выхлопам lsof и ps. Замечание одно — сервер поимели таки не в базовой конфигурации и вовсе не из-за её.
Ну я так и написал, что я самдурак — оставил старый phpmyadmin, но написал что такая ситуация может возникнуть на любом сервере где есть доступ по ftp к сайтам у сторонних пользователей, т.е. у обычного хостингового сервера.
Я один читал «ридми» в phpMyAdmin и удалил «setup.php» после установки?
Я не могу заставить всех юзеров на хостинге читать ридми, а тем более — ещё его понимать и следовать тому что написано! Себя-то не всегда удаётся заставить, только когда петух клюнет ;))
Sign up to leave a comment.

Articles