The [CHPC] installed a new network this past weekend as part of the [SANReN] project. The new network consists of [Cisco] equipment, including their [NAC] (or "Clean Access") system. This requires all clients to authenticate before they are allowed access to the network, and can also enforce a configured security policy (such as requiring operating system updates and anti-virus).
The system works as follows. By default, the ports on the switch are in an "unauthenticated" [VLAN]. When a client is connected, it is provided with an IP address (via [DHCP]) in an "unauthenticated" subnet. The system then presents a captive portal which requires the user to authenticate with a username and password using their browser. If the authentication is successful, the port is moved to a different VLAN (depending on the user's access level), and the switch briefly disconnects the link which causes the client to negotiate a new IP address (in a different subnet).
Before the portal presents the login page it requires that a [Java applet] be run on the client. The applet gathers various bits of information about the client (including the operating system) and submits this information to the portal. (I assume that the portal uses this information to determine what policies must be enforced. In our setup, Windows machines must have the Clean Access Client installed, while Linux and Mac OS X machines are simply allowed access.) The portal then presents the login page.
Being a geek, I wasn't very happy to go through this rigmarole everytime I connected to the network. (I also couldn't use my [normal browser][konq] since the applet didn't work in it.) So I set out to automate the process. Initially I tried to script everything (including the Java applet) but then I noticed that the output of the applet wasn't sent with the login form submission. The only other information the form contained was a session key and random string, both of which were present on the [HTML] page which contained the applet. A manual test confirmed that the login page could be submitted successfully as long as the session key and random string were correct — the applet could be bypassed.
I quickly scripted the login process using a
 script and [wget]. I then installed it in <code>/etc/network/if-up.d</code> after adding some logic to only execute if the current IP address was on the unauthenticated network. The result is that I can plug in the cable, and my machine automatically authenticates to the system. While searching for information about the Clean Access system, I came across this [Slashdot article] about a guy who was suspended from university for bypassing the Clean Access checks. I only realised last night that this is exactly what my script does![^1] I haven't tested it on Windows yet, but the only possible change I can think of is to change the [user agent]. Seriously Cisco, the fact that I managed to bypass the applet simply by submitting the login form programmatically is ridiculous. I have attached my script to this post. The way in which I have parsed the HTML page is rather ugly and likely to only work on this specific version of Clean Access. I plan to rewrite it in [Python] sometime. <strong>Update:</strong> I have rewritten the script in Python, which should be a bit more solid since it parses the HTML using a [DOM]. The script requires [libxml2dom] and [ipy]. After configuring the parameters it can be dropped in <code>/etc/network/if-up.d</code>[^2] where it should run automatically. [^1]: Note that it doesn't bypass the authentication: you still need a valid account in order to gain access. [^2]: Make sure not to use a dot in the filename though. <em>[CHPC]: Centre for High Performance Computing </em>[SANReN]: South African National Research Network <em>[NAC]: Network Admission Control </em>[VLAN]: Virtual LAN <em>[DHCP]: Dynamic Host Configuration Protocol </em>[HTML]: HyperText Markup Language *[DOM]: Document Object Model [chpc]: http://www.chpc.ac.za/ [sanren]: http://www.meraka.org.za/sanren.htm [cisco]: http://en.wikipedia.org/wiki/Cisco_Systems [vlan]: http://en.wikipedia.org/wiki/Virtual_LAN [dhcp]: http://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol [nac]: http://en.wikipedia.org/wiki/Cisco_NAC_Appliance [java applet]: http://en.wikipedia.org/wiki/Java_applet [konq]: http://en.wikipedia.org/wiki/Konqueror [Slashdot article]: http://it.slashdot.org/article.pl?sid=07/04/27/203232 [user agent]: http://en.wikipedia.org/wiki/User_agent [python]: http://en.wikipedia.org/wiki/Python_(programming_language) [html]: http://en.wikipedia.org/wiki/HTML [wget]: http://en.wikipedia.org/wiki/Wget [bash]: http://en.wikipedia.org/wiki/Bash [dom]: http://en.wikipedia.org/wiki/Document_Object_Model [libxml2dom]: http://www.boddie.org.uk/python/libxml2dom.html [ipy]: http://russell.rucus.net/2008/ipy/