Ermitteln der externen IP-Adresse der Fritz!Box OHNE UPnP

sipgateuser

Mitglied
Mitglied seit
17 Jul 2008
Beiträge
564
Punkte für Reaktionen
0
Punkte
0
Man findet sehr viel, wie man von einer Fritzbox (es geht genau gesagt um eine 7270, Firmware-Version 54.05.06) die IP-Adresse auslesen kann, meistens ist dazu aber UPnP notwendig, das ich nicht aktiviert haben möchte. http://www.gimme-th.at/blog/?p=165 beschreibt einen Weg, der bei mir nicht funktioniert

Code:
# Log-In first
/usr/bin/wget -q --post-data="login:command/password=your_password_here" http://fritz.box/cgi-bin/webcm -O /home/mrre/login.txt
#Get the logfile and write it to /tmp
/usr/bin/wget -q --post-data="getpage=../html/de/system/ppSyslog.html" http://fritz.box/cgi-bin/webcm -O /tmp/logfile
#Grep the IP out of the logfile
ip_address_act=$(cat /tmp/logfile | grep "Internetverbindung wurde erfolgreich hergestellt" | grep -o -m1 -e'Adresse: [0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' | sed 's/Adresse:\ //')
#delete the logfile
rm /tmp/logfile

Hat wer eine Idee für ein Shell-Skript?
 
Zuletzt bearbeitet:
Hast dyndns?

nslookup auf deine dyndns Adresse zeigt dir das sofort ;)
 
Es gibt aber keine dyndns-Adresse und ip-adress.com o.ä. will ich auch nicht. Die Frage ist, wie kitzle ich das aus der Fritzbox ohne UPnP raus?
 
Hat wer eine Idee für ein Shell-Skript?
Im UU-Forum (Beitrag vom: 28. Juli 2012 17:38), (siehe Link)
Code:
http://forum.ubuntuusers.de/topic/gespeicherte-ip-adresse-bei-cloudflare-hinter-/2/
, versucht auch jemand, die externe IP-Adresse der FB _nur_ im _(W)LAN_, (evtl. mit einem Script) aus der FB zu ermitteln.
 
Da gibt es aber auch keine Lösung.
 
... keine Lösung.
Versuch mal mit einem expect-Script. Z. B.:
Code:
#!/usr/bin/expect
spawn telnet fritz.box
expect "fritz.fonwlan.box login:"
send "root\n"
expect "Password:"
send "<password>\n"
expect "root@fritz:/var/mod/root#"
send "cat /var/run/onlinestat | grep \"IPADDR\" | sed 's/IPADDR\ //'\n"
expect "root@fritz:/var/mod/root#"
send "exit"
exit
Das Script musst Du evtl. für deine FB anpassen. Die Ausgabe des Scriptes kannst Du auch in eine Datei auf deinem Client-PC, umleiten und bearbeiten.
 
Ich denke telnet ist ein größeres Sicherheitsproblem als UPnP. Ich frage mich gerade wie es die Android-App Landroid macht. Ich habe auch schon gelesen, dass es irgendwie mit netcat gehen soll.
 
Ich denke telnet ist ein größeres Sicherheitsproblem als UPnP.
Das machst Du doch nur im LAN. Warum ist da telnet ein Sicherheitsproblem? Aber Du könntest auch ssh verwenden, wenn für dich telnet ein Problem ist.
 
Steht doch auf der Uebersichtseite?!

Sinngemaess:
wget fritz.box
grep "IP"

Aufaendiger wird es, wenn man sich einloggen muss. Das ist aber auch beschrieben. Somit ist der obige Ansatz richtig, aber die aktuellen Boxen haben einen komplizierteren Einlogmechanismus, so dass man da noch etwas machen muss. (Gibt es ein PDF bei AVM)

voipd.
 
