[Problem] TR64 Seiten auf Fritzbox alle 404?

daubsi

Neuer User
Mitglied seit
22 Feb 2010
Beiträge
47
Punkte für Reaktionen
0
Punkte
6
Hallo, ich hatte vor Jahren mal ein Script am Laufen, welches mir bei der FB über das TR64 Protokoll einen Verbindungsreset durchführte. Dieses Script will nun nicht mehr, weil die ganzen API Endpoints alle nur noch 404 als Rückgabewert geben? Wurde da was grundlegend geändert? Ich habe mir vorhin auch die Docs von AVM gezogen, und demnach scheint das alles zu passen...?

Das war der One-liner von damals:
Code:
{CURL} -s -H "Content-Type: text/xml; charset="utf-8"" -H "SoapAction:urn:schemas-upnp-org:service:WANIPConnection:1#ForceTermination" -d "<?xml version='1.0' encoding='utf-8'?> <s:Envelope s:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' xmlns:s='http://schemas.xmlsoap.org/soap/envelope/'> <s:Body> <u:ForceTermination xmlns:u='urn:schemas-upnp-org:service:WANIPConnection:1' /> </s:Body> </s:Envelope>" http://fritz.box:49000/igdupnp/control/WANIPConn1 >/dev/null

Prinzipiell ruft man doch die tr64desc.xml auf Port 49000 ab, bekommt dort die URLs der "service Subpages" und kann dann diese ansprechen?

ein entsprechender Curl liefert mir:
Code:
...
<service>
<serviceType>urn:dslforum-org:service:DeviceConfig:1</serviceType>
<serviceId>urn:DeviceConfig-com:serviceId:DeviceConfig1</serviceId>
<controlURL>/upnp/control/deviceconfig</controlURL>
<eventSubURL>/upnp/control/deviceconfig</eventSubURL>
<SCPDURL>/deviceconfigSCPD.xml</SCPDURL>
</service>
<service>
<serviceType>urn:dslforum-org:service:Layer3Forwarding:1</serviceType>
<serviceId>urn:Layer3Forwarding-com:serviceId:Layer3Forwarding1</serviceId>
<controlURL>/upnp/control/layer3forwarding</controlURL>
<eventSubURL>/upnp/control/layer3forwarding</eventSubURL>
<SCPDURL>/layer3forwardingSCPD.xml</SCPDURL>
...

Aber jeder Versuch auf irgendwas unterhalb von /upnp zuzugreifen, scheitert mit HTTP Statuscode 404?

Fritzbox 7490, Fritz OS 7.57 , Heimnetz->Netzwerk->Netzwerkeinstellungen "Zugriff für Anwendungen erlauben" und UPnP sind natürlich aktiviert.

Hatte auch schon mal ChatGPT um Rat gefragt, der mir folgendes Script ausspuckte, aber beim Aufruf in "get_connected_clients" einen Error 401 zurückliefert.

Credentials sind die eines lokalen Box Admins und wurden natürlich eingetragen.
Hat jemand eine Idee?

Code:
import requests
import xmltodict
import hashlib

# Fritzbox credentials and URL
FRITZBOX_URL = "http://fritz.box:49000/upnp/control/hosts"
USERNAME = "your_username"
PASSWORD = "your_password"

def get_session_id():
    url = "http://fritz.box/login_sid.lua"
    response = requests.get(url)
    data = xmltodict.parse(response.content)
    sid = data['SessionInfo']['SID']

    if sid == '0000000000000000':
        challenge = data['SessionInfo']['Challenge']
        response_str = f"{challenge}-{PASSWORD}"
        md5_response = hashlib.md5(response_str.encode('utf-16le')).hexdigest()
        login_url = f"http://fritz.box/login_sid.lua?username={USERNAME}&response={challenge}-{md5_response}"
        login_response = requests.get(login_url)
        login_data = xmltodict.parse(login_response.content)
        sid = login_data['SessionInfo']['SID']

    return sid

def get_connected_clients():
    headers = {
        'Content-Type': 'text/xml; charset="utf-8"',
        'SOAPAction': 'urn:dslforum-org:service:Hosts:1#GetHostListPath'
    }
    body = """
    <?xml version="1.0" encoding="utf-8"?>
    <s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
      <s:Body>
        <u:GetHostListPath xmlns:u="urn:dslforum-org:service:Hosts:1"></u:GetHostListPath>
      </s:Body>
    </s:Envelope>
    """

    response = requests.post(FRITZBOX_URL, headers=headers, data=body, auth=(USERNAME, PASSWORD))
    data = xmltodict.parse(response.content)

    # Extract the path to the host list from the response
    path = data['s:Envelope']['s:Body']['u:GetHostListPathResponse']['NewX_AVM-DE_HostListPath']

    # Fetch the host list
    sid = get_session_id()
    host_list_url = f"http://fritz.box{path}?sid={sid}"
    response = requests.get(host_list_url)
    host_list = xmltodict.parse(response.content)

    return host_list

def main():
    clients = get_connected_clients()
    print("Connected Clients:")
    for client in clients['List']['Item']:
        print(f"Name: {client['NewHostName']}, IP: {client['NewIPAddress']}, MAC: {client['NewMACAddress']}")

if __name__ == "__main__":
    main()
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.