FridaHook(三)——AllSafe App wp

By ruanruan,2022/04/21

文章目录

      • 1、不安全的日志记录
      • 2、硬编码
      • 3、pin绕过
        • (1)反编译查看方法判断逻辑
        • (2)hook方法
          • A、Hook areEqual(Object,Object)
          • B、Hook checkPin(a)
        • (3)页面效果
        • (4)踩坑
      • 4、root检测绕过
        • (1)反编译查看
        • (2)hook方法
        • (3)绕过效果
      • 5、Secureflag绕过
        • (1)查看相关代码
        • (2)Hook脚本
        • (3)hook效果
      • 6、Deeplink利用
        • (1)查看漏洞代码
        • (2)漏洞利用
          • A、访问html文件
          • B、使用adb构造intent
      • 7、Webview利用
        • (1)查看漏洞代码
        • (2)漏洞利用
          • A、任务一:弹窗
          • B、任务二:访问一个本地文件,如/etc/hosts
      • 8、证书绕过
        • (1)hook脚本
        • (2)hook结果
        • (3)踩坑
      • 9、脆弱的加密
        • (1)反编译查看
        • (2)hook加密函数
          • A、AES
          • B、MD5
          • C、Random
      • 10、本地动态链接库
        • (1)反编译查看
        • (2)so文件查看检测函数代码
        • (3)hook方法
        • (4)hook结果
        • (5)踩坑

1、不安全的日志记录

任务:在日志中找到key

命令查看日志中是否包含输入的key

adb logcat 

在这里插入图片描述

2、硬编码

任务:查找硬编码user:password

查找到superadmin:supersecurepassword

在这里插入图片描述

3、pin绕过

任务:绕过pin检测

其实可以对NDg2Mw==,直接解码得4863

(1)反编译查看方法判断逻辑

在这里插入图片描述

查找areEqual方法,如下

在这里插入图片描述

(2)hook方法
A、Hook areEqual(Object,Object)

先是去hook了kotlin.jvm.internal.Intrinsics类的重载方法,通过传的first参数数据类型为String可知,调用的是

在这里插入图片描述

搜索Equal函数,是返回true or false

那么修改返回为true就行

js:

function hookChongZai(){var utils = Java.use("kotlin.jvm.internal.Intrinsics");utils.areEqual.overload('java.lang.Object', 'java.lang.Object').implementation = function(a,b){console.log(a,b);a = "2022";b = "2022";console.log(a,b);var ret = true;return ret;}
}function main(){Java.perform(function(){hookChongZai();})
}setImmediate(main);

输出:

在这里插入图片描述

页面显示

B、Hook checkPin(a)

在这里插入图片描述
修改返回值,只要return true就行

js:

function hookpin(){console.log("script running .....")var utils = Java.use("infosecadventures.allsafe.challenges.PinBypass");console.log("test\n");utils.checkPin.implementation = function(a){console.log(a);a = "2022";console.log(a);var ret = true;console.log(a,ret);return ret;}
}function main(){Java.perform(function(){hookpin();})
}setImmediate(main);

在这里插入图片描述

(3)页面效果

输入任意四位数,显示输入正确

在这里插入图片描述

(4)踩坑
  • overload(‘java.lang.Object’, ‘java.lang.Object’)

    小结:

    		.overload('double', 'java.lang.Double').overload('float', 'java.lang.Float').overload('java.lang.Double', 'double').overload('java.lang.Double', 'java.lang.Double').overload('java.lang.Float', 'float').overload('java.lang.Float', 'java.lang.Float').overload('java.lang.Object', 'java.lang.Object')
    
  • 将返回设置成字符串true了,即var ret = “true”;

    为变量赋值Boolean类型值的例子:

    var found = true;
    var lost = false;
    

    需要注意的是Boolean类型的字面值true和false是区分大小写的。

4、root检测绕过

任务:绕过root检测

(1)反编译查看

首先查看infosecadventures.allsafe.challenges.RootDetection,找了找没有啥判断逻辑

在这里插入图片描述

再查看infosecadventures.allsafe.challenges.RootDetection$onCreateView$1的检测逻辑

在这里插入图片描述

全局搜索isRooted方法,如图可知是布尔类型的返回结果。

在这里插入图片描述

(2)hook方法

js:

function hookroot(){console.log("script running .....")var utils = Java.use("com.scottyab.rootbeer.RootBeer");console.log("test\n");utils.isRooted.implementation = function(){var ret = false;console.log(ret);return ret;}
}function main(){Java.perform(function(){hookroot();})
}setImmediate(main);
(3)绕过效果

原始页面:
在这里插入图片描述

绕过页面:

在这里插入图片描述

5、Secureflag绕过

任务:绕过禁止截屏限制

(1)查看相关代码

找到禁止截屏函数

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

