开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 6882|回复: 22
收起左侧

[讨论] 浅谈HTTP(S) 抓包

[复制链接]
头像被屏蔽
结帖率:14% (1/7)
发表于 2018-1-22 16:29:21 | 显示全部楼层 |阅读模式   湖北省孝感市
本帖最后由 落款hMZ 于 2018-1-22 22:20 编辑

因为HTTP都是明文发送的,只要能抓到数据包,都可以抓到他,也不需要对数据包进行修改,所以抓他的方法就很多了比如Wireshark 的网卡抓包,以及原始套接字监听抓包等等,因为不需要对数据进行修改,所以抓这类包是非常方便的
本帖主要讨论 HTTPS抓包

HTTPS是密文发送的,基于SSL加密通讯,想要破解SSL,以目前的科技水平,几乎是不可能的,所以我们只拦截通讯数据,是读取不到HTTPS的明文的
因此,目前市面上所有的抓包软件都是基于内置代理HTTPS服务器的方式,把HTTPS访问的目的地导向到自己的内置服务器,这个内置服务器用的是自己的SSL证书,所以客户端跟他通讯的话他可以要求客户端用他对应的公钥证书,然后就可以解密用户发来的数据,与此同时他代替客户端去访问客户真实要访问的站点,把访问的结果传递给客户,这样一来数据交互就全都能获得明文了

那么这里有两个问题
1、如何更改用户要访问的服务器的目的地,把这个目的地导向本机?
2、如何解决客户对服务器证书的验证问题




我们先说第一点,如何更改用户访问的服务器目的地
这里有四种方法可以做到
第一,是最低级的修改系统代理,告诉系统,你所有的wininet的访问(包括IE浏览器以及一些调用wininet的应用程序)都走我指定的代理,而不是直接访问目的地IP,这种方法局限性很大,也比较低级,典型的比如fiddle,因为浏览器已经知道了连接的只是代理,不是真实的目的地,所以他们不会对fiddle的证书做什么验证,他们是完全相信fiddle的

第二,HOOK方法,HOOK掉目标软件的connectconnectEX两个函数,就可以实现强行把连接地址改为本机内置HTTPS服务器,这种方法对于单个软件抓包还是比较好用的,但是如果你不知道目标软件具体是哪一个,你想抓整个系统,那就会有点麻烦,你需要把所有进程都HOOK掉,并且HOOK方法是非常容易被检测到的,对于一些不允许你抓包的软件,他们一旦检测到有别的软件在HOOK他,肯定会采取限制措施

第三,LSP方法,LSP是win7以下系统的一个功能,对于win7以上的系统不适用,所谓的LSP就是分层服务提供者,说到这个就要说说windows的网络分层机制,任何一个进程,在使用网络的时候,都并不是直接操作系统底层的功能函数,而是通过一些服务提供者进行操作,这些服务提供者叫做SPI,他们帮助用户处理网络通讯的操作,这些SPI会有很多层,一个socket编程里调用某网络功能函数,是先调用SPI最上层的函数,然后SPI经过一些处理后,把这个请求传递给下一层继续处理,最终传递给基础SPI,也就是最底层的SPI,最底层的SPI接收到这些请求后,再调用系统驱动层的函数来处理,在这个过程中,所有的SPI都是透明的,调用这不会看到自己经过了哪些SPI层,他只关心自己传入的参数和最终获得的结果。    所以我们可以在最底层和最上层之间插入一层我们的处理函数,在我们的处理函数里把目的地IP转向我们自己的内置服务器,目前这种应用的抓包工具典型的如 Proxifier,以及易语言网截支持库等等(易语言网截支持库是直接替换最底层SPI),这种抓包软件的优点是:开发难度小,抓包范围全面,安装后就可以抓系统全局所有进程,不管你是不是浏览器,都可以抓,并且抓UDP,广播等等都是可以的,比较靠近底层,缺点是不适用于win7以上操作系统,安装和卸载都不方便,因为一旦有进程在使用你的SPI的DLL的话,你删除这个DLL或者修改就很麻烦,所以调试的时候经常要被迫重启电脑,麻烦得很,同时如果系统里有多个LSP的时候,有可能会出现互相安装卸载的时候导致协议链断裂,系统无法上网的问题,所以此方法在未来会被淘汰,但是在win7和win7以下系统中,他比上述两个办法都要高级得多

