|
/ h0 E. P$ p4 u9 T: D& p( y0 [ 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
' \$ `* i" R& r) S5 x8 V
H3 i- U6 n, z* ]6 I: U& ]3 `' K* G, L
1 Q# b0 {* H/ P {8 H
' }" d6 O0 x+ ~9 u1 Q* J2 F1 E2 o+ a) J* z
5 t, x3 t# w0 n0 A, r
) I0 I* ~4 ~5 m7 b' p' x& i W; B# ? * R6 n9 U' b+ c: }, a# `$ ~
; d" x" h( E$ Y* R* E7 [ {3 P+ r$ A
下面就以开发者角度进行解析下这个APP的功能的实现原理。 : [, l* Y1 v n. ]! m. p
9 P/ }8 i& [% t0 M
( ?0 d' z$ Z( d6 L! } 5 V* I5 E" r p- s8 z9 g7 h g# l
2 @0 ^. Z2 A3 R! D
4 o, J( X$ H) ]8 Y 基础信息
+ F4 B, F4 N0 _6 |5 U4 K$ }" a$ f
, r0 d+ L# r+ `& U$ n' y; t) h' H/ D1 A5 ~
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 1 L& j! K6 M9 h! V3 x5 H+ t7 |
/ A. Q h# T2 C5 y9 [; \
% A! A# \2 f U+ t% d! V% T+ G4 g
6 T; q' Q( z& v6 i$ T
" A! K9 j& s1 b& J
?# ]6 L# W n% l
; \+ t# X& O3 C - {0 Q6 i X3 S& l: z# d
/ @4 m# |8 N4 w: o, Y
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
6 S! M" y: N& m4 {3 P1 g1 A# A% _1 _ ! L: A, [# t6 _) H( ~
$ o5 C/ j! s4 d& Y$ w4 X( x 9 [$ G* z: O1 R9 S' J8 Z
: X* Y, u: H& z5 R$ s- C) I: C
! q3 ]3 E' Z6 J: s; P0 ^0 B ) }) O+ ]6 y# N1 }% C0 S$ p
9 O8 ^! G3 t) T1 {$ x0 U
! Z6 [2 I- o/ \& Q3 ? n 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 , n" k( z! H4 E! d* p. s) }
1 Y0 l! S) }6 K7 S+ g9 B- B1 g3 b
* e0 {$ c8 i0 b _5 i5 _
4 X# x/ Y M, W$ f
* Y6 q( ^! ^2 W0 I! E* E$ [0 X" I1 i' L, Q" g0 Z
) B- \1 X% J+ z, g" O/ \: |
7 M* M- [3 `1 ^; Y7 c! r. D& i+ x
4 B# [6 U! C6 v9 N; O; I& M: t 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
X& y: d8 i: I1 x: ?6 B. V4 ?
- `% z1 ]9 `0 |: O8 j3 O9 R J2 s w7 Y& d# w
+ J: j# w* G, C9 t+ o, Z7 T
s, P& }+ J. G: a! Y- h1 b; g2 i4 Q' H5 r9 G+ T9 v
; R2 v5 C/ T4 K/ X' X) i8 x5 ]: V
9 f4 R# m5 i; \& ]4 h
3 h2 X$ j8 v0 g0 c 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 . @/ M8 {/ B: } X A
* p! ^8 c2 W+ g1 n) j, d" K" |3 j" b3 m5 }
, d3 \! q2 M0 e% y
/ a& u) k1 `2 N" R
4 b: |2 T! l9 Y& U( ]5 y, @- `
* b1 z' ~. n; h
4 n8 X" N" b/ N& z0 h2 y) G8 s' K
% s! I1 _) i9 b$ J2 K' d8 X
]5 z8 |5 b# w
. I2 L9 w' a1 T) k3 x5 T P! a0 t, k! T% T w( n* m9 R7 m
签名信息 4 c5 X# h1 u( p" |) S5 X
# R& \/ [( O" p I( [
1 O& {$ M* \" f' `4 ^, t# J" \' X
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 / ?. S! \4 V! f7 x% f
" M5 p* E' C5 f: d. }) Z* Y
6 q; l; i6 q* ? j% Z
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 1 Q9 V& r1 c# O' r3 y1 b
5 I1 f# R; m( [! n: ?
3 z2 b+ F8 \% E* s
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
2 c$ g; T5 K! j+ D: J q 2 }, b+ S G8 H% F; ]
( j$ C: l7 O+ T" O. Q3 ~: z
2 j+ g: S9 J3 E O
0 z. Z. K9 {4 k1 o* U) x' a: @- a i; A4 E U+ \3 R
8 B) ]/ Z8 F2 k, F- ?, m" O0 W
' n' {. L2 i' i0 b. `+ P
7 U, S+ ^! c; ? android签名的数字证书的一般都是采用 X.509的国际标准。 , Q- ^$ p! H5 t$ t8 [' _' v
3 {6 J- T. M9 u& G7 l
% F$ @- z2 K" o& }' [& @- B 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 0 m( j5 o6 D0 @# m+ ]' S- P3 y
" ?4 n) s% j w( ]2 ?' D; e" M4 D+ `$ l. y6 B% f' a9 ?6 B
下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
3 x7 Q" b" v4 t$ b" |
3 g, Q7 e4 Y" ^/ Z0 `: F% T+ A2 ?; r+ U% C z+ B$ p
5 a7 k$ [: t6 P/ h) p- B 0 t/ C2 j+ p1 a4 Q
$ \# l' X8 k3 }2 L6 m; i # d6 B; V, r0 y' k* ~* \
% Q; I- R9 n8 D4 ^
5 N5 m6 e$ d8 K$ Q0 ?8 P! w( N 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 ! T X) n# ]* r$ i
7 T! M1 I. j8 I% t5 q. Y( d. l- j
x: O0 g% {5 B* L- C0 X - g @, S* V6 }+ F
* [: \- c* P$ c
6 E: R8 B' r0 @ 、 ! }$ j( l6 w1 v9 P( S4 ^
, y9 i- o0 X& p( h$ _; e
* ?8 ]* P ?2 U/ d9 e9 k* e * h0 T0 n& j1 S3 b
) q! \% E9 r; d+ _
; I* l/ G( C3 u; z; w# g9 ?- y8 g 权限信息 . o3 b( V1 E, k/ Y! I; m$ a4 t: C
, I# C$ h7 _9 b
3 y h, D, m9 Q; R9 E' p. Z3 l
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
9 D6 P6 L: P5 [: C y4 c * S. h# @' I. i [
5 ^) ?; S- ^4 Y+ G# f* y
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
: U9 j" {1 U% `$ s1 W3 r) X - Y' b9 M3 }0 ], n* W' B5 j
0 b/ E7 F& m( o; p! H$ _3 M
+ ~7 M' Q9 F- }8 b' c$ ~
* o3 }8 Q) s3 F5 x1 H6 Q
7 p$ k0 r2 E3 x+ F( m+ z3 M b0 Q, l
+ p& D5 D1 w# Y8 K7 r, i1 W
$ R, j( F" ?) e0 O
0 H) t# s+ L. ]% g/ I: D9 J8 M 下面对这个APP的所有权限进行详解下:
5 T4 Q. H2 i. E9 h% Y , c i5 H+ y* e7 t! a) b: }1 n7 n7 H
3 N) L" M% v3 |' y$ x8 ^* U
android.permission.INTERNET :访问网络连接可能产生GPRS流量
% m4 N B6 ?2 A. T 1 I' m% n2 p" H5 b
0 [4 L. \ L6 o% q+ o- a
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 $ |2 Y7 J1 c g5 [+ z5 U
) r* W3 i- w; \% R* i2 ]& j: M1 S5 ]) T# F
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
8 r8 ^& p1 F8 i- S( Z% S8 {. n : f( k! q0 h" Z T4 h
" [/ Q/ W9 U+ v2 w2 [0 V. M
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
# G- W, ]# t# x( Q H
) |7 l5 D: }0 v+ S g8 U6 W* \4 [% c( e+ o9 w: {0 j1 x
android.permission.WRITE_SMS:允许应用程序写短信内容 ; V9 b, G( f" C
% y2 Y' i; ~# B# O4 L' ]# v U
$ E* G: V( R. d/ Y9 ~* V" d7 \ android.permission.READ_SMS:允许应用程序读取短信内容 % J! `8 R! E# h6 M8 m1 q
& c2 f! {: Y$ ]; F3 l* l
7 }0 ^: b! h! M' y android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 + p; v% b+ S0 O
9 n+ m# f8 w2 N) @* I A
0 F: F5 J# a2 a' W+ d r android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 9 }7 d" n0 X: E9 ~7 L
% d. J% G$ o8 q
; C9 u! ~+ B4 F
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
. q% J! `/ |: K O5 N; W+ P
9 p" ^8 F4 i9 I/ a0 {/ ?. N4 i4 g9 f! `5 g T* ]
android.permission.VIBRATE:允许振动
2 C( r+ ?4 m* C. O
9 Y0 ` Z/ i. M$ O0 `$ u& h# M( D& r) ]9 `% W) r" u/ o8 P N
android.permission.READ_LOGS:允许程序读取系统底层日志
2 F$ v! _# x; Q8 y4 q
/ _# M5 @, w/ F o# r2 P# @% t0 B; y+ W6 I/ q9 v: U9 l! _( L6 l* B* ]
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
0 Y% A' _( k( \( c2 |) _4 g
# X" c- N! V. f" G9 V6 _4 k- `. {% J; n* V
1 N L5 k% e; K" ~5 M, f
+ y: m4 s% f# Y5 I2 d
5 W4 j' {' @( a. g3 R 功能信息 8 z1 Y4 G" J5 K7 u& q' i$ {. L
7 G2 g& Z. m/ l
' k. W. B# d5 f6 [' h ' p" Z j+ S6 s% q
% C% c8 m% f3 c3 _- L/ r- H/ v+ N" o8 n* L
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 1 [$ ~/ m; {( k9 A" l0 _' C& e
6 p" W( Y2 t0 o& ~3 V* p7 A$ K6 ]! b) X3 K
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 ) G5 l$ R6 J0 \! g4 |
/ N* u9 t( Q/ d$ u: Y4 `8 c7 ~9 ]% i7 w9 i
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 x9 j, Y, E& ]; n
4 S: V1 k h/ w3 b* J* ~6 r4 s' h* @; |1 `& s4 z% z. H9 K* R
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
5 r7 E: o% V e& Z: _ ) D. x9 J8 n |5 w. f
0 w0 R9 ?* Y2 U- U w
+ B b& {& n3 |+ {4 p) j
P9 w7 n3 M2 [3 I ~+ E, K0 h. r2 g% t K0 J% M2 E! ], x
8 Z7 y. F4 S# G: P" W8 `# |
; F, ?: d+ V" A$ p* ^, f/ l
, u# V, y0 f" ~* @
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
0 g3 Q/ G) V/ ?" H' c! l
; P, y6 x2 | Q5 a. R D2 a& C! _6 f
3 k% M1 k# u9 Q% b: y " l! ^ l, k- l( c
" I4 d( P6 S7 G+ _5 A2 t* C3 E
, g: r5 s Q+ k1 B$ m
& r5 o- Z7 l8 q2 k5 M' s" M3 J2 a5 j
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 4 q- u& m, h; X! {
( [% U, \) I3 E2 g b% |$ z) z
( j# |2 x# t, S$ ]7 u* w
' q1 l1 A/ G( i) I. k! \ 9 @0 j' @. N; T" i8 ~9 Y
! V: @$ ~$ }( R2 ~0 C
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
9 r* K: r4 Y4 S& F2 f* u4 b2 l- u% `$ P 9 o1 u3 K, K# |; X Z+ Q
1 o. U7 x' o0 {3 Y
/ w5 H$ j7 b: {0 s( Z 0 b' B" r Y. d# S
/ m* m5 O' F( M" }. \5 i$ j
' U6 h7 ~5 O1 ~# l2 {! s0 A5 |9 {) D 4 Y+ K: g* G6 }. W/ d) }* \
1 \. a# H$ L$ \7 [
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
3 N, Y; e1 l: F Z 6 ]# ^; F' ~: G v& {) D
$ o; G; u) ]6 g- A3 t; j- N
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 , \: ^5 N* x4 I' p
7 C1 Q. R# \, H. ~# b/ a2 f+ g4 l3 W
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 " n) ?' x: u/ y
9 R+ j+ q4 c8 `' ]$ ~. X
/ I% |5 G v# a1 _8 z. n* t# Y 开源的luasocket代码可以参考学习下 8 j% f1 d: G/ C
! a% z( b* Q _7 }
$ [1 q: I( M+ a, I2 Y: |/ U; Q5 E4 D
https://github.com/lunarmodules/luasocket
' |, D. h. h& w0 M& Y" s, r3 a6 Q
6 t/ y* A4 d& @9 ^" j, O0 z4 f9 ~8 q3 L5 n ?
https://github.com/fengye/luasocket
8 `! B' i; M& u5 ~8 n1 k $ ?. h1 T; J% b% I3 [
7 Z: g5 t1 u+ h& @4 x ' J/ d. l! \# x
) [% L8 s P' ?
' N5 r, J8 p: I& h 6 E4 w# X" o- y9 |3 q
4 f0 W9 J- D1 B6 b4 L O$ A! P5 I7 u0 ?/ i
+ F+ M; t7 X: n, q
( K7 t* a! _1 ?# l# I( W5 ^
8 J5 Z0 E! \6 v0 g: `, ?3 K . ~ ~- l: t H
% ]* g+ n! s0 [$ ?& l( V+ B
M' A. e" ]9 H5 Y$ D 总结
) \2 |2 i% A' K& _: g
6 W# b" j( K% t3 `- {7 Q& \; _( _2 ~* P; J c7 w {
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
8 i! {2 ~2 n% _5 @0 O) c- V$ L, i* Y [
0 B% R% G% ~0 V* ~( u! p/ T
* y& [1 V# r% ?0 F 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 : p0 W# p6 a! h! j
6 s% ]. _" ?: w7 w4 B. q, Z8 r" m
" l$ a6 r: M! w6 w 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 1 x7 h; Z7 @/ O' N* [5 E
) ~: Y0 X* m9 Q( @/ d2 I+ m4 N4 y1 s
+ h6 U* ^0 {' S 结束
1 \0 ^5 S6 w9 N" R
( c- {! ~; N2 Y( n k0 _
6 [8 H4 x* o* X% z, H 【推荐阅读】 ) @/ B4 A% ^+ O$ v/ O
7 w8 J- L M: Z5 A
- P" M) @' t+ C; V J% \ 对吃鸡APP的分析 4 B0 ^4 ^ W, [) Q9 |- h5 p
, W8 u" _/ t0 m* Z- G
( P7 J" `+ X6 }
你需要了解的APP安全 9 }. Z/ ]7 K5 h- e- U% |
* W& w; q7 x0 q, Q( c* ~! f l
. f5 E! H( u; K, a 你需要了解的APP安全 , k; q, E I. h. i5 c, {
5 n( L+ t# I0 O( g
- V6 K" e; ^( c8 Z" k" E
# |& O+ T' i$ l ], I# E
|