Gehackte Mailaccounts

Mit schöner Regelmäßigkeit werden Provider, Firmen, Portale und andere Dienste um Daten "erleichtert". Das kann durch einen klassischen Einbrucht, durch die Ausnutzung einer Sicherheitslücke, durch Phishing oder durch unseriöse Mitarbeiter erfolgen, die beim Verlassen ihres Arbeitgebers eine Kopie von Kundendaten mitnehmen. Im Gegensatz zu echter Hardware fällt die Kopie einer Datei im Gigabyte-Bereich nicht wirklich auf. Sie können verkauft oder auch einfach nur als Rufschädigung später im Internet auftauchen. Im Oktober 2013 hat es z.B. Adobe getroffen, mit dem Resultat, dass die E-Mail-Adressen und (schwach) verschlüsselten Passwörter von über 153 Millionen Menschen öffentlich wurden. Auch das gehackte Seitensprungportal "Ashley Madison" hat gezeigt wie leichtsinnig bzw. stümperhaft auch anscheinend große Portale mit Daten umgehen.

Das Risiko

In vielen Fällen werden E-Mail-Adressen zugleich als Anmeldenamen verwendet. Wenn nun durch einen Einbruch diese Daten in fremde Hände gekommen sind, dann reiben sich gleich mehrere kriminelle Personen die Hände:

  • Spamversender
    Diese freuen sich über eine Liste von Mailadressen die einen hohen Anteil "echter Personen" repräsentiert und im Idealfall fast gar keine Spamtraps enthalten.
  • Account-Diebe
    Für diese Personengruppe ist das Kennwort oder ein vielleicht einfach zu knackender Hashwert zu einem Konto noch viel interessanter. Zum einen kann so das Konto bei der beklauten Firma übernommen werden. Monetär lässt sich dies durch eine Erpressung des Kontoinhabers, eine Erpressung des Betreibers oder direkt als Missbrauch durch den Bezug von Leistungen auswerten. In zweiter Näherung liegt der Verdacht nahe, dass der Anwender die Zugangsdaten und das Kennwort vielleicht noch bei anderen Diensten genutzt hat.

In beiden Fällen sollten Konto-Inhaber sehr schnell davon in Kenntnis gesetzt werden, dass sein Konto kompromittiert ist und er möglichst umgehend seine Zugangsdaten ändert. Dass seine Mailadresse nun in verschiedenen Listen erscheint, kann er nicht mehr rückgängig machen. Hier ist dann wieder das Spamschutz (z.B. NoSpamProxy) gefordert

Ist mein Konto auf der Liste ?

Die meisten Anwender sind nun nicht so bewandert, in Listen und "dunklen" Webseiten nach solchen Datenbeständen zu stöbern und darin ihre Konten zu suchen. Oft verbreiten solche Seiten nur noch weiteren Schadcode, den unbedarfte Anwender besser nicht zu nahe treten. Um es mit einem Vergleich zu sagen:

Wenn ihnen der Geldbeutel geklaut worden ist, dann würden Sie doch sicher nicht in den Hinterhöfe und dunklen Gassen einer Stadt gehen, um diese wieder zu finden. Der Verlust des Bargelds ist bitter aber versuchen sie möglichst schnell ihre Bankkarten und ePerso sperren zu lassen.

Aber es gibt Personen, die genau diese Listen mit kompromittierten Konten  sammeln und auf ihrer Webseite bereit stellen. Eine der Seiten ist die Website haveibeenpwned.com, auf der Listen mit kompromittierten E-Mail-Adressen gesammelt werden.

Wenn Sie den Angaben auf der Seite vertrauen, dann waren dort (Stand Sep2015) über 220Mio Accounts von 53 Webseiten verzeichnet. Sie können hier im Formular ihre Mailadresse eingeben und die Webseite meldet ihnen umgehend, ob diese in einer der hinterlegten Datenbanken verzeichnet ist.

Ich kann natürlich nicht für die Seriosität dieser Webseite einstehen. Sie hinterlassen dort eine Mailadresse und natürlich könnte der Betreiber genau diese Mailadresse ja als "von einem Mensch eingegeben" weiterverkaufen.

haveibeenpwned.com und WebService

Interessant ist der Service von haveibeenpwned.com in einer anderen Hinsicht: Auf der Webseite können Sie immer nur genau eine Mailadresse eingeben. Ich habe noch keinen Weg gefunden, z.B. eine Liste in einem Formular hochzuladen. Das ist aber auch gar nicht erforderlich, denn die Webseite bietet auch eine API

