Attacking WCF Web Services-Holyfield-Shmoocon 2010

45
Cracking the Foundation: Attacking WCF Web Services Shmoocon 2010 - February 7, 2010 Brian Holyfield Gotham Digital Science http://www.gdssecurity.com [email protected]

Transcript of Attacking WCF Web Services-Holyfield-Shmoocon 2010

Page 1: Attacking WCF Web Services-Holyfield-Shmoocon 2010

Cracking the Foundation:

Attacking WCF Web Services

Shmoocon 2010 - February 7, 2010

Brian Holyfield

Gotham Digital Science

http://www.gdssecurity.com

[email protected]

Page 2: Attacking WCF Web Services-Holyfield-Shmoocon 2010

Attacking WCF Web Services

• Session Objectives

– Introduction to WCF

– Tools & Techniques for Attacking WCF Services

• Session Outline

– WCF Overview

– Silverlight WCF Web Services

– WCF and WS-Security

– Duplex Services

Page 3: Attacking WCF Web Services-Holyfield-Shmoocon 2010

WTF is WCF?

• Core Communications Framework for .NET

Applications and Services

– Introduced in .NET 3.0, enhanced in .NET 3.5– Introduced in .NET 3.0, enhanced in .NET 3.5

– Various protocol bindings and message formats

– Backwards compatible for legacy services

Page 4: Attacking WCF Web Services-Holyfield-Shmoocon 2010

What’s new with WCF?

Page 5: Attacking WCF Web Services-Holyfield-Shmoocon 2010

ABCs of WCF Endpoints

• WCF Services are exposed through Endpoints

• Each Endpoint has three required elements

– Address– Address

– Binding

– Contract

(commonly referred to as the A-B-C’s)

Page 6: Attacking WCF Web Services-Holyfield-Shmoocon 2010

WCF Addresses

“Where can I find the service?”

• Every WCF Service has a Unique Address

– Transport Protocol– Transport Protocol

– Location

– Often use .svc file extension when hosted in IIS

[transport]://[machine or domain][:optional port]/[optional uri]

Page 7: Attacking WCF Web Services-Holyfield-Shmoocon 2010

WCF Bindings

“How do I talk to the service?”

• Bindings specify how a service communicates

– Transport Protocol– Transport Protocol

– Encoding (Message Format)

• Several out-of-the-box bindings, or can be

customized

Page 8: Attacking WCF Web Services-Holyfield-Shmoocon 2010

WCF Bindings

• WCF Transport Protocols

– NET.TCP

– HTTP/HTTPS

– Named Pipes (IPC)

– Peer to Peer (P2P)

Message Queuing (MSMQ)– Message Queuing (MSMQ)

• WCF Encoding Formats

– Text (SOAP, XML, JavaScript)

– Binary

– MTOM

Page 9: Attacking WCF Web Services-Holyfield-Shmoocon 2010

WCF Contracts

“What can I do with the service?”

• Nothing is part of a service contract by default

– Opt-In Approach– Opt-In Approach

• Must explicitly indicate exposed methods

Page 10: Attacking WCF Web Services-Holyfield-Shmoocon 2010

Attacking WCF Services

• Example 1: Silverlight 3 Client Service

• Example 2: WCF Duplex Abuse• Example 2: WCF Duplex Abuse

• Example 3: WS-Security & Message Encryption

Page 11: Attacking WCF Web Services-Holyfield-Shmoocon 2010

Example 1: Silverlight Client Service

• WCF commonly consumed by

Silverlight for browser services

– Broad Support for WCF in Silverlight 3+– Broad Support for WCF in Silverlight 3+

– By default, uses .NET Binary SOAP Messages

• Content-Type: application/soap+msbin1

• MC-NBFS Protocol Specification

– http://msdn.microsoft.com/en-us/library/cc219175(PROT.10).aspx

Page 12: Attacking WCF Web Services-Holyfield-Shmoocon 2010

HTTP/S Proxies and MC-NBFS

• Limited (if any) support for MC-NBFS/MSBin1

in most common proxy tools

– Fiddler: Binary XML Inspector (Richard Berg)– Fiddler: Binary XML Inspector (Richard Berg)

• http://tfstoys.codeplex.com/

• Read Only inspection of Binary XML Messages

Page 13: Attacking WCF Web Services-Holyfield-Shmoocon 2010

MSBin1 Burp Proxy Plug-In

• Plug-In for Burp Suite

– MSBin1 Burp Plug-In (Gotham Digital Science)

