FritzBox Challenge Response in SH

level20peon

Mitglied
Mitglied seit
11 Jul 2007
Beiträge
270
Punkte für Reaktionen
0
Punkte
16
Hallo zusammen,

ich habe folgendes BASH script geschrieben um eine SID zu generieren:

Code:
#!/bin/sh


password="FBpassword"
output=$(/usr/bin/wget -O - "http://fritz.box/login_sid.lua" 2>/dev/null)
challenge=$(echo $output | sed -n "/.*<Challenge>\([^<]*\)<.*/s//\1/p")
SID=$(echo $output | sed -n "/.*<SID>\([^<]*\)<.*/s//\1/p")

if [ "$SID" = "0000000000000000" ]; then
	CPSTR="$challenge-$password"
	MD5=$(echo -n $CPSTR | iconv -f ISO8859-1 -t UTF-16LE | md5sum | sed -e "s/ .*//")
	response="$challenge-$MD5"
	POST="page=%2Fhome%2Fhome.lua&response=$response&username="
	SID=$(/usr/bin/wget -O - --post-data="$POST" "http://fritz.box/home/home.lua" 2>/dev/null | sed -n "/.*\"sid\", \"\([^\"]*\)\".*/s//\1/p")
	echo $SID
fi

Damit bekomme ich auf einem Debian System eine SID heraus, auf der FritzBox selbst jedoch nicht. Warum ?
Bitte beachtet, dass ich iconv auf der Box habe (mit entsprechendem Pfad im script) und $response auf beiden Systemen scheinbar exakt gleich ist, wenn ich einen statischen $challenge string zum testen verwende.

Hat irgendjemand eine Idee was ich möglicherweise falsch machen könnte bzw. was ich noch testen könnte, um den Fehler zu finden ?

System 1)
uname -a -> Linux debian 3.2.0-3-amd64 #1 SMP Mon Jul 23 02:45:17 UTC 2012 x86_64 GNU/Linux
wget -V -> GNU Wget 1.13.4 built on linux-gnu. \ +digest +https +ipv6 +iri +large-file +nls -ntlm +opie +ssl/gnutls


System 2)
uname -a -> Linux fritz.fonwlan.box 2.6.28.10 #1 Wed Nov 20 16:00:30 CET 2013 mips GNU/Linux
wget -V -> GNU Wget 1.14 built on linux-gnu. \ +digest +https +ipv6 -iri +large-file -nls -ntlm +opie +ssl/gnutls
 
Zuletzt bearbeitet:
Wenn du mir verrätst wie du iconv übersetzt, würde ich versuchen, dein Problem nachzuvollziehen. Ich könnte die Session-Generierung auf der Box ebenfalls gut gebrauchen.
 
Mit einem billigen Trick; Ich bin dran verzweifelt das Paket für die Box zu kompilieren (jegliche Version von iconv). Dann habe ich durch Zufall gesehen, dass durch das Auswählen von "Shared libraries" -> "Charsets & Internationalization" -> "libiconv (libiconv.so) (NEW)" neben der Library selbst auch eine binary gebaut wird. Sie liegt (nach freetz make) in "<freetz pfad>/source/target-mips_gcc-4.6.4_uClibc-0.9.32.1/libiconv-1.13.1/src/.libs/" und heißt "iconv_no_i18n".
 
War das (iconv_no_i18n) nicht nur ein Shellskript? Ich hatte mir den Buildprozess von iconv bzw. libiconv auch mal angesehen, aber dann ganz schnell wieder die Finger davon gelassen. Das war mir definitiv zu unverständlich, wie da, ich meine wegen zyklischer Abhängigkeiten, alles anders als normalerweise üblich gebaut wurde. Allerdings hab ich wohl nur src/iconv_no_i18n angeschaut, .libs ist mir durch die Lappen gegangen.

Danke für den deinen Tipp!

Mit folgenden Skript bekomme ich eine gültige Session-ID

Code:
!/bin/sh -x
IP="fritz.box"
UID="web-user"
SECRET="web-password"

# Challenge abholen
CHALLENGE=`wget -O - "http://$IP/login_sid.lua" 2>/dev/null | sed 's/.*<Challenge>\(.*\)<\/Challenge>.*/\1/'`

# login aufbauen und hashen
CPSTR="$CHALLENGE-$SECRET"

MD5=`echo -n $CPSTR | iconv -f ISO8859-1 -t UTF-16LE | md5sum -b | awk '{print substr($0,1,32)}'`
RESPONSE="$CHALLENGE-$MD5"
URL_PARAMS="username=$UID&response=$RESPONSE"