第四:WFP驱动,这是从win vista以来,一直到目前的win10都支持的一种系统底层驱动,并且微软解释说在废除LSP机制以后,WFP将会是未来主流的网络过滤管理方式,其原理是写一个WFP驱动,用这个驱动在系统底层注册一个过滤器和callout回调函数,根据过滤器规则,当网络层发生了指定的事件之前或者之后,这个驱动都会主动调用callout函数通知其他应用,同时也会根据过滤器规则对这些事件进行更改。
    利用这个原理,就可以达到把其他进程的目的IP强行转向自己内置HTTPS服务器的目的,并且这一切都是对于应用层透明的,被抓包的进程是无法感知到的,这是当前最先进的抓包方式,也最隐蔽,只要你的驱动起名不是特别明显,你的内置服务器的端口不是固定的,你的窗口和进程名称不是非常明显,那几乎很难被针对防御,况且如果掌握了这套技术,能自己写源码,那随时修改你抓包软件的各种特征,被抓软件是不可能发现的,并且这种抓包方法也非常稳定,跟LSP一样,可以针对整个系统所有进程和所有协议,而且他卸载起来非常方便,可以做到来去无痕迹,缺点是开发难度高,驱动不好写,写过驱动的人就知道,在写驱动测试驱动过程中,动不动就蓝屏可不是闹着玩的,并且他成本也很高,win7的64位系统以上都强制检查驱动证书,没有驱动证书是无法安装驱动的,而购买驱动证书比较昂贵,想要开发这种原理的抓包工具,主要需要解决两个问题:一个是驱动的编写,用易语言写驱动有点蛋疼,一个是驱动证书的问题。这种方式只适合专业化商业化的抓包工具,做出来以后基本可以拿去卖钱,目前典型的应用如HttpAnalyze 就是用的WFP驱动的方式,所以HttpAnalyze也是目前市面上最强大的抓HTTPS包的工具




下面再来说说如何解决浏览器和其它应用程序对SSL证书的检查
HTTPS对SSL证书的检查无非是:1,检查CA证书,证书链。2,检查证书日期。3、检查证书名称,持有人等。
前两者都好办,你自己可以写一个自签名的CA证书,把这个CA证书静默安装为系统的可信任根证书颁发机构,再给其它网站签发证书,签发的到期日什么的都可以由自己决定。
比较难以解决的是证书名称,持有人的验证(CName)
因为你的抓包软件必然不是只抓一个网站里一个URL的包,不同的URL都会检查SSL证书的持有人名称 :CName,而SSL的机制决定你在SSL握手阶段你不可能预先知道某个客户是要访问哪个网站,不可能根据这个网站提供相应名字的证书,所以一旦证书名称不对,浏览器一般都会发出警告,一些应用程序会直接终止连接

对于fiddle来说,不存在这个问题,因为fiddle并没有要冒充某个网站,他只是告诉系统,我是一个代理,所以他不用解决这个问题
对于 Proxifier 来说,他认为自己也只是一个强制代理的工具,证书问题不在自己解决的范围之内,所以他也不会提供这种解决方案

目前为止,只有HttpAnalyze是提供了一个比较完美的解决方案,其过程如下
1、当客户端的要连接的目的IP被导向到自己内置服务器以后,客户端会跟HttpAnalyze内置服务器进行TCP连接

2、当TCP连接完成以后,HttpAnalyze并不急于去接受SSL连接,而是他这个时候去连接应用程序原本要连接的服务器,获取到这个服务器的证书名称
3、然后,利用openssl,根据这个名称,用自己的CA证书给这个名称签发一个新的服务器证书
4、再把这个证书绑定到一个SSL结构体上,用这个结构体去接受客户端的SSL连接请求
这样,客户端就会得到一个由HttpAnalyze签发的跟自己要访问的网站同名的证书(比如由HttpAnalyze签发的淘宝的SSL证书),因为我们事先把HttpAnalyze的根证书设为了可信任根证书颁发结构,所以浏览器会直接信任这个证书,而不会拦截

