/CovertMark

A deep packet inspection (DPI) framework for benchmarking the covertness of protocol-obfuscation proxies.

Primary LanguagePythonMIT LicenseMIT

CovertMark

CovertMark is a deep packet inspection (DPI) framework for evaluating and benchmarking the covertness of protocol-obfuscation proxies. Working from the perspective of a state censor with extensive computational resources, CovertMark performs automated passive analysis on captured proxy traffic to determine the likelihood and practicality of accurate protocol classification, which would in turn allow the state censor to block such traffic. All TCP-based proxy protocols are applicable, including currently deployed Tor pluggable transports and tunnelling proxies such as shadowsocks.

CovertMark is extremely easy to use. You only need the downloaded code, a Python 3.5+ installation, and a PCAP file of your proxy traffic captured with WireShark (or with tcpdump on UNIX-like systems). You can download publicly available Tor pluggable transport and negative network traffic traces from here.

As an integrated offline traffic analysis solution, CovertMark is implemented entirely with Python, and no pre- or post-processing of captured traffic in other traffic analysis tools such as Bro are required. In addition to a summary report of covertness benchmarks (and a CovertMark Score), full CSV results and simple graph plotting are also available from CovertMark.

CovertMark comprises of generalised strategies (CovertMark/strategy) observing different features of traffic, with varying effects on different proxy protocols. You can easily implement new strategies into CovertMark by extending CovertMark.strategy.strategy.DetectionStrategy. For more detailed descriptions on how strategies can be implemented, please see the strategy implementation page here.

Installation

CovertMark requires Python 3.5 or newer, which can be obtained from python.org should your system came with an older version. For easy setup of dependencies, setuptools and pip are recommended, as well as virtualenv. These are normally available from your system's package management system, such as apt on Debian and Ubuntu, and brew on Mac OS X. They can otherwise be installed by downloading releases and installing manually with Python.

CovertMark uses a local MongoDB (3.2+) database to store parsed traffic traces for fast access, which can be installed by following the tutorial here. MongoDB authentication is supported locally (see the relevant section below).

In addition to UNIX and UNIX-like systems, CovertMark should work on Windows with all necessary dependencies, but the author did not have an appropriate machine to test it at the time of release.

On Debian and Ubuntu, matplotlib requires some additional dependencies:

sudo apt-get install libbz2-dev tk-dev

These should have been included in Command Line Tools distributed with Apple's Xcode on Mac OS X.

To set up CovertMark itself:

git clone https://github.com/chongyangshi/CovertMark.git

cd CovertMark

virtualenv env -p python3.5   # or python3.6, etc.

source env/bin/activate

pip install -r DEPENDENCIES

If your local MongoDB requires authentication, copy /CovertMark/data/mongo-auth-example.json into /CovertMark/data/mongo-auth.json, and edit the username, password, and authentication database required.

You can move your proxy PCAP files and regular (negative) traffic PCAP files into /CovertMark/examples/local, or leave it elsewhere on the system to specify an explicit path later. If you wish to use the cantab negative traces or any other example traces supplied by the project, please download them separately from the data page here.

To run CovertMark's command line user interface, simply run /CovertMark in module mode:

python -m CovertMark

In the command line interface, all possible commands (with parameters collected within) can be shown by entering help:

CovertMark >>> help

Operations and Usage

While the command line interface should be sufficiently intuitive, it is necessary to first explain how the covertness benchmarking works in CovertMark.

A Game of Filters

Filters nearly always become the most irritating part of any network traffic analysis system, as it is necessary to avoid processing wrong types of packets. CovertMark uses two types of filters, only one of which need to be manipulated by the user (the other by strategy designers only).

The user-facing input filters determine what IP addresses or subnets, as well as what direction(s) of flow should be parsed from the PCAP file into MongoDB for further analysis. Not all strategies require both directions of flow, and this will be automatically handled by CovertMark rather than the user, based on the strategy designer's specifications. CovertMark also supports IPv4 and IPv6 (mutually without much engineering effort thanks to Python 3's ipaddress library).

