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