Как найти путь до скрипта подбирающего пароль mysql?
Есть сервер с кучей web-проектов. Снаружи доступ к mysql закрыт, доступ по SSH пользователям закрыт. В /var/log/messages периодически появляется строка типа mysqld: 2020-07-29 10:10:22 140000674043648 [Warning] Access denied for user 'admin'@'localhost' (using password: YES)
Логины бывают разные. Иногда совпадают с названиями доменов иногда нет.
Вопрос в том, как узнать, где лежит скрипт который используют для подбора пароля?
general_log включать не вариант. Запросов настолько много, что собирается по миллиону записей за 3 секунды работы. Вот как бы записать именно запросы завершающиеся Access denied и с путем до скрипта который для попытки аторизации использовался?
Добавлено
Надо, собственно, отключить этот сервер от продакшена, от греха подальше и на нём проводить эксперименты. А для продакшена подготовить свежеустановленную ОС с более серьезным подходом к защите.
Если есть спортивный интерес обнаружить зловред, то:
далее, можно установить atop, acct: sudo apt install acct atop
atop собирает информацию о производительности системы и запускаемых процессах
acct ведет мониторинг активности пользователей (в частности, sa выводит список процессов)
соберет статистику за полдня-день и тогда можно анализировать историю так: atop -r /var/log/atop/atop_20200729
Если не хватит, то у меня появилась такая идея: можно написать программу. Она может слушать на порту 3306 и регистрировать IP адрес и также узнавать номер процесса клиента, по которому можно узнать и путь и от какого пользователя запущен.
Узнать номер процесса по прослушиваемому порту sudo lsof -i :2345
Узнать что за пользователь и откуда запускается
А смысл? Я и так вижу строки типа: Jul 26 03:47:13 host2 mysqld: 2020-07-26 3:47:13 140000680802048 [Warning] Access denied for user 'Admin2'@'localhost' (using password: YES)
Просто для вызова клиента mysql из консоли, надо в нее залогиниться, а у нас только 1 учетка под которой можно SSH пользовать и она у меня. Т.е. я в логах не вижу подозрительных входов перед появлением ошибки приведенной выше. По SSH только мои всегда. Значит скрипт. А если так, то надо как-то путь к скрипту найти. Вот как получить подробности хоть в тот-же messages?..
Роман Мирр, Учетка Admin2 не существует вообще. Как и множество других учеток мелькавших в логах. У некоторых клиентов название учетки mysql почти совпадает с названием домена, но не у всех. И в логах я видел попытки подобрать пароль к учетке которая на 100% совпадает с названием домена. Т.е. предполагаю, что тот кто занимается подбором знает не так много о том, куда попал.
Сейчас прогнал проверку rkhunter - ничего интересного он не нашел. поругался только на то, что не с чем сравнивать passwd.
Потом прошелся grep'ом по всем файлам какие нашлись в /var/www, нашел кучу словарей. Обрадовался, а оказалось, что битрикс зачем-то "из коробки" держит файлы со словарями (bitrix/modules/perfmon/admin/perfmon_tables.php). Зачем?..
Писать программу чтобы слушала 3306 порт - странное решение. Ведь порт уже занят. Да и IP адрес я и так знаю - 127.0.0.1 ибо снаружи уже несколько раз проверил - закрыт порт.
MrRitm, если только изнутри, то пункт 2 моего ответа. И только если не поможет, тогда 3.
Суть состоит в том, чтобы найти какой процесс создает соединение. По номеру процесса уже можно получить всю необходимую информацию.
Сейчас прогнал проверку rkhunter - ничего интересного он не нашел. поругался только на то, что не с чем сравнивать passwd.
если debian/ubuntu, то можно прогнать debsums. для других дистрибутивов должно быть аналогичное.
хотя если крутой руткит — то его фиг обнаружишь. но мне такие не попадались.
подмена ps и прочих попадалась.
через ss -np не пробовали искать процесс, который коннектится к мускулу? ну или lsof/netstat по вкусу.
Потом прошелся grep'ом по всем файлам какие нашлись в /var/www, нашел кучу словарей.
искали Admin2 и прочее? а в других местах искали?
вообще есть ощущение, что вы что-то простое забыли. вроде phpmyadmin, о котором писали.
Кажется я понял, что происходит. В Апачевом конфиге для Phpmyadmin ничего не написано про логи. А значит если кто-то ломится через него, я в логах апача ничего не увижу. Сейчас пытаюсь понять, как дописать в конфиги сбор логов для phpmyadmin. Не совсем понятно, куда вписывать пути к лог-файлам ибо это не отдельный virtualhost. Сейчас почему-то в error.log пишутся общие серверные логи, а вот пробная попытка зайти с левой учеткой через phpmyadmin не зафиксировалась.
Господа, всем огромное спасибо за идеи и участие. Проблема действительно оказалась именно в интерфейсе phpmyadmin который доступен снаружи при этом допускает ограниченное количество попыток ввода пароля.
Т.е. по сути пытаются подобрать пароль к базе для каждого сайта по отдельности, подставляя домен в качестве логина или если не базу сайта, то ставят логин admin, admin2 и прочее. Самое забавное, что пока даже логин ни разу существующий не встретился в логах. Так что думаю до подбора первой пары логин+пароль не то, что я, а планета не доживёт :-)
P.S.
Подскажите, как вопрос отметить решенным?
MrRitm, если есть доступ к машине по SSH, то phpmyadmin безопаснее всего отключить, а вместо него использовать с локальной машины MySQL Workbench или другой клиент MySQL через туннель SSH.
Роман Мирр, Дело в том, что доступ иногда нужен и клиентам. А им не объяснишь, как пользоваться SSH и что есть что-то помимо PMA для управления базой. edo1h, спасибо, Ваша идея в общем и привела к решению
MrRitm, если возможно, ограничьте доступ к PMA адресами клиентов на уровне iptables. Всё же PMA доступный интернету - это дыра.
Ещё лучше настроить VPN и пускать клиентов в PMA только через неё, в идеале каждого через собственную виртуальную подсеть.
вариант прошерстить все файлы на сервере на наличие строки "Admin2"
может быть найдется брутфорс скрипт с списком дефалт логинов или текстовый словарь и тд find / -type f | xargs grep "Admin2"
можно искать не от корня, а например в /home или /var и тд
SergeyDeryabin,
Это, скорее всего, скрипт. А значит, ему надо знать расположение проектов, их конфигураций и способ извлечения учёток.
Программно извлечь их нетривиально, т.к. есть много фреймворков и не только их.