* 本文内容代码执行需要管理员权限

主要难点

  1. 将用户访问请求重定向到劫持服务器,
  2. 如何获取 https 传输内容并解密成明文.
  3. 修改 https 内容后重新打包并保证浏览器可以正常打开.

难点一

重定向用户请求相对来说比较简单, 这里只列举几个 windows 的方法:

  1. 通过配置系统 VPN 来过滤 443 端口请求
  2. hook mswsock.dll->connect 来重定向 443 端口请求
  3. 通过编写 Windows LSP 协议来重定向 443 端口请求

难点二

https 协议是公开协议, 其安全主要是靠证书来保证的, 如果你可以抓到 https 服务器和客户端的握手包即可拿到整次访问的加密秘钥.

你可以手动解析 https 协议, 或者寻找任意一个 https 服务器即可. 这里使用 golang 来作为劫持服务器.


func HTTPSGetCertificate(clientHello *tls.ClientHelloInfo) (cert *tls.Certificate, err error) {if cert, err = QueryTlsCertificate(clientHello.ServerName); nil == err {return cert, err}return CreateTlsCertificate(nil, clientHello.ServerName, -(365 * 24 * time.Hour), 200)
}func StartHTTPSProxy(addr string, router socks.Dialer, tran *HTTPTransport) {serverHTTPS := &http.Server{ErrorLog: log.Warn,TLSConfig: &tls.Config{GetCertificate: HTTPSGetCertificate,},Addr: addr,Handler: &HTTPHandler{scheme:    "HTTPS",proxy:     socks.NewHTTPProxy("https", router, tran),},}if err := serverHTTPS.ListenAndServeTLS("", ""); nil != err {log.Error("Start HTTP proxy at ", addr, " failed, err:", err)}
}

难点三

怎样修改 https 内容后重新打包并保证浏览器可以正常打开, 这个可以明确的告诉你没辙. 除非你能拿到对方服务器的私钥.

我们既然拿不到对方的私钥, 那可不可以伪造一个?

这个是可以的, https 的证书是可以随意生成的, 我们可以通过生成自己的证书来重新打包 https 内容, 只是没办法通过浏览器验证而已,.

浏览器是通过什么验证证书是不是伪造证书?

其实系统中有个证书信任库, 里面保存了所有可以信任的证书列表, 浏览器是通过查询证书是否存在于这个库中来确定证书可不可以信任的.

了解了上面的内容后, 我们可以得到一个结论, 不管当前证书是否是真正服务器证书只要当前证书存在于系统的信任证书库中, 就可以通过浏览器的验证. 想通了这点我们可不可以手动将证书加到信任库里? 答案是可以的,下面给出 C++ 通过 Windows API 给系统添加证书的代码.

// pszSRCCert = 常规 X509 编码证书内容, 可以通过记事本打开证书文件获得
// pwszStoreName = 值可以为 "My" | "CA" | "Root", 分别对应 个人 | 颁发机构 | 根证书bool WINAPI AddCertificateCryptContextToStore(const wchar_t * pwszStoreName, const wchar_t * pszSRCCert) {unsigned long dwCertData = 0;ULONG dwRootCert = (ULONG)wcslen(pszSRCCert);if (!CryptStringToBinaryW(pszSRCCert, dwRootCert, CRYPT_STRING_BASE64HEADER, NULL, &dwCertData, NULL, NULL)){return false;}unsigned char* pbCertData = (unsigned char*)calloc(1, dwCertData);if (NULL == pbCertData){return false;}defer_free _free1(pbCertData);if (!CryptStringToBinaryW(pszSRCCert, dwRootCert, CRYPT_STRING_BASE64HEADER, pbCertData, &dwCertData, NULL, NULL)) {return false;}return AddCertificateContextToStore(pwszStoreName, PKCS_7_ASN_ENCODING | X509_ASN_ENCODING, pbCertData, dwCertData);
}bool WINAPI AddCertificateContextToStore(const wchar_t * pwszStoreName, DWORD dwCertEncodingType, BYTE * pbCertData, DWORD dwCertSize) {bool bIsSucc = false;HCERTSTORE hStore = NULL;PCCERT_CONTEXT m_pctx = NULL;do{m_pctx = CertCreateCertificateContext(dwCertEncodingType, pbCertData, dwCertSize);if (m_pctx == NULL) {break;}hStore = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, CERT_STORE_OPEN_EXISTING_FLAG | CERT_SYSTEM_STORE_LOCAL_MACHINE, pwszStoreName);//my 个人  ca 中间证书颁发机构 root 受信任的根证书颁发机构,显然中国铁路的根证书要安装在root里面if (NULL == hStore) {break;}if (FALSE == CertAddCertificateContextToStore(hStore, m_pctx, CERT_STORE_ADD_NEW, 0) && CRYPT_E_EXISTS != GetLastError()) { // 如果安装失败,并且错误码不是以安装过break;}bIsSucc = true;} while (false);if (m_pctx)CertFreeCertificateContext(m_pctx);if (hStore)CertCloseStore(hStore, 0);return bIsSucc;
}

