统计
  • 建站日期:2021-03-10
  • 文章总数:114 篇
  • 评论总数:0 条
  • 分类总数:12 个
  • 最后更新:4月29日
文章 渗透测试

某金融app的加解密hook+rpc+绕过SSLPinning抓包

自由子
首页 渗透测试 正文

0x01 抓包

1.1 burp抓包测试(抓不到)


某金融app的加解密hook+rpc+绕过SSLPinning抓包
-纵横安全网-渗透测试-软件开发-前端开发-PHP全栈
-第1
张图片

1.2 httpcanary

HttpCanary可以抓到包,可以看到有请求包有加密。可以看到报文有显著的特征:params


某金融app的加解密hook+rpc+绕过SSLPinning抓包
-纵横安全网-渗透测试-软件开发-前端开发-PHP全栈
-第2
张图片

0x02 代码分析

直接将app拖到Jadx-gui中,可以看到没有加壳:


某金融app的加解密hook+rpc+绕过SSLPinning抓包
-纵横安全网-渗透测试-软件开发-前端开发-PHP全栈
-第3
张图片

然后搜索报文中的:“params”,然后定位到了加解密的地方,有报文的参数进行搜索,找加解密还是比较快的。


某金融app的加解密hook+rpc+绕过SSLPinning抓包
-纵横安全网-渗透测试-软件开发-前端开发-PHP全栈
-第4
张图片

下面是加解密的核心代码:


某金融app的加解密hook+rpc+绕过SSLPinning抓包
-纵横安全网-渗透测试-软件开发-前端开发-PHP全栈
-第5
张图片

小tips:jadx-gui中,可以在类或方法名称上右键——复制为frida片段,便可以自动生成frida hook代码了。


某金融app的加解密hook+rpc+绕过SSLPinning抓包
-纵横安全网-渗透测试-软件开发-前端开发-PHP全栈
-第6
张图片

使用objection对加密和解密的方法进行验证:

android hooking watch class_methon [方法的完整路径] --dump-args --dump-backtrace --dump-return

通过hook的结果,可以判断该处代码就是报文的加解密代码。


某金融app的加解密hook+rpc+绕过SSLPinning抓包
-纵横安全网-渗透测试-软件开发-前端开发-PHP全栈
-第7
张图片

某金融app的加解密hook+rpc+绕过SSLPinning抓包
-纵横安全网-渗透测试-软件开发-前端开发-PHP全栈
-第8
张图片

0x03 编写hook+rpc代码

aaa.js

function main(){
    Java.perform(function(){ console.log("正在注入") var data = Java.use('com.xxxx.http.HttpEncrypt');
        data.encryptParams.implementation = function(json,signdata){ console.log("===========================加密算法==========================");
            send(json.toString());//因为是json类型数据,所以需要转换为string类型,否则转发不到burp var tmp; var op = recv('send',function (value) {
                tmp = value.payload; console.log("请求篡改后----->: ", tmp); return tmp;               
            });
            op.wait(); return this.encryptParams(tmp,signdata);
        } var shuju = Java.use('com.xxxx.http.HttpEncrypt');
        data.decryptReponse.implementation = function(content,i){ console.log("==========================解密算法=============================="); var ret = this.decryptReponse(content,i);
            send(ret); var tmp; var op = recv('send',function (value) {
                tmp = value.payload; console.log("请求篡改后----->: ", tmp); return tmp;

            });
            op.wait(); return tmp;
        }
    });
}
setTimeout(main,5000);

启动handle_server.py


某金融app的加解密hook+rpc+绕过SSLPinning抓包
-纵横安全网-渗透测试-软件开发-前端开发-PHP全栈
-第9
张图片
from http.server import HTTPServer, BaseHTTPRequestHandler class RequestHandler(BaseHTTPRequestHandler): def do_GET(self):
        print('Recving request connction...')
        request_headers = self.headers
        content_length = request_headers.get('content-length')
        length = int(content_length[0]) if content_length else 0 print(self.headers) self.send_response(200) self.end_headers() self._send_cors_headers() self.wfile.write(self.rfile.read(length)) def do_POST(self):
        print('Recving request connction...')
        req_datas = self.rfile.read(int(self.headers['content-length'])) # print(self.headers) # print(req_datas) self.send_response(200) self._send_cors_headers() self.end_headers() self.wfile.write(req_datas) def _send_cors_headers(self): self.send_header('Content-type', 'application/json') self.send_header("Access-Control-Allow-Origin", "*") self.send_header("Access-Control-Allow-Methods", "*") self.send_header("Access-Control-Allow-Headers", "Authorization, Content-Type") def do_OPTIONS(self): self.send_response(200) self._send_cors_headers() self.end_headers() def main(ECHO_PORT):
    print('Listening on localhost: %d' % ECHO_PORT)
    server = HTTPServer(('127.0.0.1', ECHO_PORT), RequestHandler)
    server.serve_forever() if __name__ == '__main__':
    main(8889)

