IOS的apsd是Apple Push Service的相关进程,很多系统服务都跟他有关,比如iMessage、Homekit,因此想抓包查看他是怎么实现的。

1.搜索发现相关资料很少,只有多年前的一个相关演讲:https://blog.quarkslab.com/resources/2013-10-17_imessage-privacy/slides/iMessage_privacy.pdf

2.首先使用uncover越狱,尝试使用ssl-kill-switch2,发现并不成功,原因不明,发了issue不只一个人有这个问题。

3. 接下来尝试使用Frida来Hook SecTrustEvaluate(),参考博客https://kov4l3nko.github.io/blog/2018-05-27-sll-pinning-hook-sectrustevaluate/

发现是可行的,中间人能抓到客户端发出的第一个数据包,但是不明原因服务器并不会回复客户端请求。猜测是不是服务器验证了客户端的证书(从苹果官方资料中猜测是,但是我抓包没有看到标准的TLS握手中请求客户端证书),因此尝试使用keychain dumper获取客户端apsd使用的证书,并把证书设置给中间人。

4. 使用keychain的时候有坑,首先不支持IOS12,通过Issue 36修改entitlements.xml解决,特别注意需要下载源码按照说明重新build二进制才能使用,不然出现KILL 9错误。 参考pushProxy的教程,使用cydia安装openssl后使用KeychainDumper_signed -k (记得加-k参数)可获得私钥。换成-i参数获得证书。

悲剧的是,在mitmproxy里设置了客户端证书也不行,服务器还是不回复消息(毕竟没开中间人也没看到服务器要客户端证书啊),不知道发生了什么。剩下的只能靠自己或者研究一下多年前的pushProxy了。

5. 由于Hook SSL证书这条路出现了不明原因的bug,所以决定Hook SSL的收发函数。

首先调查苹果ssl的实现机制,可能是用的这个链接的coreTLS实现:https://opensource.apple.com/tarballs/

这里面源码就用了Hook发现确实在用的SecTrustEvaluate();收发函数观察发现是SSLWrite和SSLRead,注意大小写一定不能错!用frida-trace发现其实SSL_write()也有,但不知为何没有hook到调用。

最终问题解决可以看到收发的数据了,使用的代码如下:

 import frida
