colinardo
Goto Top

Fritz!Box Reboot "ohne" Telnet mit Bash Shell-Script (für aktuelle Firmware-Versionen 6 - 6.3)

Es kam gestern die Frage in meiner Anleitung zu Informationen aus dem Webinterface einer Fritz!Box via Shellscript auslesen, wie man die Fritz!Box ohne Telnet über ein Bash-Script neu starten kann.

Da bestehende Scripte im Web nur bei älteren 5er Firmware-Versionen funktionieren und ich im Web kein einzige Variante für aktuelle Firmware-Versionen(6.xx -6.3) finden konnte, poste ich das Script hier nochmal separat für diejenigen die genau danach suchen.

back-to-topFritz!Box neu starten (Reboot) / kein aktiviertes Telnet notwendig
(die Variablen sollten selbsterklärend sein, ansonsten zur Erläuterung in den oben verlinkten Thread reinschauen)
#!/bin/bash
_BOXURL="http://fritz.box"  
_USERNAME=""  
_PASSWORD="GEHEIM"  
_CHALLENGE=$(curl -s ${_BOXURL}/login.lua | grep "^g_challenge" | awk -F '"' '{ print $2 }')  
_MD5=$(echo -n ${_CHALLENGE}"-"${_PASSWORD} | iconv -f ISO8859-1 -t UTF-16LE | md5sum -b | awk '{print substr($0,1,32)}')  
_RESPONSE="${_CHALLENGE}-${_MD5}"  
_SID=$(curl -i -s -k -d 'response='${_RESPONSE} -d 'page=' -d "username=${_USERNAME}" "${_BOXURL}/login.lua" | grep "Location:" | grep -Poi 'sid=[a-f\d]+' | cut -d '=' -f2)  

# Box rebooten
echo 'Reboot in progress ... please allow up to 2 minutes for the box to come up!'  
curl -s "${_BOXURL}/reboot.lua?sid=${_SID}&extern_reboot=1&ajax=1" >/dev/null  
Grüße Uwe

p.s. ist zwar im Endeffekt nur ein einfacher GET-Request geworden, aber da die Traces in Wireshark etc. den spezifischen Parameter nicht offenbart haben, war doch etwas mehr Analyse der LUA-Scripte auf der Box nötig.

Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate

Content-Key: 274710

Url: https://administrator.de/contentid/274710

Printed on: April 19, 2024 at 04:04 o'clock

Member: TimoMF
TimoMF Jun 16, 2015 at 20:15:25 (UTC)
Goto Top
Vielen Dank

Mei der Fritz!BOX 7490 Firmware 6.20.

Gruß Timo
Member: vaddi3
vaddi3 Dec 20, 2015 at 13:08:52 (UTC)
Goto Top
Für den Fall das noch jemand das Skript auf einer FritzBox 7360 (FW 6.30) verwenden will, sollte er in Zeile 8 anpassen da "awk $NF" nur den letzten Teil ausgibt. Die SID steht jedoch an vorletzter Stelle der Respnse, alles folgende kann man dann einfach mit "cut" wegschneiden lassen.

_SID=$(curl -i -s -k -d 'response='${_RESPONSE} -d 'page=' -d "username=${_USERNAME}" "${_BOXURL}/login.lua" | grep "Location:" | awk -F'=' '{print $2}' | cut -f1 -d"&" )  


Besten Gruß
Member: colinardo
colinardo Dec 20, 2015 updated at 16:54:28 (UTC)
Goto Top
Hallo @vaddi3,
Danke für deinen Hinweis das sich ab Firmware 6.30 nun etwas verändert hat. Da haben sie wohl noch einen Parameter mit hinten dran gehängt. In dem Fall machen wir es doch universell dann kann der Parameter in der URL stehen wo er will:
_SID=$(curl -i -s -k -d 'response='${_RESPONSE} -d 'page=' -d "username=${_USERNAME}" "${_BOXURL}/login.lua" | grep "Location:" | grep -Poi 'sid=[a-f\d]+' | cut -d '=' -f2)  
Ist im Ursprungspost gefixt.