# login senden und SID herausfischen
SID=`wget -O - "http://$IP/login_sid.lua?$URL_PARAMS" 2>/dev/null | sed 's/.*<SID>\(.*\)<\/SID>.*/\1/'`
echo SID=$SID

User-ID und Passwort musst du natürlich noch anpassen, das binary heisst bei mir iconv.
 
Zuletzt bearbeitet:
War das (iconv_no_i18n) nicht nur ein Shellskript?

Jain, "<freetz pfad>/source/target-mips_gcc-4.6.4_uClibc-0.9.32.1/libiconv-1.13.1/src/iconv_no_i18n" ist ein shell script, "<freetz pfad>/source/target-mips_gcc-4.6.4_uClibc-0.9.32.1/libiconv-1.13.1/src/.libs/iconv_no_i18n" ist die binary.

Ich habe bisher noch kein so widerspenstiges Ding wie iconv im crosscompiler gesehen... nach vielen erfolglosen Stunden ist diese "dirty" Variante für mich jetzt die einzige Lösung und werde es dabei so belassen.

Danke für dein script, ich werde es in ein paar Stunden einmal testen und mich dann nochmal zurückmelden.
 
Hat irgendjemand eine Idee was ich möglicherweise falsch machen könnte bzw. was ich noch testen könnte, um den Fehler zu finden ?

Als erstes würde ich am Anfang #!/bin/bash schreiben. Auf den meisten PCs ist sh gleich bash, auf der Box nicht. Allerdings fällt mir so direkt am Skript nicht auf, was bash spezifisch ist.
Ansonsten, das Skript mit bash -x aufrufen und schauen, was passiert.
 
Ich habe bash mal installiert, das war jedoch keine Erfolg bescherende Maßnahme.

Durch die Erwähnung von "web-user" in Beitrag #4 ist mir mal in den Sinn gekommen, dass ich einem user das Recht "Zugang auch aus dem Internet erlaubt" im AVM webinterface geben sollte (mal abgesehen davon, dort überhaupt einen user anzulegen).

Mit diesem user funktioniert dann auch mein script, jedoch nur, wenn ich GET und nicht POST benutze. Laut AVM Anleitung (Seite 3, unter "Besonderheiten ab FRITZ!OS 5.50") sollte GET und POST möglich sein, um die SID zu erhalten.
Weiterhin besagt selber Absatz, dass man aufgrund der neu eingeführten Benutzerrollen immer Kennwort und Benutzernamen benötige. Hierzu sei gesagt, dass ich vom Debian System ohne Anlegen jeglicher Benutzer im AVM webinterface lediglich mit meinem AVM webinterface Kennwort (ohne Benutzernamen) eine SID mit dem script in Beitrag #1 erhalten kann.

Irgendwas geht doch hier nicht auf, oder habe ich etwas übersehen ?


PS:
Auf dem Debian System liefert nur /home/home.lua?usw eine SID im letzten Schritt, auf der Fritzbox selbst liefert nur /login_sid.lua?usw eine SID im letzten Schritt. Vorrausgesetzt, dass ich auf dem Debian System die Variante ohne Benutzernamen nutze (die Variante mit Benutzernamen funktioniert nämlich hier auch).
 
Zuletzt bearbeitet:
Ich habe bash mal installiert, das war jedoch keine Erfolg bescherende Maßnahme.

Ich hatte bash erwähnt, weil im Titel BASH steht. Das Skript siet aber aus, als sollte es mit jeder Shell laufen.

Zur Fehlersuche
- Rufe das Skript mit sh -x auf
- Speichere die Ergebnisse von wget in Temporären Dateien
- Suche die Unterschiede zwischen PC und Box
 
Ich hatte bash erwähnt, weil im Titel BASH steht.
Ja du hast Recht, ich habe es zu "SH" geändert. Ich hatte zu Testzwecken sogar ASH auf dem Debian System installiert, aber auch damit funktionierte es dort problemlos.

Rufe das Skript mit sh -x auf
Habe ich gemacht, ohne aussagekräftige Ergebnisse (keine Unterschiede an den betreffenden Stellen zwischen den beiden Systemen)

Speichere die Ergebnisse von wget in Temporären Dateien
Auch das habe ich mal gemacht. Der generierte Schlüssel (response) ist aber auf beiden Systemen gleich. Ich vermute das Problem an anderer Stelle.

