====== Поймай меня если сможешь ======
Если вы это читаете вероятно проблема с рассылкой спама вас уже коснулась и вы хотите как можно быстрее найти спамящий сайт и вывести в коридор и там расстрелять выгнать пользователя с вашего сервера.
{{: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