您专门询问脚本和命令行结果之间的区别。请注意,在其他情况下,脚本结果可能无法用于您的 Fritzbox。
AVM Fritzbox 文档中的会话处理示例代码是用 C# 编写的,请参阅
从该代码中,我派生了https://github.com/WolfgangFahl/fritz-csharp-api
并添加了一些测试:
受到以下测试的启发:
基本上有5个例子:
- “”->“d41d8cd98f00b204e9800998ecf8427e”
- “秘密”、“09433e1853385270b51511571e35eeca”
- “测试”、“c8059e2ec7419f590e79d7f1b774bfe6”
- “1234567z-äbc”、“9e224a41eeefa284df7bb0f26c2913e2”;
- "!\"§$%&/()=?ßüäöÜÄÖ-.,;:_`´+*#'<>≤|" -> "ad44a7cb10a95cb0c4d7ae90b0ff118a" 现在是第 6 个示例:
"challenge-password1234" -> "1722e126192656712a1d352e550f1317" 这些在 Java 和 C# 实现中的行为相同。现在用下面的 bash 脚本尝试这些
回声 -n "$l_s" | iconv --from-code ISO8859-1 --to-code UTF-16LE | md5sum -b | gawk '{print substr($0,1,32)}'
例如在https://www.ip-phone-forum.de/threads/fritzbox-challenge-response-in-sh.264639/中讨论
因为它的 getmd5 函数为 Umlaut 案例提供了不同的结果,例如在我在 Mac OS Sierra 上的 bash 中。
已经添加了一些调试输出。
为 1234567z-äbc 给出的编码具有字节序列 2d c3 a4 62 63,而例如 java 实现具有 2d e4 62 63。
因此,请注意密码中的变音符号 - 使用此脚本解决方案可能会导致 fritzbox 访问失败。我正在寻找一种解决方法,当我找到它时会在这里发布。
bash 脚本
#!/bin/bash
# WF 2017-10-30
# Fritzbox handling
#
# get the property with the given name
# params
# 1: the property name e.g. fritzbox.url, fritzbox.username, fritzbox.password
#
getprop() {
local l_prop="$1"
cat $HOME/.fritzbox/application.properties | grep "$l_prop" | cut -f2 -d=
}
#
# get a value from the fritzbox login_sid.lua
#
getboxval() {
local l_node="$1"
local l_response="$2"
if [ "$l_response" != "" ]
then
l_data="&response=$l_response"
fi
fxml=/tmp/fxml$$
curl --insecure -s "${box_url}/login_sid.lua?username=${username}$l_response" > $fxml
cat $fxml |
gawk -v node=$l_node 'match($0,"<"node">([0-9a-f]+)</"node">",m) { print m[1] }'
cat $fxml
rm $fxml
}
#
# get the md5 for the given string
#
# see https://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/AVM_Technical_Note_-_Session_ID.pdf
#
# param
# 1: s - the string
#
# return
# md5
#
getmd5() {
local l_s="$1"
echo -n "$l_s" | iconv -f ISO8859-1 -t UTF-16LE | od -x
echo -n "$l_s" | iconv --from-code ISO8859-1 --to-code UTF-16LE | md5sum -b | gawk '{print substr($0,1,32)}'
}
# get global settings from application properties
box_url=$(getprop fritzbox.url)
username=$(getprop fritzbox.username)
password=$(getprop fritzbox.password)
# uncomment to test
getmd5 ""
# should be d41d8cd98f00b204e9800998ecf8427e
getmd5 secret
# should be 09433e1853385270b51511571e35eeca
getmd5 test
# should be c8059e2ec7419f590e79d7f1b774bfe6
getmd5 1234567z-äbc
# should be 9e224a41eeefa284df7bb0f26c2913e2
getmd5 "!\"§$%&/()=?ßüäöÜÄÖ-.,;:_\`´+*#'<>≤|"
# should be ad44a7cb10a95cb0c4d7ae90b0ff118a
exit
# Login and get SID
challenge=$(getboxval Challenge "")
echo "challenge=$challenge"
md5=$(getmd5 "${challenge}-${password}")
echo "md5=$md5"
response="${challenge}-${md5}"
echo "response=$response"
getboxval SID "$response"