对路由器相关项目做安全审计,安全测试,需要对路由器进行https抓包,并且需要搭建一个可以篡改,mockhttps 数据的环境。
所以大致需求是通过fiddler对路由器的网络请求进行抓包,并且需要抓取并解密Https请求,通过fiddler的autoresponse和script功能mock数据。其中fiddler运行在pc上。
使用fiddler对Https进行抓包并解密的前提有两个:
1,在被抓包设备上设置http代理
2,在被抓包设备上信任fiddler根证书
目前存在的问题是,需要被抓包的路由器,系统无法设置Http代理,也无法通过正常方式信任fiddler根证书。需要想办法解决这两个问题。
一,解决代理问题
代理问题,通过下图解决
待抓包设备连接到openwrt系统路由器下(其他系统也可以,openwrt操作起来方便些)。openwrt和PC在相同的网络下,确保可以互相访问。
例如openwrt的地址是192.168.0.2,PC的地址是192.168.0.3。PC上开启fiddler,并且开启远程访问。
在openwrt上访问地址 192.168.0.2:8844,如果可以正常访问,说明网络环境没有问题。
网络可以访问通后,在openwrt上设置防火墙规则,把80和443端口的流量设置透明代理,代理到PC的地址,端口为8844(fiddler端口)。
例如我的PC地址是192.168.67.147,则命令如下:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 192.168.67.147:8844
iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to 192.168.67.147:8844
设置规则后,重启防火墙,然后在PC上的fiddler查看待抓包设备的请求。
此时发现一个问题,http的请求可以正常在fiddler里看到,但是Https的请求,在fidder里查看存在异常。如图,并不是一个正常的Https的显示:
查询了一下具体原因,应该是因为fiddler是不支持透明代理的。也就是说fidder只会显示带了代理协议头的Https请求,我们通过iptables把443端口的Https流量直接导给fiddler,是无法正常解析的。
解决方案是可以更换mitmproxy,mitmproxy支持透明代理。mitmproxy也是支持多平台,windows上也可以运行,但是考虑到不太熟悉,还是想用fiddler。fiddler的script脚本功能还是更强大一些。
又查询了一下,查到了一个解决方案,可以在fiddler的命令行用!listen 命令额外的开启一个端口获取透明代理的请求。例如命令
!listen 8443 host.com ,就可以在8443端口上截取host.com域名的Https请求,所以我们的iptabels规则需要调整一下:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 192.168.67.147:8844
iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to 192.168.67.147:8443
重启防火墙后,为了试验流量是否正常到达了fiddler,我们telnet上待抓包的设备,使用wget命令请求一个地址。wget前,先在fiddler中使用命令 !listen 8843 example.com
然后运行 wget –no-check-certificate "https://www.example.com" 发送一条https请求。注意这里需要带–no-check-certificate参数,因为如果访问通了,证书返回的会是fidddler的证书,设备上肯定是校验失败的。
可以看到fiddler可以正常获取到请求了。
二,解决证书信任问题
fiddler抓包由于使用的是中间人的方式,对于待抓包设备而言,fiddler就是与之交互的服务端。所以待抓包设备收到的Https证书肯定也是fiddler的证书。但是由于fiddler的证书签发机构是自己,没有主流的根证书机构的认证关系。
所以各种设备平台上,fiddler的证书是无法通过校验环节的。https请求也就无法正常建立。
一般来说linux的信任证书放在/ect/ssl/certs目录下。可以通过将fiddler的证书放到指定目录下,然后执行update-ca-certificates命令来更新证书。
不过路由器设备是基于openwrt,逻辑上有些区别,有些逻辑是定制的。例如试用wget命令的时候,指定了证书目录,命令如下
wget --ca-directory=/certdir “https://url"
所以理论上,把fiddler的证书文件FiddlerRootCertificate.crt和hash值链接文件,放到certdir文件,应该就可以截取并解密wget发出的https请求了。
这里在openwrt上,把FiddlerRootCertificate.crt文件放到/etc/ssl/cert目录后,执行openssl rehash命令生成hash文件。计划再把证书文件和hash文件放到待抓包设备的certdir目录下,就可以正常抓包了。
不过在执行命令后遇到了提醒:
rehash: warning: skipping FiddlerRoot.pem,it does not contain exactly one certificate or CRL
应该是fiddler证书的问题,导致命令无法生成hash文件。这里没有找到比较好的解决方案。
所以又采用了另外一个方案,登陆待抓包设备后,把FiddlerRootCertificate.crt的证书路径直接写入到wgetrc文件中,这样wget在Https请求时候,可以在wgetrc中找到fiddler的证书,也就可以通过校验了。
写入ca-certificate=/var/ca_root_dir/FidderRoot.cer到/root/wgetrc文件。
echo ca-certificate=/var/ca_root_dir/FidderRoot.cer >>/root/wgetrc
再尝试请求wget,这次不带–no-check-certificat参数。
可以看到,fiddler也可以正常抓取解密https请求了。到此我们的环境搭建完毕。可以愉快的在PC上抓包智能设备上的https请求了。