UPDATE: FritzBox aus BlitzMax ansprechen

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Midimaster

Betreff: UPDATE: FritzBox aus BlitzMax ansprechen

BeitragMo, März 08, 2021 11:45
Antworten mit Zitat
Benutzer-Profile anzeigen
EDIT: ich bin etwas weiter gekommen. Inzwischen habe ich einen MD5 Generator im Internet gefunden, dessen Hash von der Fritzbox akzeptiert wird. (siehe unten)


Ich nutze noch BlitzMax 1.50 und möchte damit die Smarthome Möglichkeiten meiner Fritzbox ansprechen.

Dazu gibt es eine Programmierschnittstelle, die schon macht was ich will, wenn ich erst mal eine Session-ID habe. Die besorge ich mir momentan, indem ich mich im Browser auf fritz.box anmelde. Dadurch erhalte ich eine gültige Session-ID. Mit der arbeite dann aus BlitzMax heraus

Nun möchte ich natürlich auch den Anmeldeprozess direkt aus BlitzMax durchführen. Dabei kommt das Challenge-Response-Verfahren zur Anwendung.

Das geht so:

1. ich frage die FritzBox ohne Parameter:

Code: [AUSKLAPPEN]
fritz.box/login_sid.lua


als Antwort erhalte ich:
Code: [AUSKLAPPEN]
<SessionInfo>
<SID>0000000000000000</SID>
<Challenge>c4d45d8b</Challenge>
<BlockTime>0</BlockTime>
<Rights/>
</SessionInfo>


Nun soll ich aus Challenge und meinem Passwort die nächste URL zusammenbauen:
Code: [AUSKLAPPEN]
fritz.box/login_sid.lua?username=&response=c4d45d8b-91e5b7b6f354f6ec38ff49a6d62de45d


Dafür muss ein MD5-Hash gebildet werden aus der Challenge und meinem Passwort

Der String für den MD5 soll so gebildet werden:
Code: [AUSKLAPPEN]
Challenge$ + "-" + Passwort$


Die Response soll dann wiederum so aussehen:
Code: [AUSKLAPPEN]
Challenge$ + "-" + MD5$


Also (wie man denken könnte) alles ganz einfach... aber die FritzBox erteilt daraufhin keine SID, sondern antwortet mit einer neuen Challenge und einem TimeOut

Momentan erzeuge ich in BlzuMax nur Strings, die ich dann wieder im Browser reinkopiere und so an die FritzBox sende.

Die FritzBox ist aktuell so eingestellt, dass sie nur Passwort aber keinen Usernamen braucht.


BlitzMax: [AUSKLAPPEN]
MD5$ = MakeMD5(Challenge$ + "-" + Passwort$)
URL$ = "fritz.box/login_sid.lua?username=&response=" + Challenge$ + "-" + MD5$



Das ist die MD5-Funktion, die ich verwende (im engl. Forum gefunden):
BlitzMax: [AUSKLAPPEN]
'entfernt weil fehlerhaft,
'besserer MD5-Algo siehe weiter unten....


Damit erhalte ich keinen Zugang!


Aber wenn ich den MD5 hier im Internet erzeugen lasse, akzeptiert ihn die FritzBox:

https://dencode.com/hash

und zwar dann, wenn ich die Methode auf UTF-16LE-MD5 umstelle.



Hat hier schon jemand Erfahrungen mit der FritzBox?
Wo finde ich einen passenden Algo für BlitzMax?


ich habe folgendes BIN Bash für Unix gefunden. Damit soll das Login gelingen. Aber diese Scriptsprache kenne ich leider nicht. Nützt das jemandem was?

Code: [AUSKLAPPEN]
#!/bin/bash
# Quelle: https://raspberrypiandstuff.wordpress.com/tag/fritzdect/
FBF="http://fritz.box"
USER=""
PASS=""
AIN=""
CHALLENGE=$(curl -s "${FBF}/login_sid.lua" | grep -Po '(?<=<Challenge>).*(?=</Challenge>)')

