Android靶场All Safe 靶场WP

news/2024/5/4 10:24:07/文章来源:https://blog.csdn.net/qq_45414878/article/details/127538725

环境准备

ADB

DDMS

ALLsafe app

part 1 不安全的日志记录

挑战

在不反编译的情况下从日志中获取输入的密钥。

方法一

使用DDMS监控日志记录,工具在SDK/tools目录下的monitor.bat,需要java8的环境支持,java11会报错。

使用adb连接 测试机,出现以上进程即为成功,下半部就是日志输出页面。

image-20220712143148718

在app中输入密钥,再从日志中筛选记录,发现输入的密钥。

image-20220712144114837

方法二

使用adb logcat监控日志记录。

使用adb连接测试机后在电脑端开启监听,命令:adb logcat。成功发现泄漏的密钥。

image-20220712144727243

part 2 硬编码凭证

挑战

对app进行逆向,找到硬编码的账号密码。

在app中启动登陆请求,返回消息:“Under development!”,在jadx-gui中查找关键字,定位到利用类:

infosecadventures.allsafe.challenges.HardcodedCredentials$onCreateView$1,但 类中没有发现账号密码,查找调用该关键字所在类的用例。

image-20220712151442590

定位到只有 infosecadventures.allsafe.challenges.HardcodedCredentials 类调用了上一个类,

并在BODY字段中发现了硬编码的账号和密码:superadmin、supersecurepassword (好家伙藏的好不起眼)。

image-20220712152008860

part 3 PIN绕过

挑战

使用Frida进行hook或者爆破绕过4位数验证码登陆。

方法一

在jadx-gui中定位点击事件输出的提示消息,发现逻辑处理在 infosecadventures.allsafe.challenges.PinBypass$onCreateView$1类中,主要判断方法是 PinBypass类中的checkPin 方法。

image-20220712165142645

继续跟进,方法主要是拿用户输入的PIN值和Base64编码后得到的值(NDg2Mw==)进行比对,若比对成功则输出

“Access granted, good job!”,所以我们只要解密 NDg2Mw==就可得到需要的PIN值,解密后得到 4863 即为正确的PIN值。

image-20220712165638620

image-20220712165914968

方法二

使用frida hook PinBypass类和checkPin方法的返回值使其为true便可以绕过PIN比对输出成功的提示消息。

随便输入字符,如1111便可绕过。

image-20220712180649305

image-20220712180907597

part 4 Root检测绕过

挑战

使用frida绕过root检测(测试机已root)。

跟进点击事件提示消息定位到 infosecadventures.allsafe.challenges.RootDetection$onCreateView$1类中,查看逻辑处理主要是利用isRooted()方法检测是否root,也是布尔类型方法,hook返回值即可绕过,true为已经root,false为未root,我们需要hook达到输出未root的提示消息。

image-20220712183733951

image-20220712183110123

修改isRooted()方法的返回值为false。

setImmediate(function() {
Java.perform(function() {var targetClass='com.scottyab.rootbeer.RootBeer';var methodName='isRooted';var gclass = Java.use(targetClass);gclass[methodName].overload().implementation = function() {console.log('\nGDA[Hook isRooted()]'+'');var i=this[methodName]();console.log('\treturn '+i);return false;}
})
})

image-20220712183701201

part 5 Secure Flag Bypass

挑战

使用frida绕过截屏限制拿到密码。

这一题鼓捣了好久都没找到入口点,导师点了一句去看官方文档,然后在 https://developer.android.com/reference/android/view/WindowManager.LayoutParams#FLAG_SECURE 文档中发现了如果FLAG_SECURE标志值为8192时屏幕不能截屏,按提示找到主 MainActivity 函数代码,发现 getWindow().setFlags(8192, 8192),窗口已经被添加了不可截屏的标志值。

image-20220713111231104

image-20220713111256033

所以只要hook setFlags()方法使得两个参数值不都为8192即可绕过截屏限制。

