ios旧版软件抓包,iosapp抓包
Python crawler使用drony转发来抓取和转发数据包。
重印到https://www.cnblogs.com/lulianqi/p/11380794.html#l_2
简介HTTP应用层的包捕获已经成为日常工作测试和调试的重要组成部分。最近接触到新的项目,突然发现以前的抓包方式效果并不好。突然之间,模块间前端和服务的交互变得看不见了,整个人好像被蒙住了眼睛。
其实我很早就发现,我平时使用的支付宝等app,在使用Fiddler或Charles等代理抓取软件时,默认无法抓取请求,但是使用Wireshark等网卡抓取软件,可以看到这些app的流量,这也说明这些app使用的主要应用层协议仍然是HTTP(https),只是我们的代理抓取工具出现了故障。现在终于在实际工作中遇到了,不得不解决。毕竟眼前的东西会让我觉得不舒服。
代理抓取原理为了找出Fiddler或者Charles对这些app无效的原因,我们有必要先了解一下代理抓取的原理(当然如果你不想了解也完全没问题,只要看看后面的实际操作就可以了,如果你对原理分析什么的感兴趣可以随时回来)
Fiddler或Charles等代理的包捕获软件与Wireshark完全不同(Wireshark使用的网卡的数据副本只要经过指定的网卡就会被捕获),只能在使用代理的应用层网络协议上生效,比如常见的HTTP(https)和Websocket。
这里以HTTP为例简单说明一下。
客户端需要完成一个http请求,通常它需要先找到服务器。客户端会根据http请求中url的主机名(实际会用到主机中的主角名)和它的端口建立与目标主机的tcp连接。连接建立后,HTTP消息将被发送到目标服务器(更多详情请参考https://tools.ietf.org/html/rfc7232)。
接下来,让我看看HTTP代理是如何工作的。当我们启动Fiddler或Charles时,我们启动了一个HTTP代理服务器。这样的工具会通知操作系统,“现在我已经在系统上创建了一个HTTP代理,IP为XXXXXX,端口为XX。如果使用的是linux,可以手动通知操作系统(export http _ proxy=IP:port export https _ proxy=$ http _ proxy)。如果您使用的是移动设备,如手机,您可以在当前的wifi设置下告诉系统您要使用HTTP代理。现在我们已经告诉系统我们想要使用一个代理。此时,当系统上运行的http客户端再次发送请求时,他不会做DNS解析来连接目标服务器,而是会直接连接系统告诉他代理的地址(代理的ip和端口,请注意,无论http还是https或者其他支持代理的协议都会连接到同一个端口)。然后代理服务器会和客户端建立连接,然后代理服务器根据请求信息连接到真实服务器。
还有一个细节。通常,在没有代理的情况下,客户端发送给服务器的请求行只包含URI的一部分(实际上,没有方案、主机名和端口)。
如上图,如果没有代理,www.baidu.com/index.htmls请求的请求行其实是GET /index.html HTTP/1.1,这其实不是我们常见的完整uri。因为在最初的HTTP设计中没有考虑中间服务器(即代理),客户端在发送消息之前就已经知道了服务器的地址并与之建立了连接,所以不需要再次发送方案、主机名和端口。但是,这种做法在代理出现后会有问题。客户端连接到代理服务器,但代理服务器无法连接到正确的服务器。因此,客户端发送给代理的请求实际上略有不同。客户端将在请求行中使用完整的uri,以便代理服务器可以解析真实服务器的地址。
目前我们的请求实际上是通过代理服务器(Fiddler或Charles)发送的,所以代理包捕获软件不仅知道http请求和响应的所有消息,甚至可以随时修改请求和响应。
应用程序无法捕获数据包的部分原因可见一斑。代理捕获的关键是http客户端需要根据需要连接到代理服务器。一般来说,我们在系统级设置了代理,http客户端通常根据需要实现它们。在发出HTTP请求之前,他们将首先检查系统代理。如果设置了代理,客户端将直接使用完整的uri连接到代理服务器。不同的平台通常实现自己的http客户端。虽然都是按照协议要求实现代理功能,但默认情况下不一定直接使用系统代理。
现实中,这样的情况并不少。这是作者在当前项目中使用的颤振案例。默认情况下,Flutter不会主动使用系统代理,所以需要单独设置。(当然,我个人认为这个策略也是有道理的。虽然给测试和调试带来不便,但也在一定程度上提高了数据安全性。)
只是因为HTTP客户端不使用我们设置的系统代理,自然不会连接Fiddler或者Charles创建的代理服务器,最终导致我们无法获得任何请求。
解决方法不过,现在我们知道了Fiddler和Charles抓不到包的具体原因,代理抓包的原理前面也提到了,我们总能找到解决方法。
如前所述,我们APP使用的HTTP客户端没有连接代理服务器,导致我们的代理抓包软件无法正常抓包。然后我们只需要想办法让客户端重新连接代理服务器(当然这一切都是建立在不修改客户端软件APP的前提下)
方法:控制dns解析,通过修改DNS让客户端认为我们的代理服务器是目标服务器。
优点:操作简单。修改设备的主机非常方便。
缺点:每个需要操作的域名都需要提前添加主机。
很难在手机等手持设备上修改主机(也就是很难实现手机app等应用)。
方法:流量转发直接在网络设备上完成,发送到指定终端设备上80和443端口的数据直接转发到代理服务器的目标端口。
优点:连接网络设备的终端设备可以单独配置,而手机等终端设备不需要任何设备。
缺点:需要单独的硬件设备。
方法:利用VPN将终端设备的流量转发到代理服务器。
优点:使用VPN软件时不需要添加其他测试。
缺点:终端上的VPN默认会直接转发所有流量,可能需要额外的学习成本来进行合理配置。
实用步骤(Android)这里作者直接用上面提到的第三种方法(方法1对于手机APP来说操作难度较大,方法2可能需要其他设备,所以这里不使用)。因为我们的测试对象是手机APP,所以首先要在手机上安装一个VPN。这里有一个非常方便的vpn软件,drony(这里介绍在https://github . com/SuppSandroB/sandrop/wiki/drony-FAQ)。drony会在你的手机上创建一个VPN,将你手机上的所有流量重定向到drony本身(而不是VPN服务器),这样Drony就可以管理所有手机上的网络流量,甚至可以单独配置你手机上不同app的流量。
1.安装drony(此处手机使用的安卓设备)。可以在网上搜索drony并选择想要安装的版本,也可以在这里下载(https://files . cn blogs . com/files/lulian qi/Drony _ 102 . apk)。安装完成后,打开软件,如下所示。
2.打开代理捕获软件(这里,代理捕获软件使用Fiddler)。这里不介绍Fiddler的用法。您需要打开远程代理并在您的手机中安装Fiddler根证书。
笔者在这里开通的远程代理地址是192.168.2.244:8888。
关于证书安装的一些细节,Fiddler默认的根证书是cer格式,部分手机可能只识别pem格式的证书。
直接用openssl就行了(OpenSSL X509-inform der-infiddlerroot . cer-outfiddlerroot . PEM)
Openssl一般安装在windows/mac中,直接使用命令即可,使用生成的FiddlerRoot.pem (Charles默认为pem证书)安装在手机上
3.配置无人值守转发
3.1打开Drony(处于关闭状态),滑动到设置页面,点击选择网络Wi-Fi进入配置。
3.2在网络列表中,选择并点击当前手机wifi连接的网络(需要确保此网络连接的是Fiddler代理服务器网络)。
3.3配置当前网络要使用的代理门户(这里直接填写fiddler的代理地址即可),选择代理模式为手动。
3.4代理类型代理模式注意普通http代理。
3.5过滤默认值选择直接全部,然后单击下面的规则设置应用规则。
您的默认规则应该为空。单击上面的加号添加规则(只有符合规则的规则才会被转发)。
说明下面的操作会用咸鱼或者支付宝来演示,但是作者目前测试的项目不是咸鱼或者支付宝,也不是他公司的员工。之所以选择这两个app进行演示,是因为这两个app比较常用,抓不到包的原因和笔者现在的项目app差不多。
在网络ID中选择当前wifi的SSID
选择操作本地代理链。
应用选择需要强制代理的应用。
将主机名和端口留空意味着它们都将被强制代理,因为APP可能使用其他网络协议,不一定是http,也可能不想将所有流量都引流到http代理服务器。此时,它将在转发之前使用此配置来指定ip和端口。
完成后保存,然后返回设置主页,滑动到日志页面,点击下面的按钮使其开启(表示激活)。
这个时候启动支付宝或者咸鱼,在提琴手上可以看到正常的流量。但是,如果你和作者一样幸运,你可能只会看到这些通往(TLS管道建立)的隧道。如果您使用的是Charles,您可能会在列表中看到红叉。
当然,作者的Fiddler根证书安装成功,Fiddler配置正确(手机上Chrome https抓取正常)。
现在流量到了Fiddler,Drony的工作已经完美完成,有些app无法解密https消息,还是我们自己的证书。先简单描述一下证书验证的流程(如果不想看这些流程,可以直接看下面的操作步骤)。
证书验证原理Fiddler和Charles都是利用中间人攻击来替换tls链接证书,对消息进行解密后再进行加密并发送给真实的服务器。
关于中间人攻击的详细内容,可以参考HTTPS中间人攻击练习(原理与练习)。
当代理存在时,客户端首先连接到代理服务器(也就是图中的攻击者),实际客户端是一个直接与代理建立的TLS通道,所以代理当然使用TLS通道的传输密钥,然后解密消息。
但是,由于证书的存在,客户端将验证证书的有效性,然后决定是否连接到服务器。我们在抓取https之前,使用Fiddler或Charles在设备中安装根证书,只是为了通过客户端的证书验证。
在浏览器中找到任何https网页,并检查其证书信息。
从这里我们可以看到证书包含以下内容:
(1)有效期是有效期,包括有效时间和无效时间,是一个时间区间;
(2)公钥信息主题公钥信息,包括公钥加密算法和公钥内容;
(3)指纹信息。指纹用于验证证书的完整性,也是证书验证的关键。他的保证书没有被修改。原理是发布者在发布证书时,根据指纹算法计算整个证书的哈希指纹(这里证书中使用了SHA-1和SHA-256算法,以兼容老客户端)[证书内容的哈希值用CA私钥加密,就是指纹]并和证书放在一起。当客户端打开证书时,它还根据指纹算法计算证书的哈希值,并用其可信根证书的公钥解密哈希指纹,计算出原始哈希。如果散列值不一致,
(4)证书签名值和用于签署证书的证书签名算法、散列算法和散列值;
(五)发行人;颁发证书的CA机构;
(6)哪个机构/公司信息主体;是颁发给的证书;
(7)证书版本、证书序列号、扩展的扩展信息等。
上图是证件指纹验证的流程。您可能会看到,客户端验证证书的核心实际上是解密原始指纹的CA公钥。CA公钥来自哪里?为了确保安全设备系统将具有您信任的CA公共密钥(根证书)的列表。这些CA公钥一般对应的是权威机构或组织,然后这些权威机构在颁发证书时会使用自己的私钥进行签名(为证书生成指纹)。这确保了只有授权机构向每个网站颁发的证书才会被客户端验证。
Filddler在这些证书中没有公钥对应的私钥(CA只会把完全颁发的证书对应的私钥给网站的所有者),所以没有办法和客户端完成TLS握手。为了完成握手,Filddler只能自己为不同的站点生成证书,
但是客户端生成的证书必须是用自己的私钥签名的,客户端在其可信CA公钥列表中找不到对应的根证书,所以肯定无法通过证书验证。所以Filddler让我们把他的根证书安装到设备上,这样他自己颁发的证书就可以通过证书验证,他就可以解密https报文了。
其实无法解密的原因从上面的描述就很清楚了。我们无法正常建立连接解密https消息的原因是证书验证失败,我们的根证书安装不够完整。
Android7.0之后,系统允许每个应用定义自己的可信CA集。有些应用默认只信任系统中预装的CA证书,而不信任用户安装的CA证书(或者应用使用的开发框架默认只信任系统证书,因为开发者通常不会关心这些配置,也不会更改)。在Android中,用户安装的证书都是用户证书,所以不管是Filddler还是Charles,我们只是把他们的根证书安装到用户证书中。这些应用程序不使用它们,所以我们安装的证书无效。
既然又知道了原因,总有办法解决。我们只需要安装代理软件的根证书作为系统证书。
其实把证书安装到系统区还是比较简单的。只需用指定的名称将证书放在指定的位置(/system/etc/security/cachets/)。
首先将我们的根证书的名称改为Certificate_Hash。
Certificate_Hash表示证书文件的哈希值,Number是为了防止证书文件哈希值不一致而添加的后缀(用0就可以了)。
下载自己的根证书FiddlerRoot.cer,使用OpenSSL X509-subject _ hash _ old-in certificate _ file计算证书哈希,将证书重命名为269953fb.0 (269953fb为哈希(269953fb为作者证书的哈希,每个人肯定不一样)
然后将269953fb.0文件复制到/system/etc/security/cacerts/
完成后,我们可以看到代理软件的证书出现在系统区域。
这里还有一点需要单独说明。/system/etc/security/cacerts/directory的写权限需要手机root权限。
也就是说,将证书复制到这个目录需要你自己root自己的设备。
关于安卓手机的root,通常手机厂商都会有自己的官方教程。建议你按照官方操作root。
以小米手机为例(http://www.miui.com/thread-12281379-1-1.html)
目前小米手机的root需要手机绑定小米账号7天以上才能解锁。解锁后刷入开发版完成root。
需要注意的是,并不是所有的小米手机都有相应的开发版本,购买测试设备时要注意。(http://www.miui.com/download.html可以看看他的手机有没有开发版可以用在这里)
现在效果证书也已经安装在系统区了,再回去提琴手看看效果。
再次打开free fish,我们已经可以看到完整的https请求了。
我们找一个请求,修改请求返回的数据,看看效果。
借助Fiddler插件FreeHttp修改该请求的返回数据,将二手m
再次打开闲鱼,可以看到代理数据被篡改了。(测试时注意清空咸鱼的缓存和应用数据,确保每次打开app都会请求firstdata。)
经过上述配置,这些app的HTTP流量可以通过代理抓包软件获取,https流量也可能正常解码。
回到顶端
IOS操作程序(IOS)
Ios(iphone)也使用上面提到的第三种方法(原理和android一样),同样需要使用VPN。ios里有很多类似drony的软件,你可以选择自己喜欢的。作者在这里使用Shadowrocket。
如上图,你可以直接在App Store中找到这些软件(受内地相关规定限制,如果你在中国的App Store区域找不到这些软件,需要使用美国地区的账号)
为了重定向流量,Shadowrocket和drony一样,会先在设备上创建一个本地VPN服务,然后使用你设置的规则来处理流量。
不过Shadowrocket的使用会更方便,只需打开软件,如下图配置即可。
1.选择全局路由作为“代理”
2.添加一个服务节点(类型为HTTP和HTTPS,服务器的地址和端口为您的代理数据包捕获工具的地址和端口)
3.将状态设置为启用(IOS将同时自动创建VPN)
现在,直接打开iphone上的任何APP(不用在wifi上重复设置代理),就可以在代理包捕获工具上看到流量,也无法解析HTTPS流量。但是IOS不允许APP像新版android一样手动拒绝用户信任的用户根证书,所以IOS证书安装比android更随意,没有那么多额外的操作。只需遵循正常的证书安装过程。安装证书后,您可以查看HTTPS流量。
如何使用CSS设置div的半透明效果
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。