Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
.github Improve bug report instructions Jan 14, 2018
Mk Remove duplicate entry for openssl-1.0.0 Aug 27, 2018
extra Add an LD_PRELOAD overlay to debug NSS certificate validation failures Aug 30, 2018
xnu Add XNU headers for macOS High Sierra 10.13.1, 10.13.2 and 10.13.3 Aug 23, 2018
.gitattributes Add .gitattributes and cleanup .gitignore Jan 14, 2014
.gitignore Reuse existing session.pem for unit testing by refreshing its timestamp Aug 24, 2018
.travis.yml Hack around TravisCI creating empty cached directories Aug 29, 2018
AUTHORS.md Reverse order Aug 2, 2018
BSDmakefile Fix BSDmakefile for recent versions of BSD make Mar 27, 2016
GNUmakefile Add an LD_PRELOAD overlay to debug NSS certificate validation failures Aug 30, 2018
LICENSE Add license title to conform with Github standards Feb 22, 2018
LICENSE.contrib Fix referenced filename Feb 5, 2018
LICENSE.third Revamp license information and package docs Feb 5, 2018
NEWS.md Update NEWS Aug 26, 2018
README.md Suppress Expect-CT in HTTP mode to avoid CT lookup failures Aug 23, 2018
attrib.h Revamp license information and package docs Feb 5, 2018
base64.c Revamp license information and package docs Feb 5, 2018
base64.h Revamp license information and package docs Feb 5, 2018
base64.t.c Revamp license information and package docs Feb 5, 2018
build.c Update to newest buildinfo.mk Mar 10, 2018
build.h Update to newest buildinfo.mk Mar 10, 2018
cache.c Revamp license information and package docs Feb 5, 2018
cache.h Revamp license information and package docs Feb 5, 2018
cachedsess.c Revamp license information and package docs Feb 5, 2018
cachedsess.h Revamp license information and package docs Feb 5, 2018
cachedsess.t.c Fix test session loading for LibreSSL < 2.5.1 Aug 29, 2018
cachefkcrt.c Revamp license information and package docs Feb 5, 2018
cachefkcrt.h Revamp license information and package docs Feb 5, 2018
cachefkcrt.t.c Fix libressl support (#207) Aug 26, 2018
cachemgr.c Revamp license information and package docs Feb 5, 2018
cachemgr.h Revamp license information and package docs Feb 5, 2018
cachemgr.t.c Revamp license information and package docs Feb 5, 2018
cachessess.c Revamp license information and package docs Feb 5, 2018
cachessess.h Revamp license information and package docs Feb 5, 2018
cachessess.t.c Fix test session loading for LibreSSL < 2.5.1 Aug 29, 2018
cachetgcrt.c Revamp license information and package docs Feb 5, 2018
cachetgcrt.h Revamp license information and package docs Feb 5, 2018
cachetgcrt.t.c Specifically test if cache returned NULL Aug 19, 2018
cert.c Revamp license information and package docs Feb 5, 2018
cert.h Revamp license information and package docs Feb 5, 2018
cert.t.c Revamp license information and package docs Feb 5, 2018
defaults.h Add tests for default dropuser capabilities Jul 21, 2018
defaults.t.c Add tests for default dropuser capabilities Jul 21, 2018
dynbuf.c Revamp license information and package docs Feb 5, 2018
dynbuf.h Revamp license information and package docs Feb 5, 2018
dynbuf.t.c Revamp license information and package docs Feb 5, 2018
khash.h Update khash.h to latest version Mar 25, 2016
log.c Revamp license information and package docs Feb 5, 2018
log.h Revamp license information and package docs Feb 5, 2018
logbuf.c Revamp license information and package docs Feb 5, 2018
logbuf.h Revamp license information and package docs Feb 5, 2018
logger.c Revamp license information and package docs Feb 5, 2018
logger.h Revamp license information and package docs Feb 5, 2018
main.c OpenSSL engine support Aug 23, 2018
main.t.c Add tests for default dropuser capabilities Jul 21, 2018
nat.c Revamp license information and package docs Feb 5, 2018
nat.h Add -o name=value option Aug 5, 2018
opts.c Fix libressl support (#207) Aug 26, 2018
opts.h Fix libressl support (#207) Aug 26, 2018
opts.t.c Pass opts->spec to proxyspec_parse() instead of opts as a whole May 8, 2018
privsep.c Add fall through comment for missing break in case statement, as gcc … Aug 1, 2018
privsep.h Revamp license information and package docs Feb 5, 2018
proc.c Fix proc_freebsd_pid_for_addr() for FreeBSD 12 Feb 17, 2018
proc.h Revamp license information and package docs Feb 5, 2018
proxy.c Revamp license information and package docs Feb 5, 2018
proxy.h Revamp license information and package docs Feb 5, 2018
pxyconn.c Fix libressl support (#207) Aug 26, 2018
pxyconn.h Revamp license information and package docs Feb 5, 2018
pxysslshut.c Revamp license information and package docs Feb 5, 2018
pxysslshut.h Revamp license information and package docs Feb 5, 2018
pxythrmgr.c Revamp license information and package docs Feb 5, 2018
pxythrmgr.h Revamp license information and package docs Feb 5, 2018
pxythrmgr.t.c Revamp license information and package docs Feb 5, 2018
ssl.c Re-enable SSL_is_server() on LibreSSL 2.5.1+ using ->server workaround Aug 26, 2018
ssl.h Unbreak on OpenSSL 0.9.8 Aug 27, 2018
ssl.t.c OpenSSL engine support Aug 23, 2018
sslsplit.1 OpenSSL engine support Aug 23, 2018
sslsplit.conf OpenSSL engine support Aug 23, 2018
sslsplit.conf.5 OpenSSL engine support Aug 23, 2018
sys.c Revamp license information and package docs Feb 5, 2018
sys.h Revamp license information and package docs Feb 5, 2018
sys.t.c Update to newest buildinfo.mk Mar 10, 2018
thrqueue.c Revamp license information and package docs Feb 5, 2018
thrqueue.h Revamp license information and package docs Feb 5, 2018
url.c Revamp license information and package docs Feb 5, 2018
url.h Revamp license information and package docs Feb 5, 2018
url.t.c Revamp license information and package docs Feb 5, 2018
util.c Revamp license information and package docs Feb 5, 2018
util.h Revamp license information and package docs Feb 5, 2018
util.t.c Revamp license information and package docs Feb 5, 2018

README.md

SSLsplit - transparent SSL/TLS interception

https://www.roe.ch/SSLsplit

Overview

SSLsplit is a tool for man-in-the-middle attacks against SSL/TLS encrypted network connections. It is intended to be useful for network forensics, application security analysis and penetration testing.

SSLsplit is designed to transparently terminate connections that are redirected to it using a network address translation engine. SSLsplit then terminates SSL/TLS and initiates a new SSL/TLS connection to the original destination address, while logging all data transmitted. Besides NAT based operation, SSLsplit also supports static destinations and using the server name indicated by SNI as upstream destination. SSLsplit is purely a transparent proxy and cannot act as a HTTP or SOCKS proxy configured in a browser.

SSLsplit supports plain TCP, plain SSL, HTTP and HTTPS connections over both IPv4 and IPv6. It also has the ability to dynamically upgrade plain TCP to SSL in order to generically support SMTP STARTTLS and similar upgrade mechanisms. SSLsplit fully supports Server Name Indication (SNI) and is able to work with RSA, DSA and ECDSA keys and DHE and ECDHE cipher suites. Depending on the version of OpenSSL built against, SSLsplit supports SSL 3.0, TLS 1.0, TLS 1.1 and TLS 1.2, and optionally SSL 2.0 as well.

For SSL and HTTPS connections, SSLsplit generates and signs forged X509v3 certificates on-the-fly, mimicking the original server certificate's subject DN, subjectAltName extension and other characteristics. SSLsplit has the ability to use existing certificates of which the private key is available, instead of generating forged ones. SSLsplit supports NULL-prefix CN certificates but otherwise does not implement exploits against specific certificate verification vulnerabilities in SSL/TLS stacks.

SSLsplit implements a number of defences against mechanisms which would normally prevent MitM attacks or make them more difficult. SSLsplit can deny OCSP requests in a generic way. For HTTP and HTTPS connections, SSLsplit mangles headers to prevent server-instructed public key pinning (HPKP), avoid strict transport security restrictions (HSTS), avoid Certificate Transparency enforcement (Expect-CT) and prevent switching to QUIC/SPDY, HTTP/2 or WebSockets (Upgrade, Alternate Protocols). HTTP compression, encodings and keep-alive are disabled to make the logs more readable.

See the manual page sslsplit(1) for details on using SSLsplit and setting up the various NAT engines.

Requirements

SSLsplit depends on the OpenSSL and libevent 2.x libraries. The build depends on GNU make and a POSIX.2 environment in PATH. If available, pkg-config is used to locate and configure the dependencies. The optional unit tests depend on the check library.

SSLsplit currently supports the following operating systems and NAT mechanisms:

  • FreeBSD: pf rdr and divert-to, ipfw fwd, ipfilter rdr
  • OpenBSD: pf rdr-to and divert-to
  • Linux: netfilter REDIRECT and TPROXY
  • Mac OS X: pf rdr and ipfw fwd

Support for local process information (-i) is currently available on Mac OS X and FreeBSD.

SSL/TLS features and compatibility greatly depend on the version of OpenSSL linked against; for optimal results, use a recent release of OpenSSL proper. OpenSSL forks like LibreSSL and BoringSSL may or may not work.

Installation

With OpenSSL, libevent 2.x, pkg-config and check available, run:

make
make test       # optional unit tests
make sudotest   # optional unit tests requiring privileges
make install    # optional install

Dependencies are autoconfigured using pkg-config. If dependencies are not picked up and fixing PKG_CONFIG_PATH does not help, you can specify their respective locations manually by setting OPENSSL_BASE, LIBEVENT_BASE and/or CHECK_BASE to the respective prefixes.

You can override the default install prefix (/usr/local) by setting PREFIX. For more build options see GNUmakefile and defaults.h.

Documentation

See the manual page sslsplit.1 for user documentation. See NEWS.md for release notes listing significant changes between releases.

License

SSLsplit is provided under a 2-clause BSD license. SSLsplit contains components licensed under the MIT and APSL licenses. See LICENSE, LICENSE.contrib and LICENSE.third as well as the respective source file headers for details.

Credits

See AUTHORS.md for the list of contributors.

SSLsplit was inspired by mitm-ssl by Claes M. Nyberg and sslsniff by Moxie Marlinspike, but shares no source code with them.