//hook代码一
setImmediate(function() {
Java.perform(function() {var targetClass='android.view.Window';var methodName='setFlags';var gclass = Java.use(targetClass);gclass[methodName].overload('int','int').implementation = function(arg0,arg1) {console.log(arg0,arg1);var arg0=1var arg1=8192console.log('\nGDA[Hook setFlags(int,int)]'+'\n\targ0 = '+arg0+'\n\targ1 = '+arg1);var i=this[methodName](arg0,arg1);console.log('\treturn '+i);//return i;}
})
}) //hook代码二
setImmediate(function() {
Java.perform(function() {Java.use("android.view.Window").setFlags.implementation = function (flags, mask) {console.log(flags,mask);this.setFlags(flags & ~8192, mask);};})
}) 

image-20220713114048308

hook前

image-20220713113609651

hook后

image-20220713113548281

参考链接:

https://www.csdn.net/tags/NtzaIg1sNDQ4MC1ibG9n.html

https://blog.csdn.net/xxdw1992/article/details/102852751

https://blog.csdn.net/chifu5720/article/details/114259049

part 6 Deep Link Exploitation

挑战

通过传参触发深层链接(Deep Link)。

定位到Deep Link的逻辑处理代码,在infosecadventures.allsafe.challenges.DeepLinkTask类中,data就是传过来的Uri,主要逻辑就是匹配传过来的Uri中有无key参数和对应值对比,如果传的值和getString的值不一样也是不成功。

image-20220713143416672

image-20220713145016516

最初的想法是查看getString的key值,找到对应的路径就能知道key的值,但是传值后发现key是错误的,真正的key值并不是2131820617,这里的数值都是十进制数据。后面通过使用frida hook getString方法得到真正的key值。

image-20220713143849346

image-20220713144544028

方法一

在 AndroidManifest.xml 文件中查看Deep Link配置,得出Uri(data)为 allsafe://infosecadventures/congrats

image-20220713144903269

再根据hook得到的key值,完整的Uri应为 allsafe://infosecadventures/congrats?key=ebfb7ff0-b2f6-41c8-bef3-4fba17be410c

使用adb调起的命令为:adb shell am start -a android.intent.action.VIEW -c android.intent.category.BROWSABLE -d "allsafe://infosecadventures/congrats?key=ebfb7ff0-b2f6-41c8-bef3-4fba17be410c"。

image-20220713145643085

image-20220713150032233

方法二

使用html页面唤醒Deep Link,在本机上用python起一个http服务让手机能够访问到html页面。

html代码如下:

<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no,minimal-ui"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black"/><title>DeepLink 测试</title><meta id="viewport" name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,minimal-ui"></head><body><div><a href="allsafe://infosecadventures/congrats?key=ebfb7ff0-b2f6-41c8-bef3-4fba17be410c">Deep Link</a>></div></body>
</html>

点击Deep Link按钮即可进入到Allsafe的成功祝贺页面。

image-20220713152604426

参考链接:

https://blog.csdn.net/JiaoZi0201/article/details/78828055

https://blog.csdn.net/jingbin_/article/details/84228877

https://blog.csdn.net/qq_34681580/article/details/113870059

part 7 Vulnerable WebView

挑战

在不反编译的情况下弹出警示框和访问一个本地文件(/etc/hosts)。

警示框

了解到WebView可以解析DOM 元素,展示html页面,也就相当于一个浏览器,那么xss漏洞在其上也存在。

payload:<script>alert("77")</script>

执行payload后页面成功弹窗。

image-20220713162836764

访问文件

既然要访问文件肯定用文件协议,前提条件:

WebSettings webSettings = getSettings(); 
webSettings.setAllowFileAccess(true);

可使用如下三种方式访问。
1、file:///android_assets/xxx"。
2、本地webview或html可以通过"file:///sdcard/xxx"访问sd卡上的文件。
3、本地webview或html也可直接用file协议访问该app内的私有文件区下的文件"file:///data/data/packageName/xxx"。

payload:file:///etc/hosts

image-20220713163230033

part 8 CertiFicate Pinning

挑战

拦截流量并绕过证书验证。

网上hook脚本

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);

