无校验直接抓:

burp + wifi改手动代理/shadowrocket(clash)
charles + burp
stream直接抓包(IOS)

https

如果有些https,在设置了好各种证书和配置后,看到的:要么是unknown,要么是加密的乱码,要么是报错无法抓包。无法看到希望的明文数据,最大可能是,对方用了https的SSL pinning

注:接口显示: Method: CONNECT
CONNECT 含义: HTTP 8种Method中的一种
作用:HTTP /1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于 SSL 加密服务器的链接(经由非加密的 HTTP 代理服务器,并非所有的 http 隧道支持 connect 方法
Http 隧道分为两种:不使用 CONNECT 的隧道 和 使用 CONNECT 的隧道
Http CONNECT 相当于客户端和服务器之间建立的一个隧道,而通过这个隧道的请求是加密的,所以 CONNECT 方式的请求使用抓包是抓不到,是无法查看 https 的原文,明文的信息的

SSL pinning

SSL pinning=证书绑定=SSL证书绑定
对方的app内部只承认自己的特定的证书,此处Charles的证书不识别,不允许,导致 Charles 无法解密看到 https 的明文数据

相关解决思路和方案:

  • 作为app的开发者:改自己app的配置,允许 https 抓包 (前提是得到或本身有 app 的源码)

  • 绕开 https 不去校验:

    借助于其他(JustTrustMe等)工具绕开 https 的校验 (需要借助其他 XPosed 等框架配合才可以)

修改app增加配置,允许https抓包

通过修改 app 的配置,使得允许 https 抓包。修改 app 的配置分两种:

自己有源码:可以通过修改源码的方式去添加允许 https 抓包的配置
自己没源码,只有 apk:借助第三方工具修改 apk,增加配置,允许 https 抓包
比如借助第三方工具:https://github.com/levyitay/AddSecurityExceptionAndroid

1
2
cd AddSecurityExceptionAndroid
./addSecurityExceptions.sh ../xxx.apk

即可给 apk 增加允许 https 抓包的配置了,然后就可以继续用Charles抓包https

绕过ssl pinning

绕开/禁止 SSL pinning 的插件
Android(root)
Xposed / Ldposed + JustTrustMe

iOS
shadowrocket全局代理
越狱 cydia + ssl-kill-switch3
免越狱 Sideloadly(自签软件)注入dylib到ipa包中

即可绕开ssl的验证,抓包到https被解密变成明文的数据

双向认证

双向认证,服务端会校验客户端(也就是我们的app)的证书,客户端也会校验服务端的证书

双向证书校验要破解有: 1.证书密码 2.cer或者p12证书

方法一:

因为 APP 能正常跟服务端通信,所以真正的证书肯定是在 APP 里面。所以就是要想办法从 APP 里抠出证书。
抠证书有开源的 Frida Hook 脚本。如下地址是开源作者写的 Frida Hook 脚本 https://gist.github.com/ceres-c/cb3b69e53713d5ad9cf6aac9b8e895d2gfgg。可以把证书从内存里读出来保存到本地,并且证书密码也能读出来

该脚本的原理是: 因为 APP 在向服务端发请求时, APP 肯定会操作证书,所以如果能找到 APP 操作证书的代码地方, Hook 这部分代码,对参数做些输出打印,证书和证书密码就都有了

大部分情况下,我们不用非常熟悉安卓原理,比如安卓在代码层面是如何操作证书的。查阅资料可以知道,安卓操作证书通常是 java.security.KeyStore 这个类,然后再了解下这个类的用法,参数形式,就可以尝试去Hook了。上述脚本就是 Hook java.security.KeyStore 这个类的 load 方法,load 方法的形参就是我们需要的证书和密码。 抠出的证书和密码,配置进 fiddler 或 charles 里面,就可以抓到双向认证的包
PS: 还要注意证书的格式,抠出的证书可能是 jks 或 bks 格式的,fiddler 可能需要 p12 格式的, 所以要找工具先转换一下格式

方法二:

如果只是想抓包,还有另一种不需要抠证书的方法

虽然 https 在传输过程中是加密的,但在终端显示的时候,必然会解密,不然 APP 上都没法显示了。所以如果能知道安卓解密 SSL 加解密是哪个类, Hook 这个类, 类里相关方法的输入输出肯定就是传输的明文数据。所以可以查阅资料,看看相关类的用法,就可以尝试去 Hook 打印输出看看情况。

也有开源作者开源了该 Hook 脚本, 比如 5alt 在google开源的脚本基础上做了修改了的 ssl_logger https://github.com/5alt/ssl_logger 能够 Hook SSL 加解密的地方,它会把传输的数据保存为 pcap 格式。再使用 wireshark 打开该 pcap文件, 在 wireshark 上就可以看到明文的数据了。

如果要模拟向服务器发送请求的话,还是只能使用第一种方法,因为客服端必须要提交正确的证书,服务端才会正确响应。必须得抠出证书,模拟请求时必须带上证书,才能请求到数据。安卓上的证书好多是 jks/bks格式的, 如果使用 Python requests 库的话, 不支持这个格式, 所以要想办法把证书转成 cert 格式的。

上面两种方法都是使用 Frida 进行 Hook ,所以要有 Root 过的手机和明白Frida 怎么使用就能搞定。 对于爬虫来说,搞定抓包和请求参数加密的问题,大部分 Hook ,都可以通过 Hook 安卓系统 API 来找到 APP 代码位置,或直接搞定

代理检测

检测到有代理退出或不发送请求
解决方法1(推荐):安卓root设备使用ProxyDroid/Drony代理软件可以绕过,ios使用shadowrocket全局代理或者用stream直接抓包
安卓设备设置全局代理:

1
adb shell settings put global http_proxy 127.0.0.1:1984

查看代理是否设置成功:

1
adb shell settings get global http_proxy

取消代理设置:

1
adb shell settings put global http_proxy :0

解决方法2:逆向找到检测代理的位置,修改程序逻辑(Patch程序,hook等)

网络协议

应用层:用户使用的应用程序都归属于应用层,抓包工具如fiddler、Charles,都只能抓应用层的协议
传输层:tcp、udp,用wireshark可以抓取
网络层:ip协议

Socket通信是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口,不是协议,fiddler/charles抓不到
pc版本的qq客户端也抓不到包,因为他没有用http协议,而是用的tcp协议

私有协议:这种不是通用的协议,wireshark能抓到,不知道协议细节,解不了包。需要分析APP协议解析部分
路由器抓包:网络组网方式,因为所有的流量都要从路由器过,使用特殊的路由器,可以进行路由器抓包

Frida

frida是一款基于python + javascript 的hook框架,可运行在android/ios/linux/win/osx等各平台,主要使用动态二进制插桩技术Dynamic Binary Instrumentation(DBI)
DBI做些什么呢
(1)访问进程的内存(2)在应用程序运行时覆盖一些功能(3)从导入的类中调用函数
(4)在堆上查找对象实例并使用这些对象实例(5)Hook,跟踪和拦截函数等等

mac:pip3 install frida-tools

1
2
adb forward tcp:1234 tcp:1234
frida -H 127.0.0.1:1234 -f com.cebbank.mpoinx -l 1.js

andriod/iOS:安装对应版本和架构的frida-server

1
./frida-server -l 0.0.0.0:1234

tcpdump

tcpdump是linux下的抓包工具,需手动下载安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 将tcpdump push到/data/local/目录
adb push tcpdump /data/local/
// 获取root权限
adb root
adb remount
// 进入/data/local目录
adb shell
cd /data/local


// 静态抓取
./tcpdump -i any -p -s 0 -w /sdcard/capture.pcap
// 退出adb shell
exit
// 将抓包文件拷贝出来
adb pull /sdcard/capture.pcap ~/Desktop

//动态抓取
tcpdump -n -s 0 -w - | nc -l -p 2015
//pc端执行
adb forward tcp:2015 tcp:2015
//在wireshark安装目录下cmd执行
ncat 127.0.0.1 2015 | wireshark -k -S -i -

AndriodKiller

https://github.com/MaskCyberSecurityTeam/AndroidKiller4J

image-20231215163416000

Smali文件

Android程序员用Java语言开发APP,编译工具会将Java源文件(.java)编译成Dalvik可执行文件(.dex)。Android系统中Dalvik Virtual Machine 会执行该文件。smali/baksmali则是Dalvik VM可执行文件的汇编器/反汇编器。反汇编Dalvik可执行文件(.dex)后,将会得到.smali后缀文件。smali代码拥有特定的语法。相比于.dex文件,smali文件的语法更容易理解些。下面是.dex文件、.smali文件、.java文件三者之间的转化关系

image-20230904144000155

adb

安卓调试桥 (Android Debug Bridge, adb),是一种可以用来操作手机设备或模拟器的命令行工具

可以使用 adb install [option] <path> 命令来将电脑上的一个 APP 安装到手机上

1
2
adb push foo.apk /sdcard/  #电脑传到手机
adb pull /sdcard/xxx.jpg #手机传到电脑

在Android中,除了从界面上启动程序之外,还可以从命令行启动程序,使用的是命令行工具am

启动的方法为adb shell am start -n {包(package)名}/{包名}.{活动(activity)名称}

Android 11无线调试

1
2
3
4
adb pair ip:port
adb connect ip:port-for-connect
adb devices -l
adb shell

appid、appkey、appsecret

AppID: 应用的唯一标识 AppKey: 公匙(相当于账号) AppSecret:私匙(相当于密码) token:令牌(过期失效)

app_id 是用来标记你的开发者账号的, 是你的用户id, 这个id在数据库添加检索, 方便快速查找

app_key 和 app_secret 是一对出现的账号, 同一个 app_id 可以对应多个 app_key+app_secret, 这样平台就可以分配不一样的权限。比如 app_key1 + app_secect1 只有只读权限 但是 app_key2+app_secret2 有读写权限,这样就可以把对应的权限放给不同的开发者。其中权限的配置都是直接跟app_key 做关联的, app_key 也需要添加数据库检索,方便快速查找

至于为什么要有app_key + app_secret 这种成对出现的机制呢, 因为要加密, 通常在首次验证(类似登录场景) , 需要用app_key(标记要申请的权限有哪些) + app_secret(密码, 表示你真的拥有这个权限) 来申请一个token, 就是我们经常用到的 access_token, 之后的数据请求直接提供access_token就可以验证权限了

简化的场景:

省去 app_id, 默认每一个用户有且仅有一套权限配置, 直接将 app_id = app_key , 然后外加一个app_secret就够了
省去app_id 和 app_key, 相当于 app_id = app_key = app_secret, 通常用于开放性接口的地方, 特别是很多地图类api 都采用这种模式, 这种模式下, 带上app_id 的目的仅仅是统计某一个用户调用接口的次数

appSecret是小程序的唯一凭证密钥,也是获取小程序全局唯一后台接口调用凭证(access_token)的重要参数。appSecret密钥泄露漏洞的危害包括但不限于:获取小程序用户访问数据、冒用小程序身份给用户发送客服消息/模板消息、获取小程序session_key(用于解密微信侧提供的用户敏感数据)、获取小程序运维信息、日志等敏感信息、更改小程序相关的配置等

https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

image-20230906105253673

实战app测试

逻辑漏洞为主:参数替换 修改返回包

反汇编/脱壳后源码中敏感信息泄漏(微信小程序secretkey/内网ip地址)

不安全的证书(未使用HTTPS证书绑定/客户端证书/越狱检测root检测)

不安全的本地文件存储

image-20230905110111063

Activity 劫持

线上环境未删除debug页面: adb shell进入adb,输入命令

1
am start com.xxx.xxx/com.xxx.xxx.home.ui.activity.debug.DebugSettingActivity

其他正常测