首页
论坛
专栏
课程

[原创]afd内核过滤增强fiddler

2019-6-18 19:36 2451

[原创]afd内核过滤增强fiddler

2019-6-18 19:36
2451
1.
写点笔记,怕忘了。
这种方式并不能处理https,只能处理http。 
 
Fiddler
Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的“进出”Fiddler的数据(指cookie,html,js,css等文件)它的原理是以web代理服务器的形式进行工作的,使用的代理地址是:127.0.0.1,端口默认为8888,我们也可以通过设置进行修改。
afd驱动
简来说AFD驱动向上与SOCKET应用接口约定了接口来实现SOCKET,AFD驱动实际上是一个TDI客户端,它通过TDI接口调用微软件的另一个网络部件TCPIP驱动来完成功能。AFD并没有官方的资料说明它的接口,但是在网上还是可以找到很关于AFD驱动的资料的。这里笔者参考了ReactOS-0.3.4-REL-src源代码中的AFD的内容,它于官方的AFD驱动实现还是有一些驱动别的,比如未实现FASTIO接口等。
为什么要增强,Fiddler对于浏览器的HTTP请求大部分是可以处理的,可是碰到类似自带一个libcef的客户端,或者直接用wininet来发送请求等不走ie代理的,Fiddler是抓不到其请求的,所以需要对其魔改一下。

(这样访问网络,fiddler并不能抓到)

2.简述
r3中winsock的connect,send,recv等等最终会转换成对afd驱动的DeviceControl(很多去广告喜欢挂钩这里)。

我们在驱动里面稍微打印一下相关的控制码(win2k源码中可以找到对应信息)

得到结果
IOCTL_AFD_BIND:12003 
IOCTL_AFD_CONNECT:12007 
IOCTL_AFD_START_LISTEN:1200b 
IOCTL_AFD_WAIT_FOR_LISTEN:1200c 
IOCTL_AFD_ACCEPT:12010 
IOCTL_AFD_RECV:12017 
IOCTL_AFD_RECV_DATAGRAM:1201b 
IOCTL_AFD_SEND:1201f 
IOCTL_AFD_SEND_DATAGRAM:12023 
IOCTL_AFD_SELECT:12024 
IOCTL_AFD_DISCONNECT:1202b 
IOCTL_AFD_GET_SOCK_NAME:1202f 
IOCTL_AFD_GET_PEER_NAME:12033 
IOCTL_AFD_GET_TDI_HANDLES:12037 
IOCTL_AFD_SET_INFO:1203b 
IOCTL_AFD_GET_CONTEXT_SIZE:1203f 
IOCTL_AFD_GET_CONTEXT:12043 
IOCTL_AFD_SET_CONTEXT:12047 
IOCTL_AFD_SET_CONNECT_DATA:1204b 
IOCTL_AFD_SET_CONNECT_OPTIONS:1204f 
IOCTL_AFD_SET_DISCONNECT_DATA:12053 
IOCTL_AFD_SET_DISCONNECT_OPTIONS:12057 
IOCTL_AFD_GET_CONNECT_DATA:1205b 
IOCTL_AFD_GET_CONNECT_OPTIONS:1205f 
IOCTL_AFD_GET_DISCONNECT_DATA:12063 
IOCTL_AFD_GET_DISCONNECT_OPTIONS:12067 
IOCTL_AFD_SET_CONNECT_DATA_SIZE:1206b 
IOCTL_AFD_SET_CONNECT_OPTIONS_SIZE:1206f 
IOCTL_AFD_SET_DISCONNECT_DATA_SIZE:12073 
IOCTL_AFD_SET_DISCONNECT_OPTIONS_SIZE:12077 
IOCTL_AFD_GET_INFO:1207b 
IOCTL_AFD_EVENT_SELECT:12087 
IOCTL_AFD_DEFER_ACCEPT:1208f 
IOCTL_AFD_GET_PENDING_CONNECT_DATA:120a7 
IOCTL_AFD_ENUM_NETWORK_EVENTS:1208b 
IOCTL_AFD_VALIDATE_GROUP:120ab 