Bei telnet ist das Sicherheitsproblem, dass man sich grundsätzlich überhaupt per telnet anmelden kann, also nicht nur ich intern, sondern auch irgendwer von extern versuchen kann sich bei der FB anzumelden.

Ich denke http://www.avm.de/de/Extern/Technical_Note_Session_ID.pdf ist der Weg, der weiterführt. Ich blicke da aber noch nicht durch:

Vergabe der Session-ID
Für die Vergabe der Session-ID wurde eine neue Einstiegsseite login_sid.xml eingeführt.

Übergabe der Session-ID
Die Übergabe der Session-ID erfolgt im Parameter sid (per GET oder POST).
Beispiel HTML-Formular:
<form action=“…/cgi-bin/webcm“ …>

<input type=“hidden“ name=“sid“ value=”0000000000000001”>
Beispiel für direkten Link:
<A HREF=“…/cgi-bin/webcm?getpage=../html/seite.html&
sid=0000000000000001</A>

Verwendet eine FRITZ!Box Session-IDs, erfolgt das Login nicht direkt über das Kennwort, sondern über einen
Response-Wert, der aus dem Klartextkennwort und einer Challenge ermittelt wird.
Der Login-Vorgang sieht wie folgt aus:
<form action=“../cgi-bin/webcm/“ …>

<input type=“password“ name=“login:command/response“
value=“response“>
</form>

Ermittlung des Response-Wertes
Beim neuen Login-Verfahren wird also das Klartextpasswort
login:command/password=<klartextpassword>
ersetzt durch
login:command/response=<response>
Der Response-Wert wird wie folgt gebildet:
<response> = <challenge>-<md5>
Der Wert <challenge> kann aus der Datei login_sid.xml ausgelesen werden
und <md5> ist der MD5 (32 Hex Zeichen mit Kleinbuchstaben) von
<challenge>-<klartextpassword>
Der MD5-Hash wird über die Bytefolge der UTF-16LE Codierung dieses Strings gebildet (ohne BOM und ohne
abschließende 0-Bytes).
Aus Kompatibilitätsgründen muss für jedes Zeichen, dessen Unicode Codepoint > 255 ist, die Codierung des "."Zeichens benutzt werden (0x2e 0x00 in UTF-16LE). Dies betrifft also alle Zeichen, die nicht in ISO-8859-1
dargestellt werden können, z.B. das Euro-Zeichen.
Abschließend ein Beispiel mit deutschem Umlaut:
Die Challenge
<challenge> = "1234567z"
kombiniert mit dem Kennwort
<klartextpassword> = "äbc"
ergibt den Wert
<response> = "1234567z-9e224a41eeefa284df7bb0f26c2913e2"

Wenn die Übersichtsseite einmal mit curl oder wget zur Verfügung steht, dann denke ich, komme ich schon weiter. Wie ich dorthin mit einem Skript komme, ist mir aber noch nicht klar.
 
Eine Möglichkeit ohne Einloggen wäre der statisch gelinkt kompilierte sighttpd-Server auf der nicht gefreetzten FritzBox, der mit curl auf dem Client-PC (im LAN), ausgelesen werden kann:
Code:
http://www.ip-phone-forum.de/showthread.php?t=223629&highlight=SIGHTTPD
Code:
root@fritz:/var/tmp/flash# while `true`; do cat /var/run/onlinetstat; sleep 5; done | sighttpd -f /tmp/flash/ip.txt &
BTW: Warum benötigst Du im LAN bzw. die externe IP-Adresse der FritzBox?
 
Jetzt bin ich mir nicht sicher, ob ich da was falsch verstehe. Ich will kein Freetz verwenden und der Link bezieht sich auf Freetz, du schreibst aber "nicht gefreetzten FritzBox" und dann steht da beim "2. Code" "root@fritz"
 