• Leverages Richard Berg’s XML Encoder/Decoder

• Allows full edit/update of Binary XML Messages• Allows full edit/update of Binary XML Messages

– Implements processProxyMessage and processHttpMessage methods of BurpExtender

– Available for free at http://www.gdssecurity.com

Page 14: Attacking WCF Web Services-Holyfield-Shmoocon 2010

MSBin1 Burp Proxy Plug-In

• Editing Encoded Response Data

– Both processProxyMessage and processHttpMessageare invoked BEFORE response edit, not after

– Workaround: Chain 2 proxy instances to perform encoding and decoding of intercepted requests

• “X-WCF-Proxy: must-encode” header

Page 15: Attacking WCF Web Services-Holyfield-Shmoocon 2010

MSBin1 Burp Proxy Plug-In

• Workaround for Burp Extender API Limitations

Silverlight Client WCF Service

Attacker

Burp Proxy 1

• Decode & Edit Requests

• Encode Edited Responses

Burp Proxy 2

• Decode & Edit Responses

• Encode Edited Requests

Page 16: Attacking WCF Web Services-Holyfield-Shmoocon 2010

Obtaining WCF MetaData

• HTTP-GET

– Same as legacy ASMX

– Retrieved by appending “?wsdl” to the address

• Metadata Exchange (MEX) Binding

– Based on WS-MetadataExchange Standard

– W3C Working Draft (25 June 2009)

Page 17: Attacking WCF Web Services-Holyfield-Shmoocon 2010

MetaData Helper Page

Page 18: Attacking WCF Web Services-Holyfield-Shmoocon 2010

Obtaining WCF MetaData

• By default, no metadata is published

– WSDL and MEX are enabled by default in Visual

Studio WCF configuration

[snip][snip]

<endpoint address="mex" binding="mexHttpBinding"contract="IMetadataExchange"/>

[…]<!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->

<serviceMetadata httpGetEnabled="true"/>

[snip]

Page 19: Attacking WCF Web Services-Holyfield-Shmoocon 2010

Basic MEX Request Structure

POST /MyService.svc/mex HTTP/1.1

Content-Type: application/soap+xml; charset=utf-8

Host: wcf.example.com

Content-Length: 565

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">

<s:Header><s:Header><a:Action>

http://schemas.xmlsoap.org/ws/2004/09/transfer/Get</a:Action><a:To>

http://wcf.example.com/MyService.svc/mex</a:To>

</s:Header><s:Body/>

</s:Envelope>

Page 20: Attacking WCF Web Services-Holyfield-Shmoocon 2010

MetaData over SSL

• A note about MetaData over SSL

Default Visual Studio Template:

<serviceMetadata httpGetEnabled="true"/>

Does NOT include:

<serviceMetadata httpsGetEnabled="true"/>

Page 21: Attacking WCF Web Services-Holyfield-Shmoocon 2010

Manual Testing Utilities

• Leveraging MetaData for Manual Testing

– WcfTestClient

• Automatically Parses WSDL or MEX

• Ships with Visual Studio 2008+• Ships with Visual Studio 2008+

– http://weblogs.asp.net/blogs/guillermo/Code/WcfTestClient.zip

– WCF Storm

• Supports most WCF bindings

• Free Lite Version available

– http://www.wcfstorm.com/wcf/download-wcfstorm-lite.aspx

Page 22: Attacking WCF Web Services-Holyfield-Shmoocon 2010

Obtaining MetaData from XAP Files

• Silverlight client can be decompiled to obtain

service metadata from the XAP file

– Service Endpoints

– Methods & Data Types– Methods & Data Types

• Download, Unzip, Decompile

– .NET Reflector w/ FileGenerator Plug-In

– XAP Reflector

Page 23: Attacking WCF Web Services-Holyfield-Shmoocon 2010

WS-Discovery

• Open protocol standard for multicast

discovery of services on a local network

– .NET Framework v4+ (still in Beta)

– UDP Port 3702– UDP Port 3702

– 4 Message Types

• Hello – Announce a service has joined the network

• Bye – Announce a service is leaving the network

• Probe – Search for a service by type or scope

• Resolve – Search for a service by name

23

Page 24: Attacking WCF Web Services-Holyfield-Shmoocon 2010

• WCF also supports “Duplex” communication

– Provides a “callback” channel for clients

• WSDualHttpBinding

• NetTcpBinding

Example 2: WCF Duplex Services

• NetPeerTcpBinding

– Ideal for “push” notification

Page 25: Attacking WCF Web Services-Holyfield-Shmoocon 2010

