|
6 W4 D0 R5 {& l8 _; D/ n U2 W
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 7 L9 o" E/ l2 p/ L$ J. ~
# [# m2 o: t* y) {2 @( d; S+ H7 m* K! `* Z+ W( e3 P
/ ]6 V8 Q. X5 C9 ^, e+ W
- r9 {# A7 n: H1 T$ u9 Z A& x. B( n0 K# V# P, K/ M
7 [* [( z) i$ l" E# ?% L z ' q0 z/ e8 J! [) }9 N5 b. g- l6 G) H
% y: O" s+ B% W: k N! D" Q
下面就以开发者角度进行解析下这个APP的功能的实现原理。
* D+ V* Z% K2 W) L d# y* M 0 t! b4 O3 e: W+ L4 P6 F
) ^/ z' ^) M: L+ Y i
q. ]6 e, Z" k$ o
, E/ `4 i# k$ |' I
/ x& u/ v& C- C' K6 ~% ]1 g
基础信息 4 q9 T% n7 _# j5 k3 {, D: d9 ^
/ \- n1 r7 y# D% m; J: g0 H3 B: y- l
$ ]9 R! W' Q- u/ p3 p1 }+ L
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 5 ?, K! Y4 u0 |: G: _ q
& m6 H* |1 Y0 }$ ~: \% K, x/ q* }7 t# _8 X; x8 W" K5 g
1 E9 I# O J+ f5 E2 F4 m& B 1 e6 O9 t! Z1 G
; {+ Y4 W8 C9 k1 Z- k% y
2 v! H0 t$ g) g8 S% p* m * W7 _3 c) A$ U5 T
( G% |; ?' I6 q! Q j( { 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 7 \2 `" j4 A- P1 R
. Y* ?5 s; ^8 L+ X. Q' r
( {/ E3 F. D. W% K. ^3 _/ i
2 @( ^, L( g+ A0 `8 e0 q1 H4 i, d
9 M. U9 y0 y9 V0 m: c
* r+ h$ J: V3 @+ R: w- S $ e7 [+ b8 d/ V' ~# r- ^+ B2 P9 K
- T5 g# i- k, q/ K
- Y: a" O1 O4 m" d% I! j8 A 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
' I6 C! u& b% B6 J
& n" K$ Y" e( c* D+ X7 d) z$ `0 m( e1 L- w4 {
" m: i1 q4 i, B
# p9 ?& u$ U% j6 x% N1 b. b( ~$ b
' T& S; R! D* b* n" [& P# {& i
" { w$ A& [2 i" A+ q: i& E! e
/ C. s5 x) u9 J/ j# g0 F" x5 C 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 0 c/ F* H! g, ^
5 A, U" _/ p5 `$ n, B5 d; L
* q2 ?4 F) U3 ~! |9 Z$ t
2 g- y2 u: w7 o; z8 P* S3 X
: `% ]+ d, \$ l) S3 z" l- F/ o7 J5 S- T& ^4 v7 O4 o
* N5 s7 ~5 U. x. [; R 7 M1 m( M( J( H3 M+ M) U) A
# Z2 M8 t, H I7 g& X
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 1 x( C# u/ U1 a' \
z0 M4 Z1 y# `) h0 N
* D" ]8 t$ D: G: @
2 S0 E9 n- h/ K6 w' W
% X, G% d. V" V/ {- N1 F& K3 T
4 ^/ \& h2 C$ ~$ i6 ^
" F+ b5 R( Z( C % H4 L! h% O, e% ]; D% k a+ u
8 I7 X- M1 v" h/ V v6 G: H
7 I9 `& x8 |8 n6 u, I; z
, k% E9 T) U9 j4 a" L$ Z: k1 w. w8 d7 a, |/ e X
签名信息 ! `0 y( u+ i: {2 `9 a
# {) R! e& z/ a w$ Q; |
/ l9 q6 m0 i+ r, j3 `$ s1 \" v
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
9 A3 N3 w; J( v7 k3 v
$ k+ M4 R4 R% G, f( m: X% y2 x9 N0 c1 a& |1 i V* E! {
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 + O G! `9 V5 ^. L& a# D
( n" K) H, k% d8 e' ?" x& ]: \1 {
1 t! A4 e* }6 S" U7 H/ t& `
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 0 _% J" L! |8 A9 p+ V3 X
4 k$ {* y; ~& {7 w: N/ Y' {0 w, p( t4 H u
+ R0 v$ W- `& ^+ T
3 ^% ?2 j; Z: U- R* }. T. y$ k: s, G( ]0 K$ m' s
/ C) X! d# N" f h! v
( W" s& u4 r6 b( w A# A& P* R( [$ P3 X
android签名的数字证书的一般都是采用 X.509的国际标准。
- M' U H1 o9 @. E5 q
( Y: T P! v4 d- j5 R4 N
" x0 ?# l7 H+ U @* S/ G& j& ^4 w: h' v 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
' e v# N* P$ O7 ~+ M% o3 Z 7 X) r' L% U: o% g) X4 r. ~
A4 m* R( `. `5 c: ?, R5 e 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
1 N) P% n/ q/ ?) O- K7 h
6 Z+ K0 ]$ l+ {& Y6 E, M
, Z: A; {3 s P$ L, b% |, L
7 O O& _; |" }7 ~$ u/ U2 d) Q
+ k+ i) x U2 b8 ~/ X8 g! r' V( R- A- f3 Z( L
5 ^0 F V( F. k5 k% K4 |
$ a+ H1 z2 H- d0 n+ g6 \
7 x( J9 ?; a D% z$ [ 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
0 g$ q/ `+ S( I5 w. B ' r( q, b5 ~, B; p8 r6 t3 A
: ? o" X' C4 ?( `. k
9 ^' \6 i, M G# z" R/ B
( p4 D9 e/ u- r" ^4 b
- Q" q- W. G( B$ d 、 1 Z/ y4 T9 x" s; ~2 ~, f
' F2 {- K0 T Q" j$ O7 }- U
7 j8 W" Y4 b' ]& H+ I7 T" |( P0 @
- |* `& R% f r3 z" H" ^! J
; y; ^7 j& _9 Q- p" Z" \# L# k7 J9 _% r/ p6 D" k2 y- }
权限信息
" _. V$ u, x# j R3 M/ F- f5 m# ^& ?' X
* U; _ P( Z$ G0 q; _5 ?% |4 T 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) ) X, D0 H& i: |' [) [
3 q6 g( I3 H7 |7 W0 T2 b; c
) m0 r6 _; i! b, \) U4 C, R V android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
4 C) p9 R( ]& E# w) ` d/ E
. `' `+ |- |7 }
2 ]! y/ e7 w u& p
n6 z- @. z4 A0 V 0 @' [/ T8 @; Q! o; j
4 W5 C3 C/ v; t+ \ 6 i" z- Q* C" T3 v5 Z. K$ x
/ P6 O' w9 P5 B3 z! Y$ s% z! c
/ }; r |, Q& C4 _) o0 Q& W 下面对这个APP的所有权限进行详解下:
# G X: e+ F- M3 I4 O3 m
6 e" {. s3 Z% E- R5 A5 V* r5 \
/ h5 w, a( E$ h' `, r/ A android.permission.INTERNET :访问网络连接可能产生GPRS流量 6 g! ` f9 E! ?- J% C0 |
8 U/ \- a1 Z) ] x2 V, l8 ~% ]- M/ O: m/ x
2 M4 U' v: J# x( [' J- k# R1 r android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 1 O) v A1 y4 W8 Y8 @
' r- S& Z/ Q0 w9 n
0 q( C6 S# S5 q9 y$ {: o- C0 }) l
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 8 |7 I8 L* t. {3 u: V: \5 n4 l4 ]
6 Z: l- K: w Z5 N7 r1 u4 z- b. \; I& H4 W* e7 O
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
$ g2 u/ \& b' T- w# @4 |8 K
3 w' C( d+ H4 @& q
3 T0 F6 K5 H, @! d6 U9 j android.permission.WRITE_SMS:允许应用程序写短信内容 : G4 t( z3 U7 ~! |1 u* |
, X. R# |" i; y4 |
! v5 z' N. G' \( I( W) M
android.permission.READ_SMS:允许应用程序读取短信内容 ( \# n8 V' o8 v1 X7 D) X7 j
( M+ C5 N; b, v3 j! H
9 h I. y7 P5 {( e
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
9 D( m( j8 [! i( ~' h 1 Z* M1 f& U' u$ N
) x) ]+ h) { k' A. W, q, V* L android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 ?3 W8 @9 N M0 d6 [, T7 `
" V& Z( |$ A" ^9 ]' P" H/ Y
+ Z0 M& g. J0 N b android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 ; b( [1 L" A: \* R0 d
& ], {1 W( }0 D8 i
9 x- P6 n# L- R3 @( K" n' X! r android.permission.VIBRATE:允许振动 r- u7 K' R* L, C; o9 S9 j- D! p- D
& Q! J V$ v1 R2 G, `* x/ @/ y+ j& X3 i c0 L6 l/ ?8 [' h
android.permission.READ_LOGS:允许程序读取系统底层日志
/ i9 h; q( ^! c5 R* b- K 9 N% I% D7 |" k) A2 a1 g
7 O$ j% o; c6 u/ H android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 , R4 _6 x+ d! h/ v. i# `
; v6 N. x) m4 O4 O' g+ c- g* c+ J- t: }' \
! l( y Y1 i" F
/ x! w1 B$ b2 @
5 U0 P" i3 @ T+ l 功能信息 ' j2 E' l: `/ h9 l
0 I- d% F) U9 k+ Q
. I* |0 V* {5 C$ e" {
$ j1 P. R1 q8 g9 x
4 V& f$ V, p4 \$ s# Y1 D2 g' g1 D& `% J- w) d! B; F
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 3 z/ l7 F: Q% m1 f! c( \
' B+ c! C' }" T9 N/ S1 L: _
/ s% F. ~% [9 V Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 % K! d7 n- Y( v% H
- M! j: ^' z0 X+ \3 Z# t
; ]5 a9 ^5 F" J+ B5 G$ Y 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 # W" v0 h: E7 r E
6 i: o9 p# X: W
" a |# q% _# b% f7 T/ r! N; ~ 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 " _8 F# Y+ E! K3 E
( @3 E6 g; R* M" n% H6 G7 M
* H x$ }, {0 {) o/ F/ M" h
; X) @) v& w9 d( Y( Q. ~
! g6 ]; U& x K) y: o; z& F4 m- K: k, T7 D1 f0 O* I% D8 Z" ^
- y2 Z$ @7 j9 s) a- B& L
6 d. @% N# s1 ~+ B- [9 \/ B* C; S8 G+ p6 k0 @4 ~
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 e6 U5 D6 ~& H1 z
0 p, M& a/ Y+ S0 {
0 G5 d. ^ g+ O+ c5 E
4 i. t, S! p! \7 e
- K, n& S5 B6 }% T( l0 O5 \+ f# X8 T# X+ ^ j
/ E3 G3 t: Y+ O" T( l. e
1 H$ j; l% G1 }4 R% v: P' X f$ m
8 _! k: M, X) H6 X* I G# y 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
4 n1 ^* O: J: L O6 q% ?7 | Q + E& |9 W4 s2 h( n# q
x3 d9 L4 K+ M ) k3 b0 ?, a5 z
( ?. @/ U& _& D% D
& e J Z1 C" D& I! o 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
, [6 Y+ |' ?: {4 N1 D + w( I5 Q& u$ y) V1 s
8 M5 E7 {5 C4 S2 E N( n+ i & d, l) R. W. n8 p ]% N5 }( u
' U& X1 d% `& M% f2 d: ~
% G' D* ~, B: f: v9 g2 D7 ^ - K. ^. S7 S9 O1 @7 [, x/ t, \0 J" o
: _1 k6 z6 O% {1 i, d- P6 H g+ U
/ A6 u! w( B1 E, D# x
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 7 J! V5 }+ w+ K+ {4 Z
" Y1 D/ U9 M" j3 p- T
I3 d- L- X/ V% R$ d* b3 t" b" B LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
1 o4 u- M9 }) ^9 J - K3 d3 Q, p- L7 ^& Q' l1 ~9 S+ ?
' S2 z% ]3 ?4 J: Q9 r! W 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
+ v% T! `6 a* y0 p) v4 h9 [ ( S# x" }" g& \' i5 K0 g
- y l& n1 o7 q1 r9 g: a 开源的luasocket代码可以参考学习下 - B+ o w/ e; @& R4 B# {
" S+ }9 f; O1 z' q* J" d C
$ N1 e# n0 A0 r0 g6 I) V& d https://github.com/lunarmodules/luasocket
$ M/ G G( ~) D, M 6 D' `0 ]' N4 ~
9 M( m; T7 V2 O5 e https://github.com/fengye/luasocket
! M5 H* V2 n$ m/ y8 j
# D S5 x5 f9 d3 _% S/ |
+ U# |; o4 ~5 X% G
. `$ A# l0 _* j 8 a* m* d0 o8 D! e- }& r
: E) I7 K5 D1 c0 a; m; Z
0 G/ m" ~$ ~( W# x# \
3 O9 J5 z' b+ p2 c. k( q9 f( b& x; s, V; q' E! V
+ [- I3 z) f! O* Z! C2 q
0 Y# u: x/ b( P# D
0 V( A* G8 c/ {( u
/ {0 u6 o& R. n$ k, h+ ~
& y6 r! F6 n, H
1 _( Z' T0 \# @* y3 K8 U; s; T2 i- ~; I5 x 总结 " N, Z2 F! ]2 \' A# q
6 S- F! c* j! e
( j; r- T% D- C& D! i% k 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
, e2 p& @* d ~& s & Y+ T, q; X& F* {0 j( s4 d+ r; v
/ J: w0 v! J* | C+ {) s
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
3 v% L- g- N9 V $ e u% I4 A5 V
( k, F2 A3 z! o& v) \( H$ e 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 : h+ Z* b ]% o2 R T$ b
5 h0 w; ^$ @+ T+ ^0 w7 x) c0 R
, a- N3 w/ H- | 结束 , h) f8 }$ |$ b/ Z! x
3 |' O, s- \* S9 Z* q3 b
6 C/ O; s1 Z# t! I" _" o* ~ 【推荐阅读】 # s/ I; n+ x- l# p r
7 x! p: Q" R. G+ X9 g. B+ m1 O% g+ w
对吃鸡APP的分析 * Z3 v4 c* y/ w& y- r3 b3 H
7 d$ U- g& A. A! [' }
5 ]( @; E% O+ M1 ?$ ]3 M 你需要了解的APP安全 8 |+ e* _+ A7 \( {6 w& s# j
( Z9 }: e9 ]3 o4 |9 G% v, s) R M$ h" l( |. J v
你需要了解的APP安全 / I' h) z& u8 R( H
) A& ~! U9 n9 k( t; I2 w) \6 s6 p3 V; b
$ L; F8 o _9 \" w6 D+ t4 b
|