|
1 l1 `( \) `8 | J( ]& x
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 8 P0 \, T+ @; k2 T5 _2 ^. u, T1 Y
: X8 z5 N Y' v9 V9 i
: |) e) ^8 j& W- j* q: t+ [ ) J1 T4 G( j& ]( N
" |3 m J- g7 \" P1 e
7 ]2 t! ]8 k, _& F b: O3 f8 m
" D! |4 F3 ~5 R$ x2 R$ m
# j! ^; S% s) t! u' U8 ]. W7 z( H% P0 D2 F
下面就以开发者角度进行解析下这个APP的功能的实现原理。
4 I1 b# z3 C2 t- E% T7 O p
5 c4 e3 O. W( ?' f& u' b$ c+ l+ \" f* I. i, B
1 U l% W, S& l/ q
: ~& @: d! J; B
" t" i# `1 Y' _ 基础信息
& q4 S6 C( H' W# @0 r
; K, S( ]& n! l+ b( P$ ?$ W: N1 E/ V, R5 A6 {" M& i
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
6 r# `5 J$ s0 C; [ , Q/ w& V1 a# \) `" N' d$ g
- n; B" ]4 }- r' k f& l" X9 \; V2 j$ I3 K9 w# f. G
$ ~- H# [3 a4 l" B7 R! C# o" ` {9 I* c1 P7 s
2 ^+ f' E8 y. J# h3 [* d
' T. i( T# |1 M9 y% J' `
7 K, S/ x+ T5 ?! V8 W 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 e$ N4 Z& o: `$ E0 u- C/ Q
; Y2 F; Y$ E4 ?" W( ?' x8 q. K) z5 N' P1 i. E: b# _, f
$ U$ |2 _; G* t$ @ 0 v/ b+ s- j3 L/ {) u5 U) i/ B
! H- s9 S3 Y4 v/ a3 b) P
9 S: R) C4 ~3 e! {
% y( C& I4 |3 T- D* D; u' P
& a8 a! f2 {% w( q, C 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 , ~6 f# r7 M) G7 G
. S u9 {( i, V6 O! n- ^6 `- \8 O/ R
8 p0 Y9 s! @0 R7 X0 r
* ~/ _* a5 w( B4 r3 T' p" G5 n
+ o0 |4 X0 A3 J3 i6 m- S! O9 I" z4 d; g* b, `5 Z# b. P5 N/ P
0 C/ l# ~* H) V2 \
! l' A% ~) W# T' S: R
# z6 R- n2 Y5 u! i9 V, o8 m 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 3 x0 D @! v8 C b& k* f
* c# H0 T/ x% [: q+ b
p& B" y* i( C. \6 ^4 I 9 _! E* P7 Q+ k9 G- Z
: j H% O8 `* B& c; E2 W5 e/ f4 Z, G( f7 O. k0 E# H' T; x
' o6 H. z4 o9 q" |' \
7 |$ T+ f4 u& w4 a# r
8 Y8 C, G6 ~9 g* |6 A$ e/ W2 k5 ~ 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
' W4 N/ n3 j. J9 D9 L. ^ 7 G* K6 \! [( Z. J( l- w
- Z5 V, r9 a& I5 I3 Z) n 3 C( p3 R9 o. Q. m1 e3 v8 Q
" D( g7 i! o/ T: W0 p ^& a9 A/ B+ v. q% M5 f. M9 \/ w1 L! t
# L7 J" p% G& A4 M, f
5 x2 K9 y9 P2 _ F' G" U: F, C1 U- |1 B5 {, Y; D
8 |( h- q, Q- k
; u& G" P6 y1 B$ k# c* r! J; _- n5 L: y/ }, m1 G( b
签名信息 8 X" o1 {" u0 }' l) V$ R) \
7 z+ u' Q3 a7 s3 r6 g* j& M2 x+ U! k/ y; `
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
4 ?5 |' |+ \& }. j) m- P" q 7 h# m. z& E% d6 y
4 r3 U8 e$ S, G+ T; D# q3 ]. F
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 ) `* D! [, Z7 ~# F6 H4 e1 @
2 s7 ?1 A- x9 q) r
3 }0 v# ]7 x; Y8 b$ n0 x/ @
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 ! ], J3 @8 w! o! R: W# _
! {' t/ F9 A$ Q2 c+ L9 z! j" W, x5 L+ w" a. R
! J4 a6 x3 Q+ O
* m5 g$ E6 a, a4 z/ P
; c* w" j: c. l6 l$ Y/ d# U
5 ~- G% ?& L" V% B# y
. Q- H0 n5 l7 a4 _7 `) c4 E( Y, l1 D" t8 d- W5 ^7 _ u
android签名的数字证书的一般都是采用 X.509的国际标准。
4 d. F) p" c3 p8 K% Y& i6 T
/ G* C, _$ r X, v8 ^) }/ t. Y+ Q' f7 O
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
/ N" P1 u# E+ P5 ?
( J+ w& I* ?) }" M' t& v
3 W' N- ]* O9 x( A5 } } 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 0 {3 |1 _' g0 l$ l8 v; C4 y
1 ]' L+ i# t6 _3 }& |8 i9 Z2 a3 J" r4 B+ R* D9 P
! Z! W+ M" A& M
9 L% N* k T/ F: V6 }6 { u: D7 B0 n+ X1 _0 w: g
M$ P5 l, S, d
5 } L8 Z' w4 Q, g: d
* e; u8 z4 @. [. w. k: S, t 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 1 d6 Y9 O. u4 ~; K0 f- Z
, j* [! ]* f. @, `
* S6 g6 r- y* L# v5 |3 k5 H: A
/ O8 L$ t% f1 I3 W1 `6 O 3 `' L. ]$ ~% R7 E& G
2 B( u) x+ T! {" c: d0 k/ |6 w 、
8 t' D. ^! J. y/ \! E
1 J9 E, k0 N' L
H! Y, K+ `* H: N( l+ U
# l, E8 y1 R }5 S
. S' ?( n% F0 X' K& f2 c& |( }) ?) b8 E
权限信息
! G- }7 G6 v% j. G$ \4 N
+ b! j) N( K5 l, A8 V
7 i- v- p" `1 S2 { ^ 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) 7 P4 S- U0 n `: C
; W* E4 O7 n {7 b3 ^
6 f# R/ O9 y8 J$ q& i2 Z& O android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 4 ?# I+ _& F, v- V; r- f7 h5 D, M
+ i& }6 _- p: T: {* ]3 D. _* f: l/ Y! Y, U$ Z2 L" A4 Z
0 w9 Q1 j: r) y8 I: F8 h& j6 c6 x
' @ i% t# T4 N* g) o
; N3 r" M# i O- t! X, _/ s
) p$ r, s( p$ G5 t2 ?' Q" M! J
+ K: U+ L0 o: p, _) v$ d
" k2 O& R" j* A 下面对这个APP的所有权限进行详解下:
7 A0 r5 Z6 S1 u( V: k, x3 h - A8 [7 ]: Z0 _- j* w# v; A
+ B% w, N' G# a9 l7 ?' M0 l0 v' m) ^
android.permission.INTERNET :访问网络连接可能产生GPRS流量 5 E. N6 {9 `! N% f
1 h1 }! s. R6 _6 b9 N
0 ^5 l9 s, U; u! J/ C# m c8 r
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 - J: P/ Y! a' h8 h$ r$ G
+ n/ e) l- l8 ]& K1 T2 b
8 p8 n# ?% n6 z1 r3 C
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
( [. d( c9 j' K8 n6 |( f
2 S$ S1 w- I8 _! n9 T' t) o, Z$ ~: k9 c1 d y
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
- v9 Z3 L/ N3 Q0 C8 c2 E5 S
# B3 H4 D9 c* N z8 Q) g7 D; N) m5 g; t& M7 |9 z8 [3 @$ q) m
android.permission.WRITE_SMS:允许应用程序写短信内容 3 Y& k+ U" V3 c! q
6 r$ }9 X1 t" }# X2 B! l i. Y6 W; Z
android.permission.READ_SMS:允许应用程序读取短信内容 ! F2 w; P3 w# `& g' p1 B
( U! d/ m- \6 n/ c& q7 ?' ?, A5 d) D3 ?" m- @. H3 K
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 " @; U, A* Z7 D; y
1 \( l# Z) E9 q
) z$ I' y1 w2 \6 \8 ?5 ]8 ~: ] android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 4 z' Y* j4 i: P, c9 p8 _* o
5 E7 {2 w- u( I
/ m" q8 p- F, x1 @ android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
: @# L( P& ~( G' q
0 f- Y: e9 d# _; R- y0 w$ g( M6 g% o" I# D! u- D! ]- [- g
android.permission.VIBRATE:允许振动 9 }6 m/ Y2 O" B: N, Z( \/ z9 N" O! X
: b* ?, B; y6 e2 t3 T& c
5 f$ s2 E3 u! p# ?' j$ \ android.permission.READ_LOGS:允许程序读取系统底层日志 8 M$ t2 g( L2 J! j" T
' E& z- F; O# s+ E/ G) r; q8 C' _
" Y3 [ T ^$ r0 M) z android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
) a+ R' f9 L, H7 ]( P
, a$ U: R2 x6 a2 U2 e: D! u+ z
4 i- M! H* E0 X m2 l 3 V5 `2 ?# e0 C( {2 M* K
- W' P0 e, T7 x2 N6 N4 w, j- j
* H5 y3 h7 ?+ V4 B) Y& a/ Y7 I 功能信息 2 E( e% z6 f" _% \$ [% Q
3 d: k4 l* e, K. Y& D0 U3 q
3 _* {- b+ K j
6 z4 u4 m# @6 X6 T0 L" z9 S* s0 ] ) w* q) m, n, s0 E, A! U4 m$ z) Y
# F% [, B( @5 o3 h. f4 ?# T6 [3 N6 y
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
5 L6 u, b9 E) n " D# z7 r% H) x% x2 P1 q& _
`5 ?: x% ^6 R) C Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 . Q- K3 j/ s+ N9 y8 t
9 R3 q" M K: N/ T. s5 f( V0 n/ f" j. W: j: m5 }/ L
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 8 ~! d8 H: l3 W& g+ f4 n
1 b1 F/ c) J% W4 O' e5 a- D5 Z; i0 i
5 z4 \$ G6 \* e% E: e5 p 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 # M- ]- {; h# g- i" s: w/ o
$ X' `5 S0 O5 B9 Z
( ]: h% r& F8 D; N
+ @2 ]" F: f6 i
' }& X0 q! `; E& @3 B- z3 S8 C, H+ z/ S( x; i% T' Z* j V
! D; u& j' ~ w
! B q! w6 P6 e7 ]. E
+ E% j* E- V6 ?; H. Q ?3 r 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
( ?$ {0 a T7 R & Y; R! u+ ^- T. C. G# ?: D6 _* u
) k7 s. }$ A9 B/ c$ @
0 N) Z! ~" o% Q9 j+ t& Y( |! y
+ ~: b) O& q [ t" @+ n) N3 S. y2 H/ c# n: A3 i$ Z
3 g3 R( q% m6 \* d( W8 v
T6 u4 ]( }* g/ `. h, I
% y! E0 P7 l7 `' R: ]8 h1 ^
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 7 r G; k3 o% D+ E
( t1 _* H+ d- _" n( G( I( m4 l0 |$ g9 W. Q3 U8 q/ f1 K# F
* C8 j' {3 m* k- M
, O: m3 ^" J- i: `
/ K# q O2 f! M# U, z2 R3 A' }4 d
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
9 T( a( s$ x0 ~0 }2 n 6 @) [3 o6 x- ^5 I/ b5 K$ d, o
/ l7 O& c0 W! f
, [4 z+ g& n6 a, \0 h2 r
: T+ w/ X) P- f" t$ S1 Q& V# B9 T( j" t
: E& Z4 C9 `* s4 A$ z
, ?: I N {: |- q; ]0 |4 u( q3 X6 s. s3 D$ t* n0 j+ j
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
: s8 y1 z. Y; O
2 _, J0 r8 v& C1 ]! G
" S. E* a# D! s/ H2 @5 \ LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
. X) P) B& s5 K& q
% X# m4 n1 B% U y# m0 s: b# `7 {% H2 H3 z7 Y& q! G9 \1 D& L/ Q
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
6 E: V! x/ w+ }$ K( o
7 K9 L) [8 j5 f+ B$ t: ^' t) t+ I
开源的luasocket代码可以参考学习下 1 c \- D% p. ]
$ b, a4 {7 C9 M! A& B1 }, Q5 M0 H
* e. ` {0 _, o" b5 R; F2 s https://github.com/lunarmodules/luasocket
5 B; Y2 N8 p# I, V9 p ) o5 y7 h$ b1 h5 D( x
( q; ]2 x- O( m
https://github.com/fengye/luasocket & ^6 Z# g5 W _* P7 C) P
2 \+ B4 k* J/ m' W5 z
, D! H3 a, o* F- h& Z5 ^
# ^8 r/ D x* t; y/ P
1 N) {0 G: L+ }0 L1 c
1 m' X" L( t5 S+ D' c
1 ^& w+ W, z4 c * V/ I [* D5 @
, l$ _+ @" _+ m T; D1 r0 N + t' ^% {' m; ^0 o5 C; b. f3 N
+ X9 Q) Z4 X w& \) W+ v. @9 O; E4 y* B5 i: S' U5 h3 \ A
9 j; w+ A1 K! L/ R 6 q) J* L% F) z
4 p* k) t6 o% j7 Y% a0 g2 S7 ]
总结
5 k/ n1 }& H' d* n. N
8 a4 x. x; y D* `9 c9 d! g, v
; p( _- l, ]! T' f8 B( e/ u 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 ( H7 D* _7 i* r& K9 A1 b6 q; h
9 ?9 W [8 t/ O
' E2 ~7 M) y7 c) P+ S q 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
) C9 q K$ H; Z+ U
7 V/ ~, T* Y0 l. v
$ h/ \7 a4 K3 [; j! X# d* j5 y2 k 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 4 k+ d. V) G& ^" w
% V. l. C6 m' |# n4 t& E2 i" `( J9 e( u' T
结束 3 t9 F4 T& d$ h' i' p
3 E( b! V. `5 o. d
# b5 ^. F4 b9 H& e+ H6 R' O2 H; r
【推荐阅读】 + x, N6 u8 [+ ?
* f# m: C( U" @6 R* R
, i |; j5 j' Q9 n/ ^' n 对吃鸡APP的分析
: F9 z7 @% W( Q+ }" z7 W0 c
. W; n5 b; y5 i& k
5 t: A- T: N S4 B1 h7 E- e 你需要了解的APP安全 ( B: T3 w& z) H
9 g6 |7 M5 e+ Q; o! j( ]* V: n$ J
# e7 F/ y6 _ T- W 你需要了解的APP安全
, E6 q) b$ @* ]) Q# k+ D; s _0 W
z: c# r2 r y1 \: `8 D3 ~) V5 b i3 K' x- c
( [& ^6 l) Y @7 d
|