Ich will kein Freetz verwenden und der Link bezieht sich auf Freetz, du schreibst aber "nicht gefreetzten FritzBox" ...
Ich habe auch geschrieben "statisch gelinkt kompilierter sighttpd-Server". D. h., dass Du das binary auf der Box, auch ohne Freetz benutzen kannst.
 
Hier mal ein Codeschnipsel den ich nutze und der funktioniert. Teile dieses Schnipsels habe ich selbst uebernommen und wie ich gerade bei der Durchsicht feststelle ist der auch nicht 100% valide: Die Variablen RSTART und RLENGTH machen keinen Sinn und kommen in meinem Script sonst nirgends vor. Wie gesagt: Funktioniert auf einer 7240.

Dieses Stueck Code muss man nur ausfuehren wenn die SID ungueltig ist. Das ist der Fall wenn zwischen 2 Requests mehr als 10 Minuten vergehen oder die Box rebootet wird.
Man kann dies natuerlich immer machen, ist aber nicht so elegant.

Code:
PASSWORT=GEHEIM
FRITZBOX=192.168.1.1

...
if [ $SIDUNGUELTIG -eq 1 ] ; then #Wenn also die SID ungueltig ist, dann SID holen und anmelden.
       # Challenge abholen
       echo "INFO: Da SID ungueltig Challenge abholen." # Weglassen, Info aus dem IF Zweig.
       rm webcm\?getpage\=..%2Fhtml%2Flogin_sid.xml* 2>/dev/null # Loeschen vorm Holen.
       ChallengeXML=`wget -t 1 -O - "http://$FRITZBOX/cgi-bin/webcm?getpage=../html/login_sid.xml" 2>/dev/null| grep Challenge`
       Challenge=`echo $ChallengeXML | awk '{match($0,/>[^<>]+</); print substr($0,RSTART+1,RLENGTH-2)}'`
       Passwd=$PASSWORT
       echo "INFO: Challenge ist: $Challenge"
       echo "INFO: Login aufbauen"
       # login aufbauen und hashen
       CPSTR="$Challenge-$Passwd"
       MD5=`echo -n $CPSTR | iconv -f ISO8859-1 -t UTF-16LE | md5sum -b | awk '{print substr($0,1,32)}'`
       RESPONSE="$Challenge-$MD5"
       POSTDATA="login:command/response=$RESPONSE&getpage=../html/de/menus/menu2.html"
       # login senden und SID herausfischen
       SID=`wget -t 1 -O - --post-data="$POSTDATA" "http://$FRITZBOX/cgi-bin/webcm" 2>/dev/null| grep "name=\"sid\"" | head -1 | awk '{match($0,/value="[^"]+"/); print substr($0,RSTART+7,RLENGTH-8)}'`
       echo "INFO: Login erledigt. SID: $SID"
       #Nun gueltige Seite mit Rufnummerninformationen/IP holen.
       rm home.lua\?sid\=* 2>/dev/null # Loeschen vor dem Abholen
       wget -t 1 http://$FRITZBOX/home/home.lua?sid=$SID 2>/dev/null
fi
...

voipd.
 
Zuletzt bearbeitet:
Müsste ich dann einen USB-Stick an der FB anstecken?
Ich denke nicht. Die Größe des binary ist:
Code:
... /freetz-devel> ls -la packages/target-mipsel_uClibc-0.9.32.1/sighttpd-1.2.0/root/usr/bin/sighttpd
-rwxr-xr-x 1 ### users 222072 29. Jul 15:20 packages/target-mipsel_uClibc-0.9.32.1/sighttpd-1.2.0/root/usr/bin/sighttpd
Code:
... /freetz-devel> file packages/target-mipsel_uClibc-0.9.32.1/sighttpd-1.2.0/root/usr/bin/sighttpd
packages/target-mipsel_uClibc-0.9.32.1/sighttpd-1.2.0/root/usr/bin/sighttpd: ELF 32-bit LSB executable, MIPS, MIPS32 version 1 (SYSV), statically linked, with unknown capability 0xf41 = 0x756e6700, with unknown capability 0x70100 = 0x3040000, stripped
Das ist nur zur Info.
 