image-20220713171647928

这里还没能理解透hook脚本的绕过思路,应该是替换证书让系统信任。毕竟android 7之后不再信任用户级的证书,只信任系统级的证书。

part 9 Weak Cryptography

挑战

使用frida hook加密方法。

根据点击事件消息(Result:)定位到解密类 infosecadventures.allsafe.challenges.WeakCryptography 中,第一个加密方法是AES,这里已经给出了KEY:1nf053c4dv3n7ur3,使用的加密模式是ECB(不需要IV),但是因为最后输出的密文不是可见字符没办法写出对应的解密代码,如果最后输出的密文是base64或者hex密文就可以利用已知的KEY来编写解密函数。

image-20220713174828834

frida hook 代码,可以根据自己的需要去hook参数或者返回值

setImmediate(function() {
Java.perform(function() {var targetClass='infosecadventures.allsafe.challenges.WeakCryptography';var methodName='encrypt';var gclass = Java.use(targetClass);gclass[methodName].overload('java.lang.String').implementation = function(arg0) {console.log('\nGDA[Hook encrypt(java.lang.String)]'+'\n\targ0 = '+arg0);var i=this[methodName](arg0);var re='1'console.log(i);return re;}
})
})

image-20220713180845797

剩下的的md5和随机数字生成(跟参数加密没有关联)同上可以根据需要hook参数或者返回值。

part 10 Native Library

挑战

使用frida hook so层的加密函数。

定位到处理类是infosecadventures.allsafe.challenges.NativeLibrary$onCreateView$1,跟进发现加密函数是在native层。

image-20220713193231619

image-20220713193650328

使用Ghidra反汇编so文件,查看伪代码,发现处理函数是Java_infosecadventures_allsafe_challenges_NativeLibrary_checkPassword。里面的checkPass是验证密码的函数,但我们主要hook Java_infosecadventures_allsafe_challenges_NativeLibrary_checkPassword函数为真便可以绕过。

image-20220713193814475

frida js脚本

Java.perform(function(){
//要hook的so名
var str_name_so = "libnative_library.so";
//要hook的函数名    
var str_name_func = "Java_infosecadventures_allsafe_challenges_NativeLibrary_checkPassword"; 
var n_addr_func = Module.findExportByName(str_name_so , str_name_func);
console.log("[*] 目标hook函数的内存地址是: " + n_addr_func);
Interceptor.attach(n_addr_func,{//在hook函数之前执行的语句onEnter: function(args) {//console.warn("[*] Success Hook So!");},  //在hook函数之后执行的语句onLeave:function(retval){      console.warn("[*] 原始的So层函数返回值是:"+retval);var change=1; //定义修改返回的值retval.replace(change);    //替换返回值,使结果为真console.error("[*] 篡改的So层函数返回值是:"+retval);}   
});
});

image-20220714103735134

这里不知道为什么刚开始执行的时候js报错,但是点击事件发生后就能获取到内存地址和hook返回值了,成功绕过。

总结

通过对app测试后也学习到了几个新的漏洞,例如Deep Link、WebView等,利用方式也千奇百怪。虽然过程中遇到了一些问题,但后面也都成功解决了,边学习边解题。现在主流的app都是加壳加so层加密,逆向难度大大增加,特别是在反汇编和审计伪c代码上要花费许多时间和精力。自己还得在java代码方面下功夫,掌握基本开发能力,为后续burp插件开发打下基础,同时也要掌握基本的java审计功能,在安卓逆向上至少不能因为看不懂代码而劝退。

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

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

相关文章

工业控制系统安全评估流程物理环境脆弱性

架构与设计脆弱性 表 4.2 架构与设计脆弱性检查表 脆弱性 描述 安全架构是企业架构的一部分&#xff0c;在工业控制系统 架构设计之初&#xff0c;应该融合考虑。 在架构搭建与设计过程中未考虑安全因素 在架构设计时需要解决用户识别与授权、访问控制机 制实现、网络拓扑绘制…

厨电智能化趋势下,究竟什么才是真正的“用户思维”?

