Fritzbox: fetch data with a bash script
2013-08-01
Fritzbox is a popular router with many great features. Today I want share a script that allows you to extract some information without using the web interface. Many thanks to home.debian-hell.org. This post inspred me to look into this topic and I reused the connection part.
#!/bin/bash
_FBOX="https://$1"
_HTTP_USERNAME="$2"
_HTTP_PASSWORD="$3"
_USERNAME=""
_PASSWORD=""
_EXPORT_PASSWORD="foobar"
echo "Fritzbox URL: ${_FBOX}"
# get challenge key from FB
_CHALLENGE=$(curl -s \
-k \
--user ${_HTTP_USERNAME}:${_HTTP_PASSWORD} \
"${_FBOX}/login.lua" | \
egrep "^g_challenge|ready.onReady\(function" | \
tail -1 | \
awk -F'"' '{ print $2 }')
#echo "challenge: ${_CHALLENGE}"
# build md5 from challenge key and password
_MD5=$(echo -n \
${_CHALLENGE}"-"${_PASSWORD} | \
iconv -f ISO8859-1 \
-t UTF-16LE | \
md5sum -b | \
awk '{print substr($0,1,32)}')
#echo "md5: ${_MD5}"
# assemble challenge key and md5
_RESPONSE=${_CHALLENGE}"-"${_MD5}
#echo "response: ${_RESPONSE}"
# get sid for later use
_SID=$(curl -i \
-s \
-k \
--user ${_HTTP_USERNAME}:${_HTTP_PASSWORD} \
-d 'response='${_RESPONSE} \
-d 'page=' \
-d 'username='${_USERNAME} \
${_FBOX}/login.lua | \
grep "Location:" | \
awk -F'=' {' print $NF '})
#echo "sid: ${_SID}"
# get configuration from FB and write to a file
curl -s \
-k \
--user ${_HTTP_USERNAME}:${_HTTP_PASSWORD} \
--form 'sid='${_SID} \
--form 'ImportExportPassword='${_EXPORT_PASSWORD} \
--form 'ConfigExport=' \
${_FBOX}/cgi-bin/firmwarecfg > tmp_$1_export.txt
echo "telefone numbers: "
grep "name = \"0" tmp_$1_export.txt | sed -e 's/.*= "//' -e 's/";//'
echo "ssid:"
grep "ssid = " tmp_$1_export.txt | grep -v "_ssid" | sed -e 's/.*= "//' -e 's/";//'
curl -s \
-k \
--user ${_HTTP_USERNAME}:${_HTTP_PASSWORD} \
"${_FBOX}/cgi-bin/webcm?getpage=../html/de/menus/menu2.html&var:menu=fon&var:pagename=foncalls&sid=${_SID}" > tmp_$1_calls.txt
echo Calls:
grep '(TrCall(' tmp_$1_calls.txt | sed -e 's/.*(//' -e 's/"//g' -e 's/^1/incomming/' -e 's/^3/outgoing/' | cut -d "," -f 1,2,3,4,8
curl -s \
-k \
--user ${_HTTP_USERNAME}:${_HTTP_PASSWORD} \
${_FBOX}/wlan/encrypt.lua?sid=${_SID} > tmp_$1_wlan_encrypt.txt
echo WLAN key: ${_WLANKEY}
grep 'settings/pskvalue' tmp_$1_wlan_encrypt.txt | sed -e 's/.* = //' -e 's/"//g' -e 's/, $//'
rm tmp_$1*
you can start the script simply with ./fritzbox.sh 10.20.30.40 myusername mypassword
You might think that it is not very useful to extract the last calls to a text file on your server and you are right 🙂
The output is just an example and should give you an overview how it works and what would be possible.
You can store the information somewheare and compare them one a week for automatic email notifications in case a new port forwarding rule was created.
Have fun! 🙂