WSDualHttpBinding

• WSDualHttpBinding designed for HTTP Duplex

– Callback channel is a listening port on the client

– Uses Microsoft-HTTPAPI/2.0

• Client informs service of callback address

during initial request

– WCF server issues an acknowledgement response

to callback address

Page 26: Attacking WCF Web Services-Holyfield-Shmoocon 2010

WSDualHttpBinding

• CreateSequence

http://service/wcf.svcAction: CreateSequence

Reply To: http://client:8000/test

Port 80

Client

HTTP/1.1 202 Accepted

HTTP/1.1 202 Accepted

Servicehttp://client:8000/wcf.svcAction: CreateSequenceResponse

Reply From: http://service/wcf.svcPort 8000

Page 27: Attacking WCF Web Services-Holyfield-Shmoocon 2010

WSDualHttpBinding

• CreateSequence

http://service/wcf.svcAction: CreateSequence

Reply To: http://target:8000/test

Client1 HTTP/1.1 202 Accepted

http://target:8000/wcf.svcAction: CreateSequenceResponse

Reply From: http://service/wcf.svc

TargetTimeout

Page 28: Attacking WCF Web Services-Holyfield-Shmoocon 2010

WSDualHttpBinding

• CreateSequence

http://service/wcf.svcAction: CreateSequence

Reply To: http://target1:8000/test

Target1

Client1

HTTP/1.1 202 Accepted

Target2

Page 29: Attacking WCF Web Services-Holyfield-Shmoocon 2010

WSDualHttpBinding

• CreateSequence

http://service/wcf.svcAction: CreateSequence

Reply To: http://target1:8000/test

Target1

Client1

HTTP/1.1 202 Accepted

Target2

http://service/wcf.svcAction: CreateSequence

Reply To: http://target2:8000/test

Page 30: Attacking WCF Web Services-Holyfield-Shmoocon 2010

WSDualHttpBinding

• CreateSequence

http://service/wcf.svcAction: CreateSequence

Reply To: http://target1:8000/test

Target1

Client1

HTTP/1.1 202 Accepted

Target2

http://service/wcf.svcAction: CreateSequence

Reply To: http://target2:8000/test

HTTP/1.1 202 Accepted

Page 31: Attacking WCF Web Services-Holyfield-Shmoocon 2010

Abusing WSDualHttpBinding

• Port scanning via WSDualHttpBinding callback

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"xmlns:a="http://www.w3.org/2005/08/addressing"><s:Header>

<a:Action s:mustUnderstand="1">http://schemas.xmlsoap.org/ws/2005/02/rm/CreateSequence

</a:Action><a:MessageID>urn:uuid:foobar</a:MessageID><a:MessageID>urn:uuid:foobar</a:MessageID><a:ReplyTo>

<a:Address>http://holyfield-pc:135/test</a:Address></a:ReplyTo><a:To s:mustUnderstand="1">

http://gotham-vista:88/Service.svc</a:To>

</s:Header><s:Body>

<CreateSequence xmlns="http://schemas.xmlsoap.org/ws/2005/02/rm"></CreateSequence>

</s:Body></s:Envelope>

Page 32: Attacking WCF Web Services-Holyfield-Shmoocon 2010

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"xmlns:a="http://www.w3.org/2005/08/addressing"><s:Header>

<a:Action s:mustUnderstand="1">http://schemas.xmlsoap.org/ws/2005/02/rm/CreateSequence

</a:Action><a:MessageID>urn:uuid:foobar</a:MessageID>

Abusing WSDualHttpBinding

• Port scanning via WSDualHttpBinding callback

<a:MessageID>urn:uuid:foobar</a:MessageID><a:ReplyTo>

<a:Address>http://holyfield-pc:135/test</a:Address></a:ReplyTo><a:To s:mustUnderstand="1">

http://gotham-vista:88/Service.svc</a:To>

</s:Header><s:Body>

<CreateSequence xmlns="http://schemas.xmlsoap.org/ws/2005/02/rm"></CreateSequence>

</s:Body></s:Envelope>

Page 33: Attacking WCF Web Services-Holyfield-Shmoocon 2010

WsDualScanner

• Converts any WSDualHttpBinding service into

a remote port scanner

– Works behind the firewall (DMZ/Intranet)

– Relatively slow, but effective (timeouts)– Relatively slow, but effective (timeouts)

Probe 1 (Ignore Response)

Probe 2 (Measure Response Time for Probe 1)

Probe 3 (Measure Response Time for Probe 2)