Therefore for the user, it is only necessary to know what IP addresses (e.g. 192.168.0.42, 2001:db8:a0b:12f0::1) or subnets (192.168.0.0/24, 2001:db8:a0b:12f0::/64) are to be associated with the clients and (if applicable) proxy servers in the PCAP files. These information will be prompted when setting up a CovertMark procedure from the user interface. Multiple clients and proxy servers are supported, which can be entered as a subnet if they are the only members of that subnet in the PCAP, or as distinct IP addresses separated by a comma.

Once the PCAP files are parsed into MongoDB, these information will be carried within a collection of parsed traces, and will not be required again from the user until manual deletion.

The other type of filters (relevant only to strategy designers) are strategic filters, which specify the inclusion of only certain types of packets for examination (e.g. TCP packets with payload but no TLS record), and are strategy-specific. Packets not matching the strategic filter will remain in MongoDB (to enable shared use between strategies to save disk space) but not loaded by the strategy who does not need it (to improve performance).

A Clash of Strategies

In order to streamline the benchmarking process to reduce manual configuration efforts, procedures are used to represent a series of strategy executions (runs) on the same or different inputs from PCAP files or MongoDB-stored traces. A strategy can have multiple runs to, for example, perform identical computations separately on both client-to-server and server-to-client packets.

A Storm of Procedures

To set up a procedure in the command line interface:

CovertMark >>> new

The interface will then prompt you to choose from possible runs of strategies; choose to import PCAP files or to select from existing MongoDB-stored traces; specify input filters as necessary; and supply additional runtime parameters required by the strategy run. This process will be repeated until you have set up all the runs of strategies you need, and allows duplications of runs should you wish to test the same run on different inputs. This will replace whatever procedure already set up or loaded.

You can view MongoDB-stored traces from past executions with traces, and delete some as required with delete if freeing up some disk space is needed.

Once you have set up your procedure, you can save it to a JSON file now, or delay saving until after the procedure's execution to use the parsed traces in MongoDB instead next time.

CovertMark >> save

To load a saved procedure, enter load and specify when prompted a relative or full path to where the procedure is stored as a JSON file.

At any time, you can check the current procedure in use by entering current. Once you are ready to execute the CovertMark procedure, enter execute to start the automated process.

The rest of the interface commands become available after results have been yielded from the execution of runs. Results include true positive rates (TPRs), false positive rates (FPRs), execution times on positive traces, and percentage of remote IPs falsely blocked in negative traces; corresponding to different configurations (one or more parameters) embedded within each strategy.

To view a list of results available, enter results. These will be retained until CovertMark exits, unless deleted with delresults. Falsely blocked remote IPs can be inspected in Wireshark with a generated display filter, which can be obtained through the wireshark command.

Assuming all runs of strategies in your procedure are on traces from the same proxy or pluggable transport protocol, you can view a summative report of the covertness of that protocol and its CovertMark Score by entering:

CovertMark >>> score

You can export full results of strategy runs by entering csv, which will export CSV records of all current results into a directory specified. Simple plotting between strategy configuration parameters and performance metrics can be done in plot, which will prompt the specific parameter(s) and metric(s) you wish to plot in pairs. More complex plots can be done separately from the CSVs exported.

Publication(s)

This project is the resulting product of my MPhil thesis Security evaluation of network protocol obfuscation proxies at the Computer Laboratory of the University of Cambridge, which will likely become a technical report and/or (hopefully) a conference paper. Citations to the relevant publication(s) will be available here once progresses have been made in publication.

Problems and Feedback

Despite extensive efforts made to engineer CovertMark as a user-facing product, it is likely to malfunction if not used in the intended ways. (For example, exceptions when supplied with PCAP files not matching the input filter, which are very difficult to check without consuming long execution times to read the PCAP first). If you do get strange or unexpected results after execution, it is worth checking whether the input filters have been entered correctly and match those in the PCAP files.

Of course, issues, pull requests, and general feedbacks are very welcome.