D-Link Captcha Partially Broken May 12th, 2009 Hack-A-Day reported on D-Link’s new captcha system designed to protect against malware that alters DNS settings by logging in to the router using default administrative credentials. I downloaded the new firmware onto our DIR-628 to take a look, and quickly found a flaw in the captcha authentication system that allows an attacker to glean your WiFi WPA pass phrase from the router with only user-level access, and without properly solving the captcha. When you login with the captcha enabled, the request looks like this: GET /post_login.xml?hash=c85d324a36fbb6bc88e43ba8d88b10486c9a286a&auth_code=0C52F&auth_id=268D2 The hash is a salted MD5 hash of your password, the auth_code is the captcha value that you entered, and the auth_id is unique to the captcha image that you viewed (this presumably allows the router to check the auth_code against the proper captcha image). The problem is that if you leave off the auth_code and auth_id values, some pages in the D-Link Web interface think that you’ve properly authenticated, as long as you get the hash right: GET /post_login.xml?hash=c85d324a36fbb6bc88e43ba8d88b10486c9a286a Most notably, once you’ve made the request to post_login.xml, you can activate WPS with the following request: GET /wifisc_add_sta.xml?method=pbutton&wps_ap_ix=0 When WPS is activated, anyone within WiFi range can claim to be a valid WPS client and retrieve the WPA passphrase directly from the router. Further, one need not log in with Administrative credentials to perform this attack; only User-level access is required to activate WPS. This means that even if you load the new firmware on your router, use a strong WPA pass phrase, and change your Administrative login, an attacker can still activate WPS and gain access to your wireless network by simply having an internal client view a Web page. The attack works like this: 1. The attacker uses DNS load balancing to bypass the browser’s same-domain restrictions. This allows his JavaScript code to access the router’s index page and glean the salt generated by the router. 2. The attacker’s JavaScript uses the salt to generate a login hash for the D-Link User account (blank password by default). 3. The attacker’s JavaScript sends the hash to the post_login.xml page. 4. The attacker’s JavaScript sends a request to the wifisc_add_sta.xml page, activating WPS. 5. The attacker uses WPSpy to detect when the victim’s router is looking for WPS clients, and connects to the WiFi network using a WPS-capable network card. So what you basically have is a combination of our previously described DNS load balancing and CSRF-based WPS attacks that results in a captcha bypass, privilage escalation, and a WPA crack, all with just a little JavaScript and some phishing.