4 J6 b) J- \, K5 U/ q
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
, O& {: H* a. W# i! s# |
+ b# a- b9 [ \! t# b) `! l5 i! W9 e5 u1 T; }
! I2 v& \! y a- g+ ^& N + l7 ?4 E7 ]0 j! r4 ^0 w
7 ~( q8 X. Q7 @. B0 t
3 g y& R! K- ]# C$ S7 [* p
7 s) `2 c/ a, f1 g( y# c$ H
! z$ F Q; u2 F& H* L 下面就以开发者角度进行解析下这个APP的功能的实现原理。
4 @8 H+ ]) `5 f2 H, f
5 O1 G8 L! N! J6 ~! t3 {8 H# ?- g* O( o0 v* |* x# J0 {: Y; e0 T+ ]
1 W# S" _0 d2 g( _: g, k
K6 v4 H( O y- g
4 j Z, W0 O2 h, ? 基础信息 & c1 f" G. l& r% }, s1 q. x; p
3 @3 |" Y$ r+ D, {
4 s: y4 m; T7 p' o5 W- I1 W6 k 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 0 s6 H# [( g, E4 J) Y( ~' m
8 J1 Z3 @: `& G4 u# X6 k1 Z
) I* U# z+ g6 }2 x
% x) h- @4 i3 V9 O 0 j5 @( V: W6 ~! N' F
0 T# T! [" I) Y y9 p4 B1 S
$ v! l' G! J: S- ]4 `: V
8 i8 S4 `) G5 V0 q5 F
9 t0 Q+ |6 @" ?% T7 j! ^, C 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 1 v! v5 C( W% d: w* M
) Z+ w$ ^+ _, h
/ Q Y' Q, m/ ~0 s6 C i( r! `9 |! t0 G0 l
. l5 j; X& _8 Z; T7 p m, k
5 p* n6 Z( Y4 F, h' `' H
9 `% m9 ]2 s$ q9 y) W- P6 Y
7 |# I* ?) R; T8 y6 F
3 O' h0 l: d/ \1 `0 L9 m 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
" l1 O' B0 d* {; p5 V2 b/ _
! n" H. X# L4 R% X1 |
/ `; P8 h; w7 j: x5 E ( w# P6 b. ?+ I- o' D0 H
3 T+ r# ]- L4 a# B8 o6 \
' U9 a5 e0 X& A& G 3 M; e+ H9 W; o, W
9 J7 y I% d7 d
9 S* a1 |! W5 b: r, J) d 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
, e" s' a* q* n5 H/ ~
, ?3 }7 ^( d2 [+ M! c9 Q" |: i% H& ^6 F
: f, z3 `) l1 {1 l! j6 [8 h* t $ n+ n8 h0 I4 l: K( A- n
. [$ c* o0 G$ [. _# L0 R# M9 w' j
9 C* S4 u2 F2 O, c * |% U" I7 Q+ q1 T- x1 m& ?7 j
: w7 X6 x7 H% U% l1 k& G6 d/ z' t. t. x0 K5 c- r! ^" i$ ]
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
* l8 D/ h7 _5 e Z3 w : P8 W% e$ p8 R) p4 V5 Q; b
! }. T* a4 O: G3 J6 r1 g9 q% v9 @( {& A
8 t* o' T7 b- V: ]; c0 M
: M0 e/ U, D: m8 ?: j9 U* ~; e% ~
9 E# r P! R: | 6 E0 n+ {: K, h4 K- P- | q
4 `) R! ]3 I, p) h& Z+ K; ?- y
, S" y/ u. u* p$ B; V) c: ~
: T! ^4 o$ d' L. R+ \# V3 W0 r
6 I3 l9 Y3 @% {/ a* R5 f$ g7 h% f/ Y" k9 \- ?; t
签名信息
$ ^7 @. G7 O. A& ]( ?0 W8 Q 6 X% [. e7 a. U. o& t6 A# m9 i
6 x! C; x" z1 T
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 / G" b. j# @: g- y" k0 |
3 X4 x! {! y. k: C
, s. M' m! c3 o. ^7 W9 N7 \6 k 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 / }. p; Q! W" r; d6 ^; T
9 K* h, j& t7 v/ i6 K
' d* U+ e j$ X5 F( b. P# @2 t
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 $ S* G' B2 C' R! @/ P4 p0 ^
( W, `: K. i/ Y$ M+ [, k+ }* S/ j- @+ s( `8 p" c! x
& N6 H- K" I2 `
3 ?; B- E% q. @' {# @3 N6 Z
0 {1 u0 m2 I$ y7 `$ g % D; n' O8 y* D3 ?6 w9 t' \
$ W! N+ _9 M# v& O, \. r
4 a# Z* { |; m" F/ b( ^ android签名的数字证书的一般都是采用 X.509的国际标准。
- _; _* m$ Z! |6 m" j \' K ) n- P# \: I0 H2 i
# w2 f: e+ N, I% R 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 & ]" x/ }& }- K
8 B* ^% B3 f( _, I1 n
! Z$ V9 \ y) q+ _3 } 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
$ O- H- a" u' x0 f - D- B3 v4 S$ ]* W
3 c0 b$ K9 t3 \1 W A" ~
% c+ B1 A: O3 o- Q0 @& H1 a7 T ; v7 h5 u8 A6 Z6 D/ t
8 f, e- j9 O+ k; N& P& b9 ?, b
$ w/ ^+ S5 M5 A# z 1 {; [: i$ q2 ~
6 m1 ], I! Z1 w/ @. F3 {
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
: S& f, N! N) K: }! W3 Q9 ?# d
' C- O7 i6 B- v5 b. v! w3 G6 v. o$ Y& U8 F2 f8 P6 U/ \/ _
$ k% s5 O7 s1 [7 b- _
3 e# ^7 ~0 a4 }6 I0 e3 `5 ^) E9 X l; l3 N0 j) C- J
、
4 _, ~1 [3 b& `" B. ~
1 [, v: V4 V$ X! g$ e5 @5 ?4 N6 x8 N3 T7 [7 d6 }) x$ w/ f w
9 H! E* ~& X, R. j- G" D9 n
" E& m; f. O' U' I
8 T. v, I `- Y( C
权限信息 8 j9 G6 {1 v2 |+ ]
: Q; H9 ]+ ^/ o6 |# C! u
. j6 t+ f" m2 D; _
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) 0 C+ A: j, _6 @* Q8 }2 K
/ q! b4 O) B% b4 |% K0 I
. I* Q7 Z S0 i( n; o. y
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 5 {, g$ [. K( J' g+ P; E
9 Q0 \1 R; l( `
' t2 g( K. g2 m/ C# n5 J & w; _0 D$ u# O3 g! ?
3 G+ e7 I) Z/ x. J0 q7 C: S) r! W
+ ?$ p. {, m- t# n" M0 _
6 r# H, O5 y2 t0 U( E; c( P$ k % L( T3 F3 v+ R3 G5 ?; @
1 |4 x5 t" o- [/ M6 @ 下面对这个APP的所有权限进行详解下:
* X$ s/ q! b2 `8 u4 @: J
. M, [* L9 Z U6 P8 {. m# S; L! Q: n0 [1 u& t+ s8 L& {+ g1 H* n" g
android.permission.INTERNET :访问网络连接可能产生GPRS流量 ; Q0 l6 e- e0 D8 W# i& \
+ ~+ G+ C0 e& i% }+ c0 x: T
4 |% B5 i$ ^; o# s' m7 ~: }: f1 ~ android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
# u8 j, J" H3 [' L/ \; [6 _) e0 x
2 ~8 I$ Y) h5 g% \# h. r1 P. {9 t/ ~! z. \3 G
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
) K- G' r3 k" K2 Z0 t. A' J$ b . P5 @! u4 j& h5 l( V
$ R# R, T$ Q6 E! Z; G
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
" w D9 Y, }9 I8 x! g3 x . r- e* j! @9 ]$ P$ X+ Y
) U$ `5 i5 S- O: I+ V | android.permission.WRITE_SMS:允许应用程序写短信内容
1 O' f) L( M. j8 F: c0 S; E( S- P
$ r$ K2 O; }5 h. @, b1 X( K3 s1 p
5 b% n! R( Y, T+ ?9 V android.permission.READ_SMS:允许应用程序读取短信内容 - r/ S; _, [1 J' }5 L' {
5 X) U5 Q8 C9 U/ Z) P8 ]
% I* r1 ^* c: d" b* a" ] android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
2 |3 _+ E0 q) R: ]: i. {% b0 x
9 m6 F% `& c! i Z- z1 {- u2 K! d# k( y9 Y$ q1 n- c. S
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 % G9 m9 F* i. U' N [. j- F
6 |8 M, I+ N& \9 _2 I
& k4 \" T- F( _5 f6 } android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 3 k# ~1 U; B% h/ ]0 h
0 [' k! L% o' {+ V
7 A+ [# R0 r6 k# ~- [; l& c2 F+ K
android.permission.VIBRATE:允许振动 2 l9 {# b( J9 Q% {8 r
& s7 f; P) G: j$ m. y/ o4 \( V. O" z, _1 `
android.permission.READ_LOGS:允许程序读取系统底层日志
9 v5 l3 i& N, O4 l
8 [ [5 J) k4 p0 `5 y1 Z6 f( S8 ]9 R* H* f, b1 T t8 \5 ~" |
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 & ], ~, Y/ B9 t9 _
& M& D. g j6 H5 S* h4 f
6 k9 C/ W; E0 w1 S4 Q+ [
2 c& W/ b. ]5 W+ o' o' _3 D4 @/ x / b9 p. l0 e+ x, A" _9 N2 V# G' Z
9 W: D5 n' x! q4 [* b
功能信息 * A* B; E' \; f: P
4 j2 j4 U) _# j2 Z$ X' M# X4 ?' Q/ E! C! `5 L" `3 X
& s \' N3 M, G Q# |$ @9 E: U3 Z ' U/ x5 R9 }- z
+ R+ E7 ] B0 N 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 + _ d& j3 @9 a4 E- L
* C& B, W7 ?/ Y8 N D$ g4 ]) R% I- e! r c; `, u& M2 p
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
: g8 y3 p5 B1 R$ x% C
- u# Y3 t7 u% K! @. z: Q# G$ C7 t( t/ b" i; j6 V
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 9 b4 h Z1 @9 }+ A( `6 Y
/ D: s$ F1 r# Q5 E+ @5 {' b4 {* ^
! d, |0 B3 p7 U# E. U& f- x5 @5 j
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 , O3 w, S/ ?( V$ l% u( C
2 l- W8 ]% h& X
, S, g x# ?% o }% H- C6 n , N( u. G! a5 d/ ]' l& ?0 G, U2 Z
! ~0 [) I+ ` p T, b9 v( }% Y3 b) p; I9 D/ ^! I4 _
# V% p$ o, [& q, X9 l' c
7 G+ C- a+ C& ]- d/ D* U$ j! G" Y& G6 N9 m, h8 i5 d
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
. G0 K3 n6 j, I. ?' k! W4 J $ a1 t& U/ f" A& c, V+ _4 P& V
5 ?: q+ _* X, }" z$ N
S% O6 | ^7 I
, D" l. a6 ~( X' ^6 k* `( o! `! C1 ~1 F7 T" t! _
: Q6 U/ S# z) C
+ Q0 d( f$ ^( S3 S# x2 g$ ~/ S2 j* y D1 B5 }; L( I
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
5 k: B9 I3 p; e0 @4 l
- X( ~: h- w5 `1 }5 l+ H$ R- o/ k- n7 T
2 c6 U' ?& N6 w0 _
, S8 _& z' x) \ |4 i8 R% p' u/ k, z7 Q0 H; @
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
5 @ W. d+ `6 X5 r 1 ]; a8 L& V0 |% {: `* l
9 w8 R1 b M- }4 m* y
+ |1 V- R+ a& R) S' p4 U
/ d% k' i2 K" I' I
3 ~/ V* F- u1 {6 W$ C
- D' v; R8 j" |0 [$ D% A: k/ X 1 T5 S: l: D. ?0 O' ~& F
/ X- @$ A H1 V% O
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 6 T6 g! E* d8 {6 i. j7 J
) a. u3 j- R; L, i+ T
& p: K" o) A @ LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 / r0 I0 @5 ^) N: C2 z1 v. W/ A& N
: c; S+ ?2 ^6 j+ }2 V
1 U+ h* i' z: t V$ A, n 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
3 m' U+ ^# \& h 5 \: K: t( X' I
: X+ a$ B, `8 b; Q& C1 _ 开源的luasocket代码可以参考学习下 & \3 J& E+ ^) h" Y% f
/ r' H4 ^# o6 i" M* ]( ^8 w3 o
8 z5 C: A( ]# k, M1 g$ j0 Y https://github.com/lunarmodules/luasocket
- G( Y3 [% V. E, k8 m
8 [; l. q0 o7 d; f# b9 s' s8 F1 p/ N6 ]/ J
https://github.com/fengye/luasocket 0 a7 W' `- t' ]* k# O/ S0 y; L
' G, D2 c1 B% x+ h, c( x" z
8 {5 n$ J) a. A/ N" T 7 F* W$ m8 @3 t' f
- o& I8 k( R: U4 m( p( l
+ p$ {6 ~7 r$ @" v, `5 ^
6 Y; P" F1 W7 m. T1 `3 {5 h/ ^5 t
. ?. B4 K' W4 y) }2 Q
- p, V! y0 ^4 c
$ j6 y5 R/ q6 T- K2 E
* A, E. w5 K! d: r* }5 N
4 F" m1 ]- e8 J& w0 S5 y5 e & g, |5 w% W- o1 |. ~* c4 E
M p* c C2 M" [( J0 y4 S( f* f( v! q, ]
总结
- b- `9 z( o+ M4 q3 [
1 C& c& f- N3 y2 ? H
' |. |* X3 {7 D# G 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
6 y7 l$ J% V3 V4 r
D0 j6 X! N: P6 M4 x) L$ H+ E- z6 T" r5 ~+ X6 Z
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
, l* }; Q$ o l4 `# ? 5 Y* z% z* c& b7 D: k7 l b: `; N7 A
& E! `3 [6 F9 X2 o7 z* I 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 2 }9 |! L1 h) M/ E8 r6 P
! u( `/ `* G# u
, Z. N, G5 u, o) r- N* T
结束
0 i$ Y' q) x3 {# k \2 ]2 g8 U
/ g1 p3 [4 y8 H8 Z7 E5 }4 K4 u& | a4 `7 F4 y6 j P
【推荐阅读】 ! l7 t9 `! |3 Q' w2 k3 `
8 W5 j& A8 P! D% u0 q
7 [. n0 e" m9 P& I- q# f. } 对吃鸡APP的分析 5 a8 p3 K. C$ A/ u8 `# f' R* [
9 o7 M f2 @# [% A) ~3 g% G
, Z! }! G2 m" F4 z2 Z3 X+ _3 s& T3 S 你需要了解的APP安全
3 z9 O( y/ t7 Y# k
9 U3 U1 M& S/ I7 e6 Q
3 n- a$ V5 i. X9 H/ j 你需要了解的APP安全
" N2 S9 Z0 g ]4 Y8 K
, u. }+ d, h; z' U+ y8 V0 D4 K8 D% U& m
/ M \6 k! d# l& p7 h5 ^ |