burp监听127.0.0.1:8888端口


某金融app的加解密hook+rpc+绕过SSLPinning抓包
-纵横安全网-渗透测试-软件开发-前端开发-PHP全栈
-第10
张图片

然后使用adb转发端口:

adb forward tcp:27042 tcp:27042

某金融app的加解密hook+rpc+绕过SSLPinning抓包
-纵横安全网-渗透测试-软件开发-前端开发-PHP全栈
-第11
张图片

启动toBurp.py

启动前需要修改里面的一些内容:

'''
python toBurp.py
中转至burp,动态修改请求

''' import os import time import sys import frida import requests import json def on_message(message, data): if isinstance(message, dict): if message['type'] == 'send':
            payload = message['payload'] if '{' in payload:
                data = toburp(message["payload"].encode('utf-8'))
                data = {'type': 'send', 'payload': data}
                script.post(data) #script.post({'type': 'send', 'payload': json.loads(data)}) elif message['type'] == 'error':
            print(message['stack']) else: if message.has_key("payload"):
            print(message["payload"]) #获取设备应用名 def get_application_name(device, identifier): for p in device.enumerate_applications(): if p.identifier == identifier: return p.name # 中转到burp def toburp(data): proxies = {'http':'http://127.0.0.1:8888'}
    url = 'http://127.0.0.1:8889/Hook' response=requests.post(url,data=data,proxies=proxies) return(response.text) def main(): #连接设备 device = frida.get_remote_device() #需要attach的apk包名 pid = device.spawn('com.xxxx.xxxx') #修改为包名 try: #attach目标进程 session = device.attach(pid)
        device.resume(pid) #加载javaScript脚本 # 修改此处: aaa.js为hook脚本 script_content = open("aaa.js",encoding='utf-8').read() global script
        script = session.create_script(script_content)
        script.on("message", on_message)
        script.load()
        sys.stdin.read() except KeyboardInterrupt as e: if session is not None:
            session.detach()
            device.kill(pid)
        sys.exit(0) if __name__ == "__main__":
    main()

这是burp可以接收到参数,但是提交的时候会失败,就是提交到服务器,服务器并不认识。


某金融app的加解密hook+rpc+绕过SSLPinning抓包
-纵横安全网-渗透测试-软件开发-前端开发-PHP全栈
-第12
张图片

通过下图可以看到,参数是被正常打印出来了,但是提示重载,后来我写了重载也是不行。


某金融app的加解密hook+rpc+绕过SSLPinning抓包
-纵横安全网-渗透测试-软件开发-前端开发-PHP全栈
-第13
张图片

仔细分析了一波后得出结论:

加密代码没有其他参数类型的方法了,只有

public final String encryptParams(JSONObject json, String signData)这一个。

而我们在将JSONObject json发送到burp的时候,将JSONObject json类型转换为了String,导致调用encryptParams方法进行加密的时候,JSONObject json这个参数转换为了string类型的,所以匹配不到,故提示要重载。

所以我们还需要将String类型的数据转换为Json类型。

我自己尝试了几种方法,都不行:

第一种:

var ret = JSON.stringify(tmp);

第二种:

function strToJson(str){ var json = eval('(' + str + ')'); return json;

}

后来找了许多资料没有找到好办法,于是乎~~~~人工智能

在这里我就不得不表扬一下ai同学了:


某金融app的加解密hook+rpc+绕过SSLPinning抓包
-纵横安全网-渗透测试-软件开发-前端开发-PHP全栈
-第14
张图片

某金融app的加解密hook+rpc+绕过SSLPinning抓包
-纵横安全网-渗透测试-软件开发-前端开发-PHP全栈
-第15
张图片

最終修改后的js代码:

function main(){
    Java.perform(function(){ console.log("正在注入") var data = Java.use('com.xxxx.http.HttpEncrypt');
        data.encryptParams.implementation = function(json,signdata){ console.log("===========================加密算法==========================");
            send(json.toString());//因为是json类型数据,所以需要转换为string类型,否则转发不到burp var tmp; var op = recv('send',function (value) {
                tmp = value.payload; console.log("请求篡改后----->: ", tmp); return tmp;               
            });
            op.wait(); return this.encryptParams(tmp,signdata);
        } var shuju = Java.use('com.xxxx.HttpEncrypt');
        data.decryptReponse.implementation = function(content,i){ console.log("==========================解密算法=============================="); var ret = this.decryptReponse(content,i);
            send(ret); var tmp; var op = recv('send',function (value) {
                tmp = value.payload; console.log("请求篡改后----->: ", tmp); return tmp;

            });
            op.wait(); return tmp;
        }
    });
}
setTimeout(main,5000);

