【问题标题】:Decrypt SSL/TLS with specific Private Key via SCAPY通过 SCAPY 使用特定私钥解密 SSL/TLS
【发布时间】:2022-01-20 17:40:45
【问题描述】:

我想在 我的服务器 上使用 scapy 解密 我的域 的 HTTPS 流量。

然后我有我的域的原始国际注册证书 (TLS1.3) 文件...

必须非常容易用 scapy 做到这一点,但我在任何地方都找不到任何解决方案,这太疯狂了

例如,我尝试了这些解决方案,但它们不起作用,没有错误崩溃

最后我编写一个示例代码但它低于错误,我尝试太多来修复它但无法理解问题和明确的解决方案:

值错误:密文长度必须等于密钥大小

import os, sys
import ssl
from scapy import *
from scapy.all import *
from scapy.layers import *
from scapy.layers.tls import *
from scapy.layers import inet
from scapy.layers.inet import *
import socket, select
import binascii
import io
from io import StringIO

load_layer("tls")
c = Cert("SSL/STAR_mydomain_com.crt")
k=PrivKey("SSL/private.key")

########### Unit-Test Encrypt/Decrypt Run OK ########### 
#M = bytes("message to be encrypted".encode())
#enc = c.encrypt(M, t='oaep')
#print(enc)
#dec = k.decrypt(enc, t='oaep')
#print(dec)

while True:
    s = sniff(filter="port 443", count=10)
    ch_list = [p for p in s]
    if len(ch_list)>0:
        for pkt in ch_list:
            p_layer = pkt.getlayer('IP')
            src = p_layer.src
            dst = p_layer.dst
            if (src=='my-server-ip') or (dst=='my-server-ip'):
                if ('TLSEncryptedContent' in str(type(pkt['TCP'].payload))):
                    
                    ########### any 3 below commands go in same error ############## 
                    ########### and i was try 'pss' instead of 'oaep' but same error 
                    
                    dec2 = k.decrypt(pkt['TCP'].payload, t='oaep')
                    #dec2 = k.decrypt(bytes(pkt['TCP'].payload), t='oaep')
                    #dec2 = k.decrypt(bytes(pkt['TCP'].payload).decode('UTF8', 'replace'), t='oaep')
                    
                    print(dec2)
                
    else:
        print('...passed')

如果您有任何解决方案,请分享,我将测试并分享结果,没有否定分数

注意:我不需要哲学,我对此有很多参考资料,我知道很多开发人员说这是不可能,并为此制定他们的哲学逻辑。如果您有答案,请分享代码 sn-p 参考,如果没有,请留下,因为有些小组解决了这个问题,但他们不分享他们的解决方案。坦克斯。

解决此问题但不共享其代码的示例组: https://docs.paloaltonetworks.com/pan-os/10-1/pan-os-admin/decryption/decryption-concepts/tlsv13-ssl-decryption-support.html

那么这是可能的,但是谁知道代码呢?

【问题讨论】:

  • 我不太确定你在问什么。如果您想要类似 tshark 的东西,那么您必须拥有或编写与 tshark 使用的代码等效的代码。或者只是使用 tshark 的代码。
  • 也许我的最终解决方案是自定义 tshark 源代码,但此时我正在用 Python+Scapy 编写一个巨大的 IDS/防火墙,我更喜欢用 scapy 库来解决我的问题。
  • 我认为你正在尝试做的事情将非常困难。 Scapy/tshark 处理数据包边界。您将需要处理 TCP 重新排序、无序数据包、tls 消息和一整套其他东西。如果您同时拥有证书和密钥,则可以解密 RSA 会话,但对于使用临时密码(椭圆曲线)的会话则不可能这样做。即使对于 RSA,就像@president-james-k-polk 提到的那样,您几乎必须实现 tshark 正在做的事情来创建解密密钥。
  • 我有私钥,但无法正确解密数据包...你有什么明确的解决方案吗?
  • @EyniKave 正如我所说,这不是一件容易的事。您必须基本上构建一个 tls 协议栈。首先,您在 tls 握手消息中累积所有 tls pkts。在交换期间,客户端发送密码规范消息,其中包括使用 svr 的公钥加密的 premaster secret。 svr 将使用私钥解密秘密。 svr 还发送更改密码规范,其中包括密钥材料的一侧。一旦双方拥有彼此的密钥材料,它们就会组合起来创建对称密钥,用于加密用户数据。省略了很多细节,但这非常复杂。

