Keith C. Perry via plug on 26 Aug 2021 16:54:50 -0700


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: [PLUG] my bash script to report rogue Microsoft 365 servers


I didn't know the problem was that bad.  Granted it is M$ but at the same time, DNS checks are the most basic thing that is done.

Question...  Aren't you already automatically blocking DNS mismatches to MX records?  I run Zimbra for my company and the blacklist functions take care of this.  While I might get phishing email, I don't get outright mismatches so I haven't had to think about it for a long time.

Am I misunderstanding what you are dealing with?

~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 
Keith C. Perry, MS E.E. 
Managing Member, DAO Technologies LLC 
(O) +1.215.525.4165 x2033 
(M) +1.215.432.5167 
www.daotechnologies.com

----- Original Message -----
From: "CJ Fearnley via plug" <plug@lists.phillylinux.org>
To: "PLUG List" <plug@lists.phillylinux.org>
Sent: Thursday, August 26, 2021 7:26:45 PM
Subject: [PLUG] my bash script to report rogue Microsoft 365 servers

Today I wrote a script to report to Microsoft all the rogue Microsoft
365 servers that tried to send me e-mail yesterday. After a few days of
testing, I will add it to my crontab.

Maybe JP will find an idea here for his book.

This is a David versus Goliath effort: I need all the help I can get.

So, I welcome any advice to improve the script or to further shame
Microsoft for their despicable 365 e-mail server management practices.

I wrote three tweets to notify them publically of their problems:
https://twitter.com/cjfsyntropy/status/1430551812059373568
https://twitter.com/cjfsyntropy/status/1430926526242037764
https://twitter.com/cjfsyntropy/status/1431029781693452289

Maybe you can modify the script to report Microsoft's rogue 365 mail
servers to them. Just point LOGFILE to any (preferably recent) archive
you have of e-mails that come from 365. You will probably have to modify
the regexes to find the sending server IP address. Once you have that
part working, my script should "just work".

My script found these 8:
20210826 15:35: Bad DNS report to IOC@microsoft.com: 104.47.20.59 mail-cwlgbr01lp2059.outbound.protection.outlook.com. 2(SERVFAIL)
20210826 15:38: Bad DNS report to IOC@microsoft.com: 40.107.212.70 mail-bn1nam07on2070.outbound.protection.outlook.com. 40.93.25.70
20210826 15:42: Bad DNS report to IOC@microsoft.com: 40.107.236.62 mail-bn8nam11on2062.outbound.protection.outlook.com. 40.93.28.62
20210826 15:48: Bad DNS report to IOC@microsoft.com: 40.107.244.59 mail-mw2nam12on2059.outbound.protection.outlook.com. 40.93.38.59
20210826 15:55: Bad DNS report to IOC@microsoft.com: 40.107.3.125 mail-eopbgr30125.outbound.protection.outlook.com. 2(SERVFAIL)
20210826 16:03: Bad DNS report to IOC@microsoft.com: 40.107.91.47 mail-dm3gcc02on2047.outbound.protection.outlook.com. 40.93.19.47
20210826 16:13: Bad DNS report to IOC@microsoft.com: 40.107.93.81 mail-dm6nam10on2081.outbound.protection.outlook.com. 40.93.21.81
20210826 16:25: Bad DNS report to IOC@microsoft.com: 40.107.94.69 mail-mw2nam10on2069.outbound.protection.outlook.com. 40.93.22.69

Here is the script (I'll put this one in the public domain so that if
you are an e-mail admin at Google or something there will be no qualms
about taking my code and shaming Microsoft with it):

#!/bin/bash

LOGFILE="/var/log/exim4/mainlog.1"
BADDOMAIN="outbound.protection.outlook.com"
MYAUDITLOG="/home/lfcjf/CheckRevDNS.log"
SENDTO="IOC@microsoft.com"
DELAY=85
CNT=1
for host in $(grep 'Reverse DNS mismatch' $LOGFILE|grep $BADDOMAIN| \
   awk '{print $4}'|sed -e 's/\[//' -e 's/]//'|sort -u); do
  FOR=$(host $host|awk '{print $5}');
  for IP in $(host $FOR|awk '/has address/ {print $4} /not found/ {print $5}'); do
    # echo "DEBUG: Compare $host $FOR $IP";
    if [ "$FOR" = "3(NXDOMAIN)" ]; then
      IPREPORT="$host does not resolve (NXDOMAIN error)."
    else
      IPREPORT="$host resolves as $FOR
That, in turn, resolves as $IP

Notice that $host != $IP !!!"
    fi
    if [ "$host" != "$IP" ]; then
MESSAGE="Our mail server received a connection yesterday from $host which we
judged to be rogue because its reverse DNS did not match forward DNS.

Debug output:
$IPREPORT

To increase e-mail security, best practices stipulate that forward and
reverse DNS should match on mail servers.

For more information, please reference
https://www.linuxmagic.com/best_practices/check_ip_reverse_dns.html

Please fix your DNS records to comply with this Internet best practice."
      echo "$MESSAGE" | mail -s "Bad reverse DNS for $host" $SENDTO
      echo "$(date +'%Y%m%d %H:%M'): Bad DNS report to $SENDTO: $host $FOR $IP" >> $MYAUDITLOG
      CNT=$((CNT+1))
      # echo "sleep for $((CNT*DELAY))"
      sleep $((CNT*DELAY))
      break
    fi;
  done
done

-- 
CJ Fearnley                 |   LinuxForce Inc.
cjf@LinuxForce.net          |   Hosting and Linux Consulting
https://www.LinuxForce.net  |   https://blog.LinuxForce.net
___________________________________________________________________________
Philadelphia Linux Users Group         --        http://www.phillylinux.org
Announcements - http://lists.phillylinux.org/mailman/listinfo/plug-announce
General Discussion  --   http://lists.phillylinux.org/mailman/listinfo/plug
___________________________________________________________________________
Philadelphia Linux Users Group         --        http://www.phillylinux.org
Announcements - http://lists.phillylinux.org/mailman/listinfo/plug-announce
General Discussion  --   http://lists.phillylinux.org/mailman/listinfo/plug