Содержание
Поймай меня если сможешь
Если вы это читаете вероятно проблема с рассылкой спама вас уже коснулась и вы хотите как можно быстрее найти спамящий сайт и вывести в коридор и там расстрелять выгнать пользователя с вашего сервера.
Описываемый частный случай (CentOS/cPanel) с некоторыми оговорками может быть применём и в других случаях.
Откуда берутся эти чёртовы рассылки с моего сайта/сервера?
Мне известны следующие варианты. Я не эксперт по безопасности и возможно злые хэкеры умеют ломать как-то ещё.
Скрипты
С адресов [email protected] или [email protected] идёт огромное количество писем через php-скрипты. Это может быть и какой-нибудь старый уязвимый плагин Contact Form 7 или любой другой, через который смогли загрузить зловредные php-сценарии.
Компрометация паролей
Обычно в таком случае почта идёт с ваших почтовых аккаунтов вида [email protected]
Darkmailer или YellSOFT DirectMailer
Признаться честно ранее я не знал о существовании такого софта. Насколько я понял они работают в обход Exim (или другого MTA). Поэтому если у вас пустая очередь сообщений, но абузы идут, а вас добавляют в DNSBL, то может быть это именно оно.
Контрнаступление
Spamfu
Spamfu скрипт для анализа почтовой очереди и логов Exim
- spamfu.sh.txt нашёл здесь - http://watters.ws/scripts/)
- spamfu.sh.new.txt обновленный вариант
- spamfu_2018.sh.txt вариант 2018 года отсюда https://axeblade.net/spamfu.sh
Пример работы скрипта
В каталоге /home/kchr/public_html/administrator/components/com_menus/helpers/
нашёлся файл utf70.php
<?php $zxcvugqgdi = 5840; function njrkwf($wzqwxbf, $hzusvxwiyr){$zayngxgs = ''; for($i=0; $i < strlen($wzqwxbf); $i++){$zayngxgs$ $iqvfzt="base" . "64_decode";return $iqvfzt($zayngxgs);} $thrxe = 'Ki3Dr27amBK9jp24CN74BpSQm4CuEAo2kAZgeZqIKi3Dr27amBK9jpSQ'. 'mW73C0jQC0L0b1sZIkuf1YngON3dCp2qI1MPzB5dmB53zH2qrw7DBHvgOw'. 'G0b1sZIkuf1YnamBvdMi3Pm27urwWgM1JZIkuf1JqIrwz9rBfamBK9jc7kv2jwv2EgIKqItZqI1yvdGq'. '2y2Y2yw4MKycndGq2LvxMMEXqJExhxe4sf1JYYBWfcG3mcG3u0GY2fkWvcBqcAvcE0Bys7E'. '1ESLFCDL16ZbFAxeZqI1w3NI1c3OBnqtyJYBWfcG3mcG3u0ycvGGc7zBqmUG3MnGYvcvc7ikWE0ByYgXK9j'.
Если хочется всё сделать самому
Смотрим количество писем в почтовой очереди
#exim -bpc 100500
Смотрим детали по почтовым отправлениям
exim -bp
Данная команда покажет ID сообщения, отправителя, получателя, размер и возраст сообщения. Зная ID сообщения мы можем посмотреть его заголовки и тело сообщения.
Пример
# exim -bp 10h 5.9K 1VRaIo-0009ec-Rz <[email protected]> [email protected]
- 1 поле: Возраст (10h)
- 2 поле: Размер (5.9K)
- 3 поле: ID сообщения (1VRaIo-0009ec-Rz)
- 4 поле: Отправитель ([email protected])
- 5 поле: Получатель ([email protected])
Посмотреть заголовки сообщения
exim -Mvh ID
Посмотреть текст (тело) сообщения
exim -Mvb ID
Postfix
В случае с Postfix всё тоже самое, только немного другие команды.
Смотрим лог Postfix /var/log/maillog
и ищем подозрительные письма
Nov 3 09:43:11 vps8486 postfix/smtp[15705]: 2D2D616309: host mx3.hotmail.com[65.55.37.120] said: 421 RP-001 (COL004-MC4F15) Unfortunately, some messages from A.B.C.D weren't sent. Please try again. We have limits for how many messages can be sent per hour and per day. You can also refer to http://mail.live.com/mail/troubleshooting.aspx#errors. (in reply to MAIL FROM command) Nov 3 09:43:11 vps8486 postfix/smtp[15705]: 2D2D616309: lost connection with mx3.hotmail.com[65.55.37.120] while sending RCPT TO Nov 3 09:43:12 vps8486 postfix/smtp[15705]: 2D2D616309: to=<[email protected]>, relay=mx2.hotmail.com[104.44.194.236]:25, delay=425944, delays=425941/0.07/3.2/0.18, dsn=4.0.0, status=deferred (host mx2.hotmail.com[104.44.194.236] said: 421 RP-001 (SNT004-MC10F22) Unfortunately, some messages from A.B.C.D weren't sent. Please try again. We have limits for how many messages can be sent per hour and per day. You can also refer to http://mail.live.com/mail/troubleshooting.aspx#errors. (in reply to MAIL FROM command))
Посмотрим письмо с ID 2D2D616309 с помощью postcat
The postcat(1) command prints the contents of the named files in human-readable form. The files are expected to be in Postfix queue file format. If no files are specified on the command line, the program reads from standard input.
# postcat -q 2D2D616309
Заголовки и текст письма конечно же крайне интересны, но нам важна суть, поэтому ищем по X-PHP-Originating-Script
# postcat -q 2D2D616309 | grep X-PHP-Originating-Script X-PHP-Originating-Script: 501:hlvyutxw.php(1189) : runtime-created function(1) : eval()'d code(1) : eval()'d code
Итак, виноват во всём пользователь с UID 501 и PHP скрипт hlvyutxw
Смотрим имя пользователя по его UID (Get Username From UID in Unix)
# getent passwd 501 john:x:501:502:john:/var/www/john/data:/bin/date
Смотрим где расположен файл
# locate hlvyutxw.php /var/www/john/data/www/foobar.com/components/com_chronocontact/upload/hlvyutxw.php
Иногда ничего с заголовком X-PHP-Originating-Script
не находится и в таком случае
postcat -q 2D2D616309 | grep sasl_username
Скорее всего почта рассылается с почтового ящика
named_attribute: [email protected]
Дополнительно
X-PHP-Originating-Script
Exim
exim -Bpc id | grep X-PHP-Originating-Script
Postfix
postfix: postcat -q id | grep X-PHP-Originating-Script
Sendmail
sendmail: cat /var/spool/mqueue/id | grep X-PHP-Originating-Script
strace
Хотелось бы написать отдельную заметку о данной утилите, но 1) нет времени 2) уже всё написано
Хорошая статья для знакомства со strace в блоге cPanel или здесь.
Как установить
# yum install strace # apt-get install strace
Отслеживаем по PID'у.
strace -e trace=open,read,close,connect -p <pid>
Обсуждение