Computerbeveiliging - Hoe je bad guys buiten de deur houdt

Java/Python XXE: FTP en SMTP risico's

21-02-2017, 14:10 door Erik van Straten, 7 reacties
Laatst bijgewerkt: 21-02-2017, 14:13
Publicaties
Op 20170218 schreef Alexander Klink "SMTP over XXE ? how to send emails using Java's XML parser" [1].

Dit werd op 20170220 opgepikt door Johannes Ulrich die in een artikel [2] beschrijft hoe je misbruik van een interne Postfix (e-mail) server kunt voorkomen. Ik had in eerste instantie dit artikel gevonden en begreep aanvankelijk niet goed wat Johannes precies bedoelde (zie mijn bijdrage onder het artikel van Johannes).

Issue
Bij het parsen van een XML file ondersteunt de Oracle Java XML parser het ophalen van aanvullende informatie via FTP. Daarbij kan gebruik gemaakt worden van authenticatie (dus inloggen op de FTP-server met USER en PASS).

Er zit echter een bug in Oracle Java: achter de naar de FTP gestuurde URI (ftp://user:password@ftpsite:optionele_poort/pad), dat hoort de parser hoort af te kappen bij de eerstvolgende karakters CR LF, maar dat gebeurt niet. Een kwaadaardige XML bestand met een verwijzing (in dit voobeeld onvolledig) naar:
ftp://A<CR><LF>EHLO B<CR><LF>MAIL FROM: <test@example.com><CR<LF>C@mailserver:25/pad

Dat zorgt ervoor dat de Java XML interpreter een verbinding maakt met (wat hij denkt een FTP server is) de opgegeven mailserver. Die ontvangt de volgende commando's:
USER A<CR><LF>
EHLO B<CR><LF>
MAIL FROM: <test@example.com><CR><LF>

Dit voorbeeld heb ik bewust te kort gehouden (het is onvoldoende om de mailserver een mail te laten versturen), maar je zult het principe wel begrijpen vermoed ik (of zie [1]). De mailserver zal een foutmelding teruggeven voor het USER commando (want dat kent hij niet), maar zal de rest "braaf" overnemen.

Phising mails verzenden
Indien een mailserver (intern of op de grens met internet) verbindingen vanaf de computer (met Java die XML parst, in principe elke PC met Java) accepteert, kan zo spam worden verzonden. Met name als daarbij SPF, DKIM en/of DMARC wordt gebruikt, komt zo'n email overtuigend vanuit jouw organisatie. In [2] beschrijft Johannes een methode om dit in Postfix te blokkeren (of andere mailservers iets dergelijks ondersteunen, weet ik niet).

FTP risico's door Java en Python
Helaas zijn de risico's niet tot SMTP beperkt, zoals Timothy Morgan in zijn blog schrijft [3] (bron: [4]). Niet alleen Java zou kwetsbaar zijn, maar ook Python: deze zouden je firewall open kunnen zetten voor ongeauthoriseerde verbindingen.

[1] https://shiftordie.de/blog/2017/02/18/smtp-over-xxe/
[2] https://isc.sans.edu/forums/diary/Hardening+Postfix+Against+FTP+Relay+Attacks/22086/
[3] http://blog.blindspotsecurity.com/2017/02/advisory-javapython-ftp-injections.html
[4] http://www.theregister.co.uk/2017/02/21/java_python_ftp_code_vulnerable/
Reacties (7)
21-02-2017, 19:42 door [Account Verwijderd] - Bijgewerkt: 21-02-2017, 19:45
[Verwijderd]
21-02-2017, 20:12 door Erik van Straten
21-02-2017, 19:42 door Rinjani: Wow, dat is niet best... En ik heb beide nodig op mijn systeem (Java - niet in de browser - én Python).
Uit [4] (voor zie mijn vorige bijdrage):
20-01-2017, door Timothy Morgan: [...]
this FTP protocol injection allows one to fool a victim's firewall into allowing TCP connections from the Internet to the vulnerable host's system on any "high" port (1024-65535). A nearly identical vulnerability exists in Python's urllib2 and urllib libraries. In the case of Java, this attack can be carried out against desktop users even if those desktop users do not have the Java browser plugin enabled.
[...]
Hoe dat kan weet ik ook niet, en misschien is het beter als zo min mogelijk mensen dit weten (tot Oracle de kwetsbaarheid gepatched heeft).
21-02-2017, 20:37 door [Account Verwijderd]
[Verwijderd]
21-02-2017, 21:20 door Anoniem
Door Erik van Straten:
21-02-2017, 19:42 door Rinjani: Wow, dat is niet best... En ik heb beide nodig op mijn systeem (Java - niet in de browser - én Python).
Uit [4] (voor zie mijn vorige bijdrage):
20-01-2017, door Timothy Morgan: [...]
this FTP protocol injection allows one to fool a victim's firewall into allowing TCP connections from the Internet to the vulnerable host's system on any "high" port (1024-65535). A nearly identical vulnerability exists in Python's urllib2 and urllib libraries. In the case of Java, this attack can be carried out against desktop users even if those desktop users do not have the Java browser plugin enabled.
[...]
Hoe dat kan weet ik ook niet, en misschien is het beter als zo min mogelijk mensen dit weten (tot Oracle de kwetsbaarheid gepatched heeft).
FTP opent een control channel. Dat is een connectie naar de server op (gebruikelijk) poort 21 waarnaar de commando's worden gestuurd. In dit geval omdat er line breaks in de username toe worden gestaan kun je dus meerdere commando's sturen want FTP commando's zijn gesplitst met line breaks maar hetzelfde geldt voor HTTP requests die ook uit headers bestaan met daarna een request body. Daarom zie je ook dat postfix standaard bepaalde HTTP verbs filtert en de connectie sluit. Zo zal dit werken met elk plain text protocol waarin je new lines kan injecteren ergens.

Terug naar FTP. Na het openen van de control channel stuurt jouw client naar de server hoe de server terug kan verbinden met jou. Daarvoor opent de client een random poort in deze hoge poort ranges en stuurt vervolgens op 'hoi, ik gebruik deze poort' waarna de server terug connect en een data kanaal opent. Dat heet 'FTP classic mode' of ook wel anders genoemd 'active'. Nadat NAT populair werd was dit natuurlijk een probleem en hebben ze passive mode geintroduceerd (PASV) waarbij de client dit data kanaal opent.

Anyways, FTP was heel populair (en is nog steeds populair) dus over verloop van tijd zijn firewall oplossingen die in de pakketjes kijken gaan denken 'hey ik help deze gebruiker' en als ze dus een client die in FTP active mode staat een control channel open pakketje zien sturen openen ze die poort.

Dit probleem bestaat al heel lang, her wat uitgebreidere uitleg: http://phrack.org/issues/63/19.html#article
21-02-2017, 23:25 door Erik van Straten - Bijgewerkt: 21-02-2017, 23:29
@Anoniem 21:20: dank voor de uitleg, want niet iedereen weet wellicht hoe merkwaardig ftp werkt, met name de "classic" (active) variant (een server die moet "terugbellen" voor de data transfer).

Zoals Timothy Morgan aangeeft is het verstandig om ondersteuning voor classic/active ftp uit te zetten in firewalls. Maar, hoewel wellicht een goed idee, de oorzaak van het probleem is dat een aanvaller aan de internetzijde van jouw firewall jou onbedoeld iets aan de LAN-zijde kan laten starten, waardoor jouw firewall een poort van buiten naar binnen openzet omdat die firewall "denkt" dat jij dat wilt.

Opmerkelijk daarbij is dat Timothy vermeldt dat de Java XML-parser-kwetsbaarheid kennelijk ook exploitable is zonder Java plugin support in de webbrowser.

Naast de mogelijkheid tot het openen van poorten in firewalls en het verzenden van spam, sluit ik andere narigheid niet uit als gevolg van deze Java bug (van de Python issue is nog minder bekend).
22-02-2017, 10:05 door [Account Verwijderd] - Bijgewerkt: 22-02-2017, 11:19
[Verwijderd]
22-02-2017, 11:14 door Anoniem
Als de Python kwetsbaarheid deze is dan is die in 2.7.10 en 3.4.4 gefixt:
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-5699
Reageren

Deze posting is gelocked. Reageren is niet meer mogelijk.