zoukankan      html  css  js  c++  java
  • [dev][https] 非PFS协商的https的流量的解码

    经过基础调研之后,目前准备确认实现方案,完成对https的解码。

    之前的调研,传送门: http://www.cnblogs.com/hugetong/p/6670083.html

    1. 需求:

      以旁路方式,完成对非PFS协商的https流量完成解码,前提是可以获得服务器私钥。

    2. 先寻找几个可参考的开源方案:

      调研阶段已经注意到了它: https://github.com/plashchynski/viewssld

      它还用到了:https://github.com/plashchynski/libdssl

    # 编译libdssl,自带文档写的有点小问题
    > ./autogen.sh
    > ./configure
    > make

     3. 看viewssld, libdssl的文档和源码。

      文档源码读了个办啦卡及的。

    4. 搭个环境先

      参考这个http://www.cnblogs.com/hugetong/p/6670083.html里面有个实验链接:

      4.1 做证书

    [root@dpdk http]# openssl req -x509 -nodes -newkey rsa:1024 -keyout testkey.pem -out testcert.pem 

     网页里说,为了可以是用wireshark顺利打开,还需要使用:(本意应该是为了去除密码,因为wireshark支持的不太好。在这里没有密码的情况下,可以不做。

    [root@dpdk http]# openssl rsa -in testkey.pem -out testkey.pem

      经过处理前后的密钥对比:

    [root@dpdk http]# cat testkey-new.pem 
    -----BEGIN RSA PRIVATE KEY-----
    MIICXAIBAAKBgQC5a2FqNfaHVbZdfKQgWLV2cle4f8J633dVaaedyokUbhj2n0BR
    NxMd/Jh16o5tPLqs96SmDTiMvZmS7lRz4w1SpXiY78VOm8j1C3WWNR/nkilyQyz3
    ri9kqwmPeVNVn0gL/JvmlkduIWVCj6zX3AqhBCGuQhL6iYvb8UPLz0J2pwIDAQAB
    AoGAbKDfWnUw8Eqj45NRKG4wKauFft7Clm/zHsQeYhA1TRXPZDUaXjpQ5eGFhJed
    R5wrlYgkGvBl7/ZoUa91JMuhkol8XbnTGanbGZENCByvdRmu5BUizU/LwWb6pl8J
    tDM40RphJ+QShGWJvdQOP87+pvLAwAaEUSAZNpD5xFZCpIkCQQDZ+mcaz635EqQX
    yIxopqbBNa0jOXfZK4UuBLDdL3zePYResQ+lvCJwnNbZ/47qdWUZG+PH3ANIt50B
    PT6OhtADAkEA2cMaKuKaDGF+5ZcRUlPId14GgahyU4tjqtaFbVOmvcs++rv/lVl6
    uRVC+qOBK1xY1tC5ug3XxeXBzM/nDsX3jQJALS1v1ye6CAhsCB3htALuRtcoJkfP
    5ivV8363ZXBlMe6QE8wg0RnYDX0ELrR/22ovZO/Z2t9nsteTa+FUqNeaHwJBAJZe
    0kgA2A1qmZzit3RZJJnA1M9dySyFmVpT7ijzVbXDjobHoRK5ijQaSXkXxM9zYmlc
    EpQ2kOQ35p6Oheg+rdUCQA+bPrUJNkyWPQfsqHp036ECDEg/7YjhRqyzCJ6+KMRq
    nDR66pKN0b/uLJi7f0DnATd7gYuNR3BMlAf6OWm6TDI=
    -----END RSA PRIVATE KEY-----
    [root@dpdk http]# cat testkey-org.pem 
    -----BEGIN PRIVATE KEY-----
    MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALlrYWo19odVtl18
    pCBYtXZyV7h/wnrfd1Vpp53KiRRuGPafQFE3Ex38mHXqjm08uqz3pKYNOIy9mZLu
    VHPjDVKleJjvxU6byPULdZY1H+eSKXJDLPeuL2SrCY95U1WfSAv8m+aWR24hZUKP
    rNfcCqEEIa5CEvqJi9vxQ8vPQnanAgMBAAECgYBsoN9adTDwSqPjk1EobjApq4V+
    3sKWb/MexB5iEDVNFc9kNRpeOlDl4YWEl51HnCuViCQa8GXv9mhRr3Uky6GSiXxd
    udMZqdsZkQ0IHK91Ga7kFSLNT8vBZvqmXwm0MzjRGmEn5BKEZYm91A4/zv6m8sDA
    BoRRIBk2kPnEVkKkiQJBANn6ZxrPrfkSpBfIjGimpsE1rSM5d9krhS4EsN0vfN49
    hF6xD6W8InCc1tn/jup1ZRkb48fcA0i3nQE9Po6G0AMCQQDZwxoq4poMYX7llxFS
    U8h3XgaBqHJTi2Oq1oVtU6a9yz76u/+VWXq5FUL6o4ErXFjW0Lm6DdfF5cHMz+cO
    xfeNAkAtLW/XJ7oICGwIHeG0Au5G1ygmR8/mK9XzfrdlcGUx7pATzCDRGdgNfQQu
    tH/bai9k79na32ey15Nr4VSo15ofAkEAll7SSADYDWqZnOK3dFkkmcDUz13JLIWZ
    WlPuKPNVtcOOhsehErmKNBpJeRfEz3NiaVwSlDaQ5Dfmno6F6D6t1QJAD5s+tQk2
    TJY9B+yoenTfoQIMSD/tiOFGrLMInr4oxGqcNHrqko3Rv+4smLt/QOcBN3uBi41H
    cEyUB/o5abpMMg==
    -----END PRIVATE KEY-----

      4.2 放一个index.html在当前目录,然后启动服务

    [root@dpdk http]# openssl s_server -key testkey.pem -cert testcert.pem -WWW -cipher RC4-SHA -accept 443

      4.3 使用浏览器访问,报错:(或许是协商有问题吧)

    140006084822944:error:1408A0C1:SSL routines:SSL3_GET_CLIENT_HELLO:no shared cipher:s3_srvr.c:1387:
    ACCEPT
    140006084822944:error:1408A0C1:SSL routines:SSL3_GET_CLIENT_HELLO:no shared cipher:s3_srvr.c:1387:
    ACCEPT
    140006084822944:error:1408A0C1:SSL routines:SSL3_GET_CLIENT_HELLO:no shared cipher:s3_srvr.c:1387:
    ACCEPT

      4.4 重新调整:

    [root@dpdk http]# openssl s_server -key testkey.pem -cert testcert.pem -accept 443 -www -no_ecdhe -no_dhe

      抓包并使用wireshark解码打开。

    5. 再找找,其他实现

      http://ssldump.sourceforge.net/

      https://tls.mbed.org/

      https://tls.mbed.org/openssl-alternative

    6. 编译ssldump。编之前需要打个patch,做些修改(来自AUR的pkgbuild)

    prepare() {                                                                     
      cd $pkgname-$pkgver                                                           
      patch -Np0 -i ../openssl-0.9.8.patch                                          
      sed -i 's/libpcap.a/libpcap.so/g' configure                                   
      sed -i 's/BINDIR=@sbindir@/BINDIR=@bindir@/' Makefile.in                      
    }                                                                               
                                                                                    
    build() {                                                                       
      cd $pkgname-$pkgver                                                           
      # Arch64 fixes --build/host                                                   
      ./configure --prefix=/usr                                                    
                  --mandir='${prefix}/share/man'                                   
                  --build=i686-pc-linux-gnu                                        
                  --host=i686-pc-linux-gnu                                          
      make                                                                          
    }                                         

    7. 读ssldump代码。

    8. 项目时间进度比较紧,直接用libdssl实现。调研过程中发现有其他商业项目也在使用,应该稳定性还不错。时间充裕的时候,还是要对其代码详细阅读。

    9. libdssl 竟然只支持SSL2.0和SSL3.0, 仔细一看,最后一次更新竟然是5年前。直接换另一个fork。

    https://github.com/Correlsense/libdssl

    10. 抓些ssl2和ssl3的测试包.

      chrome / firefox 由于安全问题已经禁用了ssl3版本,最低版本是tls1.0 即使在选项里打开了,也无法使用。。。

    连新版本的openssl都不支持了。。。。

    /home/tong/Data/https [tong@T7] [10:46]
    > openssl version
    OpenSSL 1.1.0e  16 Feb 2017
    
    /home/tong/Data/https [tong@T7] [10:47]
    > openssl s_client -4 -ssl3 -connect dpdk:443
    s_client: Option unknown option -ssl3
    s_client: Use -help for summary.
    
    /home/tong/Data/https [tong@T7] [10:47]
    > 

    还好旧版本的目前还支持

    [root@dpdk https]# openssl s_server -key testkey.pem -cert testcert.pem -accept 443 -www -no_ecdhe -no_dhe -ssl3
    [root@dpdk ~]# openssl version
    OpenSSL 1.0.1e-fips 11 Feb 2013
    [root@dpdk ~]# openssl s_client -connect 127.0.0.1:443 -ssl3
    
    #成功之后,输入一个GET /回车。
    
    SSL2 同上。

    这组包还是非常珍贵的啊,以后都抓不到啦。

    11. 两个dssl库里边都有Segmentation fault

    Program received signal SIGSEGV, Segmentation fault.
    n ssl3_decode_client_hello (sess=0xcbf8d0, data=0x7fffea52f4cb "03", len=115) at ssl_decode_hs.c:77
    77              sess->handshake_start = sess->last_packet->pcap_header.ts;

    sess->last_packet是null,只能查下源码打个patch上去了。

    fork了,并打了patch https://github.com/tony-caotong/libdssl

    12. 集成入主进程后,分别对不同应用场景进行测试,包括无密码的私钥,有密码的私钥,错误的私钥,错误密码的私钥。ssl2,ssl3, tls1 tls1.1 tls1.2等。均通过。

    13. 遗留问题: 当解码过程中明显发现密钥错误时,是否应该将密钥从密钥列表里移除,从而不再对后续的包识别为可解码的https?

      但是解码错误的情况各有不同,还需要对状态机进行关注,才好从不同情况下判断是否需要移除。

      因为目前可以设想到的有一种情况是不应该排除的:比如一组恶意的错包就不应该导致程序将密钥移除。

    14: TODO  读协议 RFC

  • 相关阅读:
    XMLhttp.status返回值及xmlhttp.readState值
    移动端meta设置
    css自定义checkbox样式
    base.css(css基础样式)
    css文本块中首行文本的缩进,字间距
    jq里的 ajax( ) 方法
    小程序 背景图在开发工具上显示,但是在真机调试时无效
    小程序登陆锁-登录逻辑
    背景图尺寸(background-size)
    动态渲染style 背景图片
  • 原文地址:https://www.cnblogs.com/hugetong/p/6697924.html
Copyright © 2011-2022 走看看