某软件WFP防火墙分析
本帖最后由 少年持剑 于 2023-12-22 20:39 编辑前言
https://static.52pojie.cn/static/image/hrline/1.gif
最近朋友找我帮忙,起因是他们公司有一个VPN软件,只有使用这软件才能正常访问公司内网站。
这个软件需要账号登录,一个账号只能在一个设备登录,另一个设备登录就会被挤下线。
因为他有几台电脑,所以需要一个账号能几个设备一起使用。
尝试
https://static.52pojie.cn/static/image/hrline/1.gif
因为对网络方面不太了解,所以最先想到是在一台电脑(后面称为主机)建http代理,其它电脑(后面称为客机)通过代理在访问网站。
主机使用CCProxy 设置HTTP 端口
客机通过proxifier设置代理地址和端口。
上面设置好后,在VPN软件没有运行时,代理能正常通过,CCProxy能正常显示用户,但是VPN软件驱动后 代理就生效,CCProxy 没有流量通过。
寻找原因
https://static.52pojie.cn/static/image/hrline/1.gif
没有流量通过,可能是路由,防火墙和系统原因。但是防火墙两边都关了,所以只能先用wireshark抓包看看。
在wireshark里面可以看到只有客机向主机重复发送TCP第一个握手的SYN,而主机没有发向客机的数据包,所以不可能是路由,应该是系统做了手脚。
用pchunter 可以观察到启动VPN软件前后有一个驱动被加载。
驱动分析
https://static.52pojie.cn/static/image/hrline/1.gif
把驱动直接拖到ida里面,因为没有壳,直接看导入函数,可以初步判断应该是用wfp搞的防火墙,拦截了局域网内其它电脑的数据包。
使用Windows-Kernel-Explorer工具可以查看所有wfp注册的callout,在启动vpn软件后会多出几个回调函数,而图中的OutBound 显然就是驱动管理出站的回调。
根据回调地址,在ida中定位到函数:可以看到函数主要由HandleIPv4来决定最后的actionType 是将数据包放行或阻止。而filter->context 指向DeviceObject->DeviceExtension 用来存放防火墙的出入站规则和行为。
进入HandleIPv4函数,根据返回值跟着可以找到过滤局域网数据判断的关键位置:
sub_1400065C4负责对传入IP跟驱动定义的防火墙规则匹配,根据返回的operator来决定是阻止数据,放行等,进入sub_1400065C4 函数后第一行是
a1 是之前的DeviceExtension而a3是传进来的6 对应TCP ,其它协议UDP等对应不同值。
0x1D018i64* a3 + a1 + 0x48对应的是TCP防火墙规则。
而sub_1400041F0函数作用就是将sub_1400041F0所有防火墙规则拷贝到v14 这个数组里面。
而接下来的代码就是通过遍历v14数组将IP和防火墙规则匹配了,
之后只需要通过MatchFilter函数查看v14 结构偏移就可以得到每条防火墙规则的结构。用ce lua脚本遍历
在最后输出结果可以有下面这一行
结尾
https://static.52pojie.cn/static/image/hrline/1.gif
在ce中将上面那条规则对应的operator改成1后,局域网代理就能正常访问了。
之后就是写驱动,或者看防火墙规则在3环怎么储存来修改了。
因为是公司的软件所以样品就不好发了。。。。。
大佬NB,正在入门驱动开发,想请教一下WFP里面能不能实现伪造请求响应 人家故里 发表于 2023-12-25 17:10
大佬NB,正在入门驱动开发,想请教一下WFP里面能不能实现伪造请求响应
可以的。 水平真高!{:1_921:} 哈哈哈感谢楼主分享啊啊啊:lol 牛的技术。 信息量还是蛮大 的 mark,学习一下 很实用的教程,一路跟着大佬学习! 好厉害啊,跟着楼主学习了
页:
[1]
2