====== Поймай меня если сможешь ====== Если вы это читаете вероятно проблема с рассылкой спама вас уже коснулась и вы хотите как можно быстрее найти спамящий сайт и вывести в коридор и там расстрелять выгнать пользователя с вашего сервера. {{:linux:mail:spam_can.png?nolink&150|}} Описываемый частный случай (CentOS/cPanel) с некоторыми оговорками может быть применём и в других случаях. ===== Откуда берутся эти чёртовы рассылки с моего сайта/сервера? ===== Мне известны следующие варианты. Я не эксперт по безопасности и возможно злые хэкеры умеют ломать как-то ещё. **Скрипты** С адресов nobody@foo.bar.com или john@foo.bar.com идёт огромное количество писем через php-скрипты. Это может быть и какой-нибудь старый уязвимый плагин Contact Form 7 или любой другой, через который смогли загрузить зловредные php-сценарии. **Компрометация паролей** Обычно в таком случае почта идёт с ваших почтовых аккаунтов вида john@foobar.com **Darkmailer или YellSOFT DirectMailer** Признаться честно ранее я не знал о существовании такого софта. Насколько я понял они работают в обход Exim (или другого MTA). Поэтому если у вас пустая очередь сообщений, но абузы идут, а вас добавляют в DNSBL, то может быть это именно оно. ===== Контрнаступление ===== ==== Spamfu ==== Spamfu скрипт для анализа почтовой очереди и логов Exim * {{ :linux:mail:spamfu.sh.txt |}} нашёл здесь - http://watters.ws/scripts/) * {{ :linux:mail:spamfu.sh.new.txt |}} обновленный вариант * {{ :linux:mail:spamfu_2018.sh.txt |}} вариант 2018 года отсюда https://axeblade.net/spamfu.sh {{:linux:mail:catch_spam.jpg?nolink|}} Пример работы скрипта # ./spamfu.sh #################################### SpamFu for Dummies: There are currently 910901 emails in the queue What would you like to do?: (1) Check for spammers via email logs (2) Check for spammers via emails in the queue (3) Exit Select option: 1 You have selected 1 ########################################################## Parsing a large file with lots of checks can take a while Choose options to pick which logfile, which checks to perform as well as how many lines of the file to parse LOGFILE: exim_mainlog SIZE: 107M (1) Proceed with check (2) Change log file (3) Change which checks are performed (4) Change how many lines to parse (5) Main Menu Select option: 1 Checking for scripts... Emails sent from scripts: 109472 cwd=/home/kchr/public_html/administrator/components/com_menus/helpers 58 cwd=/home/kchr/public_html 46 cwd=/ 19 cwd=/root 1 cwd=/usr/local/cpanel/whostmgr/docroot 1 cwd=/home/politika09/public_html/wp-admin 1 cwd=/home/blagodari/public_html Checking for auth users... Most emails sent by authenticated users: Checking for cpanel/system accounts... Emails sent from cpanel/system accounts: 109529 kchr 58 root 1 politika09 1 blagodari Checking for recipients... Most recipients by Mail and Sender ID's: <= with 1 recipients was sent by U=kchr 0 with 0 recipients was sent by 0 0 with 0 recipients was sent by 0 0 with 0 recipients was sent by 0 0 with 0 recipients was sent by 0 0 with 0 recipients was sent by 0 0 with 0 recipients was sent by 0 0 with 0 recipients was sent by 0 0 with 0 recipients was sent by 0 0 with 0 recipients was sent by 0 0 with 0 recipients was sent by 0 0 with 0 recipients was sent by 0 0 with 0 recipients was sent by 0 0 with 0 recipients was sent by 0 0 with 0 recipients was sent by 0 В каталоге ''/home/kchr/public_html/administrator/components/com_menus/helpers/'' нашёлся файл ''utf70.php'' ==== Если хочется всё сделать самому ==== Смотрим количество писем в почтовой очереди #exim -bpc 100500 Смотрим детали по почтовым отправлениям exim -bp Данная команда покажет ID сообщения, отправителя, получателя, размер и возраст сообщения. Зная ID сообщения мы можем посмотреть его заголовки и тело сообщения. Пример # exim -bp 10h 5.9K 1VRaIo-0009ec-Rz putin@kermlin.com * 1 поле: Возраст (10h) * 2 поле: Размер (5.9K) * 3 поле: ID сообщения (1VRaIo-0009ec-Rz) * 4 поле: Отправитель (alexey@navalni.com) * 5 поле: Получатель (putin@kermlin.com) Посмотреть заголовки сообщения 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=, 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 с помощью [[http://www.postfix.org/postcat.1.html|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 *** ENVELOPE RECORDS deferred/2/2D2D616309 *** message_size: 1498 179 1 0 1498 message_arrival_time: Sun Oct 29 11:24:08 2017 create_time: Sun Oct 29 11:24:08 2017 named_attribute: rewrite_context=local sender_fullname: m27701 sender: amalia.b@dvlgroup.ru *** MESSAGE CONTENTS deferred/2/2D2D616309 *** Received: by vps8486.nqhost.com (Postfix, from userid 501) id 2D2D616309; Sun, 29 Oct 2017 11:24:08 +0000 (UTC) To: giuseppegalluzzo@live.it Subject: =?utf-8?Q?Entra_il_nostro_club_e_fai_l=E2=80=99amore?= X-PHP-Originating-Script: 501:hlvyutxw.php(1189) : runtime-created function(1) : eval()'d code(1) : eval()'d code Date: Sun, 29 Oct 2017 11:24:08 +0000 From: "Amalia B." Message-ID: <466f47ff57bd08f3b3178babce3474cd@dvlgroup.ru> X-Mailer: PHPMailer 5.2.23 (https://github.com/PHPMailer/PHPMailer) MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="b1_466f47ff57bd08f3b3178babce3474cd" Content-Transfer-Encoding: 8bit This is a multi-part message in MIME format. --b1_466f47ff57bd08f3b3178babce3474cd Content-Type: text/plain; charset=us-ascii Cerco un ragazzo giovane per il sesso. Mi piacciono dei ragazzi sportive. { http://granovero.com/check.php?utm_source=69ldr7tv65&utm_medium=5yox5rvfvr&utm_campaign=4pss95ltc8&utm_term=qylm31qkxy&utm_content=o18gq79k67 } Le fotografie sono qui. --b1_466f47ff57bd08f3b3178babce3474cd Content-Type: text/html; charset=us-ascii Cerco un ragazzo giovane per il sesso.
Mi piacciono dei ragazzi sportive.
Le fotografie sono qui.
--b1_466f47ff57bd08f3b3178babce3474cd-- *** HEADER EXTRACTED deferred/2/2D2D616309 *** named_attribute: encoding=8bit original_recipient: giuseppegalluzzo@live.it recipient: giuseppegalluzzo@live.it *** MESSAGE FILE END deferred/2/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 ([[https://www.unixtutorial.org/2008/05/get-username-from-uid-in-unix/|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: sasl_username=user@hackedpassword.com ===== Дополнительно ===== ==== 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 в [[https://blog.cpanel.com/starting-with-strace/|блоге cPanel]] [[https://math-linux.com/linux/tutorials/article/strace-tool-linux-debugging-troubleshooting|или здесь]]. Как установить # yum install strace # apt-get install strace Отслеживаем по PID'у. strace -e trace=open,read,close,connect -p ===== Ссылки ===== * https://iserversupport.com/find-spammer-on-cpanel-exim-server/ * https://crybit.com/check-spamming-on-server-having-exim/ * http://www.donsblog.geek.nz/chasing-out-the-joomla-spammer/ * http://www.tech-notes.net/postfix-sends-spam/ * https://www.watters.ws/mediawiki/index.php/Spam_Procedure#Malicious_scripts