标签: python ssl https utf-8 scapy


【解决方案1】:

你正在尝试做的事情是行不通的。 SSL/TLS 证书仅用于 TLS 1.3 和更低版本中的身份验证,除非您将服务器配置为仅支持 RSA 密钥交换,否则您的服务器将选择 Diffie Hellman。如果客户端和服务器协商使用 Diffie Hellman(这也是 TLS 1.3 的强制要求),那么即使您解决了代码中的问题,您也无法使用服务器的证书和私钥解密数据连接.

如果您要降级 TLS 版本并将服务器配置为使用 RSA,并且浏览器愿意通过接受 RSA 的使用来发挥作用,那么理论上您想做的事情可以完成,但您离你需要的代码。您似乎只是天真地尝试使用服务器的私钥解密所有 TLS/SSL 数据包。这甚至不接近可行的方法。您需要组装流并识别密钥交换的会话密钥部分并使用私钥对其进行解密,然后使用它来解密流中的其余数据。作为其中的一部分,您必须识别和跟踪不同的流(即将数据包与它们相关联)。这种方法工作量很大,坦率地说没有意义。

更好的方法是:

  • 使用像 relayd 或 sslstrip 这样的代理,作为 Web 服务器剥离加密,然后在它自己和您的 Web 服务器之间转发未加密的流量(您可以只查看此流量)
  • (还是有点疯狂)将源代码修改为您的 Web 服务器,以便在解密流量后将其所有流量记录在您可以获取的位置。

【讨论】:

  • 这个答案对我来说是不可接受的,但正如我所承诺的,我不会给它负分......我正在测试一些 MITM 包,但它们不能正常工作......此时我已经解决了我对 NGINX 自定义日志记录格式和看门狗的问题,为我的 TCP 服务检测快速的新 TLS 事件因为 nginx 具有 MITM 能力,如果我想使用这个解决方案,那么它就足够了......但另一方面我不明白为什么这个话题对于大多数开发人员来说非常困难,因为像 nginx 这样的网络服务器或者正如你所说的 MITM 代码可以做到这一点,然后正如我一开始所说的那样'这一定很容易,但世界忘记了它'
  • 就像 David Oldford 解释的那样,DH 密钥交换是现代 TLS 交换的一部分。因此,即使您知道服务器证书的密钥内容,也无法通过数据包侦听获得明文。解密内容的唯一方法是成为 DH 交换中的端点,这称为 MITM 攻击。
  • FALSE,例如 TSHARK,ssldup,scapy,... 不是端点,但他们尝试这样做,但他们有很多错误和崩溃,另一方面,他们专注于解密算法没有私钥,他们忘记了我们拥有私钥的简单方法......那么它必须可以在数据包嗅探中,而且它不一定是端点......
  • 或水银项目中的 cisco 在非端点 github.com/cisco/mercury 的数据包嗅探中这样做,但我没有测试它,因为不是我最喜欢的,我想在 scapy 或 python 中解决这个问题,它必须有一个明确的方式,但没有人提出明确的解决方案或代码 sn-p :(
  • @DavidOldford 是正确的,如果使用临时密码 (diffie-helman),您将无法解密。如果使用 RSA 密码,你可以解密流,但现在没有人在公共网络上使用 RSA。在rfc-editor.org/rfc/rfc4346 中给出了有关如何从 RSA 的预主密钥计算主密钥的确切算法。您可以查看 OpenSSL 代码以了解双方发生了什么。您要做的是通过成为 MITM/pcap 来发挥双方的作用。为此,必须实现协议的双方才能解密。这是可能的,但相当参与。
猜你喜欢
  • 1970-01-01
  • 2014-02-07
  • 2018-05-08
  • 2018-12-31
  • 1970-01-01
  • 2020-05-01
  • 2019-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多