修改好代码后,重新运行,burp也能够抓到包了。


某金融app的加解密hook+rpc+绕过SSLPinning抓包
-纵横安全网-渗透测试-软件开发-前端开发-PHP全栈
-第16
张图片

某金融app的加解密hook+rpc+绕过SSLPinning抓包
-纵横安全网-渗透测试-软件开发-前端开发-PHP全栈
-第17
张图片

通过测试发现,加解密的报文只是针对登录、点击功能按钮跳转时生成token等生效,经过测试,没发现什么漏洞,而内部页面其实还是h5,还是需要用传统的抓包方式进行测试。

0x04 app内部H5抓包

由于刚开始测试了burp是抓不到包的,而httpcanary使用起来又不方便,所以尝试使用charles。charles抓包的时候app显示无法连接到服务器,charles提示证书的问题,怀疑可能是SSLPinning,使用抓包工具抓包时,抓包工具拦截了服务端返回的内容并重新发给客户端的时候的证书不是服务器端原来的证书了,抓包工具将原本服务器的证书替换成自己的证书,于是就构成了中间人攻击,触发SSL Pinning导致连接中断,所以就抓不到包了。尝试使用objection的SSL Pinning disable进行绕过。


某金融app的加解密hook+rpc+绕过SSLPinning抓包
-纵横安全网-渗透测试-软件开发-前端开发-PHP全栈
-第18
张图片

某金融app的加解密hook+rpc+绕过SSLPinning抓包
-纵横安全网-渗透测试-软件开发-前端开发-PHP全栈
-第19
张图片

启动objection并注入app,输入命令:

android sslpinning disable

某金融app的加解密hook+rpc+绕过SSLPinning抓包
-纵横安全网-渗透测试-软件开发-前端开发-PHP全栈
-第20
张图片

某金融app的加解密hook+rpc+绕过SSLPinning抓包
-纵横安全网-渗透测试-软件开发-前端开发-PHP全栈
-第21
张图片

运行命令后,charles也成功抓到包了,而且没有加密,就很nice。


某金融app的加解密hook+rpc+绕过SSLPinning抓包
-纵横安全网-渗透测试-软件开发-前端开发-PHP全栈
-第22
张图片

但是问题来了,charles改包、重放啥的不是很方便,所以联动一下burp。

0x05 charles联动burp

5.1 charles设置

Proxy-——External Proxy Settings

将Web Proxy和Secure Web Proxy均设置为127.0.0.1:8080


某金融app的加解密hook+rpc+绕过SSLPinning抓包
-纵横安全网-渗透测试-软件开发-前端开发-PHP全栈
-第23
张图片

5.2 burp设置


某金融app的加解密hook+rpc+绕过SSLPinning抓包
-纵横安全网-渗透测试-软件开发-前端开发-PHP全栈
-第24
张图片

5.3 成功转发

这样手机代理连接charles,charles转发到burp,就实现使用burp的抓包改包操作了。


某金融app的加解密hook+rpc+绕过SSLPinning抓包
-纵横安全网-渗透测试-软件开发-前端开发-PHP全栈
-第25
张图片

这个app权限限制的很死,没找到越权类的漏洞,代码也很规范,最后只找到几个中低危的洞。放一个文件上传的洞吧:


某金融app的加解密hook+rpc+绕过SSLPinning抓包
-纵横安全网-渗透测试-软件开发-前端开发-PHP全栈
-第26
张图片

通过修改MIME类型,可以突破文件上传。


某金融app的加解密hook+rpc+绕过SSLPinning抓包
-纵横安全网-渗透测试-软件开发-前端开发-PHP全栈
-第27
张图片

自评TCV:1


扫描二维码,在手机上阅读

版权说明
文章采用: 《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权。
版权声明:未标注转载均为本站原创,转载时请以链接形式注明文章出处。如有侵权、不妥之处,请联系站长删除。敬请谅解!

-- 展开阅读全文 --
对一次博彩站点的渗透测试
« 上一篇
挖掘犯罪链条中的URL跳转
下一篇 »
为了防止灌水评论,登录后即可评论!

HI ! 请登录
注册会员,享受下载全站资源特权。

最新评论

标签