MD5=$(echo -n ${CHALLENGE}"-"${PASS} | 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=${USER}" "${FBF}" | grep -Po -m 1 '(?<=sid=)[a-f\d]+')

TEM
  • Zuletzt bearbeitet von Midimaster am Di, März 09, 2021 12:24, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragMo, März 08, 2021 18:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Die MD5 Funktion ist falsch implementiert. Laut wikipedia sollte ein leerer string den hash d41d8cd98f00b204e9800998ecf8427e ergeben, bei deinem code bekomme ich aber f8aa48e55de9ae206539bef169d9b56a
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Midimaster

BeitragDi, März 09, 2021 3:19
Antworten mit Zitat
Benutzer-Profile anzeigen
ich bin ein ganzes Stück weitergekommen.

Ich habe einen zweiten Algo gefunden, der korrekt arbeitet:
BlitzMax: [AUSKLAPPEN]
Function md5:String(sMessage:String)
Local nblk:Int = ((sMessage.length + 8) Shr 6) + 1
Local MD5_x:Int[(nblk * 16)]
Local MD5_a:Int = 1732584193
Local MD5_b:Int = -271733879
Local MD5_c:Int = -1732584194
Local MD5_d:Int = 271733878
Local MD5_AA:Int = 0
Local MD5_BB:Int = 0
Local MD5_CC:Int = 0
Local MD5_DD:Int = 0
Local i :Int = 0

For i = 0 To nblk * 16 - 1
MD5_x[i] = 0
Next

For i = 0 To (sMessage.length - 1)
MD5_x[(i Shr 2)] = MD5_x[(i Shr 2)] | (sMessage[i] Shl ((i Mod 4) * 8))
Next

MD5_x[(i Shr 2)] = MD5_x[(i Shr 2)] | (128 Shl (((i) Mod 4) * 8))
MD5_x[nblk * 16 - 2] = sMessage.length * 8

For Local k:Int = 0 To (nblk * 16 - 1) Step 16
MD5_AA = MD5_a
MD5_BB = MD5_b
MD5_CC = MD5_c
MD5_DD = MD5_d

'Round 1
MD5_a = MD5_FF(MD5_a, MD5_b, MD5_c, MD5_d, MD5_x[k + 0], 7, -680876936) '&HD76AA478
MD5_d = MD5_FF(MD5_d, MD5_a, MD5_b, MD5_c, MD5_x[k + 1], 12, -389564586) '&HE8C7B756
MD5_c = MD5_FF(MD5_c, MD5_d, MD5_a, MD5_b, MD5_x[k + 2], 17, 606105819 ) '&H242070DB
MD5_b = MD5_FF(MD5_b, MD5_c, MD5_d, MD5_a, MD5_x[k + 3], 22, -1044525330) '&HC1BDCEEE
MD5_a = MD5_FF(MD5_a, MD5_b, MD5_c, MD5_d, MD5_x[k + 4], 7, -176418897) '&HF57C0FAF
MD5_d = MD5_FF(MD5_d, MD5_a, MD5_b, MD5_c, MD5_x[k + 5], 12, 1200080426 ) '&H4787C62A
MD5_c = MD5_FF(MD5_c, MD5_d, MD5_a, MD5_b, MD5_x[k + 6], 17, -1473231341) '&HA8304613
MD5_b = MD5_FF(MD5_b, MD5_c, MD5_d, MD5_a, MD5_x[k + 7], 22, -45705983) '&HFD469501
MD5_a = MD5_FF(MD5_a, MD5_b, MD5_c, MD5_d, MD5_x[k + 8], 7, 1770035416) '&H698098D8
MD5_d = MD5_FF(MD5_d, MD5_a, MD5_b, MD5_c, MD5_x[k + 9], 12, -1958414417 ) '&H8B44F7AF
MD5_c = MD5_FF(MD5_c, MD5_d, MD5_a, MD5_b, MD5_x[k + 10], 17, -42063 ) '&HFFFF5BB1
MD5_b = MD5_FF(MD5_b, MD5_c, MD5_d, MD5_a, MD5_x[k + 11], 22, -1990404162) '&H895CD7BE
MD5_a = MD5_FF(MD5_a, MD5_b, MD5_c, MD5_d, MD5_x[k + 12], 7, 1804603682) '&H6B901122
MD5_d = MD5_FF(MD5_d, MD5_a, MD5_b, MD5_c, MD5_x[k + 13], 12, -40341101) '&HFD987193
MD5_c = MD5_FF(MD5_c, MD5_d, MD5_a, MD5_b, MD5_x[k + 14], 17, -1502002290) '&HA679438E
MD5_b = MD5_FF(MD5_b, MD5_c, MD5_d, MD5_a, MD5_x[k + 15], 22, 1236535329) '&H49B40821

'Round 2
MD5_a = MD5_GG(MD5_a, MD5_b, MD5_c, MD5_d, MD5_x[k + 1], 5, -165796510) '&HF61E2562
MD5_d = MD5_GG(MD5_d, MD5_a, MD5_b, MD5_c, MD5_x[k + 6], 9, -1069501632) '&HC040B340
MD5_c = MD5_GG(MD5_c, MD5_d, MD5_a, MD5_b, MD5_x[k + 11], 14, 643717713) '&H265E5A51
MD5_b = MD5_GG(MD5_b, MD5_c, MD5_d, MD5_a, MD5_x[k + 0], 20, -373897302) '&HE9B6C7AA
MD5_a = MD5_GG(MD5_a, MD5_b, MD5_c, MD5_d, MD5_x[k + 5], 5, -701558691) '&HD62F105D
MD5_d = MD5_GG(MD5_d, MD5_a, MD5_b, MD5_c, MD5_x[k + 10], 9, 38016083) '&H2441453
MD5_c = MD5_GG(MD5_c, MD5_d, MD5_a, MD5_b, MD5_x[k + 15], 14, -660478335) '&HD8A1E681
MD5_b = MD5_GG(MD5_b, MD5_c, MD5_d, MD5_a, MD5_x[k + 4], 20, -405537848) '&HE7D3FBC8
MD5_a = MD5_GG(MD5_a, MD5_b, MD5_c, MD5_d, MD5_x[k + 9], 5, 568446438) '&H21E1CDE6
MD5_d = MD5_GG(MD5_d, MD5_a, MD5_b, MD5_c, MD5_x[k + 14], 9, -1019803690) '&HC33707D6
MD5_c = MD5_GG(MD5_c, MD5_d, MD5_a, MD5_b, MD5_x[k + 3], 14, -187363961) '&HF4D50D87
MD5_b = MD5_GG(MD5_b, MD5_c, MD5_d, MD5_a, MD5_x[k + 8], 20, 1163531501) '&H455A14ED
MD5_a = MD5_GG(MD5_a, MD5_b, MD5_c, MD5_d, MD5_x[k + 13], 5, -1444681467) '&HA9E3E905
MD5_d = MD5_GG(MD5_d, MD5_a, MD5_b, MD5_c, MD5_x[k + 2], 9, -51403784) '&HFCEFA3F8
MD5_c = MD5_GG(MD5_c, MD5_d, MD5_a, MD5_b, MD5_x[k + 7], 14, 1735328473) '&H676F02D9
MD5_b = MD5_GG(MD5_b, MD5_c, MD5_d, MD5_a, MD5_x[k + 12], 20, -1926607734) '&H8D2A4C8A

'Round 3
MD5_a = MD5_HH(MD5_a, MD5_b, MD5_c, MD5_d, MD5_x[k + 5], 4, -378558) '&HFFFA3942
MD5_d = MD5_HH(MD5_d, MD5_a, MD5_b, MD5_c, MD5_x[k + 8], 11, -2022574463) '&H8771F681
MD5_c = MD5_HH(MD5_c, MD5_d, MD5_a, MD5_b, MD5_x[k + 11], 16, 1839030562) '&H6D9D6122
MD5_b = MD5_HH(MD5_b, MD5_c, MD5_d, MD5_a, MD5_x[k + 14], 23, -35309556) '&HFDE5380C
MD5_a = MD5_HH(MD5_a, MD5_b, MD5_c, MD5_d, MD5_x[k + 1], 4, -1530992060) '&HA4BEEA44
MD5_d = MD5_HH(MD5_d, MD5_a, MD5_b, MD5_c, MD5_x[k + 4], 11, 1272893353) '&H4BDECFA9
MD5_c = MD5_HH(MD5_c, MD5_d, MD5_a, MD5_b, MD5_x[k + 7], 16, -155497632) '&HF6BB4B60
MD5_b = MD5_HH(MD5_b, MD5_c, MD5_d, MD5_a, MD5_x[k + 10], 23, -1094730640) '&HBEBFBC70
MD5_a = MD5_HH(MD5_a, MD5_b, MD5_c, MD5_d, MD5_x[k + 13], 4, 681279174) '&H289B7EC6
MD5_d = MD5_HH(MD5_d, MD5_a, MD5_b, MD5_c, MD5_x[k + 0], 11, -358537222) '&HEAA127FA
MD5_c = MD5_HH(MD5_c, MD5_d, MD5_a, MD5_b, MD5_x[k + 3], 16, -722521979) '&HD4EF3085
MD5_b = MD5_HH(MD5_b, MD5_c, MD5_d, MD5_a, MD5_x[k + 6], 23, 76029189) '&H4881D05
MD5_a = MD5_HH(MD5_a, MD5_b, MD5_c, MD5_d, MD5_x[k + 9], 4, -640364487) '&HD9D4D039
MD5_d = MD5_HH(MD5_d, MD5_a, MD5_b, MD5_c, MD5_x[k + 12], 11, -421815835) '&HE6DB99E5
MD5_c = MD5_HH(MD5_c, MD5_d, MD5_a, MD5_b, MD5_x[k + 15], 16, 530742520) '&H1FA27CF8
MD5_b = MD5_HH(MD5_b, MD5_c, MD5_d, MD5_a, MD5_x[k + 2], 23, -995338651) '&HC4AC5665

'Round 4
MD5_a = MD5_II(MD5_a, MD5_b, MD5_c, MD5_d, MD5_x[k + 0], 6, -198630844) '&HF4292244
MD5_d = MD5_II(MD5_d, MD5_a, MD5_b, MD5_c, MD5_x[k + 7], 10, 1126891415) '&H432AFF97
MD5_c = MD5_II(MD5_c, MD5_d, MD5_a, MD5_b, MD5_x[k + 14], 15, -1416354905) '&HAB9423A7
MD5_b = MD5_II(MD5_b, MD5_c, MD5_d, MD5_a, MD5_x[k + 5], 21, -57434055) '&HFC93A039
MD5_a = MD5_II(MD5_a, MD5_b, MD5_c, MD5_d, MD5_x[k + 12], 6, 1700485571) '&H655B59C3
MD5_d = MD5_II(MD5_d, MD5_a, MD5_b, MD5_c, MD5_x[k + 3], 10, -1894986606) '&H8F0CCC92
MD5_c = MD5_II(MD5_c, MD5_d, MD5_a, MD5_b, MD5_x[k + 10], 15, -1051523) '&HFFEFF47D
MD5_b = MD5_II(MD5_b, MD5_c, MD5_d, MD5_a, MD5_x[k + 1], 21, -2054922799) '&H85845DD1
MD5_a = MD5_II(MD5_a, MD5_b, MD5_c, MD5_d, MD5_x[k + 8], 6, 1873313359) '&H6FA87E4F
MD5_d = MD5_II(MD5_d, MD5_a, MD5_b, MD5_c, MD5_x[k + 15], 10, -30611744) '&HFE2CE6E0
MD5_c = MD5_II(MD5_c, MD5_d, MD5_a, MD5_b, MD5_x[k + 6], 15, -1560198380 ) '&HA3014314
MD5_b = MD5_II(MD5_b, MD5_c, MD5_d, MD5_a, MD5_x[k + 13], 21, 1309151649) '&H4E0811A1
MD5_a = MD5_II(MD5_a, MD5_b, MD5_c, MD5_d, MD5_x[k + 4], 6, -145523070) '&HF7537E82
MD5_d = MD5_II(MD5_d, MD5_a, MD5_b, MD5_c, MD5_x[k + 11], 10, -1120210379) '&HBD3AF235
MD5_c = MD5_II(MD5_c, MD5_d, MD5_a, MD5_b, MD5_x[k + 2], 15, 718787259) '&H2AD7D2BB
MD5_b = MD5_II(MD5_b, MD5_c, MD5_d, MD5_a, MD5_x[k + 9], 21, -343485551) '&HEB86D391

MD5_a = MD5_a + MD5_AA
MD5_b = MD5_b + MD5_BB
MD5_c = MD5_c + MD5_CC
MD5_d = MD5_d + MD5_DD
Next

Return String(WordToHex$(MD5_a) + WordToHex$(MD5_b) + WordToHex$(MD5_c) + WordToHex$(MD5_d)).tolower()

End Function


Function MD5_F:Int(x:Int, y:Int, z:Int)
Return ((x & y) | (~(x) & z))
End Function


Function MD5_G:Int(x:Int, y:Int, z:Int)
Return ((x & z) | (y & (~(z))))
End Function


Function MD5_H:Int(x:Int, y:Int, z:Int)
Return (x ~ y ~ z)
End Function


Function MD5_I:Int(x:Int, y:Int, z:Int)
Return (y ~ (x | (~z)))
End Function


Function MD5_FF:Int(a:Int, b:Int, c:Int, d:Int, x:Int, s:Int, ac:Int)
a = (a + ((MD5_F(b, c, d)+ x)+ ac))
a = RotateLeft(a, s)
Return a + b
End Function


Function MD5_GG:Int(a:Int, b:Int, c:Int, d:Int, x:Int, s:Int, ac:Int)
a = (a + ((MD5_G(b, c, d) + x) + ac))
a = RotateLeft(a, s)
Return a + b
End Function


Function MD5_HH:Int(a:Int, b:Int, c:Int, d:Int, x:Int, s:Int, ac:Int)
a = (a + ((MD5_H(b, c, d) + x) + ac))
a = RotateLeft(a, s)
Return a + b
End Function


Function MD5_II:Int(a:Int, b:Int, c:Int, d:Int, x:Int, s:Int, ac:Int)
a = (a + ((MD5_I(b, c, d) + x) + ac))
a = RotateLeft(a, s)
Return a + b
End Function


Function RotateLeft:Int(lValue:Int, iShiftBits:Int)
Return (lValue Shl iShiftBits) | (lValue Shr (32 - iShiftBits))
End Function


Function WordToHex:String(lValue:Int)
Local returnString:String
For Local x:Int = 0 To 7
Local y:Int = (lValue Shr (x*4)) & $f
returnString$ = Chr(y+48+(y>9)*39) + returnString$
Next

Return returnString$[6..8] + returnString$[4..6] + returnString$[2..4] + returnString$[0..2]
End Function


Damit erziele ich schon mal korrekte Antworten.

z.b. müsste eine Beispielsatz wie...
Code: [AUSKLAPPEN]
The quick brown fox jumps over the lazy dog

...diesen Hash erzeugen: "9e107d9d372bb6826bd81d3542a419d6"

Das funktioniert jetzt mit der neuen Funktion einwandfrei.

Allerdings erwartet die Fritzbox den UTF-16LE-MD5. Und der ergäbe für den obigen Beispielsatz diesen Hash: "b0986ae6ee1eefee8a4a399090126837"

Wenn ich nun den Beispielsatz in einem Text-Edotor als Textdatei mit den Encoding "UTF-16 no BOM" abspeichere und anschließend in BlitzMax lade, dann erhalte ich tatsächlich bereits den erwarteten Hash:

BlitzMax: [AUSKLAPPEN]

Local result$=LoadText("utftext.txt")
Print MD5(result)

printet dies:
Code: [AUSKLAPPEN]
b0986ae6ee1eefee8a4a399090126837


Nur "direkt" will es mir noch nicht gelingen:

BlitzMax: [AUSKLAPPEN]

Local result$="The quick brown fox jumps over the lazy dog"
Print MD5(result)

printet dies:
Code: [AUSKLAPPEN]
9e107d9d372bb6826bd81d3542a419d6
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Midimaster

Betreff: Wieder ein Fortschritt

BeitragDi, März 09, 2021 11:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Mittlerweile ist es mir gelungen einen String so abzuspeichern und wiederzuladen, dass er bei der MD5-Funktion das gewünschte Ergebnis bringt.

BlitzMax: [AUSKLAPPEN]
SuperStrict 
Local ErsteFrage$="http://fritz.box/login_sid.lua"
Local test$="http://fritz.box/login_sid.lua?username=&response="
Local Challenge$= "123467890"
Local Pass$="ABCDE"
Local Response$ = Challenge + "-" + Pass
SaveAs_UTF_16LE_noBOM(Response, "temp.txt")

Response=LoadText("temp.txt")
Print "RESPONSE MD5 =" + MD5(Response)


Function SaveAs_UTF_16LE_noBOM(Text$, FileName$)
Local Out:Byte[Len(Text)*2]
For Local i%=1 To Len(Text)
OUT[i*2-2] = Asc(Mid(Text,i,1))
OUT[i*2-1] = 0
Next
SaveByteArray(Out,FileName)
End Function

Der Trick ist, die Bytes des String zwar als UTF-16-LE abzuspeichern, aber nicht den Erkennungsheader (auch BOM genannt) "FF-FE" vorne dran zu stellen.
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Thunder

BeitragDi, März 09, 2021 12:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Falls du noch Spaß am Probieren hast, ich glaube dass BlitzMax intern Strings sowieso als UTF-16 abspeichert, daher könntest du eigentlich wenn du direkten Zugriff auf die Rohdaten des Strings bekommst, MD5 darauf anwenden und wenn die Endianess stimmt, sollte auch der richtige Hash rauskommen.

Es gibt intern die Funktion bbStringToWString die einen solchen pointer zurückgibt (müsste meiner meinung nach UTF-16 sein). Der Pointer muss per MemFree freigegeben werden, wenn er nicht mehr gebraucht wird.
Siehe: https://github.com/blitz-resea...ing.c#L505
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

Midimaster

BeitragDi, März 09, 2021 12:19
Antworten mit Zitat
Benutzer-Profile anzeigen
schon wieder weitergekommen.

BlitzMax: [AUSKLAPPEN]
SuperStrict 
Local Challenge$= "123467890"
Local Pass$="ABCDE"
Local Response$ = Challenge + "-" + Pass

Print "RESPONSE MD5 =" + MD5(Convert(Response))

Function Convert$(Text$)
Local Out:Byte[Len(Text)*2]
For Local i%=1 To Len(Text)
OUT[i*2-2] = Asc(Mid(Text,i,1))
OUT[i*2-1] = 0
Next
Local s$=String.FromBytes(OUT,out.length)
Return S
End Function


Der String muss in einen "quasi" UTF16 umgewandelt werden, darf aber den Header FF-FE nicht vorneweg bekommen. Dies lässt sich auch direkt mit einem Zwischenspeichern in einem Byte-Array erzeugen. Anschließend ist der String für BlitzMax doppelt so lange und wird eben nicht als UTF16 interpretiert. Wenn ich das jetzt durch den MD5-Algo jage, kommt der erwartete Hash raus!

Fertig!
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group