01.26
Wie parst man X-ARF-Reports?
X-ARF-Repors sind als erstes einmal nur normale E-Mails.
Einen X-ARF-Report erkennt man im Header an dem Tag:
X-Arf: yes
Dann kann man anfangen die Mail zu parsen, also Attachment 1 und 2 laden.
Der eigentliche Report ist im ersten Anhang als Yaml-Dokument und kann mit verschiedenen Yaml-Parsern eingelesen werden oder einfach Zeilenweise…
Da erhält man dann alle Daten. Wichtig ist dann das JSON-Schema von dem Key „schema-url“ geladen und dann gecached wird.
Gehen wir wieder von einer SSH-Attacke aus, so ist das Schema z.B. hier abgebildet:
http://www.x-arf.org/schema/abuse_login-attack_0.1.2.json
Man liest dieses dann z.B. über php als Array ein. Dann kann man prüfen alles was im Schema nicht als „optional“ gekennzeichnet ist, ist Pflicht (den Rest mit optional verwerfen wir, falls wir ihn nicht brauchen).
Es gibt im Yaml-Report den Key „report-type“, „category“ usw. Sollte ein Feld nicht im Report sein, kann man entscheiden ob man den Report verwirft, manuell verarbeitet oder ob der Wert überhaupt benötigt wird.
Als Teamleiter von einem Abuse-Team, ist es für uns nicht wichtig, ob die Version des X-ARF-Generators enthalten ist oder das Angriffs-Ziel (sieht bei Nat/Proxy anders aus).
Wenn nun alles geprüft wurde (bei dem PHP-Xarf-Parser kann dies mit $parsexarf->checkreport($typ, $report) durchgeführt werden…. $typ kann man auch entfernen), kann man dann die Daten mit $parsexarf->data durchgehen und verarbeiten.
Hier einmal noch kurz anhand des Skripts von mir:
http://www.blocklist.de/downloads/validatexarf-php.tar.gz
$parsexarf = new parsexarf($config);
$mail = $parsexarf->getmails();
Wir erstellen ein neues Object übergeben dabei die Config-Daten (Postfach, Zugangsdaten usw…)
Dann laden wir mit $parsexarf->getmails(); alle Mails.
foreach($mail as $key => $value)
{
# Check Structru from Mail.
if($parsexarf->checkstructur('x-arf', $value) == 0)
{
# Check Yaml-Report (checkreport($typ, $report))
if($parsexarf->checkreport('x-arf', $value['report']) == 0)
{
$text = $value['all']->subject'
';
$text .= '
';
foreach($parsexarf->data as $key => $value)
{
$text .= ''.$key.': '.$value.'
';
}
$text .= '
';
$errormsg = '
Good, NO Error! :-)
';
echo $errormsg;
echo $text;
}
diese gehen wir dann in der Schleife durch und prüfen jede einzelne Mail.
Man kann dies natürlich bei $object->getmails() anpassen, das z.B. nur Mails mit bestimmten Absendern usw. geholt werden.
Dann wird mit:
if($parsexarf->checkstructur('x-arf', $value) == 0)
geprüft, ob die Structur der Mail ein X-ARF-Report ist (wenn nicht 0, kein X-ARF).
Da x-ARF und ARF fast gleich sind, kann man dies beim Typ noch übergeben, das man x-arf und arf in einem macht…..
Wenn also x-arf-Report, dann prüfen wir den Yaml-Report:
if($parsexarf->checkreport('x-arf', $value['report']) == 0)
Wenn keine 0 zurück gegeben wird, ist ein Fehler aufgetreten. Hier könnte man auch mit Exeptions arbeiten, oder dann die Fehler über $parsexarf->data durchgehen.
Die ist nur ein Beispiel dafür. Es ist relativ einfach X-Arf Reports zu verarbeiten.
Man hat dazu dann die Möglichkeit ein sehr feines Scoring zu setzten:
Reported-From Ergibt je nach Versender schon mal 200 Punkte
Category gibt für SSH 500, für mail 100 usw.
Report-Type für login-attack 200, für malware 500
usw. Damit kann man dann die IP automatisch sperren, das Abuse-Team informieren oder oder…..
Somit kann man z.B. automatisch die Reports an die entsprechenden Kunden/Reseller weiterleiten, falls die IP nicht aus dem eigenen Netz/Benutzung ist.
Dies ist jetzt relativ viel Text. Am einfachsten Ihr schaut euch einfach mal die Tools von X-ARF.org an:
http://www.x-arf.org/tools.html
und testet dann mit den Beispiel-Reports eure Skripte.
Bei Fragen, könnt Ihr euch gerne an xarf.org oder blocklist.de wenden.
Download: http://www.blocklist.de/downloads/validatexarf-php.tar.gz