解密https流量

这篇具有很好参考价值的文章主要介绍了解密https流量。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

解密https流量

要想解密https流量方法无非就两种

  1. 使用密钥解
  2. 使用中间人MITM去解

但由于我并没有去考虑如何用MITM去解密https流量,所以我只介绍我使用密钥解的总结,当然,我并不是通过了解了https的整个过程去自行代码实现的,只是通过别人实现好的模型去进行解密,以下分别使用wireshark和scapy去解密

获取密钥使用wireshark解密

客户端

如果你是客户端角度出发,那么需要获取到ssl/tls通信过程中的随机会话密钥,可以配置sslkeylogfile文件的环境变量,配置后会自动写入环境变量指定的文件中,详细网上自行搜,很多文章都有介绍如何写,也很简单

在配置好环境变量后,还需配置wireshark去进行使用,也自行到网上搜寻

以下方式访问https网站都会写入密钥

  1. openssl(待验证)

    • 可以使用openssl在linux命令行下生成

    • 使用python带的ssl库来进行生成,方法是使用ssl.create_default_context函数即可
      Python SSL操作手册

  2. 使用chrome和firefox

    实际上新版的firefox和chrome并不支持写入SSLKEY了,具体哪个版本支持需自行在网上搜索文章查看

  3. 使用curl执行也会写入

使用wireshark可以直接解密所有版本的ssl/tls流量,非常强大

服务端

在服务端要是想获取密钥需要进行一些配置,本方法只尝试过apache2和nginx

nginx
  1. 首先保证服务端具有写SSLKEY密钥功能
    先查看配置

    libssl-dev/focal-updates,now 1.1.1f-1ubuntu2.16 amd64 [installed]
    libssl1.1/focal-updates,now 1.1.1f-1ubuntu2.16 amd64 [installed]
    openssl/focal-updates,now 1.1.1f-1ubuntu2.16 amd64 [installed]
    

    确保有libssl的包以及openssl的包,如果直接安装不行,需要考虑吧换软件源或者在官方网站下载相应的包

    http://security.ubuntu.com/ubuntu/pool/main/o/openssl/

  2. 复制该链接源码sslkeylog.c,粘贴为C文件,编译:cc sslkeylog.c -shared -o libsslkeylog.so -fPIC -ldl,并将生成的so文件放于/usr/local/lib

  3. 配置nginx.service

    vim /lib/systemd/system/nginx.service
    

    或者使用命令systemctl edit nginx写入

    写入内容如下

    [Service]
    Environment=SSLKEYLOGFILE=/tmp/sslkey.log
    Environment=LD_PRELOAD=/usr/local/lib/libsslkeylog.so
    

    最好赋予sslkey.log其用户写入权限

  4. ./nginx/nginx.conf中添加以下:

    env LD_PRELOAD=/usr/local/lib/libsslkeylog.so;
    env SSLKEYLOGFILE=/tmp/sslkey.log;
    
  5. 重启nginx

    # systemctl daemon-reload
    # systemctl restart nginx
    

    最后使用外部curl https://xxx.xxx.xxx来进行访问,然后查看/tmp/sslkey.log是否有写入密钥
    如若不行,则使用以下命令查看是否有引入libsslkey.so文件,-p参数为nginx的进程号PID

    lsof -n -p 10313 |grep ssl
    

详细请看这篇

Extracting openssl pre-master secret from nginx

apache2

如果你使用的是apache,那么也需要配置,需要的话请看这篇文章

Extracting openssl pre-master secret from apache2

然后就可以使用wireshark去解了

获取密钥使用scapy解密