Suche die Unterschiede zwischen PC und Box
Meines Erachtens ist laut AVM Dokumentation die Methode, die ich vom Debian System aus nutze gar nicht möglich. Ich denke also, dass das entweder ein Bug oder ein Versäumnis bei der Einführung der Benutzerrollen ist (das eventuell noch behoben wird). Hier wird schätzungsweise ein IP-Filter für die beschriebenen Ergebnisse verantwortlich sein. Ich wüsste aber nicht, wie ich das testen sollte.
 
Der generierte Schlüssel (response) ist aber auf beiden Systemen gleich. Ich vermute das Problem an anderer Stelle.
Der Challenge Wert sollte aber nicht gleich sein, und deswegen auch der Response Wert nicht.
Hier wird schätzungsweise ein IP-Filter für die beschriebenen Ergebnisse verantwortlich sein.
Versuche mal, von der Box einen Proxy auf dem PC zu verwenden, dann kommt die Anfrage vom PC und nicht von der Box selbst.
 
Der Challenge Wert sollte aber nicht gleich sein, und deswegen auch der Response Wert nicht.
Ich habe mich eventuell unklar ausgedrückt. Für diesen Test habe ich einen statischen Challenge Wert verwendet, um zu sehen ob am Ende die gleiche response herauskommt.

Versuche mal, von der Box einen Proxy auf dem PC zu verwenden, dann kommt die Anfrage vom PC und nicht von der Box selbst.
Gute Idee, ich habe es heute morgen mit Apache als Proxy versucht, aber der mochte die fb wohl nicht (oder so :D). Ein Test mit Squid bestätigt die Hypothese jedoch ! Ich kann mit der "Debian Methode" von der Box über den Proxy eine SID erhalten.
Die Frage ist nun, an welcher Stelle die Box den Dienst/Port/whatever blockt. Vorschläge :) ?
 
Ursprünglich hatte ich nach einer Möglichkeit gesucht einen USB Port bzw everything USB auf der Box auszuschalten und dann wieder einzuschalten. Hintergrund ist, dass ich einen RasPi an einem der USB Ports betreibe. Alle paar Monate hängt der sich jedoch auf/verliert die Verbindung (da es etwa 3-4 mal im Jahr passiert ist das quasi unmöglich zu debuggen). Nun wollte ich, wenn das passiert den PI durch das deaktivieren/aktivieren des USB Ports an der Box neu starten. Durch Linux Bordmittel scheint es nicht möglich USB zu schalten, sondern lediglich Geräte abzumelden. Das hilft mir aber nicht weiter, da der PI kein registriertes Gerät am USB Port darstellt, sondern sich lediglich der 5V bedient.
Nachdem ich am Ende nun erfolgreich eine SID erhalte und so dann auch im AVM webinterface Aktionen auf der Fritzbox ausführen kann wird mir jedoch nun so langsam bewusst, dass auch hier keine Möglichkeit besteht USB zu deaktivieren. Das Ganze war also scheinbar ein Schuss ins Leere - schade. Aber der thread hilft eventuell auf der anderen Seite dann Leuten, die den Zugang anderweitig brauchen können.


Edit: Kann man vielleicht das USB modul entladen und dann neu laden ? "rmmod -f hci_usb" gibt mir ein "rmmod: can't unload 'hci_usb': Resource temporarily unavailable" zurück, daher weiß ich nicht ob das auf der Box überhaupt in Frage kommen würde.

Edit2: Ich habe nun den Kernel mit "Forced module unloading" neu kompiliert und konnte damit dann everything USB entfernen. Das deaktiviert aber leider auch nicht die USB-Stromversorgung.
 
Zuletzt bearbeitet:
Ich halte es für unwahrscheinlich, dass die USB Stromversorgung abgeschaltet werden kann. Es würde zusätzliche Bauteile benötigen und auch zusätzliche Spannung für den Schalter.

Du könntest Tastatur/Monitor an den PI hängen, um herauszufinden, was los ist.
 
Du könntest Tastatur/Monitor an den PI hängen, um herauszufinden, was los ist.

Das kann ich leider nicht, weil ich ein explizites headless setup fahre, wobei ich der GPU quasi allen RAM entzogen habe. Das führt aber jetzt glaube ich auch zu weit OT. Ich werde dann wohl damit leben müssen, dass ich 3-4 mal im Jahr einen Stecker ziehen muss.
Trotzdem aber danke für die Hilfe.
 
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.