现在很多网站都使用了 https 的方案,保证了传输中的数据不被修改或者被第三方封包软件看见,但是由于https有一些隐含的缺陷或者服务器验证的不严格,https被劫持的可能性存在,就像之前出现了”净广大师”病毒劫持https,往百度搜索里插入广告id,他使用的方法就是中间人攻击,强行插入自己的证书实现解密https,今天我们介绍一种浏览器劫持的方法实现https劫持,现在我们就开始分析去找到浏览器中https加密的入口。
(一)分析方法
首先我们打开浏览器(注意:这里涉及的浏览器的名字都会被隐去),输入baidu.com,在baidu里输入666666
我们可以看到baidu搜索时浏览器地址栏里,baidu的网站使用的是https链接地址
接下来使用调试器ollydbg去附加浏览器,然后在命令输入bp WSASend
然后重新点击百度里的搜索按钮,这是调试器会断在
WSASend
地方:
我们再看堆栈区域,往下翻堆栈会看到
有
sha256
相关的
hash
计算的,这里就是说在发送数据之前经过一些
tls
的计算的过程,
下面我继续走掉返回到调用
WSASend
的地方
:
0x66F20F20
这里并不是明文所在的地方,一般进入发包的地方时已经被加密了,我们继续走下去,返回到调用该函数区域的所在函数,因为这个函数没什么特征性,应该还没到达
https
加密前所在的地方,返回到一个调用比较特别的地方。
当我们返回到这里
CALL DWORD PTR DS:[EDX+8],
我们要引起注意,可以大概这样假设,这里是调用
c++
一个类的虚表函数。
发现此地址确实是个函数表
这时我们在翻堆栈信息时发现了明文的请求信息
按下快捷键
:
ctrl + G
,输入
0x66FC422D
,
进入该函数地址区域:
发现这里并没有什么特殊地方我们可以继续
F8
单步走下去,当我们走到地址
67034AB0
,知道我们之前调用有个特殊的函数,
call [eax+0x30],
可以猜测这里的调用也是一个虚表里的函数。
接下来我们把之前的所有断点全部禁用
然后在这个函数地方下断点,重新开始
baidu
搜索,这时浏览器停在了这个函数
call [eax+0x30]
的地方
,此时eax值为
0x683A1908
查看
eax
的内存所在的地址确实是个函数表,是虚表没错了,
edi
地址也有明文。
在分析堆栈,该函数有三个参数
在
call [eax+0x30]
前有三个
说明该函数是三个参数,在上面堆栈中我们找到前三个值分别是
下面我们验证下我们对以上三个参数的验证,按
F9
,
下次浏览器会继续停在该函数的地方
查看堆栈,确实如上猜测 :
我们再继续回过头分析
eax
这个值,
0x683A1980,
这个地址在当前这个程序的这个代码模块内,且在这个模块的
”.rdata”
程序段内,那这足以证明该地址就是一个
https
的加密类,而
0×30
的偏移的函数就是加密函数入口。
(二)代码实现
分析到了具体的地方,我们就可以写程序去挂钩这个虚表函数去获取浏览器每次发出去的明文请求。
我们可以定义一个c++ 虚类
其中
pSSL_Crypt
这个地址就是
0×30
的偏移的函数指针,接着我就写一个hijack类去实现hook浏览器
在以上代码我们获取了模块加密类的虚表地址后就替换刚才那个偏移地址,修改指针去实现
hook
,当我们在浏览器里百度搜索时,会停在我们的函数里
Buffer
参数
Len值
结果和我们预想的一样,这样我们就通过
hook
实现了浏览器
https
明文的截获,在我们的hook函数中我们可以做任何事情,可以过滤数据,可以转发数据,甚至我们还能修改请求数据,如果我们再hook了浏览器的https的解密函数,也能过滤或者修改从服务器端接受的https数据回应信息,实现我们想要的各种功能。
总结
自此本文结束,综上所讲的hook技术能够破坏浏览器程序本身,导致https被劫持,而浏览器却无法察觉,可见浏览器厂商对自身的安全性保障也是一个很重要的、值得他们去深思研究的问题。
(注意:本文只是属于技术分享,请勿用于非正常途径,故而会隐去浏览器的名称)
领取专属 10元无门槛券
私享最新 技术干货