|
9 a% o/ U3 I8 @& G" [ 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
3 P8 ^* X9 k) T. S$ `1 e- ^
0 s1 m: f+ `4 s" c8 z! A1 v" C: p# X6 x
+ C) P; R- [7 v3 ?0 ?1 ?" P
; ^+ F) u+ D! R; _* f: \
- g1 g' \2 F* X) | 3 m* E D [1 M0 e
8 j$ D+ w* b8 U9 l% h% }8 d
" w: m2 Z' Q8 c# C! h) w4 A/ @% g 下面就以开发者角度进行解析下这个APP的功能的实现原理。 + J; h+ d7 c3 P% x; [
8 A$ L$ X4 E. N2 a( d# X6 s) l
8 D9 i0 X# D# P$ c7 W : g' c2 y6 l, i% m# {
Y* W( j! Z; J; s
+ L9 C4 H( t! e6 o L2 b; _ 基础信息
: o% e- r! x( S' {" e, x& r# J 6 W% j* e j) ^
) g& N% I9 Q) a7 Q
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 7 b. o+ l4 c! ^0 @! D, x
, T. t+ v' q8 K& n; |" Y: \$ |
4 y/ D' Z3 ^ e2 ]2 E* G3 U / D. u/ B! {6 n
. o$ W8 X. q" N. g w+ V& v" D
( [9 u* N c" m9 d
4 R0 M1 v2 x7 U( _* U% g: A7 T
0 `" d- x/ G) V% a( g- C1 e, K4 M9 M+ h0 R
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
* y) _+ o; g+ x7 F' l4 {4 p
6 T0 @+ r1 c) B/ N9 z# l& K# c- N% E& H! w7 z1 c5 X+ U
& L3 P- ]5 S5 t* E$ D; W; n
* J, m" I' [/ I( I K+ j
# n; d4 Z: Q; X- R+ u1 r2 [3 c! Z
& f6 \3 Q6 c4 v- F/ u/ p
# X' x2 ]: c9 P# k
+ }8 Z! ]0 O) H( i 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 * t( C {% ` J k6 U2 d( V3 C6 I
5 a+ V; h% P4 X
% @: B& R* D w1 ~1 i# N / N! F6 \' C% G2 \3 Y1 A8 G
& T3 U% j2 A; b/ l
2 I* x8 H9 I. _' }4 B% K4 G
* p* v5 z! _4 G& q- f4 h ! r; o' N2 g. o" r3 P
, P$ V D- z/ m/ i9 C 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 % C: C3 c G* N4 ]" U( l% @
* M" y+ b5 n1 {: i, {2 `+ l0 x9 U2 \ Y& e
/ e) @+ t0 W& |+ B+ v5 ^
, d) \, [' g8 p0 ~% g; V$ \, O% `
n8 r0 g( T8 L + u$ K' ~+ K7 C! N9 P# A( `9 x
; g V( `; M$ |: T- r8 ^% ^; X1 H
% ~# n+ e5 e5 |1 k2 `/ B7 K& C 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 - B3 k- b( m1 ]3 A) Q( D) L
% Y3 T, B" d$ s
: ^0 B: [. G! [
% D0 s2 J; A% K) P3 k# f% N# @ * }5 j! `7 L4 Q& f" |5 S
# l K+ ]) w3 L; c ; H- g6 N! E' R& _1 P$ O# W8 N% ^
0 T3 N# W+ v8 z) b; A$ x3 Q y
x K0 [; { L9 N
o, b3 G! T- A% O' f& K6 G8 K
M, B* k2 x# l5 r) u$ A* s
8 Z# {1 G$ Y( }; q
签名信息 3 o% y3 b. ]( \
. K0 n' p) ?: M& l
8 D- l& ~# j5 d% E$ ^2 r. T" i- g
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
3 N1 t9 j2 O0 b
; A' ? G( Q1 _ V6 l( |: [2 i3 h. S& X0 ?0 N9 b
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
1 N, d3 j4 i _4 k
5 `6 L9 A" r) |. e# ~7 I" Z- b* ^# ]
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
; C7 x- i' L0 E1 ~$ z $ a7 S3 _) b$ v) m3 {
+ m, |, b5 U% @+ n; g- }5 x
% w' O( l0 R6 s/ v( A" V
' k/ o+ T2 e" H3 X1 w& U+ e* |+ i9 L0 w: c, B6 m2 i. p
% f6 J1 _9 e, i# R . F6 U6 {6 Z" G5 V P4 n3 y4 A3 _
3 O3 ? |9 s/ I4 m, E1 d
android签名的数字证书的一般都是采用 X.509的国际标准。
' }- ?- I3 m* `* `( x6 u$ _2 B ) W& F# E- H0 P! s7 c; v- l
9 o0 b. p& r+ n' _3 a N
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
# B* B0 y/ R9 ]; A+ K% E9 Z 1 k5 B3 }, g8 u0 @6 d
4 D- n2 }* K. z! T9 E. b) l6 J4 {
下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
% P7 M& M( Z) | 7 v$ ^% E9 h% { X% H
( y9 c0 k7 C- \+ @ 6 k+ V* \4 a+ u+ O% |
0 x4 n- i1 z! w) S, y
/ J1 A4 [4 D y$ h# Q3 J5 C# [
6 m% W# E7 L; y# ~: n8 t8 Z
! \1 v9 A p! D/ F/ M) D N) V2 t4 v4 l9 L# b& P0 Z
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 ; Y& n u: G1 Q; L7 i# G* V3 a0 N
) o. c* ^& C8 m, B. u2 E% D
& u" O% U6 Y" l4 W/ O 6 p }: y& F" l3 I. R' P9 h
! H# Q+ O/ J" r' B
- F) H$ j- N" S+ i
、
$ c3 b% U* Q$ c; q c% S2 `
) X, [( ?& _* i6 B, N+ R( G' ?0 \3 G! o" o. j
" d# Q0 r( H; V+ E 3 e& E1 ^0 r2 F3 M! c6 N- N* G& {
( X+ p. Z ~5 N) _9 [! {. l 权限信息
% _; d F9 |' F0 [2 z J/ v! t- y1 F2 }
. l/ N; w4 ]- B 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) " Y4 j B+ y( N5 e9 k u& ^- c8 d* y, b
3 S ]2 g; R8 H+ v9 z7 |1 d
6 Q! z: A- c6 Y0 V( L+ w( |6 }# K6 p android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
3 h5 G8 F2 E6 I& ]3 m
, O6 e: t4 N8 s- u E8 `, r8 f
( T/ [) e8 |! s
' z+ e. L# s( H3 m" ?# |7 e0 `
, ]+ N( t) T8 X# b% `+ z# k0 f- B8 T& a
. l6 F" \% z5 f
6 k/ Y5 i1 ?# Q5 ?/ g, e& ~
- @- m8 Z# s' k 下面对这个APP的所有权限进行详解下: : K: s5 ^# F5 g) j8 n7 }3 s" G
9 r1 f7 O& G+ X, j5 q. x2 S; \$ z. Y7 Q y
android.permission.INTERNET :访问网络连接可能产生GPRS流量
/ i# V+ H( E9 N& G8 e: F0 d, l; i
: f# i9 }* v: Z) z
# ]6 d3 y) N' \. d( x android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
0 D9 }, ?( {9 a9 b & {) c! X8 L7 A3 k% h6 @
% `" c* u |+ S0 k1 y
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
9 |+ u6 s4 n5 x; G. {7 D2 `6 s% f # N9 o/ G) C3 T4 ^% i
( q& r$ }, J; ~. C android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 & c* }( o( Q7 B' r" i- h
0 P1 |$ S* m/ a8 Y0 [! d+ `1 Y3 S- c* F: z: }; A
android.permission.WRITE_SMS:允许应用程序写短信内容 9 j( \) i6 Z, k/ G- p
" D( M2 s+ z, T, V
* x1 S5 |+ h1 q' O& D6 D0 V( [ android.permission.READ_SMS:允许应用程序读取短信内容 ) q$ o* b1 t* H- W8 Y1 q
) ? o" v, j+ I5 c: O. B! |3 ]$ U& O6 ^( B8 ^- f
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
3 l7 l8 x# ~7 C , o* a0 e+ u, y% [, P
: w9 {# X7 C8 {- f- | g$ F
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
& q/ K( q k5 z, n* u2 L$ _/ q6 w6 z
; S8 u2 x% a7 S5 ^/ l0 i' p
' s0 C2 W$ ^+ c& e android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 7 z/ G# M6 ?8 K( @
e$ w& W9 a. G2 ~/ L
. a. A1 |9 j# [8 R5 c android.permission.VIBRATE:允许振动 4 ?- f# h- O7 j8 T7 [2 f
0 b2 ~. I/ r" c. d
E7 O9 h2 R. J1 T' U2 k android.permission.READ_LOGS:允许程序读取系统底层日志
1 ]) M+ k% c& e3 c5 F
a, Y8 y. e8 S# A* b5 J5 @+ s, b+ J. ?. s7 A$ o3 ^
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 4 T* m/ V# o$ K6 }* I, p
3 g8 y a- T B
0 W" w6 T+ c+ z
4 Y5 _( |" k! C# F) Z# e , S' W7 g3 m8 ]( J
/ r' m, b# a3 w
功能信息 2 `2 }5 W% U) t; L Q& j
" E) X! j/ D8 C% ~) B; E
9 B+ Y/ [% R! b: X, x! }
* X/ {. ~8 O5 b/ m$ T/ c
9 F6 }2 V8 x7 l! {* R- x/ a) k) p1 C0 }' V D8 g, i2 n1 s+ Z3 k( Q
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 6 `" y7 f( z2 K- F
# [' m! n# P" P) j* W1 p$ x
( O( J5 {% g8 `6 J$ E Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 6 R4 [' E5 e: s
2 J2 ]2 h$ {; z8 b3 G" `. {$ G# D# x
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 8 G" z G; I4 L i7 N/ K! e: K
9 P7 R! s* K3 C6 E9 y# m; o6 O2 `3 K; ?, k; |2 V. L" E
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 . ~$ R/ I( x/ L0 x
' ?" S* L1 f1 |0 L' m, X9 b1 x
* ^, M; I; x9 Y- M. @' D- y/ C) }
0 B, Q3 O1 { c! X- t5 C* b
- P3 z+ m0 R- t+ m; f
3 y; j) K$ X8 z* X& C1 }, n 2 p9 s) H" f, t8 q* G
" [% F3 s) }3 Q! T 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 1 E8 j) y$ g7 }" ~6 X
& ~- B( E4 r1 P0 M0 q+ J, v
$ d: ?/ E, s ]2 Z3 r0 H
; v2 k; ?3 o% }7 n
: B$ s L O, R$ \# R/ `0 L. ~- C1 |+ [; d- g8 f# S
( w: U, q$ v$ o+ b, i5 I
' ~% |. a- m7 t
% w2 a7 z2 P2 E1 l: d# e, E 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 3 n3 f7 b4 N% x2 D* e, t& ~" g
. [1 S5 q6 T l8 L x$ M/ ]( P/ f" I' t* P2 p3 p, h- w
% v/ e9 T! Y) z" ^3 Y2 ?) I
! @. b U3 }5 X7 D
% u! G2 N( ?4 G/ x% }2 P: p 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
- F8 g& v. o; k" S: n/ S
- O9 N% Q0 R; c% Z0 c
; h! a. [: R4 q9 K6 }: O8 B % B/ w8 g$ o. H! [; h
U3 N/ C0 G9 d8 l
2 _$ A3 L' S8 o0 I- |: Y
/ S f" ~- J9 W% N3 A* y7 U
2 e6 I" Q! i( s% ~- O) r: X9 z, B. }# p# T) P- ?& X& N
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 7 T+ N3 e. Z& \. t
/ P) q6 ~, N# ~' u0 B5 `# K9 Y
" a" f" C6 j0 w: g$ g
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
& i) S. X* v( ^2 @+ f# y / g3 k* h7 x# k. ^2 P0 K3 v
" D- q) ~ [+ b4 Z/ e1 ` 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
7 f+ L9 b' F; C' G ! Q8 P$ z$ z2 O- w6 O9 p$ F0 E
7 `4 D0 s! A2 g v; B) |* z o 开源的luasocket代码可以参考学习下
; ~ k1 m. {# ]/ m8 A 5 i0 E+ d8 ~$ `) r. K' U4 N1 b
3 ^1 L, B7 E4 x
https://github.com/lunarmodules/luasocket
7 | Z+ t9 S+ V * ]8 `+ ^( i7 a. n) \) D/ f' M
8 D7 Y8 k0 M& W3 u } https://github.com/fengye/luasocket " X, K3 V( b7 Q, M* R2 E( Y
& J/ y) t% A5 t! E+ S& B; r/ U
& u2 I. N4 K- G* M/ F8 E ; t* @8 o! a N
! c' o: ^% t9 M& V& U; G
/ S* N' X4 t% h$ v, t+ d9 u
- Q3 a- T- o4 D, D$ U7 X4 E# K
; _8 U( U S% K* r7 d% K3 ~( D' Q; O# F8 u
. c, i7 }7 q% N0 ^7 n
( O+ y# F( Z# M
, t6 w3 N* \( W" w: A* M- J
1 T( G* ]; s' |0 v5 y& q
0 L G: m4 h x7 P1 H% u: J; O2 M5 e2 C
总结
- A8 T) I/ W% }( C) i
/ r9 j" X7 n2 H* {5 T
/ y' N" W5 b- P4 t; ` 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 3 @1 r6 m* h! J* N6 P
; `- n# M/ w1 y4 u8 c
! j/ |& V- }/ ?5 M 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 . S; a! p# z1 X
- g1 ~# e" Z) r% N m% E8 g" Z' N! a$ {' v0 a: ]
对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 * d* E) d/ K% h G% A% q+ r1 z
$ d( x( l& _' {. d7 c
" N0 J1 o) K* n+ A6 j
结束
/ t6 A8 N. D5 j: U
" y& A2 {1 s& Z$ y+ V
9 ~# i( t5 b* _0 d3 x4 f 【推荐阅读】 5 @7 ?9 m; A0 f, b2 V( G
- m* Z( e' ?' ]9 b, d
4 H. f9 |# V. t: c 对吃鸡APP的分析 : R y+ h+ F# L5 g7 ]+ c
4 M5 Z' H6 u) r, W3 O; s
; V8 N# {; N/ ?% @+ w/ f# ^/ V 你需要了解的APP安全
5 }4 r8 Z! { D H . T( ^$ O# L& Q5 v: ~' _, j
# t+ `5 V, l7 { Q- o9 S8 a9 O% a
你需要了解的APP安全 3 Z0 c8 I# o3 v7 X# M% M9 t/ D
$ r1 c9 d& ^& e" w! w8 g5 R1 M; Z
, X; s/ X: X# a$ g9 {3 e |