postfix疯狂外发垃圾邮件之分析与解决(上)

 

1,找出可能被盗号的用户!

通过maillog虽然看不到被拒绝邮件到底是谁发出的,但可以看到被拒绝投递的邮件ID.就比如下面两封邮件的ID分别为45C4E130CB 4728312BBA。这时候,我们可以查找到一些收信地址比较可疑的邮件来分析。

localhost# tail  /var/log/maillog

Oct 22 16:41:38 localhost postfix/error[18801]: 45C4E130CB: to=<blantonlarry@bellsouth.net>, relay=none, delay=101364, delays=95002/6357/0/5.3, dsn=4.0.0, status=deferred (delivery temporarily suspended: host gateway-f1.isp.att.net[204.127.217.16] refused to talk to me: 550-124.172.224.76 blocked by ldap:ou=rblmx,dc=att,dc=net 550 Error - Blocked for abuse. See http://att.net/blocks)

Oct 22 16:41:38 localhost postfix/error[18103]: 4728312BBA: to=<bhaitov@yahoo.com>, relay=none, delay=102971, delays=96576/6386/0/9.8, dsn=4.7.1, status=deferred (delivery temporarily suspended: host mta5.am0.yahoodns.net[66.94.237.139] refused to talk to me: 421 4.7.1 [TS03] All messages from 124.172.224.76 will be permanently deferred; Retrying will NOT succeed. See http://postmaster.yahoo.com/421-ts03.html)

.....

我们可以通过postcat -q命令来查看指定ID邮件的详细内容。比如我觉得ID2FDF423FA50的邮件很可疑,那么让我们详细看看邮件:

localhost# postcat -q 2FDF423FA50

*** ENVELOPE RECORDS deferred/2/2FDF423FA50 ***

message_size:            2428            4714              50               0            2428

message_arrival_time: Wed Oct 24 06:18:07 2012

create_time: Wed Oct 24 06:18:08 2012

named_attribute: log_ident=2FDF423FA50

named_attribute: rewrite_context=remote

named_attribute: sasl_method=LOGIN     <-----sasl认证通过

named_attribute: sasl_username=info@example.com   <-------认证用户名

sender: lindawatts101@yahoo.com.hk <-----伪造的发信者

named_attribute: log_client_name=unknown

named_attribute: log_client_address=68.167.29.196  <----登录客户端的ip

named_attribute: log_client_port=1464

named_attribute: log_message_origin=unknown[68.167.29.196]

named_attribute: log_helo_name=User

named_attribute: log_protocol_name=ESMTP

named_attribute: client_name=unknown

named_attribute: reverse_client_name=h-68-167-29-196.mclnva23.static.covad.net

named_attribute: client_address=68.167.29.196

named_attribute: client_port=1464

named_attribute: helo_name=User

named_attribute: protocol_name=ESMTP

named_attribute: client_address_type=2

named_attribute: dsn_orig_rcpt=rfc822;ajagoodin@yahoo.com

original_recipient: ajagoodin@yahoo.com

recipient: ajagoodin@yahoo.com <------收件人1

named_attribute: dsn_orig_rcpt=rfc822;ajagostinelli@cox.net

original_recipient: ajagostinelli@cox.net <------收件人2

recipient: ajagostinelli@cox.net

named_attribute: dsn_orig_rcpt=rfc822;ajagra2001@yahoo.com

original_recipient: ajagra2001@yahoo.com <------收件人3

recipient: ajagra2001@yahoo.com

.........

通过上面的这封邮件,我们可以知道,这封邮件是由info@example.com.这个用户来认证登录的。登录者IP 68.167.29.196。该用户将发信人伪造成:lindawatts101@yahoo.com.hk。并且同时发送很多封邮件出去! 如果真存在lindawatts101@yahoo.com.hk这个用户的话,那这个用户信箱估计也被塞满了无数退信邮件.

很显然,上面这封邮件并不是一封正常邮件!通过这封邮件很快就可以确定这个用户的密码很可能是被别人破解了!或者邮件系统有其它漏洞,***者亲自建立了该用户用来群发邮件。

搜索/var/spool/postfix/defrred目录下面的ip 68.167.29.196,发现有5600邮件被阻塞着。而且还在不断增加。且用户均为info@example.com。可以确定,IP 68.167.29.196为***者

localhost#  cd /var/spool/postfix/defrred

localhost# find . -exec grep "68.167.29.196" {} \; | wc -l

5625

登录数据库查看info@example.com这个用户的创建情况。这个在webman管理后台上面是看不到的。

localhost# /usr/opt/local/mysql-5.1.47/bin/mysql -uextmail -pextmail

mysql> select * from mailbox where  username='info@example.com'\G;

*************************** 1. row ***************************

        username: info@example.com

             uid: info

        password: $1$RpyMEokE$CK31uufL9uNk6PjqSorXa1

        clearpwd: 

            name: 

        mailhost: 

         maildir: example.com/info/Maildir/

         homedir: example.com/info

           quota: 524288000S

    netdiskquota: 524288000S

          domain: example.com

       uidnumber: 1000

       gidnumber: 1000

      createdate: 2012-04-25 15:35:54    <-----创建日期

      expiredate: 0000-00-00

          active: 1

disablepwdchange: 0

    disablesmtpd: 0

     disablesmtp: 0

  disablewebmail: 0

  disablenetdisk: 0

     disableimap: 1

     disablepop3: 0

        question: 

          answer: 

1 row in set (0.00 sec)

mysql> select * from manager;

+------------------+------------------------------------+-------+------+------------+-------------+-----------+------------------+---------------------+------------+--------+

| username         | password                           | type  | uid  | name       | question    | answer    | disablepwdchange | createdate          | expiredate | active |

+------------------+------------------------------------+-------+------+------------+-------------+-----------+------------------+---------------------+------------+--------+

| root@extmail.org | $1$ZwYBBBz1$mh.Uwro5vqXMwYum0eprq/ | admin | root | Super User | my question | my answer |                0 | 2007-02-14 15:10:04 | 2010-11-08 |      1 |

+------------------+------------------------------------+-------+------+------------+-------------+-----------+------------------+---------------------+------------+--------+

管理员账号只有一个,info@example.com也不是新建的。那应该是Info@example.com的用户密码被破解了。

来看看info@example.com这个用户的登录日志。发现全是由68.167.29.196的主机登录的。

localhost# cat /var/log/maillog | grep info@example.com

Oct 24 00:32:10 localhost postfix/smtpd[4202]: 8F005249014: client=unknown[68.167.29.196], sasl_method=LOGIN, sasl_username=info@example.com

Oct 24 00:32:16 localhost postfix/smtpd[5029]: 11044249024: client=unknown[68.167.29.196], sasl_method=LOGIN, sasl_username=info@example.com

Oct 24 00:32:17 localhost postfix/smtpd[4626]: 930FB249028: client=unknown[68.167.29.196], sasl_method=LOGIN, sasl_username=info@example.com

Oct 24 00:32:17 localhost postfix/smtpd[4765]: A890624902B: client=unknown[68.167.29.196], sasl_method=LOGIN, sasl_username=info@example.com

登录extmaninfo@example.com这个用户的密码改掉。

我们登录info@example.com来看看用户情况。结果发现有一万多封退信信息,由于这个账号没人用,所以一直未发现这个问题。

2,清除所有缓存垃圾邮件,阻止邮件服务器继续偿试外发!

清除deferdeferred目录下的缓存邮件

我们来瞧瞧邮件缓存目录

localhost# du -sh /var/spool/postfix/*

2.1G    /var/spool/postfix/defer

2.7G    /var/spool/postfix/deferred

可以看到,被延迟发送的邮件占用了5g的空间!

清除邮件中的所有队列

localhost# postsuper -d ALL 

postsuper: Deleted: 292551 messages

共清除了将近30万封缓存的邮件。

-------------------------------------------------------

如果缓存邮件里面有重要邮件,不能删除所有邮件,那么也可以写一个脚本,只清除所有属于68.167.29.196的缓存邮件。

localhost# vi deldefer.sh

#删除defferred中的缓存

cd /var/spool/postfix/deferred/

find . -exec grep 68.167.29.196 {} \; | awk '{print $3}' | cut -d/ -f3 >/tmp/del.txt

for i  in `cat /tmp/del.txt`

        do

        postsuper -d "$i"

        done

rm -rf /tmp/del.txt

#删除deffer中的缓存

cd /var/spool/postfix/defer

for i in `find .|cut -d/ -f3`

        do

        postcat -q $i |grep 68.167.29.196

                if [ $? -eq 0 ];

                then

                echo $i >> /tmp/defer.txt

                postsuper -d $i

                fi

        done

rm -rf /tmp/defer.txt

脚本说明:

在删除defferdefferred下面的缓存邮件的脚本是不同的。由于defer下的缓存邮件用cat直接查看是看不到发件人及登录ip等详细信息的,需要用postcat来查看才能显示出详细的信息。所以deffer目录里的清除脚本写法和上面defferred的有些不同。注意:在删除了deferred下面的缓存后,如果不删除defer的缓存,defer下的邮件仍然会被不停的投递出去,直到最后变为deferred之后才会放弃。所以,如果只删除deferred下面的邮件而不删除defer下面的邮件的话,过不了多久,deferred下面又会出现大量邮件,而这个邮件是由defer目录下的缓存引起的。

-------------------------------------------------------

再次查看缓存目录,容量终于恢复正常值。

localhost# du -sh /var/spool/postfix/*

162K    /var/spool/postfix/defer

 46K    /var/spool/postfix/deferred

删除info@example.com用户邮箱的退信邮件

下面该删除info@example.com用户的所有退信邮件了.通过查看邮件发现所有的垃圾邮件均是今天一天生成的。到服务器端查找并删除今天的所有邮件。

进入到info用户的邮件目录

localhost# cd /usr/opt/home/domains/example.com/info/Maildir/

可以看到有12779封邮件。

localhost# ls -l cur/ |wc -l

   12779

查找今天生成的邮件,共11589

localhost# find cur/ -ctime -1 | wc -l     

   11589

删除所有今天的邮件

localhost# find cur/ -ctime -1 -exec rm -f {} \;

删除完毕!

注意find cur/ -ctime -1 -exec rm -f {} \; 中是rm -f !不要写成了rm -rf。否则一执行就把cur目录给删掉了。那么用户以前的邮件也全带着一起删除了!

至此,邮件服务器终于恢复了正常运行。再次用tail -f 来查看日志,不会再出现那恐怖的疯狂刷屏日志了!疯狂的服务器终于恢复了原来的悠闲状态!

 

3,禁止认证用户假冒发信人外发

修改main.cf配置文件,增加发信人限制功能!

localhost# vi main.cf

mynetworks = 127.0.0.0/8

smtpd_sender_restrictions =

        permit_mynetworks,

        reject_sender_login_mismatch,

        reject_non_fqdn_sender, 

        reject_authenticated_sender_login_mismatch,

        reject_unauthenticated_sender_login_mismatch,

        reject_non_fqdn_recipient,

        reject_invalid_hostname,

        reject_unknown_sender_domain,

        check_sender_access hash:/etc/postfix/sender_access

smtpd_sender_login_maps =

        mysql:/etc/postfix/mysql_virtual_sender_maps.cf,

        mysql:/etc/postfix/mysql_virtual_alias_maps.cf

localhost# postfix reload

在客户端测试效果:

客户端伪造发信人测试,test1@example.com伪造成发件人test@yahoo.com未成功!

[root@mail ~]# perl -MMIME::Base64 -e "print encode_base64('123456');"         

MTIzNDU2

[root@mail ~]# perl -MMIME::Base64 -e "print encode_base64('test1@example.com');"

dGVzdDFAZXhhbXBsZS5jb20=

[root@mail ~]# telnet mail.example.com 25

Trying 124.172.224.76...

Connected to mail.example.com (124.172.224.76).

Escape character is '^]'.

auth login

220 mail.example.com ESMTP Postfix

334 VXNlcm5hbWU6

dGVzdDFAZXhhbXBsZS5jb20=

334 UGFzc3dvcmQ6

MTIzNDU2

235 2.7.0 Authentication successful

mail from:test@yahoo.com

250 2.1.0 Ok

rcpt to:445335413@qq.com

553 5.7.1 <test@yahoo.com>: Sender address rejected: not owned by user test1@example.com

客户端用真实的地址发信测试成功

[root@mail ~]# telnet mail.example.com 25

Trying 124.172.224.76...

auConnected to mail.example.com (124.172.224.76).

Escape character is '^]'.                                                     220 mail.example.com ESMTP Postfix

auth login

334 VXNlcm5hbWU6

dGVzdDFAZXhhbXBsZS5jb20=

334 UGFzc3dvcmQ6

MTIzNDU2

235 2.7.0 Authentication successful

mail from:test1@example.com

250 2.1.0 Ok

rcpt to:445335413@qq.com

250 2.1.5 Ok

Ok,测试成功!

 

关于邮件服务器被yahoo,gmail,hotmail等邮件服务器列入黑名单问题,这个最好是换个ip地址吧。一个个申诉太麻烦了!

 

欢迎各位批评指导,共同探讨!