文|智能相对论 作者|佘凯文 近期2022年前三季度的各项经济数据在陆续发布&#xff0c;大环境依然承压&#xff0c;各个行业都在负重前行。 厨电行业在房地产下滑、疫情反复等因素影响下&#xff0c;前三季度同样一直承受着不小的压力&#xff0c;AVC数据显示&#xff0c;202…

进程的创建终止、阻塞唤醒、挂起激活(操作系统)

目录 一、引起创建进程的事件 二、进程的创建 三、进制的终止 1&#xff0e;引起进程终止的事件 2&#xff0e;进程的终止过程 四、进程的阻塞和唤醒 1&#xff0e;引起进程阻塞和唤醒的事件 2&#xff0e;进程阻塞过程 3&#xff0e;进程唤醒过程 五、进程的挂起和激活 1&…

安装Mysql-zip安装

一、安装 1、下载 到mysql官网 http://dev.mysql.com/downloads/mysql/ 下载mysql 注:msi的是安装版 2、解压 解压到想安装的目录下,我的是D:mysql-5.7.13-winx64 3、配置my.ini 在D:mysql-5.7.13-winx64目录下新建my.ini文件,输入以下配置代码: [mysqld] port = 3306 base…

springboot嘉应房地产公司质量管理系统毕业设计源码453100

目 录 摘要 1 1 绪论 1 1.1研究背景及意义 1 1.2国内外研究现状及发展趋势 1 1.3系统开发技术的特色 1 1.4论文结构与章节安排 1 2 嘉应房地产公司质量管理系统 系统分析 3 2.1 可行性分析 3 2.2 系统流程分析 3 2.2.1数据增加流程 3 2.3.2数据修改流程 4 2.3.3数据删除流程 4…

Python提取pdf中的表格数据(附实战案例)

14天阅读挑战赛 今天给大家介绍一个Python使用工具&#xff0c;那就是从pdf文件中读取表格数据&#xff0c;主要用到第三方库 pdfplumber。 pdfplumber简介 pdfplumber是一款基于pdfminer&#xff0c;完全由python开发的pdf文档解析库&#xff0c;不仅可以获取每个字符、矩形…

[spark]transformation算子

1.sample算子 1&#xff09;说明 sample算子&#xff1a;对rdd中的数据进行抽样。一个非常重要的作用就是开看rdd中数据的分布&#xff0c;进行各种调优与优化。 数据倾斜&#xff1a;数据分布的不均匀&#xff0c;shuffle会将相同key的数据汇总到一台机器上&#xff0c;就会…

水库水雨情监测系统 水雨情自动测控平台 水库雨水情监测及视频监控解决方案_设备_水位_远程

平升电子水库水雨情监测系统 水雨情自动测控平台 水库雨水情监测及视频监控解决方案_设备_水位_远程辅助水利管理部门实现水库雨水情信息“全要素、全量程、全覆盖”自动测报。系统具备水库水位、雨量、现场图像/视频等水文信息采集、传输、处理及预警广播等功能&#xff0c;有…

12-敏感的资料怎么存在K8S-Secret

12-敏感的资料怎么存在K8S-Secret 前言 今天的学习笔记将介绍Kubernetes另一个组件secret。secret协助开发者将一些敏感信息&#xff0c;像是数据库账密、访问其它server的access token、ssh key&#xff0c;用非明文的方式&#xff08;opaque&#xff09;存放在Kubernetes中…

【数据结构与算法分析】0基础带你学数据结构与算法分析06--树(TREE)

目录 前言 树的属性 树的实现 树的遍历与应用 深度有限遍历 (DFS) 广度优先遍历 (BFS) Not all roots are buried down in the ground, some are at the top of a tree. — Jinvirle 前言 Tree 是一些结点的集合&#xff0c;这个集合可以是空集&#xff1b;若不是空集…

中国锚杆行业竞争格局及投资风险分析报告