Telnet ist Standard nur aus Netzwerk erreichbar nicht von außen, sofern man es überhaupt aktiviert per Telefon. Was spricht den gegen UpnP? Nutze es auch für z.B. für Trafficauswertung, bedarf kein Login oder Telnet. Du musst ja nicht automatische Portfreigabe in UPnP aktivieren, reine UPnP Information reichen doch für so was.
 
Da geisterte mal ein UPnP-Bug bei verschiedenen Modems durch das Internet und AFAIR wollte AVM das nicht korrigieren.

Ich probiere nun wie weit ich mit dem Ansatz von voipd komme.

@voipd:

Die Sinnhaftigkeit mancher Skriptbefehle erschließt sich mir noch nicht, aber ok, wenn ich dein Skript ausführe, dann erhalte ich eine SID.

Wie erhalte ich nun mit dieser SID eine Seite, die die IP-Adresse enthält?

Zur Diskussion:
Code:
CHALLENGE=`curl --retry 1  "http://192.168.178.1/cgi-bin/webcm?getpage=../html/login_sid.xml" 2>/dev/null | grep Challenge | sed 's/.*<Challenge>//' | sed 's/<\/Challenge>//'`
 
Die öffentliche (externe) IP-Adresse wird mit "ctlmgr_ctl r connection0 pppoe:status/ip" festgestellt.
Der sighttpd-Server auf der Box, ermittelt alle 10 Sekunden (das ist konfigurierbar) die externe IP-Adresse der Box und lauscht hier auf Port 44444 für Anfragen vom curl-Client auf dem Client-PC und stellt die Information _sicher_ im _read-only-Modus_ zur Verfügung:
Code:
root@fritz:/var/tmp/flash/mod# while `true`; do ctlmgr_ctl r connection0 pppoe:status/ip; sleep 10; done | /var/media/ftp/uStor02/archiv/sighttpd -f /var/tmp
/flash/mod/smsg.txt
starting shrecord_main thread
execvp() failed: No such file or directory
Launched shcodec-record successively
# of encs = 0
User-Agent: curl/7.20.1 (x86_64-unknown-linux-gnu) libcurl/7.20.1 OpenSSL/1.0.0 zlib/1.2.3 libidn/1.15 libssh2/1.2.2_DEV
Host: 192.168.###.1:44444
Accept: */*


[Sun, 29 Jul 2012 14:52:09 GMT] "GET /smsg.txt HTTP/1.1" 200  "curl/7.20.1 (x86_64-unknown-linux-gnu) libcurl/7.20.1 OpenSSL/1.0.0 zlib/1.2.3 libidn/1.15 libssh2/1.2.2_DEV"
Der curl-Client auf dem Client-PC ruft permanent die externe IP-Adresse der Box ab, die dieser im 10-Sekunden-Takt auch bekommt:
Code:
... /freetz-devel> curl -i http://192.168.###.1:44444/smsg.txt
HTTP/1.1 200 OK
Date: Sun, 29 Jul 2012 14:52:09 GMT
Server: Sighttpd/1.2.0
Content-Type: video/mp4

##.###.##.10
##.###.##.10
##.###.##.10
##.###.##.10
Inhalt der Config-(Hilfs)-Datei "smsg.txt" für den Server auf der Box:
Code:
root@fritz:/var/tmp/flash/mod# cat smsg.txt
Listen 44444

        <stdin>
                Path "/smsg.txt"
                Text ""
        </stdin>
Die externe IP-Adresse der Box, kann auf dem Client-PC, mit curl auch in eine Datei umgeleitet werden.
 
Kostenlos!

Statistik des Forums

Themen
248,907
Beiträge
2,303,654
Mitglieder
378,541
Neuestes Mitglied
telefonieverzweiflung