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:
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:
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?
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()