在这里插入图片描述

然后查看setFlags

在这里插入图片描述

(2)Hook脚本
function hookflag(){console.log("script running .....")var utils = Java.use("androidx.recyclerview.widget.RecyclerView");console.log("test\n");utils.setFlags.implementation = function(a,b){console.log(a,b);a = 11;b = 11console.log(a,b);var ret = this.setFlags(a,b);console.log(ret);}
}function main(){Java.perform(function(){hookflag();})
}setImmediate(main);
(3)hook效果

在这里插入图片描述

思路是改setFlags的值,我看最开始输出是0,12,就给改成11,效果是黑屏卡住了 ==

找到对的值就ok

6、Deeplink利用

任务:尝试触发deeplink

(1)查看漏洞代码

先找到对应的Activity

在这里插入图片描述

再跟进 找到getintent()函数,看如何赋值的

在这里插入图片描述

可知参数data即为intent的值,以及对data的判断条件为和key的值相等则完成任务。

(2)漏洞利用

找到key的值如下

在这里插入图片描述

此时就应该构造intent为2131820617

A、访问html文件

在这里插入图片描述

可以看到action为null

但是从AndroidManifest.xml可以看到intent-filter为当Action为android.intent.action.VIEW可调用

在这里插入图片描述

构造html文件如下

<html><head><h1>deeplinktest</h1><head>
<body>
<a href="intent:#Intent;package=infosecadventures.allsafe;component=infosecadventures.allsafe/infosecadventures.allsafe.challenges.DeepLinkTask;action=android.intent.action.VIEW;data=2131820617;end">test</a>
</body>
</html>

但是 data的值好像传失败了==

B、使用adb构造intent
adb shell am start -n "infosecadventures.allsafe/infosecadventures.allsafe.challenges.DeepLinkTask" 2131820617adb shell am start -n "infosecadventures.allsafe/infosecadventures.allsafe.challenges.DeepLinkTask" -d "2131820617"

在这里插入图片描述

利用成功页面:

在这里插入图片描述

7、Webview利用

任务一:弹窗

任务二:访问一个本地文件,如/etc/host

(1)查看漏洞代码

在这里插入图片描述

漏洞条件:

  • setAllowFileAccess(true) (默认开启)

  • setJavaScriptEnabled(true)

  • WebView可以被外部调用,并能够加载外部可控的HTML文件

    都满足,对传进来的url参数没有任何处理过滤,直接使用loadurl()加载

(2)漏洞利用
A、任务一:弹窗

利用JavaScript伪协议进行弹窗

在这里插入图片描述

B、任务二:访问一个本地文件,如/etc/hosts

在这里插入图片描述

8、证书绕过

任务:拦截流量,绕过证书校验

(1)hook脚本

网上的通用脚本:

/* Android SSL Re-pinning frida script v0.2 030417-pier
$ adb push burpca-cert-der.crt /data/local/tmp/cert-der.crt$ frida -U -f it.app.mobile -l frida-android-repinning.js --no-pause
https://techblog.mediaservice.net/2017/07/universal-android-ssl-pinning-bypass-with-frida/UPDATE 20191605: Fixed undeclared var. Thanks to @oleavr and @ehsanpc9999 !
*/setTimeout(function(){Java.perform(function (){console.log("");console.log("[.] Cert Pinning Bypass/Re-Pinning");
var CertificateFactory = Java.use("java.security.cert.CertificateFactory");var FileInputStream = Java.use("java.io.FileInputStream");var BufferedInputStream = Java.use("java.io.BufferedInputStream");var X509Certificate = Java.use("java.security.cert.X509Certificate");var KeyStore = Java.use("java.security.KeyStore");var TrustManagerFactory = Java.use("javax.net.ssl.TrustManagerFactory");var SSLContext = Java.use("javax.net.ssl.SSLContext");
// Load CAs from an InputStreamconsole.log("[+] Loading our CA...")var cf = CertificateFactory.getInstance("X.509");try {var fileInputStream = FileInputStream.$new("/data/local/tmp/cert-der.crt");}catch(err) {console.log("[o] " + err);}var bufferedInputStream = BufferedInputStream.$new(fileInputStream);var ca = cf.generateCertificate(bufferedInputStream);bufferedInputStream.close();
var certInfo = Java.cast(ca, X509Certificate);console.log("[o] Our CA Info: " + certInfo.getSubjectDN());
// Create a KeyStore containing our trusted CAsconsole.log("[+] Creating a KeyStore for our CA...");var keyStoreType = KeyStore.getDefaultType();var keyStore = KeyStore.getInstance(keyStoreType);keyStore.load(null, null);keyStore.setCertificateEntry("ca", ca);// Create a TrustManager that trusts the CAs in our KeyStoreconsole.log("[+] Creating a TrustManager that trusts the CA in our KeyStore...");var tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();var tmf = TrustManagerFactory.getInstance(tmfAlgorithm);tmf.init(keyStore);console.log("[+] Our TrustManager is ready...");
console.log("[+] Hijacking SSLContext methods now...")console.log("[-] Waiting for the app to invoke SSLContext.init()...")
SSLContext.init.overload("[Ljavax.net.ssl.KeyManager;", "[Ljavax.net.ssl.TrustManager;", "java.security.SecureRandom").implementation = function(a,b,c) {console.log("[o] App invoked javax.net.ssl.SSLContext.init...");SSLContext.init.overload("[Ljavax.net.ssl.KeyManager;", "[Ljavax.net.ssl.TrustManager;", "java.security.SecureRandom").call(this, a, tmf.getTrustManagers(), c);console.log("[+] SSLContext initialized with our custom TrustManager!");}});
},0);
(2)hook结果