SOCKET - 实现任意 HTTPS 站点代理, 支持篡改内容相关推荐

  1. Nginx 配置 SSL 证书 + HTTPS 站点小记

    今天给几个站点配置了认证的 ssl 证书,但是苦于自己技术不过关,或是知识不足,导致还有那么一小点 Bug 的出现,这里就我配置 HTTPS 站点的经验来总结一下吧. 一.什么是 SSL 证书,什么是 ...

  2. [django]Django站点admin支持中文显示和输入设置

    正文: Django站点admin支持中文输入设置,操作如下: 1 需要确定的你的数据库的client客户端和服务端的编码设置为utf-8,如果不是,请将其设置成utf-8编码,我采用mysql,详情 ...

  3. timthumb.php外链,如何解决WordPress多站点不支持timthumb.php?

    在使用wordpress主题的时候,因为timthumb基于安全问题,除了支持指定的几个网站的外链图片外,不支持其它任何外链图片:另一方面则是因为对本机图片地址的处理导致.那么如何解决WordPres ...

  4. 为Metabase Pulses添加slack代理支持

    <?xml version="1.0" encoding="utf-8"?> 为Metabase Pulses添加slack代理支持 为Metaba ...

  5. 记录vultr搭建https爬虫代理

    记录vultr搭建https爬虫代理 记录vultr搭建https爬虫代理 准备 安装squid和httpd-tools,直接yum安装 设置认证的账号密码 配置squid,支持http代理 http ...

  6. HTTPS站点使用WebSocket请求被阻止的问题与相关Nginx配置

    ws://xxxxxx   WebSocket请求 在测试服务器(http)移植到正式环境(https)后不能使用 因为HTTPS是基于SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加 ...

  7. HTTPS站点不安全?SSL证书不做背锅侠

    SSL证书在保护网站数据传输上起到了至关重要的作用,它的存在让网站访问者在访问浏览器时留下的信息和数据不被窃取.篡改和监听,让访客们访问网站时非常放心.非常安心,使网站由明文传输式的http变成数据加 ...

  8. 手机端设置https访问代理(windows)

    手机端设置https访问代理(windows) 系统环境:window7 Fiddler当前版本:v4.5.1.0 Fiddler最新版本:v4.6.20171.26113 一.启动Fiddler,打 ...

  9. IIS 使用OpenSSL 生成的自签名证书,然后使用SingalR 客户端访问Https 站点通信

    使用SignalR 的客户端去发送消息给使用 https 部署的站点,官方文档目前并没有详细的教程,所以在此记录下步骤: 使用管理员身份打开cmd 窗口,选择一个整数保存文件夹的地址,切换到对应的文件 ...

最新文章

  1. [FZSZOJ 1029] 观察者加强版
  2. 计算机专业大一暑假,2020年计算机专业大学生暑期社会实践调查报告
  3. 陈老师Linux内核内存寻址导学
  4. go设计模式之代理模式
  5. 每天一道LeetCode-----根据中序遍历和后序遍历重构二叉树
  6. java对象内存占用情况分析
  7. C# WPF DataGrid获取单元格并改变背景色
  8. 2个在Java中将Byte []数组转换为String的示例
  9. SQLite学习笔记(三)--创建内存数据库
  10. netty之管道处理流程
  11. 操作系统原理(六)设备管理
  12. 为什么100offer坚持私密招聘?
  13. ffmpeg libx264_FFmpeg之FFmpeg模块介绍(一)
  14. CMM3和CMMI4的差别--过程域
  15. python 俄罗斯方块_俄罗斯方块
  16. 差分进化算法(Differential Evolution)概述
  17. Nginx配置带www域名转向无www域名
  18. 全球及中国吊链总成行业研究及十四五规划分析报告
  19. Java swing 界面开发 - 登录界面- 2021-11-10
  20. pip3 install XXX加快下载速度

热门文章

  1. Python 保存 网页上的图片
  2. 数据加速器 GooseFS 1.3.0 版本正式发布
  3. 05- 防火墙用户管理
  4. 飞腾S2500平台PCIe SWITCH下热插拔验证
  5. c#语法糖模式匹配【switch 表达式】
  6. Simplygon软件初探之软件安装
  7. Android输入汉字得到拼音
  8. java放大缩小_如何用Java实现图形的放大和缩小?
  9. TI DSP BootLoader技术要点概述
  10. 25,UC(04) .