Wer es mit awk machen möchte, das geht natürlich ebenfalls ...
_SID=$(curl -i -s -k -d 'response='${_RESPONSE} -d 'page=' -d "username=${_USERNAME}" "${_BOXURL}/login.lua" | grep "Location:" | awk 'BEGIN{IGNORECASE=1} {match($0,/sid=([a-f0-9]+)/,arr);print arr[1]}'  

Schönen 4. Advent
Grüße Uwe
Member: andPS2
andPS2 Feb 14, 2016 at 07:25:19 (UTC)
Goto Top
funktioniert nicht mehr mit 6.50 oder?
bei mir klappt es nicht von einem raspi aus
Member: andPS2
andPS2 Feb 14, 2016 at 07:38:23 (UTC)
Goto Top
vielleicht probleme mit dem login
darf das passwort sonderzeichen enthalten?
ist ja eigentlich gequoted
was ist mit dollarzeichen?

habe mal mit debug geschaut und login.lua liefert nichts zurück
Member: andPS2
andPS2 Feb 14, 2016 at 07:42:02 (UTC)
Goto Top
mmh hat ja mit dem passwort nichts zu tun
curl -s http://fritz.box/login.lua oder
curl -s http://IPDERBOX/login.lua liefert nichts zurück
Member: andPS2
andPS2 Feb 14, 2016 at 07:43:53 (UTC)
Goto Top
auch ohne silent mode -s liefert curl auf die url nix zurück
bin da mit meinem latein am ende
Member: colinardo
colinardo Feb 14, 2016 updated at 08:46:48 (UTC)
Goto Top
@andPS2
Erst mal Hallo und Willkommen im Forum, dazu sollte noch die Zeit sein!
Hast du eine nervöse Störung das du hier unbedingt 4 Posts lostreten musst die alle in einen einzigen hinein gepasst hätten ??? Kommentare lassen sich nachträglich bearbeiten falls du das noch nicht bemerkt hast.
Ich bin leider mangels Zeit und Gerät mit 6.5er Firmware noch nicht dazu gekommen das zu untersuchen. Da sich in den neuen Firmwares >6.3 sehr viel geändert hat wird zu 99% eine Anpassung nötig sein. Die obige Lösung gilt für Firmwares bis 6.3.

Wie gesagt mangels Gerät mit einer 6.5er FW kann ich dazu auch im Moment keine Hilfestellung geben.

Mach dich doch einfach mal selber dran, installier dir die temporäre Telnet-Firmware und untersuche die Lua-Skripte auf der Box dann hilfst du auch anderen damit.

Grüße @colinardo
Member: andPS2
andPS2 Feb 14, 2016 at 15:31:12 (UTC)
Goto Top
Hallo @colinardo
Ebenfalls Hallo und Sorry für das Reinplatzen. Das mit dem Edit habe ich in der Tat übersehen nochmal sorry.
Danke für die schnelle Antwort.
Leider fehlen mir die Fähigkeiten in der login.lua das Richtige zu finden.
Ich könnte die Datei aber hier posten falls gewünscht.
Grüße @andPS2
Member: colinardo
colinardo Feb 14, 2016 at 15:42:02 (UTC)
Goto Top
Zitat von @andPS2:
Leider fehlen mir die Fähigkeiten in der login.lua das Richtige zu finden.
Dann ist das nichts für dich.
Ich könnte die Datei aber hier posten falls gewünscht.
Nein das bringt nichts, der HTML.Code nützt mir nichts, dazu muss man die LUA-Files auf der Box analysieren, und das Posten dieser ist nicht erlaubt. Außerdem sind am Reboot meist intern noch andere Files daran beteiligt ohne die es unmöglich ist einen Zusammenhang herzustellen.

Grüße @colinardo
Member: Pauschi
Pauschi Apr 21, 2016 at 17:30:09 (UTC)
Goto Top
Moin!

Sehr geiles Script.

Ich kontaktiere/Logge mich über meine Fritzbox gerne von der Arbeit aus ein.

Leider kommt dann eine "Passwort falsch" Meldung in der fritz.box Log, wenn ich nachsehe.
Daten stimmen 200%ig - Ich habe eine 6490 (KabelDeutschland)
Member: colinardo
colinardo Apr 27, 2016 updated at 19:38:45 (UTC)
Goto Top
back-to-top---- UPDATE ------
Für alle die einen funktionierenden Login für die aktuellen 6.5er Firmwares benötigen:
#!/bin/bash
_BOXURL="http://fritz.box"  
_USERNAME=""  
_PASSWORD="Geheim"  
_CHALLENGE=$(curl -s "${_BOXURL}/login_sid.lua?username=${_USERNAME}" | grep -Po '(?<=<Challenge>).*(?=</Challenge>)')  
_MD5=$(echo -n ${_CHALLENGE}"-"${_PASSWORD} | iconv -f ISO8859-1 -t UTF-16LE | md5sum -b | awk '{print substr($0,1,32)}')  
_RESPONSE="${_CHALLENGE}-${_MD5}"  
_SID=$(curl -i -s -k -d "response=${_RESPONSE}&username=${_USERNAME}" "${_BOXURL}" | grep -Po -m 1 '(?<=sid=)[a-f\d]+')  
echo "SID für den aktuellen Login: $_SID"  
Der Reboot-Request funktioniert leider noch nicht bei dem Firmwarestand, aber man kann das ganze auch per SOAP-Request erledigen, das ist sowieso zuverlässiger und unabhängiger von den LUA-Skripten.

Ich habe dafür ein Powershell-Skript was das erledigt. Mann kann das auch mit Phyton oder Perl machen, bin dazu aber noch nicht gekommen, deshalb hier mal das Powershell-Skript für den Reboot:

back-to-topPowershell: Reboot Fritz!Box über SOAP-UPNP-Request
$FB_URL = "http://fritz.box"  
$USERNAME = 'admin'  
$PASSWORD = 'Geheim'  

# Reboot Vars
$URN = 'urn:dslforum-org:service:DeviceConfig:1'  
$action = 'Reboot'  

if ($PSVersionTable.PSVersion.Major -lt 3){write-host "ERROR: Minimum Powershell Version 3.0 is required!" -F Yellow; return}  

function md5([string]$string){
    [System.BitConverter]::ToString([System.Security.Cryptography.MD5]::Create().ComputeHash((new-object System.Text.UTF8Encoding).GetBytes($string))).replace('-','').toLower()  
}
# Funktion zum senden eines SOAP Requests
function Execute-SOAPRequest {
    param(
        [Xml]$SOAPRequest,
        [string]$soapactionheader,
        [String]$URL
    )
    try{
        $wr = [System.Net.WebRequest]::Create($URL)
        $wr.Headers.Add('SOAPAction',$soapactionheader)  

        $wr.ContentType = 'text/xml; charset="UTF-8"'  
        $wr.Accept      = 'text/xml'  
        $wr.Method      = 'POST'  

        $requestStream = $wr.GetRequestStream()
        $SOAPRequest.Save($requestStream)
        $requestStream.Close()

        $wresp = $wr.GetResponse()
        $responseStream = $wresp.GetResponseStream()
        $responseXML = [Xml]([System.IO.StreamReader]($responseStream)).ReadToEnd()
        $responseStream.Close()
        return $responseXML
    }catch{
        throw $_.Exception.Message
    }
}
# XML Service-Beschreibungs XML abrufen
[xml]$serviceinfo = Invoke-RestMethod -Method GET -Uri "$($FB_URL):49000/tr64desc.xml"  
# Service auslesen
$service = $serviceInfo.root.device.serviceList.service | ?{$_.ServiceType -eq $URN}
# Request XML vorbereiten
[xml]$request = @"  
<?xml version="1.0"?>  
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">  
    <s:Header>
        <h:ClientAuth xmlns:h="http://soap-authentication.org/digest/2001/10/" s:mustUnderstand="1">  
            <Nonce></Nonce>
            <Auth></Auth>
            <UserID></UserID>
            <Realm></Realm>
        </h:ClientAuth>
    </s:Header>
    <s:Body>
        <u:$($action) xmlns:u="$($service.serviceType)"></u:$($action)>  
    </s:Body>
</s:Envelope>
"@  
# Initialer Request
$resp = Execute-SOAPRequest $request "$($service.serviceType)#$($action)" "$($FB_URL):49000$($service.controlURL)"  
# Benötigte Daten für die Authentifierung aus der Response auslesen und in den neuen Request schreiben
$NONCE = $resp.Envelope.Header.Challenge.Nonce
$REALM = $resp.Envelope.Header.Challenge.Realm
$request.Envelope.Header.ClientAuth.Nonce = $NONCE
$request.Envelope.Header.ClientAuth.Realm = $REALM
$request.Envelope.Header.ClientAuth.UserID = $username
$request.Envelope.Header.ClientAuth.Auth = md5 "$(md5 "$($username):$($REALM):$($password)"):$($NONCE)"  
# Request mit Authentifizierung abschicken
$resp = Execute-SOAPRequest $request "$($service.serviceType)#$($action)" "$($FB_URL):49000$($service.controlURL)"  
$resp.OuterXML
Grüße Uwe
Member: alpha9191
alpha9191 Sep 23, 2016 at 14:10:03 (UTC)
Goto Top
Hallo Uwe,

hast du es inzwischen hinbekommen den Reboot mit den LUA-Skripten wieder funktionsfähig zu kriegen? Ich starte die FritzBoxen bei mir immer von extern deshalb kann die SOA-Variante nicht eingesetzt werden.

Viele Grüße
Member: colinardo
colinardo Sep 23, 2016 updated at 18:20:20 (UTC)
Goto Top
Hallo alpha9191,
Zitat von @alpha9191:

hast du es inzwischen hinbekommen den Reboot mit den LUA-Skripten wieder funktionsfähig zu kriegen?
Nein, hatte damit einen halben Tag verbracht, ohne Erfolg, deswegen verfolge ich das jetzt nicht mehr, SOAP ist zuverlässiger und dauerhaft.
Ich starte die FritzBoxen bei mir immer von extern deshalb kann die SOA-Variante nicht eingesetzt werden.
VPN ?! Damit geht das problemlos. Das Webinterface der Fritte würde ich nie extern ohne VPN zugreifbar machen, das ist ein NOGO und macht kein vernünftiger Admin!!

Grüße Uwe
Member: alpha9191
alpha9191 Sep 23, 2016 at 19:29:55 (UTC)
Goto Top
Hallo Uwe,

erst mal vielen Dank für deine schnelle Antwort! Ich habe alle FritzBoxen per VPN angebunden. Jedoch kommt es ab und zu vor, dass eine VPN-Verbindung "hängt". Also VPN wird auf beiden Seiten als etabliert angezeigt, FritzBox ist online, jedoch kommen keien Daten durch den Tunnel.

Jetzt hatte ich ein Script erstellt, welche die Konnektivität eines Tunnels testet und dann bei Problemen die FritzBox über die externe IP neu startet. Dies Funktionierte bis vor kurzem wie ein Traum face-wink Aber aufgrund von Leitungsumstellungen, musste auch die Firmware der FritzBoxen auf den aktuellesten Stand gebracht werden.

Viele Grüße
Member: colinardo
colinardo Sep 23, 2016 at 21:00:55 (UTC)
Goto Top
Zuverlässigen VPN-Router hinstellen (Cisco/Lancom/Draytek/Mikrotik) und solche Probleme sind Vergangenheit!. Fritten sind halt nichts fürs Business.
Member: ossiram
ossiram Sep 23, 2016 at 23:18:42 (UTC)
Goto Top
Vielen Dank für das Script! - besser gesagt die PowerShell Version!
Ich habe meine FritzBox hinter einem SpeedPort Hybrid laufen, daher muss die Fritzbox leider öfter mal neugestartet werden, weil die VOIP Verbindungen instabil werden face-confused Somit kann ich mir das morgendliche von Hand neustarten sparen face-smile
Member: colinardo
colinardo Sep 24, 2016 updated at 06:42:14 (UTC)
Goto Top
Hallo @ossiram,
Danke für die Blumen face-smile

Über SOAP(TR-064) kannst du noch viel mehr in der Fritzbox anstellen. Ich empfehle die dazu meinen anderen Artikel
Powershell: FritzBox über TR-064 im Netzwerk konfigurieren und auslesen

Grüße Uwe