在r3程序调用ZwDeviceIoControlFile的时候,实际会有2条路径,一个是afd驱动对象的>MajorFunction[IRP_MJ_DEVICE_CONTROL],
还一个就是其FastIoDispatch->FastIoDeviceControl。我们需要把这2个都挂钩,。

打印一下我们的wininet程序访问网页的时候对应的iocontrol

可以看到 IRP_MJ_DEVICE_CONTROL中,收到了一个120C7的请求,其中包含了00 50 (80端口) 77 60 c8 a6 (ip)。但是这个io码并没有在上面的列表,我们姑且叫它
constexpr auto AFD_X32_CONNECT = 0x120c7;
我们知道,Fiddler作为代理的时候,程序发送的内容和Fiddler转发的内容是一致的,所以我们可以直接修改connect时的ip和端口,再由Fiddler转发即可。

3.
找到afd的驱动对象,并修改它的相关回调


在win2k的代码中,我们可以找到AFD_CONNECT_INFO的描述
typedef struct _AFD_BIND_DATA {
  ULONG				ShareType;
  TRANSPORT_ADDRESS	Address;
} AFD_BIND_DATA, *PAFD_BIND_DATA;
typedef struct  _AFD_CONNECT_INFO {
  BOOLEAN				UseSAN;
  ULONG				Root;
  ULONG				Unknown;
  TRANSPORT_ADDRESS			RemoteAddress;
} AFD_CONNECT_INFO, *PAFD_CONNECT_INFO;


首先是Dispatch函数

首先是,判断是不是CONNECT类型,然后把ip和端口修改成Fiddler的代理地址(127.0.0.1:8888),同时我们要过滤掉Fiddler自身的转发请求,否则就会嵌套了。
FastIoDeviceControl同理

这时候就可以看到有输出了

我们使用wininet访问http://www.baidu.com看一下




这种方式并不能处理https,只能处理http。

https的探讨:
当fiddler设置为捕获https流量的时候,实际用的是web隧道.

抓一个https的代理包看一下

就是先给代理服务器发送一个CONNECT请求,代理服务器建立成功后,再传送HTTPS流量。这样问题就来了,在我们上面的工作中,并没有修改客户端的代理设置,也不希望修改。,但是在afd的回调中,我们并不知道https需要CONNECT的域名,COOKIE等信息。那有办法实现不改代理抓HTTPS包吗,这种方式叫做透明代理。
不过 Fiddler,Charles等工具并不支持

mitmproxy是一个支持透明代理的HTTP/S分析工具



什么是透明代理

https://docs.mitmproxy.org/stable/concepts-modes/#transparent-proxy

可以用afd的重定向代码支持mitmproxy吗
我们在afd的的回调中直接修改了目标地址,这样会让mitmproxy无法确定真正的原始地址,因为 mitmproxy 使用的是NAT网关。




[公告]安全测试和项目外包请将项目需求发到看雪企服平台:https://qifu.kanxue.com

最后于 2019-6-19 11:57 被xiaofu编辑 ,原因:
最新回复 (7)
放学打我不 1 2019-6-18 19:42
2
0
支持下
黑洛 1 2019-6-20 00:04
3
0
其实想要lz的配色
xiaofu 8 2019-6-20 00:07
4
0
黑洛 其实想要lz的配色

这是我的vs配色
黑洛 1 2019-6-20 00:59
5
0
xiaofu 这是我的vs配色
感谢大佬!
nevinhappy 2 2019-6-20 13:45
6
0
学习,难怪发现fiddler有很多会话没有抓到,用wireshark也没有看到。
dsqyg 2019-6-21 16:39
7
0
emmm,想要lz的字体
sxpp 1 2019-6-25 11:11
8
0
游客
登录 | 注册 方可回帖
返回