锚杆的概念 锚杆(又称土锚杆、土钉)是在天然土层侧壁钻孔&#xff0c;放置拉杆&#xff0c;注浆锚固而成。根据所用材料&#xff0c;拉杆可分为粗钢筋、高强度钢丝束、钢绞线等。通过计算确定了侧墙上锚杆的截面积、层数、间距和长度。钻孔直径应由设计确定。常用的孔道灌浆有水…

【QT + OsgEarth】(四)加载国界线矢量图

效果图 实现过程 获取国界线矢量图在.earth文件中加载矢量图文件在Qt程序中获取图层节点并控制参数 加载矢量图文件 < image > 标签定义要栅格化的shp文件 driver&#xff1a;使用agglite&#xff0c;将矢量文件栅格成为栅格文件< features > 子标签读取shp文件…

亿可控_第3章 指标数据持久化与设备详情展示

亿可控_第3章 指标数据持久化与设备详情展示 文章目录亿可控_第3章 指标数据持久化与设备详情展示第3章 指标数据持久化与设备详情展示学习目标1. InfluxDB入门及介绍1.1 InfluxDB简介1.2 InfluxDB相关概念1.3 InfluxDB的基本操作1.3.1 InfluxDB数据库操作1.3.2 InfluxDB数据表…

SANGFOR深信服短信插件

设置说明 第一步&#xff1a;先配置短信通知服务器&#xff08;以下以HTTP为例&#xff09;。 步骤1、设置短信通知服务器&#xff0c;在[系统管理/系统配置/高级配置/通知设置]&#xff0c;点击<新增短信通知服务器>&#xff0c;勾选启用&#xff0c;可启用短信通知服…

mdio bcm5482访问

查看硬件原理图&#xff0c;5482通过mdio访问自己的寄存器&#xff0c;M4通过cpld对5482进行初始化操作(复位/解复位&#xff09; 可以看到bcm5482的MDC和MDIO用的是port P 的pin4和pin5,所以基地址为GPIO_PORTP_BASE. 对应的分别是引脚4和引脚5&#xff0c;所以由此可以封装出…

SHEIN算法工程师面试题7道|含解析

8本电子书免费送给大家&#xff0c;见文末。 1、数据处理的常用方法有哪些&#xff1f; 对于离群点 当作缺失值进行处理删掉离群点所在的样本实用统计值进行填充 对于缺失值 可以用均值或均位数进行填充可以用特定值&#xff0c;如-1可以用np.nan表示 对于类别特征 编码方…

SPI示例学习

Service Provider Interface 它是从Java 6开始引入的&#xff0c;是一种基于ClassLoader来发现并加载服务的机制。 服务发现机制&#xff1a;通过在ClassPath路径下的META-INFO/services文件夹中查找文件&#xff0c;并自动加载文件里所定义的类。 SPI机制可以很好的解决不同…

到了2023年,PMP项目管理师证书含金量会如何?考试难度大么?

先介绍一下PMP PMP考试是由PMI(美国项目管理协会Project Management Institute)组织和出题,严格评估项目管理人员知识技能是否具有高品质的资格认证考试。1999年&#xff0c;PMP考试在所有认证考试中第一个获得ISO9001国际质量认证,从而成为全球最权威的认证考试之一。 pmp考…

Oracle技术分享 数据库序列间断场景

文档课题&#xff1a;模拟数据库序列间断场景. 1、概念 Gaps insequence values can occur when: a、Arollback occurs 应用出现回滚&#xff0c;但序列不会回滚 b、Thesystem crashes c、Asequence is used in another table 2、实际操作2.1、系统crash SQL>selec…

云原生时代下 K8s CGroup/CRI 的优劣势

目录前言一、CGroup1.1 基本概念1.2 cgroupfs 驱动1.2.1 基本概念1.2.2 什么是 cgroup v21.2.3 cgroup v2 使用要求1.3 systemd cgroup 驱动1.3.1 基本概念1.3.2 kubelet 设置 cgroup 驱动二、CRI2.1 Containerd2.1.1 基本概念2.1.2 配置 CGroup 驱动2.2 CRI-O2.2.1 基本概念2.…