目前这个方法,貌似是市面上唯一可行的方法,但是缺点是要根据连接动态的颁发证书,必然会影响访问速度,如果缓存了一些证书,不需要每次都颁发,那还好,要是每次都要颁发,那访问速度可想而知。可是没办法啊,你既然是准备抓包,那你必然没指望这个访问速度会有多快,所以目前HttpAnalyze提供的这个办法算是一个比较完美的办法,任何浏览器和应用程序都不会拦截




所以,说了上述这些,我们马上想到了一个万能的防止自己HTTPS通讯被抓的办法:进行双验证,在客户端验证服务器证书的时候,服务器也要客户端提供证书来验证,客户端在访问的时候判断服务器是否要求验证证书,如果你访问的这个服务器没有要求验证证书,那说明这个服务器有问题,如果你访问的这个服务器要求验证证书,你就把客户证书发给他,如果是假的服务器,那他是验证不了你的证书的,只好放弃连接,这样就保护了你的数据不被拦截



那么,说了这么多,证书操作哪家强?
当然是openssl咯,但是用openssl签发证书目前市面上都是用的命令行工具,执行效率非常差,针对这个问题,本人通过研究openssl证书操作的API,写一个证书的例子,可以直接调用API来签发证书,这个效率就高了很多了

源码连接如下:
https://bbs.125.la/forum.php?mod=viewthread&tid=14090835&extra=



点评

大神 真是太牛了 要不是我没啥条件 我都想拜师学艺了   香港特别行政区*  发表于 2020-11-15 00:13
给大佬呼个精华……其他各种伪高端都能有精华,这篇必须的   重庆市重庆市  发表于 2018-1-22 17:03

评分

参与人数 7好评 +5 精币 +14 收起 理由
半步风 + 1 感谢分享,很给力!~
Godsteal + 1 + 3 新技能已get√
梵笙 + 1 + 2 感谢分享,很给力!~
Patek + 1 + 3 打那么多字,辛苦的。
铅笔刀 + 3 新技能已get√
guilegui + 1 欢迎常来帮助新人,谢谢~
w648505183 + 1 + 2 感谢了啊老哥

查看全部评分

本帖被以下淘专辑推荐:

结帖率:62% (8/13)
发表于 2021-9-19 14:50:10 | 显示全部楼层   江苏省宿迁市

感谢分享。支持开源
回复 支持 反对

使用道具 举报

结帖率:63% (5/8)
发表于 2021-9-19 14:48:30 | 显示全部楼层   内蒙古自治区呼和浩特市
f111fei 发表于 2018-1-26 22:41
学习了,最近正在考虑怎么破不走系统代理的抓包方式

研究的怎么样了?
回复 支持 反对

使用道具 举报

结帖率:89% (31/35)
发表于 2019-5-4 12:42:44 | 显示全部楼层   湖南省湘潭市
可惜不能评分了,感谢分享,
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)
发表于 2018-2-20 15:45:19 | 显示全部楼层   河南省周口市
论坛最佳技术谈论文章,小的膜拜。
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)
发表于 2018-2-9 19:01:52 | 显示全部楼层   河南省平顶山市

论坛最佳技术谈论文章,小的膜拜
回复 支持 反对

使用道具 举报

头像被屏蔽
结帖率:95% (21/22)
发表于 2018-2-7 12:39:48 | 显示全部楼层   浙江省温州市
论坛最佳技术谈论文章,小的膜拜。
回复 支持 反对

使用道具 举报

结帖率:50% (1/2)
发表于 2018-2-5 06:28:08 | 显示全部楼层   贵州省黔东南苗族侗族自治州
感谢分享
回复 支持 反对

使用道具 举报

发表于 2018-1-26 22:41:26 | 显示全部楼层   北京市北京市
学习了,最近正在考虑怎么破不走系统代理的抓包方式
回复 支持 反对

使用道具 举报

结帖率:79% (11/14)

签到天数: 1 天

发表于 2018-1-25 16:22:49 | 显示全部楼层   云南省昆明市
感谢分享。支持开源
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 诚聘英才| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 800073686,邮箱:800073686@b.qq.com
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表