这个方式说实话有很大的弊端,虽然可以在代码层面解,但是对于https协议只支持tls1.2以下版本解,tls1.3并不支持,并且最离谱的是只能一次解一个包,真的大无语(而且这方法找了好久,真的无语)

  1. 先配置nginx只支持TLS1.2

    {
        server_name  xxx.xxx.com; 
        listen 443; 
        ssl on;
        access_log          /logs/nginx/xxx.xxx.com_access.log main;
        error_log           /logs/nginx/xxx.xxx.com_error.log;
        ssl_certificate     /opt/nginx/ssl/xxx.xxx.com.pem;   # 公钥证书
        ssl_certificate_key /opt/nginx/ssl/xxx.xxx.com.key;   # 私钥证书
        ssl_session_timeout 5m;                               # 客户端能够重用会话缓存中ssl参数的过期时间
        # 指定支持的协议,这里表示支持1、1.1和1.2, 如果只写1.2表示仅支持1.2.  注:OpenSSL版本要求 >= 1.0.1
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;                        
        # 加密套件,多个之间用冒号分隔,前有感叹号的表示必须废弃
        ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
        # 设置协商加密算法,优先使用服务端定义的加密套件
        ssl_prefer_server_ciphers on;                         
    }
    

    或者apache2

    vim /etc/apache2/sites-available/ssl.conf
    ## 添加
    SSLProtocol ALL -SSLv2 -SSLv3
    
  2. 在python安装scapy库,需要到github原作者处下载(不要使用pip install scapy

    git clone https://github.com/secdev/scapy.git
    

    进入scapy目录里面执行python3 setup.py install

    监听到的pcap包使用scapy去解

    参照作者的笔记去写python代码吧

    The lack of PFS: a danger to privacy

    以下是自己写的垃圾测试代码:

    from scapy.all import *
    import os
    import sys
    import binascii
    
    from scapy.layers.tls.record import TLSApplicationData
    
    onesslkeyfile = './sslkey.log'
    
    def method_filter_HTTP(pkt):
        if pkt.haslayer(Raw):
            pkt.payload.payload.show()
            pktdump.write(pkt)
    def method_filter_TLS(pkt):
        if pkt.haslayer(TLS):
            if pkt.haslayer(TLSApplicationData):
                pkt[TLSApplicationData].show()
                # print(pkt.src)
            pktdump.write(pkt)
            ## pktdump_payload.write(pkt)
        ## else:
            ## pkt.payload.payload.show()
    def method_save(pkt):
        pktdump.write(pkt)
    
    ## resolve the tls traffic
    ## load_layer("http")
    
    port = 80
    try:
        port = int(sys.argv[1])
    except:
        pass
    if not os.path.exists('sss.pcap'):
        pktdump = PcapWriter("sss.pcap", append=True, sync=True)
        ## pktdump_payload = PcapWriter("sss_payload.pcap", append=True, sync=True)
        if port == 443:
            print(port)
            load_layer("tls")
            pkts = sniff(filter=f'tcp and tcp port {port}', prn=method_filter_TLS, iface='eth0')
        else:
            print(port)
            pkts = sniff(filter=f'tcp and tcp port {port}', prn=method_filter_HTTP, store=0, iface='eth0')
        ## src iZwz9gwr0avfole4msfavlZ
        with open(os.getenv('SSLKEYLOGFILE'), 'r') as f:
        	sslkey = f.readlines()[-1]
        data = sslkey.strip().split(" ")
        ## print('\n', data[1], '---', binascii.unhexlify(data[1]))
    
    
        f = open(onesslkeyfile, 'w')
        f.writelines(sslkey)
        f.close()
    
    else:
        load_layer("tls")
        # config of decrypting a pcap files automationly
        # key = PrivKey('raw_data/pki/srv_key.pem')
        conf.tls_session_enable = True
        conf.tls_nss_filename = onesslkeyfile
    
        ## packets = rdpcap("./sss_payload_TLSv1.2.pcap")
        pktdump = PcapWriter("sss1.pcap", append=True, sync=True)
        packets = sniff(offline='sss.pcap', prn=method_save)
    
        print("==============================================================================================================")
        for i in range(len(packets)):
        ## packets[i].show()
        if packets[i].haslayer(TLSApplicationData):
        packets[i][TLSApplicationData].show()
        ## tls = packets[i][TLS].type
        ## print(tls)
        ## packets[i][TLS].show()
        print("==============================================================================================================")
    

记录找的过程失败的经历

尝试过的方法

目前找过的方法有:

  1. wireshark:这个说实话很强大,连tls1.3都可以解,但我需要的是可以使用python\命令行去解的

  2. tshark :此命令在linux下使用,可以解析pcap包并且可以抓包,-o参数有点可疑,这是在使用pyshark发现的

  3. pyshark:python的库,本质是调用tshark去解析https报文,其中有个FileCapture()函数似乎可以解ssl traffic(override_prefs参数),但也失败了,或许可以继续尝试

    How to decrypt TLS Packets using PyShark?

    Decrypt SSL packets using PyShark

  4. tcpdump:最常见的抓包工具

  5. ssldump:这个专门用于抓https包,其中的-l,-k和-w,-S,-r参数曾专门研究过,但仍不可解密tls,但确实有文章能解出来,我没有成功,原因未知,其中还有个孪生工具sslsniffer

    Decrypting SSL traffic using the SSL::sessionsecret iRules command
    Analyzing HTTP/S traffic under Linux

  6. httpry:也是一个抓包工具,但也不无法解析tls包

  7. scapy:python库,和pyshark有点类似,一开始截包也失败了,直到看到原作者secdev写的文章,发现了,使用pip install scapy后发现无效,后来全局访问发现问题,从github下载scapy源文件,使用python setup.py install后,成功解密tls,但只尝试了tls2,tls3是肯定不行的。scapy还有其他的孪生库如scapy-ssl_tls或许今后可以用到

    scapy文档

    secdev/scapy/notebook

  8. MITM Solution:国外一位小哥和我一样的困扰,在stack overflow求助

    Decrypt SSL/TLS with specific Private Key via SCAPY

    在了解情况后,貌似MITM也可以解决,原话为

    At this time I was solved my problem with NGINX custom logging format and watchdog to detect fast new TLS events for my TCP services Because nginx has MITM ability and if i want to use this solution then its enough...
    
  9. 反向代理,使用nginx作为服务端的反向代理,同时提供http服务,再抓取client到nginx的traffic
    nginx配置:

    server {
        listen *:80;
        listen [::]:80;
        server_name local.reverse.proxy.com;
    
        location / {
            proxy_pass https://www.google.com/;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Real-Port $remote_port;
            proxy_set_header Connection "";
            proxy_http_version 1.1;
        }
    }
    

有用的库

python的sslkeylog库

https://sslkeylog.readthedocs.io/en/latest/

https://github.com/segevfiner/sslkeylog

nginx配置sslkeylog

https://github.com/tiandrey/nginx-sslkeylog

github找到的说不定有用

tls-decryption

JS-or-Python-to-decrypt-TLS-v1.2-https

xmpp-mitm

telepath

dssl

TLS1.2过程

This is the standard, modern TLS 1.2 handshake:

JS-or-Python-to-decrypt-TLS-v1.2-https

xmpp-mitm

telepath

dssl

TLS1.2过程

This is the standard, modern TLS 1.2 handshake:

解密https流量文章来源地址https://www.toymoban.com/news/detail-442340.html

到了这里,关于解密https流量的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 解密最受欢迎的开源 Serverless 框架:流量篇

    对于 web 应用来说,通过请求流量的并发数、qps、rt 等指标,可以很好的衡量当前的 web 服务质量。Knative 中提供了基于请求驱动的 Serverless 能力,包括多版本管理流量,流量访问,基于流量的弹性以及监控等。本文从流量角度出发,为您解密 Knative 相关的能力。 Knative 是一款

    2024年02月20日
    浏览(34)
  • Elasticsearch基本安全加上安全的 HTTPS 流量

    在生产环境中,除非您在 HTTP 层启用 TLS,否则某些 Elasticsearch 功能(例如令牌和 API 密钥)将被禁用。这个额外的安全层确保进出集群的所有通信都是安全的。 当您在模式下运行该elasticsearch-certutil工具时http,该工具会询问几个有关您希望如何生成证书的问题。虽然有许多选

    2024年02月05日
    浏览(38)
  • 【IDS场景模拟】suricata检测HTTPS流量

    针对HTTPS流量来说,毕竟不是攻击流量,而是互联网通信的标配,所以服务器端是可以解密的,解密后变成明文HTTP协议,就可以很好地实现入侵检测了。所以,要处理HTTPS流量,最关键的是,先解密HTTPS数据包,才对其进行入侵检测,通常的解决方案有两种:一是直接在代码层

    2024年04月26日
    浏览(27)
  • Wireshark 解密https 数据

    默认情况下 wireshark 抓到的https 数据包都是加密后的,无法展示明文内容 浏览器在访问https 站点的时候会检测这个 SSLKEYLOGFILE 变量,如果存在,则将https 密钥写入对应的文件内 配置好之后需要重启浏览器生效 文件内容如下 配置wireshark 使用上面环境变量指定的密钥文件 适用

    2024年02月16日
    浏览(41)
  • 用 Wireshark 在 Firefox 或 Google Chrome 上使用 SSLKEYLOGFILE 环境变量解密 SSL 流量

    原文:这 您希望使用 SSL 会话密钥解密和检查 SSL 应用程序数据。 您希望在客户端系统上记录 SSL 会话密钥。 您正在客户端系统上使用 Firefox 或 Google Chrome 浏览器来访问 Web 应用程序。 注意:您还可以在客户端系统上使用 Microsoft Edge (Chromium) 浏览器访问 Web 应用程序。 描述

    2024年02月05日
    浏览(39)
  • HTTPS 加密解密大致流程

    HTTPS简介 在我们开始配置之前,让我们先了解一下HTTPS和它的重要性。 为什么选择HTTPS? 加密传输 :通过SSL/TLS协议,确保数据在传输过程中不被窃听。 认证身份 :确保 客户端与预期的服务器通信 ,防止中间人攻击。 数据完整性 :保证数据在传输过程中未被篡改。 彻底搞

    2024年04月25日
    浏览(53)
  • HTTPS解密:安全通信的魔法之窗

    欢迎来到我的博客,代码的世界里,每一行都是一个故事 在网络通信中,信息的安全性是至关重要的。而HTTPS作为保障通信安全的重要协议,就像一把锁,为我们的数据通信提供了强大的保护。在这篇博客中,我们将揭开HTTPS的神秘面纱,了解它是如何通过加密技术保障通信

    2024年02月04日
    浏览(38)
  • 浏览器安装证书,使用burp抓取任意https协议的流量

    抓包显示都是http的。 接受风险后: 给burp加证书: 点击后会让你下载,证书已下载 证书长这个样子~~~  浏览器设置中直接搜索证书: 勾选信任:  会到之前加载不出的页面刷新就可以看到加载出来图片等:   此时看到的都是https.

    2024年01月25日
    浏览(60)
  • 图解HTTPS协议加密解密全过程

    我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取。所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议。 HTTPS简介 HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进

    2024年02月05日
    浏览(57)
  • https SSL证书使用 git bash 解密

    申请域名证书后,有些证书下载时强制加密。 在使用时,比如在AWS ACM中使用时,不能用加密的证书。所以这里讲下怎么解密。 首先,加密一般加密的是公私钥中的私钥,即private.key。 填写密码,下载证书,并解压。证书类型 openssl和PKCS#8 都可以。   下载下来的证书压缩包中

    2024年02月07日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包