在这里插入图片描述

成功抓包:

在这里插入图片描述

(3)踩坑

看着是证书的问题,百度了一下需要系统信任burp证书

在这里插入图片描述

可是系统已经信任证书了

在这里插入图片描述

最后是替换了最新的证书解决的

9、脆弱的加密

任务:使用frida hook加密的方法

(1)反编译查看

在这里插入图片描述

(2)hook加密函数
A、AES

直接输出参数1,再篡改为参数2并对其加密

js:

function hookcrypto(){console.log("script running .....")var utils = Java.use("infosecadventures.allsafe.challenges.WeakCryptography");console.log("test\n");utils.encrypt.implementation = function(a){console.log(a);a = "quan";console.log(a);var ret = this.encrypt(a);console.log(ret);return "The AES encrypto Result of " + a +":" + ret;}
}function main(){Java.perform(function(){hookcrypto();})
}setImmediate(main);

hook输出:

在这里插入图片描述

页面效果:

在这里插入图片描述

B、MD5

直接输出参数1,再篡改为参数2并对其加密

hook.js:

function hookcrypto(){console.log("script running .....")var utils = Java.use("infosecadventures.allsafe.challenges.WeakCryptography");console.log("test\n");utils.md5Hash.implementation = function(a){console.log(a);a = "quan";console.log(a);var ret = this.md5Hash(a);console.log(ret);return "The MD5 Result of " + a +":" + ret;}
}function main(){Java.perform(function(){hookcrypto();})
}setImmediate(main);

hook输出:

在这里插入图片描述

页面效果:

在这里插入图片描述

C、Random

把随机数修改为固定值:111111

js:

function hookcrypto(){console.log("script running .....")var utils = Java.use("infosecadventures.allsafe.challenges.WeakCryptography");console.log("test\n");utils.randomNumber.implementation = function(a){console.log(a);var ret = 111111;console.log(ret);return "The static data is : " + ret;}
}function main(){Java.perform(function(){hookcrypto();})
}setImmediate(main);

hook输出:

在这里插入图片描述

页面效果:

在这里插入图片描述

10、本地动态链接库

任务:使用frida hook密码检测的方法

(1)反编译查看
apktool.bat d 202204061604031.apk

在这里插入图片描述

可知检测密码的函数在native层,不能直接hook

(2)so文件查看检测函数代码

用Ghidra打开分析libnative_library.so文件,找到Java_infosecadventures_allsafe_challenges_NativeLibrary_checkPassword函数

在这里插入图片描述

查看checkPass

在这里插入图片描述

hook Java_infosecadventures_allsafe_challenges_NativeLibrary_checkPassword函数即可

void Java_infosecadventures_allsafe_challenges_NativeLibrary_checkPassword(_JNIEnv *param_1,undefined8 param_2,_jstring *param_3){checkPass(param_1,param_3);return;
}

由代码可知该函数没有返回,但是要让if (NativeLibrary.access$checkPassword(nativeLibrary, editText2.getText().toString()))成立,那么条件即为true

(3)hook方法

js:

Java.perform(function(){ var nativePointer = Module.findExportByName("libnative_library.so", "Java_infosecadventures_allsafe_challenges_NativeLibrary_checkPassword"); send("native: " + nativePointer); Interceptor.attach(nativePointer, { onEnter: function(args){ send(args[0].toInt32()); send(args[1].toInt32()); send(args[2].toInt32()); //send(args[3].toInt32()); //send(args[4].toInt32()); }, onLeave: function(retval){ send("original check result: " + retval.toInt32()); retval.replace(1);send("final check result: " + retval.toInt32());} });
});
(4)hook结果

在这里插入图片描述

页面:

在这里插入图片描述

(5)踩坑

最开始设的retval为true,当成布尔型了

onLeave: function(retval){ send("original check result: " + retval.toInt32()); var ret = true;retval.replace(ret);send("final check result: " + retval.toInt32());

然后报错

在这里插入图片描述

定位到retval.replace(ret);代码

想了想if(a),a只要不是null就行,令它为1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/342214.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++程序员必备的面试技巧

“程序员必备的面试技巧&#xff0c;就像是编写一段完美的代码一样重要。在面试战场上&#xff0c;我们需要像忍者一样灵活&#xff0c;像侦探一样聪明&#xff0c;还要像无敌铁金刚一样坚定。只有掌握了这些技巧&#xff0c;我们才能在面试的舞台上闪耀光芒&#xff0c;成为那…

Window平台安装MongoDB

在部署前需要在官网先确定系统对应的Mongo DB版本。 本机电脑为Window10&#xff0c;所以这里以MongoDB 6.0版本。 1 在官网下载安装包 2 安装MongoDB MongoDB Compass 是一个图形界面管理工具&#xff0c;如果勾选了安装会花费长一点时间&#xff0c;可以取消掉勾选&#xff…

代码随想录算法训练营Day17|110.平衡二叉树、257. 二叉树的所有路径、 404.左叶子之和

文章目录 一、110.平衡二叉树1.递归法 二、257. 二叉树的所有路径1. 递归法 三、 404.左叶子之和1.迭代法 一、110.平衡二叉树 题目描述&#xff1a; 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a;一个二…

MidTool的AIGC与NFT的结合-艺术创作和版权保护的革新

在数字艺术和区块链技术的交汇点上&#xff0c;NFT&#xff08;非同质化代币&#xff09;正以其独特的方式重塑艺术品的收藏与交易。将MidTool&#xff08;https://www.aimidtool.com/&#xff09;的AIGC&#xff08;人工智能生成内容&#xff09;创作的图片转为NFT&#xff0c…

用通俗易懂的方式讲解大模型分布式训练并行技术:序列并行

近年来&#xff0c;随着Transformer、MOE架构的提出&#xff0c;使得深度学习模型轻松突破上万亿规模参数&#xff0c;传统的单机单卡模式已经无法满足超大模型进行训练的要求。因此&#xff0c;我们需要基于单机多卡、甚至是多机多卡进行分布式大模型的训练。 而利用AI集群&a…

【2023年度总结与2024展望】---23年故事不长,且听我来讲

文章目录 前言一、学习方面1.1 攥写博客1.2 学习内容1.3 参加比赛获得证书 二、生活方面2.1写周报记录生活 三、运动方面四、CSDN的鼓励五、24年展望总结 前言 时光飞逝&#xff0c;又是新的一年&#xff0c;遥想去年2023年我也同样在这个时间段参加了CSDN举办的年度总结活动&a…

慢 SQL 的优化思路

分析慢 SQL 如何定位慢 SQL 呢&#xff1f; 可以通过 slow log 来查看慢SQL&#xff0c;默认的情况下&#xff0c;MySQL 数据库是不开启慢查询日志&#xff08;slow query log&#xff09;。所以我们需要手动把它打开。 查看下慢查询日志配置&#xff0c;我们可以使用 show …

【算法Hot100系列】外观数列

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

OpenHarmony4.0Release系统应用常见问题FAQ

前言 自OpenHarmony4.0Release发布之后&#xff0c;许多小伙伴使用了配套的系统应用源码以及IDE作为基线开发&#xff0c;也遇到了各种各样的问题&#xff0c;这篇文档主要收录了比较常见的一些问题解答。 FAQ 系统应用源码在哪 目前OpenHarmony系统应用分为3种模式&#x…

DIFFWAVE: A VERSATILE DIFFUSION MODEL FOR AUDIO SYNTHESIS (Paper reading)

DIFFWAVE: A VERSATILE DIFFUSION MODEL FOR AUDIO SYNTHESIS Zhifeng Kong, Computer Science and Engineering, UCSD, ICLR2021, Code, Paper 1. 前言 在这项工作中&#xff0c;我们提出了DiffWave&#xff0c;这是一种用于条件和无条件波形生成的多功能扩散概率模型。该模…

全志V853开发板硬件开发用户入门指南

本章节将介绍V853开发板上各模块的基础使用方法。 V853开发板集成了LED、WiFi、蓝牙、以太网、音频、屏幕、USB、TF卡等模块。本章节将对这些模块进行简单的操作介绍&#xff0c;方便开发者快速上手了解开发板。 *注&#xff1a; 本文中 rootTinaLinux:~# 开头的命令是在开发…

初识C语言·内存函数

1 memcpy的使用和模拟实现 紧接字符串函数&#xff0c;出场的是第一个内存函数memcpy。前面讲的字符串函数是专门干关于字符串的事的&#xff0c;而这个函数可以干strcpy一样的事&#xff0c;但是区别就是它碰到\0也会继续复制。 函数的头文件是string&#xff0c;返回类型是v…