|
, N$ `# D+ M. C$ ?0 k/ C# ^+ C
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 $ E5 ^3 q/ g- Z: \" T5 H
2 v7 E! i5 B+ V: Q* ]: p- ?5 F# r# H& ^& D
# {+ R4 L% Z3 g: Y8 S
) p8 T6 Y& A* Q# A/ q5 \8 ~$ }( R- L+ u5 Y0 ]6 H
$ [9 }+ I$ H. j5 u/ ~) } 8 R. Z' I( x$ U# r. R
- o& s* m8 _, R2 W 下面就以开发者角度进行解析下这个APP的功能的实现原理。 1 `1 \* F, O, ^2 b" E; o9 ~
5 S# Y+ y2 C4 |7 m4 Q0 n
2 h" T# m( X6 [0 d ! s0 r4 ?' D( v( H
, p/ \) w% ~ g8 H. S4 K% S
a; Z/ e5 J. h- I, n6 W+ l 基础信息
6 |" ^2 H8 i: C, @- F' r# x . u' X) T. Y" P/ m9 V
7 W1 ?/ q+ t, G" W5 z3 q0 C4 E6 _. g
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
+ \+ P' {/ F- b9 o
. D4 ?+ Y- Z& K- }
7 J3 ?) Q# d% s4 z! R
* J: G2 x7 W% {# u8 B 1 h5 h1 u3 K' j' O+ B1 `, e
& r* U9 d# l- p- K" A- | 8 y1 M! C5 G6 y$ k
0 P* K3 a, U1 j: K- n+ l( Y
9 C/ e5 b6 j# A5 I* e/ f4 f) `2 H 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 5 ^, ?! p7 W: { q7 g
8 U- _6 H+ \4 z1 |/ e
Z) Y5 R& v; Y) }: v2 d9 S
$ [- \( P5 j- B
* V9 _" E: x+ z, \8 C; O* D i V, F) B& \+ X1 A
# ^" A+ k$ A- l9 x
8 Y' B4 p* D5 }5 z% Y3 F; i3 Y9 B( f6 _& p4 s- ^
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
2 y$ s% ~' {# @ 6 r6 v$ ^+ D+ p7 y- f& K9 h
3 U8 \4 m4 q6 r3 C9 X: C
+ \$ z. ?, K/ p* f0 }5 n 6 {# ?1 Z! s5 K; X$ x
( [0 Y$ ~$ q+ Q& i5 d
6 S6 |0 p( X8 v' g" k5 Y E# N9 r
5 t* b, ?, c( F, A; f$ e/ K! i3 B" A: g' q |1 l. t& {/ s
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 4 x6 [; a/ u* ?- T8 a2 l( B
4 M2 f, Y2 M, u& X0 d2 E; W0 _3 p# ~
, k9 G" N; B% \( x* ^, h5 B + [5 y3 e$ J# s8 Y4 a. C
. @ S: _3 H: M9 h8 p
0 `( q" e& h6 q$ w) Y9 J
: l) H- l) E( J4 `8 H8 x0 E! N 6 z' R% ?5 b/ R9 x3 `
& C0 ?, y" Z' G6 L4 J$ k 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 * I: s( l3 Z3 }5 ]1 e+ ]" z
6 @/ ]1 @! }+ N% x$ m- ]) H1 j6 ]* u x" @1 s/ Y0 F
7 s: n5 Z- `5 i& f+ Z
2 x% P( K4 |" S/ F& `6 k
# T! L( G! x3 q! h+ W9 w. P3 P
' E1 o* |8 i: p' ~: C
$ s$ b- ?/ [; V$ B W* ?3 {$ S% S& y, g5 U+ G$ h$ {, ?+ f, Z
8 g: x+ |5 N7 q6 U) G) h& }! x 6 F1 S$ y( D7 W( o0 z5 j9 e, z3 l& p
8 |! q) z6 ^! o! {% W8 w 签名信息 % Q1 @$ I9 Q1 F) K0 `* z
) u E0 M# W" c& L# R
% r3 a& m, l) H b' D
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
" ?+ r+ Z& P9 m0 f % v, \. Y! `0 A: W6 A
) ]6 T6 t( E' ?+ h7 C" g8 l8 v 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 % M3 O' j c" q1 T6 L
4 ~5 ~+ x- ?4 H' e6 O: \3 S1 _' K# @ a1 L! p7 L' c7 m
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 7 L1 L: X8 g4 O
R8 D9 Y9 h' T) v0 l! U
# T8 `+ w! N% _ Z 3 \ D4 Z4 t/ A0 L
2 p( a9 x2 q* C) g7 ?# s! {& E; @: L
+ }' ^) n7 ]) X7 T2 J
, c3 a6 e: @6 C. ` Y9 @
5 P& w' z9 p( m" S& t( ~: X! [ ~5 b5 W
android签名的数字证书的一般都是采用 X.509的国际标准。
! `& c% J- z, Y 4 ^) [% v& M' T, D
; E& u9 q- k! t8 ^9 c5 ^# H 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
3 O& d6 ]+ W- K# h2 o: S; m5 h 0 O J/ W* f |/ c% m5 y2 T6 R
1 F0 h' U# j" x4 n; D9 a/ e 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
0 [# A1 z! h: A6 Z
, f. E6 C! H* n, `! I0 \. D3 O" q! A7 Z2 s& C! D8 L7 ^
$ V; p. ]4 k1 r) m7 V8 h$ w
$ {# g8 P6 r8 ^; Z7 H& P, x+ `. t0 ~) }9 w5 i+ T
; u8 S- T1 E8 C2 Y& s3 a
# d" A7 Y2 |; Z8 a" O7 M* ?9 Q
/ ^; S) Z# @0 @. L- D9 h3 {
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 2 A* x" `& @1 o! x+ v7 H, E
, `% @3 _8 Z3 D5 N0 {! `8 J# t; G* q, I
2 {: m" B* e9 H
# v& i( X0 S$ N4 X6 \1 d2 N
& `" j2 Q7 |% `* L6 K6 C! W, b( |# k$ s% R 、
4 b* e8 L( k2 p z ! W! `# v3 P" o: W: X$ D
% ]4 V/ ?$ a% U }/ T, h5 f6 p* @1 S
* c$ I% Q7 J ^5 B" ~& y3 n
' t6 m$ V1 Y: S
1 C7 e- p- ]5 P2 _, q. i7 n 权限信息
, ~; ]! e7 N8 a( D5 I
! f# O0 F/ a9 r0 C, v. ?
/ ]0 L$ R2 W' g5 N4 x' P2 V 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
8 } o$ Y( o' k) B) r
. S+ ?3 S! ?. h: x2 _2 n+ P P) n6 w4 `
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
2 S% ^# E- p' U' X( g( K / w" b* {) ]! G8 i. v1 Y; g
0 l! N) J" _& t) Z$ d
4 t0 z. L& P- z% n N
& `5 `9 Z, `5 O; ~+ Y2 ~% o. J/ q& W( k" ~/ P
0 n$ ~7 c! b* K n2 Q 1 s7 w* v w0 w4 x# E
p. \' ~) j: p' d5 Q; w! z 下面对这个APP的所有权限进行详解下:
6 g; r# G& X/ |0 \ $ X/ S0 l9 ]7 I J
: Z, r( O/ G6 @) n* k6 @: J3 ?
android.permission.INTERNET :访问网络连接可能产生GPRS流量 ' v5 h/ a/ V" [6 }
: t8 O% m. l3 O- [
_6 {. ^0 w6 H# A android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 & Q& q& _ e/ T3 y
$ l; W" n' G0 e1 t4 x
; B a# X c% w$ u0 \4 w
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 % R2 y7 t% G: b: i: p
! }+ _& J+ L3 ~1 t! P L2 z
& M% ^) a. A+ {+ X android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 , c( |. r! q6 `3 Q2 K0 C
- z7 S/ h( Z( e
3 J/ t. |3 i- d; G; z V0 b
android.permission.WRITE_SMS:允许应用程序写短信内容 3 O! w( ]: V$ Q
# M" I% S+ @4 _9 t8 ^, @
/ F( Z/ O# k6 q android.permission.READ_SMS:允许应用程序读取短信内容
7 k$ X- g, z4 H! D1 j) Z7 I$ ^- `
5 e: V* \& l% I/ O8 [, P f5 X2 u- X$ A* O! Y
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 6 Y5 C# x0 L% G1 {, y$ R
, F. N2 q4 d. C9 i+ Q* } P: c$ I6 b& ^! n9 k% S: T. p
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
+ v. t: X) C! O# ~' ` 7 y5 c x/ @" k! f
* V* b& ]. N! n# j3 j android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
: x4 V8 Y0 W/ _8 k1 {3 b + }7 p; z: z3 S [
9 A4 v: a+ k$ W( P" x$ v: O+ l4 d
android.permission.VIBRATE:允许振动
9 ~& k, R$ ^' O, Y" a+ Z( W9 g7 ?
; P5 s& X+ U- C& u) v
+ U' y/ c6 `1 n+ S' \% |' x) D }* n android.permission.READ_LOGS:允许程序读取系统底层日志
: J3 y8 r/ c, h; P+ ^0 f! x2 }( @ / l+ c) ^. y- {% n
5 n4 k0 e e6 [# b( O android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 " e0 p0 o+ D" ~9 g) E
7 @6 w0 h1 L# G; b* p3 z. C O& B/ {8 ?* |
9 H+ G( L; j, J7 w7 r# X |" _
$ L7 B& g) S2 L
( X6 h: ]0 U, _6 i' r
功能信息 6 z* P( Q, e' z& l! f' Y, Q3 K7 `0 b. O
" |$ A1 ]5 N- k& C5 S2 n) q2 Y% P4 E3 U5 d; N0 j6 G. e4 K
_. Q3 {3 ]" n( ] A* m
4 @: M% {, z9 B: n& `: h* v) M& M) F" I) U+ y& S
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
$ E6 L6 ^4 k) s0 x2 D! U. \! `
u, @) c- y ? m8 R7 n8 \4 s
: k4 ~: G, N4 W" A9 E8 z4 h Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
* K' j$ [2 a. f 3 d6 j7 U/ q$ l r) B
& m+ B/ A6 j* E- a
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
0 h8 G! H' z; ~1 p( Q+ w: Y % y1 X. }. r$ `: L e* _
/ S2 d8 V& k7 k" y. q" C 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
1 V" h+ _. `8 e . G/ b: u' W& G- f
/ I) @1 x' i! x* [8 T/ L% U 1 L3 C8 d- b" Z* _& Q; M# R
7 O; z- P! F" U9 @, H! {3 ` T" B4 W
# x! u# @, s G9 G6 D0 ]/ C; W& O7 t, f / l! E# w! ^( I; U- D9 f i( `& P
9 J' Z3 N8 j! T) o8 ~8 ?1 B, s. w( X# t5 ^6 r6 j
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
5 K* U9 W3 x0 A+ p
* a1 E5 g4 z Z( p2 h
% {* E4 r7 ^2 |9 ]! B/ V9 R
0 h- }7 s" L0 Y: ^8 {
5 ^6 P) i+ z- G! M, a6 t+ Z
# T8 P; V }: n
( m) P3 u c8 l: v2 V( h
+ N+ T0 q* {5 ]3 S& S, o. M4 z
/ {9 ?* {8 } j3 ?4 b: r: m 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
# q% L; h( w" u) h3 E1 u/ p
6 a% q! j& i, p n, e6 `3 d2 G: O
7 b9 U5 z6 f( B% J2 b% ~
) F/ j9 g( Q7 t* x' ]& g& g5 N8 I& J5 h ?/ E
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 6 D: G3 L3 y; ^1 L1 o% X( b3 f+ U
! \( u- @% |% y
4 ^# P: L, j/ p# l3 v
: F8 p# W6 T* u& W( t2 k
1 g$ @0 H Q6 O" s) J6 S
- h" f; {8 k0 i0 ?0 ]+ M. Q P, X1 o2 s# t0 E/ k
; Y- m. L* V( | I' m' ^+ ? D5 ~/ S# ~( p* U( M1 S1 P
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
( x1 Y% Q, {+ Z) m 2 @- O, a1 r- L6 d6 P% j* o
/ i. z" d: c) l& F
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 * h, Q; _1 j% S7 k. a
4 Z; r: u _) F& W$ s
; f4 I0 v/ w% D 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
: W* l) I* d2 i$ E" b/ i2 |" G
) B6 Y! r! ^: r. D, }: d
( ^: l* ]6 w7 Q$ g- M 开源的luasocket代码可以参考学习下 8 l: S9 g( p+ H
3 d9 @) A1 k2 }6 U a3 P4 F
" u; }2 X# ^! K) t! x
https://github.com/lunarmodules/luasocket 8 F* V4 _+ V7 _1 N8 q
4 Q$ N0 j$ e6 R4 M/ R- b% X
7 m' g7 F% X. {; h5 ~! o& K
https://github.com/fengye/luasocket i. Q$ {. P, d0 X. D' D6 }
: }6 K+ P; a8 q- N# ]$ x0 V; j: s) }- E! C- |
4 m; u: p1 W/ R# C! m' \" E: H
$ g9 D0 ^( Q$ ?- r" u+ E) Q! Z, w
9 |3 y% C6 l) S6 } & _8 _: q5 r: o7 S/ s1 m+ h
/ \* E! i5 p/ }8 l+ U+ i
' b- q- `% B' q$ A6 ^, N5 R( K# X 9 k$ n* N6 P" N2 @6 w, R
$ R$ M/ u/ U" |; c2 m1 p6 f) U - c+ ~2 d2 s" |0 W4 P* |6 r
; ], `' b4 W) l5 @6 @9 p2 }: O' w: x5 N& u- \
总结 2 l0 H3 S; i1 p4 y Q4 ^' X+ H8 K
, z8 {: v2 r' i; |( \3 h1 N
V- Y& M q2 u* S" o7 K 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
% N5 x, T/ h9 T. g* @1 w 6 ~$ n9 t- b; [" t9 @. A$ s
) F; |6 J, F# z/ U- q$ G
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
1 ]/ K. d# f4 n % a4 ^1 T% B ?( ]# L
( r. o& L+ p1 F& l
对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 * D' e; O/ B4 s( k
! N/ t: @1 F# y$ V, c
/ h% |. i" a$ w: P5 s- [6 a( ? 结束 / L% }7 y1 o$ f+ H) f9 Q2 g
4 N5 @- `0 j% L% G+ |5 t1 L+ {8 R0 l
" b' X: c5 P+ n" w
【推荐阅读】
' [% I* q( A1 S! r5 N! P 7 Q/ b+ B {( ~# n6 W
# }3 _* Z7 H+ |" i% H0 M/ J% A( W 对吃鸡APP的分析
: R( n+ z+ g, Z) L5 p
9 Z0 {) T; ]: p5 ^2 N4 y2 p' o4 f& j! i
你需要了解的APP安全 , H! C4 Q8 O+ B: |) q* ]
8 T6 R( j: {+ w* i f9 W; n0 y
4 u d8 T' A. m5 d p. E5 p 你需要了解的APP安全 & K0 ^; s# |+ U2 ~ h2 G# E+ k9 a
' h3 ? j* s+ f7 p! Y
; Z) @2 o( b1 ~
& s$ x: p/ w/ l6 Z. p/ g |