RTFM.WIKI

Ordnung muß sein. Ordnung über alles (18+)

Инструменты пользователя

Инструменты сайта


linux:mail:catch_spam

Поймай меня если сможешь

Если вы это читаете вероятно проблема с рассылкой спама вас уже коснулась и вы хотите как можно быстрее найти спамящий сайт и вывести в коридор и там расстрелять выгнать пользователя с вашего сервера.

Описываемый частный случай (CentOS/cPanel) с некоторыми оговорками может быть применём и в других случаях.

Откуда берутся эти чёртовы рассылки с моего сайта/сервера?

Мне известны следующие варианты. Я не эксперт по безопасности и возможно злые хэкеры умеют ломать как-то ещё.

Скрипты

С адресов [email protected] или [email protected] идёт огромное количество писем через php-скрипты. Это может быть и какой-нибудь старый уязвимый плагин Contact Form 7 или любой другой, через который смогли загрузить зловредные php-сценарии.

Компрометация паролей

Обычно в таком случае почта идёт с ваших почтовых аккаунтов вида [email protected]

Darkmailer или YellSOFT DirectMailer

Признаться честно ранее я не знал о существовании такого софта. Насколько я понял они работают в обход Exim (или другого MTA). Поэтому если у вас пустая очередь сообщений, но абузы идут, а вас добавляют в DNSBL, то может быть это именно оно.

Контрнаступление

Spamfu

Spamfu скрипт для анализа почтовой очереди и логов Exim

Пример работы скрипта

Показать

Скрыть

# ./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

<?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

Показать

Скрыть

*** 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: [email protected]
*** 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: [email protected]
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." <[email protected]>
Message-ID: <[email protected]>
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

<html>
<body>
Cerco un ragazzo giovane per il sesso.<br>
Mi piacciono dei ragazzi sportive.<br>
<a href="http://granovero.com/check.php?utm_source=69ldr7tv65&utm_medium=5yox5rvfvr&utm_campaign=4pss95ltc8&utm_term=qylm31qkxy&utm_content=o18gq79k67">Le fotografie sono qui.</a><br>
</body>
</html>



--b1_466f47ff57bd08f3b3178babce3474cd--

*** HEADER EXTRACTED deferred/2/2D2D616309 ***
named_attribute: encoding=8bit
original_recipient: [email protected]
recipient: [email protected]
*** 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 (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>

Ссылки

Обсуждение

Ваш комментарий. Вики-синтаксис разрешён:
 
linux/mail/catch_spam.txt · Последнее изменение: 2018/11/05 23:18 — 127.0.0.1