Tools for testing HTTPoxy Vulnerability

2016-07-21

I’ve developed a script that you can run on your server and test for CGI HTTPoxy vulnerability. It’s available on my github in a repository named HTTPoxy-Test-Tools. I’ve currently developed the script for apache web servers but I’ll be adding support for other webservers gradually.

Edit:

Added IIS HTTPoxy Testing Tool:
https://github.com/silverfoxy/HTTPoxy-Test-Tools/tree/master/iis_httpoxy

HTTPoxy Test Tools

This tool finds your webserver’s CGI directory, adds a temporary file that returns the HTTP_PROXY environment variable. It then sends a GET request to this CGI file and sets the “proxy” header for the underlying request. If the environment variable is affected, then you’re vulnerable. This package contains:

apache_httpoxy.py

apache_httpoxy.py Checks for this vulnerability on Apache web servers.

Dependencies:

os, urllib2, argparse

Usage

usage: apache_httpoxy.py [-h] [-b] [-c CONF]

optional arguments:

-h, –help show this help message and exit

-b, –boolean Script returns 1 if server is vulnerable, 0 if server is not vulnerable

-c CONF, –config CONF Enter httpd.conf address

Sample Output

$sudo python apache_httpoxy.py

[+] Initiating Test

[?] Enter httpd.conf address: [Default: /etc/httpd/conf/httpd.conf]

[+] httpd.conf address was set to /etc/httpd/conf/httpd.conf

[+] Reading CGI-Directory Address from httpd.conf

[+] CGI-Directory was set to /var/www/cgi-bin/

[+] Initiating TestSuite

[+] Creating CGI File

[+] Setting Permissions

[+] Running Tests

[+] Sending Get Request to http://127.0.0.1/cgi-bin/httpoxy-test-file.py with proxy header set to 10.10.10.10

[+] Testing proxy in response

[+] Proxy was set in response

[-] ===== Server Vulnerable =====

[+] Cleaning up

[+] Done

How does it work?

In order to test for HTTPoxy vulnerability we have to have CGI enabled and have a CGI script that sends requests via APIs that use HTTP_PROXY environment variable. The script reads httpd.conf file and searches for cgi-bin directory location.

class ApacheConfigParser : CGI_CONFIG_PATTERN = 'ScriptAlias /cgi-bin/' def __init__(self, filename) : self.config_file = filename def get_cgi_dir(self) : with open(self.config_file) as conf : for line in conf : if self.CGI_CONFIG_PATTERN in line : return line.split()[2].replace('"', '')

Then we create a python script to serve as our CGI application with the following code which returns HTTP_PROXY environment variable set for the script :

#!/usr/bin/python' import os print "Content-Type: text/html\n" print os.environ.get('HTTP_PROXY')

If the proxy returned by our CGI script matches the one in the attacker’s request then we’re vulnerable. We test this like this:

request = urllib2.Request('http://127.0.0.1/cgi-bin/' + self.filename, headers = {'proxy': '10.10.10.10'}) response = urllib2.urlopen(request).read() if '10.10.10.10' in response : print "Vulnerable" else : print "Not Vulnerable"