Transparent SSL/TLS interception
Clone or download
Permalink
Failed to load latest commit information.
.github Add a "no support" note to issue template Sep 5, 2018
Mk Document SOURCE_DATE_EPOCH Oct 7, 2018
docker/sslsplit Fix stat syntax for busybox Oct 8, 2018
extra Add an LD_PRELOAD overlay to debug NSS certificate validation failures Aug 30, 2018
xnu Add XNU pf headers for macOS 10.13.4, 10.13.5 and 10.13.6 Oct 12, 2018
.gitattributes Add .gitattributes and cleanup .gitignore Jan 14, 2014
.gitignore Install sslsplit.conf.sample, respecting $(PREFIX) Oct 17, 2018
.travis.yml Add travisci target for FEATURES=-DWITHOUT_MIRROR Oct 15, 2018
AUTHORS.md Add Cihan Komecoglu to authors Sep 30, 2018
BSDmakefile Fix BSDmakefile for recent versions of BSD make Mar 27, 2016
GNUmakefile Do not run the unprivileged tests twice for sudotest Oct 21, 2018
LICENSE Add license title to conform with Github standards Feb 22, 2018
LICENSE.contrib Fix referenced filename Feb 5, 2018
LICENSE.third Add Xcode selection support Oct 1, 2018
NEWS.md Do not run the unprivileged tests twice for sudotest Oct 21, 2018
README.md Update README and manual page Oct 19, 2018
SECURITY.md Fix mailto link Sep 12, 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 Move RSA keysize for leaf keys into defaults.h Oct 19, 2018
defaults.t.c Initial support for building and unit testing in a docker image Oct 8, 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 Add build knob to build without mirroring and no libnet/libpcap depen… Oct 15, 2018
log.h Copy sockaddr to logpkt context instead of storing pointers Oct 13, 2018
logbuf.c Fix typo Oct 13, 2018
logbuf.h Preserve direction of close event in PCAP log and mirroring Oct 12, 2018
logbuf.t.c Fix logbuf_make_contiguous() and add unit test for it Oct 13, 2018
logger.c Preserve direction of close event in PCAP log and mirroring Oct 12, 2018
logger.h Preserve direction of close event in PCAP log and mirroring Oct 12, 2018
logpkt.c Remove include for ETHERTYPE_IPV6 on OpenBSD, we define it ourselves now Oct 16, 2018
logpkt.h Add build knob to build without mirroring and no libnet/libpcap depen… Oct 15, 2018
main.c Refactor uid/gid handling for dropuser Oct 19, 2018
main.t.c Fix logbuf_make_contiguous() and add unit test for it Oct 13, 2018
nat.c Revamp license information and package docs Feb 5, 2018
nat.h Add -o name=value option Aug 5, 2018
opts.c Add build knob to build without mirroring and no libnet/libpcap depen… Oct 15, 2018
opts.h Add build knob to build without mirroring and no libnet/libpcap depen… Oct 15, 2018
opts.t.c Silence build warnings in TravisCI and clean up #endif comments Oct 15, 2018
privsep.c Refactor uid/gid handling for dropuser Oct 19, 2018
privsep.h Combine openfile and pcap privsep interfaces Sep 30, 2018
proc.c PATH_MAX includes terminating NUL Oct 12, 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 Add build knob to build without mirroring and no libnet/libpcap depen… Oct 15, 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 Add libnet/libpcap versions to -V diagnostics Oct 15, 2018
ssl.h Improve error handling for cert and key loading Sep 25, 2018
ssl.t.c Initial support for building and unit testing in a docker image Oct 8, 2018
sslsplit.1 Update README and manual page Oct 19, 2018
sslsplit.conf.5 Mention equivalent options in conf man page and conf file Oct 17, 2018
sslsplit.conf.in Merge develop into equivalent-options Oct 17, 2018
sys.c Refactor uid/gid handling for dropuser Oct 19, 2018
sys.h Refactor uid/gid handling for dropuser Oct 19, 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.

Logging options include traditional SSLsplit connect and content log files as well as PCAP files and mirroring decrypted traffic to a network interface. Additionally, certificates, master secrets and local process information can be logged.

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

Requirements

SSLsplit depends on the OpenSSL, libevent 2.x, libpcap and libnet 1.1.x libraries bydefault; libpcap and libnet are not needed if the mirroring feature is omitted. 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 or LibreSSL.

Installation

With the requirements above 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, LIBPCAP_BASE, LIBNET_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 and build-time defaults see GNUmakefile and defaults.h.

Documentation

See the manual pages sslsplit(1) and sslsplit.conf(5) for user documentation. See NEWS.md for release notes listing significant changes between releases and SECURITY.md for information on security vulnerability disclosure.

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.