SSLsplit是一种针对SSL/TLS加密网络连接执行中间人攻击的工具。它旨在用于网络取证、应用程序安全分析和渗透测试。
SSLsplit设计用于透明地终止通过网络地址转换引擎重定向到它的连接。然后SSLsplit会终止SSL/TLS,并启动一个新的SSL/TLS连接到原始目标地址,同时记录所有传输的数据。除了基于NAT的操作外,SSLsplit还支持静态目标,并将SNI指示的服务器名称作为上游目标。SSLsplit纯是一个透明代理,不能作为浏览器中配置的HTTP或SOCKS代理使用。
SSLsplit支持纯TCP、纯SSL、HTTP和HTTPS连接,涵盖IPv4和IPv6。它还具备动态将纯TCP升级为SSL的能力,以泛化支持SMTP STARTTLS及类似的升级机制。SSLsplit完全支持服务器名称指示(SNI),并能与RSA、DSA和ECDSA密钥以及DHE和ECDHE密码套件配合使用。根据链接的OpenSSL版本,SSLsplit支持SSL 3.0、TLS 1.0、TLS 1.1和TLS 1.2,并可选择支持SSL 2.0。
对于SSL和HTTPS连接,SSLsplit会即时生成并签署伪造的X509v3证书,模仿原始服务器证书的主题DN、subjectAltName扩展及其他特征。SSLsplit能够使用其私钥可用的现有证书,而不是生成伪造证书。SSLsplit支持NULL前缀CN证书,但不实现针对SSL/TLS栈中特定证书验证漏洞的其他利用手段。
SSLsplit实现了一系列防御机制,以应对通常会阻止MitM攻击或使其更加困难的手段。SSLsplit可以泛化地拒绝OCSP请求。对于HTTP和HTTPS连接,SSLsplit会修改头部,以阻止服务器指示的公钥钉扎(HPKP)、避免严格传输安全限制(HSTS)、避免证书透明度强制(Expect-CT),并防止切换到QUIC/SPDY、HTTP/2或WebSockets(Upgrade、Alternate Protocols)。HTTP压缩、编码和keep-alive被禁用,以使日志更易读。
日志选项包括传统的SSLsplit连接和内容日志文件,以及PCAP文件和将解密后的流量镜像到网络接口。此外,还可以记录证书、主密钥和本地进程信息。
有关使用SSLsplit和设置各种NAT引擎的详细信息,请参见手册页sslsplit(1)。
SSLsplit默认依赖于OpenSSL、libevent 2.x、libpcap和libnet 1.1.x库;如果省略镜像功能,则不需要libpcap和libnet。构建依赖于GNU make和PATH中的POSIX.2环境。如果可用,会使用pkg-config来定位和配置依赖项。可选的单元测试依赖于check库。
SSLsplit目前支持以下操作系统和NAT机制:
本地进程信息支持(-i)目前适用于Mac OS X和FreeBSD。
SSL/TLS特性及兼容性在很大程度上取决于链接的OpenSSL版本。为获得最佳效果,请使用最新版本的OpenSSL或LibreSSL。
在满足上述要求后,运行:
make
make test # 可选单元测试
make sudotest # 需要特权的可选单元测试
make install # 可选安装
依赖项使用pkg-config自动配置。如果未检测到依赖项且修改PKG_CONFIG_PATH无效,可以通过设置OPENSSL_BASE、LIBEVENT_BASE、LIBPCAP_BASE、LIBNET_BASE和/或CHECK_BASE为相应前缀来手动指定它们的位置。
可以通过设置PREFIX来覆盖默认安装前缀(/usr/local)。更多构建选项和构建时默认值请参见GNUmakefile和defaults.h。
用户文档请参见手册页sslsplit(1)和sslsplit.conf(5)。发布说明请参见NEWS.md,其中列出了各版本间的重要变化;安全漏洞披露信息请参见SECURITY.md。
SSLsplit采用2-clause BSD许可证发布。
SSLsplit包含采用MIT和APSL许可证的组件。
详情请参见LICENSE、LICENSE.contrib和LICENSE.third以及相应的源文件头。
贡献者列表请参见AUTHORS.md。
SSLsplit的灵感来自Claes M. Nyberg的mitm-ssl和Moxie Marlinspike的sslsniff,但不共享它们的源代码。