|
) ]. g5 A5 [* j9 M. h! H$ z 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
2 ?7 y2 z1 o7 J( `# R* z: g ) R- Y0 y- v/ \/ l6 ?, f" v i# T
" Y3 s0 ^5 c% m/ n
3 c; A+ d+ W% v' U% \4 h! S" h/ } 1 b. K9 U% T. }: d* n- z6 Y0 t% R- s
: v7 A9 X8 V4 L% f- ?$ D 9 B0 A* R( X Q5 F
# ^# L2 p0 ~! [) v+ P, r: T
6 Q% A5 D# J D7 Q D2 `' r( `4 w 下面就以开发者角度进行解析下这个APP的功能的实现原理。 8 I, e' f. z( A
) c: A7 V, f$ X
& a8 S: a" f5 p: X/ y3 {/ Z
! B$ e ]( Q4 z9 x7 S6 i/ Z# I # B1 C* B6 j9 P7 O4 O7 x9 t+ u& p+ M
* b2 k! ] U6 y: i 基础信息
: P, l/ u; c* ]; K) p
# e0 \( f& _3 S& B$ Z. t0 {
3 `0 L; T2 v( o- x8 v1 v 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
/ f6 Z* Q1 Z3 l
' E! Z$ b, [2 { c+ ^6 _5 H8 S: z% q {* n# u4 O% R+ ?
/ i% `# o) N' ^% X
) n9 E X8 O. L4 y _! u0 A8 ?3 d8 L( }: V) h2 }3 S
3 g4 \- { |3 M" Q0 K
+ m, A4 K9 O6 q: G4 ~8 _
5 A4 ]3 f& _& i# u& c4 U- A 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 # j' E3 F1 {+ z
: _7 a) \& ]3 U$ P+ U) A+ _
8 [* t4 p( s1 A. W* V
" z! A, {( p0 ^- h0 l5 \
4 X+ v }7 X7 C6 E6 @0 I
3 v& m1 `+ n, r) ~/ P. Z , X8 J$ v8 I- C* F
- P2 y2 v. k- C4 K3 f" O9 T) ]
h; c& u1 g% M g3 b
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 6 @/ n; D, T5 S# d# o0 p! {/ X' ^+ Y
8 q7 b* D3 X b, \3 G: G9 n8 P$ X7 U- ?8 P: F
8 S/ F6 \+ C4 [. I: y6 x0 i
/ n9 A0 x1 w3 M1 W" U/ \5 p! s+ ?/ \ N
~5 I6 P% ^' y8 F6 D* u G _/ T. Q1 \) }" q$ r2 q, W
$ M4 V; G$ Y3 N4 n
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 * k0 k4 F8 _8 V8 u
$ q- Y2 c2 l/ d, @& d- p: M
) F6 w( u3 j, [4 o% R
4 E3 [- \0 V# P) m) Y: ^) w
* ~, c& M1 w9 f7 e" D# }
. P' a- I6 t: w( P1 \ ]% Y7 c1 F `4 L% V1 W
, T1 s, _4 D4 E, a* w0 R- h9 G+ m4 H l' Q6 ?
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
. i( E4 p* Z5 C8 D
3 n3 w/ I( R- b: d p! @+ r8 c9 I- d
9 x9 `! Y; r) F% N2 v 2 _+ Q+ c$ @0 |
& L4 Q0 L b6 h
0 R2 ~4 x/ q+ c# M6 R; K
# g4 l; R/ K* ~# t. |7 Q" R
# B) q, a1 A6 ]6 e3 ]$ |
' O& s6 ?/ E4 H* N: }- G9 K: x$ F
$ G6 }! b1 N$ z8 d( ? . I' C3 ~- w- X' T8 G
' @; ?% K6 }( r7 c4 W 签名信息 ! P4 o4 ?3 u6 a1 I @
1 r, Z" ?( [5 r& ]) c1 r( k/ x; V- p' z: R: k1 a( w
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 ) s1 ~5 f: D5 ^! K" e
& e; F% j; l/ B$ w
) k' A. l5 _ Y
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
/ K. A$ q+ m1 X# V, k( S, a - J, R2 P; B) t5 @2 w, H+ N2 C" Y; j& s
. y; i7 X0 r0 G; x
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 : R6 H8 t. V) w
0 l0 m7 _& u: }& f E4 S* w8 a% y* W6 O& \5 {' |0 v" C1 d
. L& u$ R# {$ K% Y: a7 `5 `- J
, f, b' Q) C2 d2 b3 ~* v& j' q3 U6 J6 k' `% Y- V6 ~3 k1 R$ z+ u
! r2 Q8 [" m+ a. X0 K; X
|9 q4 p. |% T0 Y) Q5 }
5 a; w" k5 o) U2 d
android签名的数字证书的一般都是采用 X.509的国际标准。 # K& m2 p8 N$ b
$ a; l5 I, N. S3 R4 J' B
3 B" i% a' n2 ~, q) D 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
7 t2 y D8 V. c& K2 I: ~
- |/ Z, L. t T: A
/ x% q. R) b+ S 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 + q& z4 k/ ^4 m( I$ x
- z4 b% Z' n. j! b, [3 @4 l6 q& U
+ _9 n' H. W' j: `# h
+ F4 Q" m8 w1 ?, y z
j3 Z0 `( t) ` L( ]. Y3 A0 V
8 e4 q9 O0 U7 F $ T$ L D+ S/ D2 `2 h3 B$ k( \
$ c8 o6 q b! M
- d" L7 @' {, M" ~8 w, W 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 ! b2 h: t1 S/ Q
# e4 r$ \ a! s$ F3 b1 J; p) e
/ \/ _, c; } R6 `7 C6 p' r/ O$ Z4 _
: @% r! a3 h1 [* A5 l 0 B [/ \# ]1 M
5 }( p) Y1 p6 ^, h. ]) J
、
3 B: D) d% K+ `) F) X+ w3 t: B 2 m% \" u, q i" {# l
5 I% _/ a/ v5 c
# ~- q G |7 H4 R: x/ B* O
4 R: Q2 t0 W* i( w6 \- r
9 d2 h7 R h6 ?- [" L1 k 权限信息 2 `3 ~& n; M" v7 b/ s% M
I, l; U% V$ s. ]! y2 B2 q
6 M! x2 o7 F2 K 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
' L3 Q5 I; d( [( b; H1 W! ^ 6 @; A& \. G$ c
2 ]3 z" k7 @% Y W* q0 w% q
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 7 e+ m. T# d0 Y, a( h/ n" Z
8 y# C' D4 `0 S! Q5 L# W
9 p3 a* v, u) l- D 4 Q4 @$ Z6 s! g+ B
: E8 I# {6 y9 n' u7 a: L" {0 V1 R9 ]8 W6 u4 K& g X$ j$ v* k! M) V
$ }, l5 Z5 M4 ?( l" f
8 x7 I7 S# e+ f: U2 z$ p5 c7 n2 ~8 n% q
下面对这个APP的所有权限进行详解下:
, a0 |7 E# A$ \! O / z: A4 e, g# O( o- Q0 X- c
: ^- G! H$ x. ?$ q+ A, y
android.permission.INTERNET :访问网络连接可能产生GPRS流量 7 T( h6 Y n8 ^9 G0 s- V
1 N$ S1 c4 i# e0 F& E
: O% Q% T' L7 M, w4 L" H android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
" ? c* a% M( m, E2 ~ 6 g1 F6 ], S5 w. n) _3 m/ R L
8 P- ]% K; n2 _7 i4 H, g android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 * o* z, C. E: x' k8 I+ q
1 Q# y! `* }: W# e( N( D$ P# Q: k3 }/ L: J% m7 k1 |
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 4 z$ o- o) ?5 b# g2 N
. F* |; g( l. g# a. D( v( }
- Z) H8 \4 W* H1 Q5 F( k5 Q0 @+ h android.permission.WRITE_SMS:允许应用程序写短信内容
& R9 M9 A/ D& l+ ]# X. c3 H1 v. u 4 e: e4 t8 b; M
1 U0 o9 Q) W9 M8 w# z% j
android.permission.READ_SMS:允许应用程序读取短信内容 : R9 O" e$ J. b% b0 @0 C+ `
: g" ^" X3 E# |* Z6 w$ R
( S1 U, j h9 O5 o3 E* ?7 U. r# ^ android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 ; I+ y1 e& q+ v/ V9 F
/ y0 ?$ I0 c0 q, h1 m
2 w; |; @2 J, j; `2 C2 ]* } android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 2 F, S/ D8 n4 v- `6 }
) l3 o2 a# ?% k
3 p& ~3 N z: p+ T2 C8 \
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 0 F8 ^, N5 z; _' N( {6 E
8 f3 M* y( C7 `* B! O2 d7 Q- Y8 w( l3 Q1 ]! R3 U# y9 ]$ R6 t, c
android.permission.VIBRATE:允许振动 ' B/ G$ B) g6 R4 r$ H/ L
4 P6 G; k8 f, T) l( u
( o3 I5 z% [7 e! o- f0 z android.permission.READ_LOGS:允许程序读取系统底层日志
2 r$ Y5 s t/ s( L. K
/ `+ C7 ?' I- `% ~, s& ], \. s' w
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 4 B+ Q4 n/ ?+ U- p ]
: r0 |1 n; b* c4 {/ F
5 ] S( |7 t1 m. `. T l1 [
( L( o! X# c; u, F, a' @; t
# P4 a! w: X7 L" q+ m. I
( x6 {" C1 I2 b2 L7 r; [' u h
功能信息 1 B W; C2 W# F
H* [, N A! H3 [ ?$ Q
# I# \* R- x/ c5 R
9 w1 _, c1 Q8 I6 D* X
* S' n# c" L# c. y' v" @
1 ^' k: K7 K; ?. F7 C 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 + a. _8 A; `# [8 r: U& c0 ?
; X2 x' u+ d0 s. i* r" i1 }
4 S! c2 Z5 X& b7 F/ ] Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 4 h- d) {! i% R5 N, ^& r7 `
- K$ G; h8 ~8 D3 V" @$ `7 P
: L% n" H; c2 i: q& b 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
3 F! b. d* M7 O) S/ @$ b
; [& D. x) r8 i0 m9 {8 X/ Y& R3 w7 m
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 8 t( {/ Y+ K4 O0 ]2 y+ |9 X- }
% O4 C2 x, M7 q
8 F2 \, P* l9 O
' n, y0 g2 ^% g0 R3 u% q4 |
~ _* P! ~( U! n
/ B' Z. Y: J( R! F" A+ R( x
% n4 q5 Q' D- l0 ]2 c
- ?: e( |# W& b2 R. J7 S6 n1 t% Z3 a) o2 ?. n7 `) r# S& L
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
p6 g6 p! L- Y" @4 P/ I* g5 v
( g" W- [, p! b0 H1 g3 v+ z0 V2 l
6 c- {5 q$ H/ K4 s" A# E 2 k; L: h% V+ ?/ j# c
6 K+ Z" y/ |5 S2 s+ v: f* x
0 d. K; u& T& K. {4 ]
3 p0 p* b6 ]2 O& |4 J9 |$ ^
( R/ Y( a* V- W+ M% O0 z
) a7 ?( C, }: i 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
! o6 H' S' u7 H) T( w
* P: R1 L( ?6 H1 m2 E* `9 _8 |0 C- G. O- Z7 B7 F" {6 P
5 ?# e+ Q# e2 j/ w+ H2 |
5 s3 D$ @4 A4 @3 x& K1 j) l
! i5 v. R Z( L* d 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
1 T) ^, h2 O7 W3 h
5 L+ C$ i5 F9 D2 L0 y V9 J# R( I$ ^
, N/ M. Q& ^6 [; Y ) ?9 b$ B2 e9 V; \: g& h
7 g9 K4 f2 {+ r! M& v6 ?7 F9 l0 ~- ^! q' H/ c" \; h
) G x9 J2 f* d- ]/ n
4 d$ J( M G/ M6 N' b$ [
* K$ j* w. O# z. X 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
+ Y7 K- o# O4 @+ B8 r9 d3 N: G
+ `% k( n+ O6 R: d- Q4 l; c+ n% H! O7 V( G1 \
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
; m# x' B# l$ ]* E5 M, V: | " M0 d/ D1 e/ P
& \+ o! Q* W3 k5 H3 W6 i
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
: n: d' a7 }, Z5 ^7 v* V& j0 E2 v " s$ g4 z6 s8 ~& C7 ^
3 W5 S2 E# _' H" @0 k 开源的luasocket代码可以参考学习下
3 v n9 H g& R- ` p4 Z4 p/ [+ _ 0 C. d3 T$ [& X. m5 R) I. L
e/ |+ b1 Q9 r! D https://github.com/lunarmodules/luasocket # H8 d5 X8 I$ S g
9 i& N. B+ a+ D+ C! n
. w# V q( E9 E) J& c https://github.com/fengye/luasocket / z% Q3 z3 W6 z) }
7 x* w1 i/ j9 o% u2 k
6 @8 u# @3 N4 _$ D! {; ~
' _6 @9 v! M* U* c
: F: o8 U. u' ]+ |$ J3 e
3 Z3 [) ]4 O, u$ R' H; ?* h
8 R; e: j8 P" G4 |# n2 W% v- Q
7 _* r' v4 K% `+ o$ Y/ r* N$ E1 G1 h7 K, X: C0 e+ Q
) U$ x% p* @9 m6 J: S
0 T5 t, A. \$ o
8 _/ N6 u2 i5 E" P
! _6 l4 s; k$ w3 k; E2 Q: ]
" Z# ^5 {0 Q& P, ?' a1 D% O, G7 d4 L
总结 - x0 D. T' d. A; y
: ?4 _4 h% D. @; F4 }" ~1 @. E
' @; z* Q* h1 } 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 7 v, g9 A2 T, z$ G& G) u
3 l( \: \* c" }1 d- p3 T; Z0 `: ?& G3 K. F9 l6 P0 N4 {
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
; t/ a: I6 a) z3 J 9 R$ u% g" B( O
2 t8 s! s- k6 {$ b# Q
对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
0 }5 _: `$ B0 l* T6 r4 X) F% a ! W0 r4 M9 z& n$ H) T
# x. U& t0 z6 y+ s" S e 结束
) I. Z6 V4 \' r4 j3 S 9 ]" ^- w) t4 Y, R( ~+ {
$ P* d& z Q, ?9 j8 g
【推荐阅读】
: }, G+ T8 @8 u / P* p( n7 q1 b/ R* L7 }& u6 z
! R5 o. @8 N" m/ o/ Z 对吃鸡APP的分析 - m6 n5 u" M/ T+ \9 y# ^# B% L; G& X
" B% m# ^8 m* G/ ^( i9 [ g
4 M3 w) s8 C& G' T
你需要了解的APP安全 6 F F% G3 \2 ?/ U, p2 N. H% y
3 a6 S8 V& H* H7 }1 q
2 x! j& \5 _1 B* {- g6 m; M7 U 你需要了解的APP安全 & ~8 s' J3 \6 J3 h' r0 C e- C: e
/ a; M+ ]# q( ~- O! o8 n: C
) z- [: K; B, ~6 n" [1 G' f
! o: Z* ^6 I3 @# C6 _" C& E, ~ |