本帖最后由 kangdiwu 于 2023-12-30 23:11 编辑
前言
最近朋友找我帮忙,起因是他们公司有一个VPN软件,只有使用这软件才能正常访问公司内网站。 这个软件需要账号登录,一个账号只能在一个设备登录,另一个设备登录就会被挤下线。 因为他有几台电脑,所以需要一个账号能几个设备一起使用。
尝试
因为对网络方面不太了解,所以最先想到是在一台电脑(后面称为主机)建http代理,其它电脑(后面称为客机)通过代理在访问网站。 主机使用CCProxy 设置HTTP 端口 客机通过proxifier设置代理地址和端口。
上面设置好后,在VPN软件没有运行时,代理能正常通过,CCProxy能正常显示用户,但是VPN软件驱动后 代理就生效,CCProxy 没有流量通过。
寻找原因
没有流量通过,可能是路由,防火墙和系统原因。但是防火墙两边都关了,所以只能先用wireshark抓包看看。 在wireshark里面可以看到只有客机向主机重复发送TCP第一个握手的SYN,而主机没有发向客机的数据包,所以不可能是路由,应该是系统做了手脚。 用pchunter 可以观察到启动VPN软件前后有一个驱动被加载。 驱动分析
把驱动直接拖到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脚本遍历 在最后输出结果可以有下面这一行
结尾
在ce中将上面那条规则对应的operator改成1后,局域网代理就能正常访问了。 之后就是写驱动,或者看防火墙规则在3环怎么储存来修改了。
因为是公司的软件所以样品就不好发了。。。。。
注:若转载请注明大神论坛来源(本贴地址)与作者信息。
|