Probe 4 (Measure Response Time for Probe 3)…

Page 34: Attacking WCF Web Services-Holyfield-Shmoocon 2010

Proof of Concept: Azure Cloud

10.X.X.X10.X.X.X

myapp.cloudapp.net

Page 35: Attacking WCF Web Services-Holyfield-Shmoocon 2010

Example 3: Secure WCF Bindings

• Secure Bindings support Message Security

– Based on WS-Security standards

• NetTCPBinding (Binary XML Message Format)

• wsHttpBinding (SOAP/XML over HTTP/S)

• many more…

– Multiple credentials options

• Windows, Certificate, Username, Anonymous, IssuedToken

Page 36: Attacking WCF Web Services-Holyfield-Shmoocon 2010

Determining WCF Security Settings

• Analyze Binding Security Settings

– Primarily Driven off “Mode”

• Transport (clientCredentialType)

• Message (clientCredentialType)• Message (clientCredentialType)

• TransportWithMessage

– Refer to both Transport and Message settings

• None

Page 37: Attacking WCF Web Services-Holyfield-Shmoocon 2010

WCF Message Security

• Message security uses WS-Security Specification

– Alternative to TLS/SSL

– Supports message signing, encryption, or both

• Supports negotiation by default

– Dynamically negotiates token

– Can be anonymous or require credentials

– Requires at least one certificate

Page 38: Attacking WCF Web Services-Holyfield-Shmoocon 2010

WS-S Anonymous Message Encryption

– Requires a valid server certificate

• Signed by trusted CA or in “Trusted People” store

SOAP security negotiation with 'http://target/service.svc' for target

'http://targetservice.svc' failed.

• Signed by trusted CA or in “Trusted People” store

• Try disabling certificate validation via behaviorConfiguration on the client

– Certificate may be provided within meta data

• Client -> Endpoint -> Identity -> Certificate

Page 39: Attacking WCF Web Services-Holyfield-Shmoocon 2010

WS-S Message Encryption

• Disabling certificate verification

<behaviors><endpointBehaviors>

<behavior name="NoCertValidation"><clientCredentials>

<serviceCertificate><serviceCertificate><authentication certificateValidationMode="None"

revocationMode="NoCheck" /></serviceCertificate>

</clientCredentials></behavior>

</endpointBehaviors></behaviors>

Page 40: Attacking WCF Web Services-Holyfield-Shmoocon 2010

WS-S Username Credentials

• Username & Password passed with message

– WCF does not allow over un-encrypted transport

– Passed in SOAP Header as defined by standards

<o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">

<o:UsernameToken><o:Username>wcftest</o:Username><o:Password>3mb3dd3d!</o:Password>

</o:UsernameToken></o:Security>

Page 41: Attacking WCF Web Services-Holyfield-Shmoocon 2010

Writing a Custom WCF Test Client

• Much easier than it sounds

– Usually requires less than 10 lines of custom code!!

• Use svcutil to generate the following artifacts using WSDL or MEX medatata:using WSDL or MEX medatata:

– [Service Name].cs – Client class with accessible web methods and complex data types

– output.config – Configuration file with endpoint information (address, bindings, contract)

Page 42: Attacking WCF Web Services-Holyfield-Shmoocon 2010

Writing a Custom WCF Test Client

• Custom WCF client in less than 10 LOC

public class MyClient{

public static void Main(){

try{

CalculatorClient client = new CalculatorClient();double sum = client.Add(1, 1);Console.WriteLine("1 + 1 = " + sum);

}catch (Exception e){

Console.WriteLine(e.Message);}

}}

Page 43: Attacking WCF Web Services-Holyfield-Shmoocon 2010

Writing a Custom WCF Test Client

• Quick and Dirty Test Client

– Step 1: Generate [class].cs and App.configsvcutil <metadataPath> /out:MyClient.cs /config:MyClient.exe.config

– Step 2: Add console processing logic

• using System;

• main()

– Step 3: Compile MyClient.cs file with csc.exe

Page 44: Attacking WCF Web Services-Holyfield-Shmoocon 2010

Summary

• WCF provides many new security features

– Attacks more difficult, but not impossible

– Perhaps some enhancement opportunities

• Toolset for attacking WCF services is limited

– Dictated by Binding and Security Options in use

• Silverlight adoption will drive consumption

Page 45: Attacking WCF Web Services-Holyfield-Shmoocon 2010

QUESTIONS

Brian Holyfield

Gotham Digital Science

http://www.gdssecurity.com

[email protected]