Es ist eine RESTful API, bei der relativ einfach über URLs eine Anfrage ausgeführt werden kann. Hier ein rudimentäres Skript für die Anfrage einer Mailadresse

$address = "someone@example.com"
$request = Invoke-WebRequest `
   -uri "https://haveibeenpwned.com/api/v2/breachedaccount/${address}?truncateResponse=true" `
   -UseBasicParsing
$breaches =  (ConvertFrom-Json $request.Content)
$breaches

Alternativ geht es auch mit "Invoke-RestMethod", die direkt das Ergebnis liefert.

$address = "someone@example.com"
$request = Invoke-RestMethod `
   -Method get `
   -Uri "https://haveibeenpwned.com/api/v2/breachedaccount/${address}?truncateResponse=true"
$request

Wenn die Mailadresse NICHT in einer der Listen enthalten ist, dann antwortet der WebService ganz einfach mit einem 404-Fehler.

Dieser Fehler muss natürlich abgefangen werden. Aber damit ist die Basis für eine weitere Verarbeitung gelegt 

Als Firma könnten Sie nun alle internen Mailadressen einmal gegen diesen Service evaluieren. Aber auch Spamfilter und Mail-Verarbeiter, Plattformbetreiber, Hoster etc. könnten Adressen, die Sie z.B. durch Anmeldevorgänge können, gegen solch einen Service evaluieren. Sie brauchen dazu nur:

  1. Ein PowerShell-Script 
    welches mit der Liste der Mailadressen gefüttert wird
  2. Eine Liste von Anmeldedaten
    z.B. die UPN-Adressen ihrer AD-Benutzer, die Mailadressen ihrer Benutzer. Denkbar ist aber auch, dass Sie die Mailadressen ihrer Kommunikationspartner mit prüfen und ggfls. diese darüber informieren.

Skript zur Verifikation von Mailadressen

Mein Kollege Henning Krause hat die wichtige Vorarbeit geleistet, weil wir so eine Absenderprüfung natürlich auch gut in NoSpamProxy integrieren können. für die Windows und Exchange-Administratoren habe ich aber leicht veränderten Ansatz gewählt.

test-PwnedAddress.ps1.txt
Nach dem Download bitte die Extension anpassen.

Achtung:
Aufgrund von Missbrauch mit sehr viel Traffic hat der Autor ab dem 12. Sep 2016 ein "Message Limit" eingeführt. Zwischen jeder Anfrage muss nun 1,5 Sekunden liegen. Ich habe im Skript dazu ein "Start-Sleep -seconds 2" addiert, um auf der sicheren Seite zu sein.
https://www.troyhunt.com/the-have-i-been-pwned-api-rate-limiting-and-commercial-use/

Das Skript akzeptiert als Parameter "SMTPAddress" eine Mailadresse. Sie können aber auch einfach per Pipeline eine ganze Liste von Mailadressen Eintüten und erhalten als Ausgabe eine Liste der Mailadressen samt der Quelle des Einbruchs. So kann das aussehen, wenn die SMTP-Adressen aus einer Textdatei kommen.

Die Adressen sind eine Momentaufnahme gewesen. Auf der URL https://haveibeenpwned.com/Pastes/Latest finden Sie immer aktuelle Accounts, die sie zum Test nutzen können. Dank der Pipeline geht es natürlich auch besser

get-content datei | test-pwndedaddress.ps1 | export-csv result.csv" arbeiten

So kann einfach eine Textdatei ausgelesen werden. Und in den folgenden Abschnitten sehen Sie, wie sie Mailadressen aus dem AD, aus Exchange und sogar NoSpamProxy auslesen und dann über die Pipeline einfach dem Skript zuleiten können.

Adressen aus Active Directory

Wer ein Active Directory, ggfls. noch mit Exchange Server betreibt, kann gleich aus mehreren Quellen die Mailadressen extrahieren:

  • Einfacher Export aus dem Active Directory per LDAP
    Das ist der schnellste Weg, wenn jemand direkt Zugriff per LDAP auf einen GC hat. Hier ein Beispiel:
$root = [system.directoryservices.activedirectory.forest]::getcurrentforest().rootdomain.name
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher([ADSI]"GC://$root")
#$objSearcher = New-Object System.DirectoryServices.DirectorySearcher([ADSI]"GC://$root",$sourceUser,$sourcepass)
$objSearcher.PageSize = 1000
$objSearcher.Filter = "(&(mail=*))"
$objSearcher.PropertiesToLoad.Add("mail") | Out-Null
$objSearcher.PropertiesToLoad.Add("ProxyAddresses") | Out-Null


$colResults = $objSearcher.FindAll()
foreach ($objResult in $colResults) {
    $mail = $objResult.properties.mail[0]
    $mail
}

Natürlich können Sie auch z.B. den UPN exportieren oder über die "ProxyAddresses" noch viel mehr Mailadressen generieren.

Adressen aus Exchange

Möchte man lieber alle Adressen aus Exchange auslesen, so können Sie folgenden Codeschnipsel verwendet:

Get-Recipient `
   | select emailaddresses -ExpandProperty emailaddresses `
   | select smtpaddress

Damit werden alle SMTP-Adressen aus den ProxyAddressen als Liste ausgegeben. Beachten Sie aber, dass z.B. "X400"-Adressen und andere Typen eine "leere" Zeile liefert.

Adressen von NoSpamProxy

Für Nutzer von NoSpamProxy ist eine solche Liste seit der Version 10 über die neue PowerShell-Schnittstelle verfügbar:

Get-NSPUser | `
   foreach { `
      $_.MailAddresses`
   } `
   | foreach {`
      $_.Address.Address `
   }

Check von Kennworten

Auch umgekehrt ist eine Analyse durchaus interessant. Stellen Sie sich vor, ein Anwender muss ein Kennwort vergeben und gibt es an der Stelle natürlich noch im Klartext ein. Das Kennwort könnte automatisch zu einem Hashwert umgerechnet und gegen den Webservice getestet werden. Hier eine Kurzfassung eines Skripts.

# TLS 1.2 erzwingen
[Net.ServicePointManager]::SecurityProtocol='Tls12'

# Kennwort in eine Datei schreiben
'P@ssw0rd'| set-content .\passport.txt -N;

# Hashwert ermitteln
$a,$b=(Get-FileHash .\passport.txt -A SHA1 | % h*) -split '(?<=^.{5})'

# Hashwerte gegen api.pwnedpasswords.com pruefen
$breaches = ((invoke-restmethod "https://api.pwnedpasswords.com/range/$($a)") -split "$b`:(\d+)")[1]

if ($breaches -ge 1) {
  Write-Host "Der Hashwert des Kennworts wurde $($breaches) mal gefunden"
}

Wenn Sie also z.B. eine Sammlung von Hashwerten der Kennworte ihrer Benutzer haben, dann könnten Sie so auch bereits irgendwo veröffentlichte Kennworte ermitteln. Das bedeutet natürlich nicht, dass diese Kennworte genau auf die Anmeldedaten passen und Sie wissen auch nicht, welches Kennwort zu dem Hashwert führt. Es ist aber zumindest ein Hinweis auf ein vielleicht schwaches Kennwort. Insbesondere, wenn es nicht nur einmal erwischt wurde.

Ein Export der Hashwerte in einem Active Directory ist relativ einfach

Die meisten Tools nutzen dabei eine Kopie der NTDS.DIT, die per Schattenkopien auf dem Domain Controller erzeugt oder aus einem Backup extrahiert wird.

Password Filter

Auf der folgenden Webseite kündigt ein Entwickler einen "Password Filter" an, der auf dem DC installiert wird. Wenn ein Benutzer sein Kennwort ändert und das Kennwort zum DC übertragen wird, kann der Password Filter das Kennwort im Klartext bekommen und gegen Dienste wie haveibeenpwned.com prüfen.

Was bleibt zu tun

Das Handwerkzeug und passenden Tipps habe ich ihnen geliefert. Alles was ihnen nun noch fehlt, ist eine Liste der Mailadressen, die die überprüfen lassen wollen, einen PC mit Internetzugang, Powershell und das Skript Test-PwnedAddress.ps1, welches weiter oben zum Download bereit steht.

Sie können als erstes einmal die Mailadressen ihrer Mailserver gegen https://haveibeenpwned.com/ testen. Vielleicht etablieren sie auch einen geplanten Task, der dies regelmäßig vornimmt.

Ich würde ihnen aber insbesondere raten, sich bei neuen Einträgen mit ihrer Domain aktiv benachrichtigen zu lassen.
Addieren Sie ihre Domäne einfach unter https://haveibeenpwned.com/DomainSearch

Weitere Links