import sys def on_message(message, data):
try:
if message:
print("[*] Received data: {0}".format(message["payload"]))
except Exception as e:
print(message)
print(e) def run_frida_script():
with open("hook_sslReadWrite.js", "r") as f:
frida_script_code = f.read()
return frida_script_code if __name__ == '__main__': #For USB connection
session = frida.get_usb_device().attach("apsd")
script = session.create_script(run_frida_script())
script.on('message', on_message)
script.load()
sys.stdin.read()
function main() {

    // Get SecTrustEvaluate address
var SSLWrite_prt = Module.findExportByName("Security", "SSLWrite");
var SSLRead_prt = Module.findExportByName("Security", "SSLRead"); if (SSLWrite_prt == null || SSLRead_prt == NULL) {
console.log("[Error] Security!SSLWrite/Read(...) not found!");
return;
} //OSStatus SSLWrite(SSLContextRef context, const void *data, size_t dataLength, size_t *processed);
Interceptor.attach(SSLWrite_prt,
{
onEnter: function (args)
{
console.log("SSLWrite(" + "" + ")");
this.data = args[1];
this.processed = args[3];
//send("onEnter SSLWrite");
//var length = args[2].toInt32();
//console.log(int64(args[2]).toInt32());
//send(Memory.readByteArray(args[1], parseInt(args[2])));
//console.log(Memory.readByteArray(args[1], length)); //console.log("SSLWrite() called from:\n" + Thread.backtrace(this.context, Backtracer.ACCURATE).map(DebugSymbol.fromAddress).join("\n")); },
onLeave: function (retval)
{
//send("onLeave");
var status = retval.toInt32();
if (status === 0 && !this.processed.isNull()) {
var data = Memory.readByteArray(this.data, Memory.readPointer(this.processed).toInt32());
console.log(data);
}
}
}); //OSStatus SSLRead(SSLContextRef context, void *data, size_t dataLength, size_t *processed);
Interceptor.attach(SSLRead_prt,
{
onEnter: function (args) {
console.log("SSLRead(" + "" + ")");
this.data = args[1];
this.processed = args[3];
}, onLeave: function (retval) {
var status = retval.toInt32();
if (status === 0) {
var data = Memory.readByteArray(this.data, Memory.readPointer(this.processed).toInt32());
console.log(data);
}
}
});
} // Run the script
main();

后记:发现苹果没有一个公开的说明push service的文档,看到流量获得的信息也有限,最后只要再查资料+逆向了……

抓取IOS的apsd进程流量的更多相关文章

  1. fiddler抓包工具 https抓取 ios手机端抓取

    fiddler抓包工具 https抓取 ios手机端抓取  转载链接:https://www.cnblogs.com/bais/p/9118297.html   抓取pc端https请求,ios手机端 ...

  2. 抓取“矢量”的实时交通流量数据

    1. 引言 最近老师有一个需求,就是想要抓取实时的矢量交通流量数据来做分析,类似于百度地图,高德地图的"实时路况"那种.平时的网络抓取工作一般是抓取网页上现成的数据,但是交通流量数 ...

  3. burp抓取ios设备https数据包

    参考了网上其他相关教程,自己动手试了一次,有效的方法可确定为: 1.让PC机和移动端处于同一局域网, 2.burp设定监听所有接口,并监听一个端口 3.手机端设置代理,方式为手动,ip地址填PC在局域 ...

  4. fiddler抓取手机端的数据流量包

    1.首先下载安装fiddler 2.然后打开fiddler,进入到tools-->options-->connections 3.然后进入到https 4.设置完成后,查找本机ip 然后打 ...

  5. 使用Fiddle抓取IOS手机

    1.配置Fiddle (Tools->Options) 勾选后,按照提示下载安装一个认证 Fiddle默认8888端口 2.电脑开个热点,手机连上后,在该wifi的代理配置中,选择手动,服务器输 ...

  6. 通过WireShark抓取iOS联网数据实例分析

    本文转载至http://blog.csdn.net/lixing333/article/details/7782539 iosiphone网络filter工具 我在另外一篇博客里,介绍了一款比Wire ...

  7. 记一次解密wireshark抓取的冰蝎通信流量

    一.关于冰蝎 1.1 简单介绍 冰蝎是一款基于Java开发的动态加密通信流量的新型Webshell客户端.老牌 Webshell 管理神器——中国菜刀的攻击流量特征明显,容易被各类安全设备检测,实际场 ...

  8. 虚机抓取Hyper-V宿主的镜像流量(Windows Server 2012R2)

    1.将交换机流量镜像到Hyper-V宿主的一块网卡(eth4) 2.在Hyper-V宿主上新建虚拟交换机(Network_Mirror),选择外部网络,扩展属性中启用“Microsoft NDIS捕获 ...

  9. Mac使用Charles抓取ios手机APP中的https请求

    1.配置Http代理 Port为监听端口号,默认为8888,勾选Enable transparent HTTP proxying,接着勾选SOCKS proxy,可以监听Socks请求 2.安装Cha ...

随机推荐

  1. tp5 上传视频到七牛云

    废话少说直接上代码 html <!DOCTYPE html> <html> <head> <title></title> </head ...

  2. 6.12号整理(h5新特性-图片、文件上传)

    <input type="file" id='myFile' multiple> <ul> <li> <img src="&qu ...

  3. 小爬爬6.scrapy回顾和手动请求发送

    1.数据结构回顾 #栈def push(self,item) def pop(self) #队列 def enqueue(self,item) def dequeue(self) #列表 def ad ...

  4. UVA_414:Machined Surfaces

    Language : C++ 4.8.2 #include<stdio.h> #include<string.h> int main(void) { int n; int su ...

  5. 巨蟒python全栈开发-第11阶段 ansible_project5

    今日大纲 1.命令展示前端页面实现(下面有个断点) 2.命令下发后端展示

  6. Java练习 SDUT-3328_JAVA判断合法标识符

    JAVA判断合法标识符 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 输入若干行字符串,判断每行字符串是否可以作为JA ...

  7. @codeforces - 455E@ Function

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 已知 a 序列,并给定以下关系: \[\begin{cases} ...

  8. Mysql——ERROR 1045 (28000): Access denied for user 'root'@'localhost'

    1.修改my.ini,最后一行添加  skip-grant-tables  ,保存关闭.(win10默认安装路径:C:\ProgramData\MySQL\MySQL Server 5.7) 2.重启 ...

  9. 从零学React Native之06flexbox布局

    前面我们接触了好多React Native代码, 并没有介绍RN中的组件具体是如何布局的,这一篇文章,重点介绍下flexbox布局. 什么是flexbox布局 React中引入了flexbox概念,f ...

  10. 从零学React Native之01创建第一个程序

    本篇首发于简书 欢迎关注 上一篇文章是时候了解React Native了介绍了React Native.大家应该对React Native有个初步的认识. 接下来我们就可以初始化一个React Nat ...