|
3 I. r- P$ Q, v. w
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 & w$ T- W# c: C& k- c' V& h6 y
. u0 v( s; r2 \; D" L# n% h
: i' S# `7 {9 \1 d, Q8 |
5 k. {& O3 m( C' {8 D 2 {8 f2 P: R8 p8 |" q, L1 m
3 [- i. p( W# b' w! l
+ |- q4 Y5 g3 b; q3 J/ r, P& N3 d 4 i9 L' Z6 i. P2 ]; ^% r
$ D3 s9 \' N& X' Y$ i) w6 \
下面就以开发者角度进行解析下这个APP的功能的实现原理。 6 Y/ F# @" {; q# K7 G; ]9 J
+ {6 |% i+ q; P
) {( J; @6 k6 P3 c
C1 F; @! H' o/ s2 C1 X0 } 4 j9 ]- O1 e7 q
7 X) ~& s( @6 m 基础信息
8 o) o' }# R& j$ I0 G0 P- | 9 K- D5 A) ?' H: z) t4 B' Y3 v
# v& }6 K$ U6 }# G
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 4 l3 W! r" ]/ ?$ `
* B! U! p: d% r) x( d' ~, @
- z) \+ h9 G1 U9 P # M+ d/ D: U: ` Z; l. ^6 B
+ v1 ]1 |6 H Q% ?+ Y4 U; M, j1 S% \1 @& f: L( Q
( u* z6 M) X g
% \+ `+ H6 w j, [: Y0 f, V+ J) `2 M1 A9 R. p; N- q
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
) E* m! {7 g0 P6 |9 R, f
* {' _- v% ^& m0 j. P- G; B, p
; b3 Z$ }( F7 A$ B2 S* _ . w7 N& T& A1 r- n8 A9 F2 D
: b# `$ @3 u9 k& z& E8 A7 P/ T/ z
* O. D" N( S8 Z
z) m- J$ D y0 Q, _
3 u& O: @' `, g
5 o' ?) h7 g) r5 D' ? 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 5 J( A7 _* l+ u4 `* w$ k) ]
4 i: @5 W) W1 k4 \( M6 V8 S# v
6 R/ j6 @& Y7 L& C) p
! c a' V t0 x- Z- l
# w, s0 [0 p* J/ c( o
' T7 J( ~! O, l% f6 s4 J# E- Q* s! n 5 S2 {7 P: ]( A4 q, _
. ?* T) `5 [& S4 e: h5 C) \1 Y
0 V( t. Y3 k* J0 g" D& F 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
E# ?0 {/ i0 X9 |7 a* Q
4 f0 P( P! K7 d9 @# N9 F
+ O/ I( b0 i4 i9 i! w; |# D
# F$ v" n; A) x; A ) B' ], N% j( S; f) ]
6 ^% F+ q* \9 t" V; d) s: S( o
- U6 |$ e& Y3 H) w/ a4 n
+ a' P0 @! ~1 D" }
* E# w/ J! M# H6 k
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 e7 m. P ]8 Q' \: U# |
6 A1 t% w e* @' p# h. I
$ a' Q9 X5 y3 Y: f3 O& F( D
3 b) N: B/ B) j5 Z2 J
) B- ^6 ~ E2 Y6 {
w# n: G: \+ y* T- T) R9 R
" A# M# h0 \' f! N 9 u0 K/ ^3 i9 G$ R: A: O
2 I) b# Q3 C0 G) Z4 m" x% p( ^0 b
E/ L/ a& l& d7 X! a& \
9 H- r9 J- ~0 F. Q \
5 k/ }4 e* y A2 _( p9 t: Q: {
签名信息
- `' j6 b: k+ d @" a, b3 R, H 4 S1 l: P% [) p* p% c, Z3 [5 f
# ~7 R* m8 q4 z6 o
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 ' S& g4 c3 G2 J* t
% n6 |; T4 \6 Z" ` n! H: p, M2 b1 G# z$ N
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 & r3 p) n3 Z* a# n0 k: I& d5 I
( W# @7 ]& l) ^4 I
1 B, `6 o8 ?3 @7 V9 T 在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
+ C4 M5 N4 c* C9 R# H) B- S 5 r% {- }9 V- C5 Y# X
! n% L( C: i6 B, ~4 d: j, ?+ Q* t! ~
5 l% I9 O0 h6 H& o% a1 u
0 \ w1 U2 T+ c" d# |% {2 Z! q: f7 |3 x! |8 I6 ]- t b
0 l1 B# ~# |# i7 ~ 6 d# s$ i0 d, z1 q- d: `6 ]
) @- k Q; o! p9 }" k android签名的数字证书的一般都是采用 X.509的国际标准。
6 o/ x5 ^: w w' A* J9 | , j+ u$ D1 b" n6 S
8 m8 n1 m8 I7 D5 j
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 ( m$ E9 I2 n: k& a8 O1 I) M \
% {5 U" _$ K4 t) s8 V8 R
' U/ ?1 `1 e8 f4 |
下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
& x# o7 m2 F& B3 C/ q& k
% s; i5 a: i# J. }# i* `( a
5 \! I( E9 O1 j 5 P& e5 v$ U5 \6 h" k. g
6 @2 z; N3 q( K- i7 Z' z
9 t$ h9 t- I& d1 z' |+ l: P
: @ l5 }7 [1 q
) `% Y4 ?9 l) O; d" O' |
. {$ ]# t* a0 \% }* ], d3 ^ 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
* }5 [7 V2 Q! [ z: d
/ K1 S. v5 ^ b8 `9 O1 M
0 c' J! l$ x/ i- q 6 c! t5 ?) n/ } ?4 T. C. l
4 z. e9 N' D7 Z1 y ^5 H1 x
0 v3 ]% K6 `3 a) o( b) p
、
4 H: M6 J+ P/ u1 q, ^. \ `1 F
8 \ N9 @. O( s% u6 {- a0 i- z' |4 x6 N/ Y- I4 c2 d' }
0 N2 @' u( d4 i7 k) k1 v4 c' [ # V9 r) h, g5 c: M( V6 }
8 ]5 R) \% L' J4 j } 权限信息 * T, k2 ~6 f1 s& b
% R" b& K& O8 d; V: k* t7 n, A. U2 O
2 V0 i8 M0 P. f. z 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
# m. r% |1 H; @% g( H- z5 J$ J
4 y: X) t) [, W) \3 |: A8 m; T# @/ @. ?7 |- q
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
7 z6 r8 W5 A' [% x A! |
% u- l( @! ?! B- U, ~* t# r' @7 f6 X5 A% H8 c/ P# M$ r& g
* e! n) A! `' v% Z1 [: D 9 _% X' a$ k& k4 v/ y- x: p
! ~) u0 ]& C* U f/ I( `) w Z
0 @# P( F0 t' s0 E/ r) Z. M ; h* B) r+ U [4 @+ e% Q7 h7 b7 x
/ q* j. U. p! m
下面对这个APP的所有权限进行详解下:
. b& e3 M H( z/ Q% K% R) s* j 6 O; t6 }$ V! F
# B& F& x, H* O$ W6 c. n
android.permission.INTERNET :访问网络连接可能产生GPRS流量 1 o9 P, | p9 ?# g; l+ |1 @6 [8 x$ \
c0 p4 j; s4 q" N# A; Z: F/ g- _( b9 c. k! P5 E2 B. r
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 0 v N1 p7 b8 V/ s
2 h& U& h, B( o0 T% L& t
* D# V! L# l5 ?/ v' n
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 : h( M6 ]% p9 S* a! O0 \3 h
) i* \- d; X7 N5 W7 k! {1 r. P) _/ t. D1 d$ b! ]1 J
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
5 I, i- \' L2 y5 h" o) N1 {4 w8 n
7 r* J) ~# r- i# Y g. A7 [, w* G0 L. s1 P/ h9 B
android.permission.WRITE_SMS:允许应用程序写短信内容 . t% [& A4 v/ Q3 T8 |/ i3 R
T4 E6 D+ d( L. a8 M; k7 u. P
/ k/ D3 J* K- }: @) k/ i android.permission.READ_SMS:允许应用程序读取短信内容 5 b; D/ j' P/ P h; Q) M
1 o$ W/ s- K% x+ @
. o W. n t* A6 x3 H s! S' q
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 - J5 x) ~; n% r2 ^& p
' G; [4 x- y9 {3 X3 Y ]
% q# J$ ^: h6 e6 L. Z android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
% C6 f1 z# D& ?, B: f8 } 1 p1 i! f0 j! I K" {+ D
; E4 m! e: H7 n; N- W% ~; J. ^. S android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 . y1 X" {9 Q' ?- V) S# B2 u! b
- q2 l. |5 j; ?- F2 X, r- ?
, V6 r" e# a! e% D android.permission.VIBRATE:允许振动 7 R$ c! R5 r: r! I
6 ?, k Q! \% `, r
, \1 I2 W5 G1 {8 L' a/ q9 b
android.permission.READ_LOGS:允许程序读取系统底层日志
+ C+ `8 e% @, z2 _$ ]' l
1 L2 v1 G/ |0 v8 Q3 M, T1 L' T4 ]$ F
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
/ |8 Y6 j& Q n6 _ : z- W: N8 N @( @+ D
! E) q2 a9 @% u8 |. J% i" q( P" r5 c' m
( w" E, v3 L3 ~ z/ F
) {' H% r7 V+ \/ A' V
r/ f% {& S" T2 H 功能信息
$ [6 B: q3 c; V5 K
1 k8 d5 c1 v6 g5 j, V2 l% ?8 |7 Z( \2 W1 y4 s9 e# |' `
- T9 R9 O5 u6 ~5 Y3 D, e
; ]: V! f1 ?: O: M) ~2 t y; t. y3 N7 }" t( j0 t
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 . J; P, j/ ~( I
2 B9 i+ G& Y/ {4 l9 R
8 c Y8 Y+ R H1 r Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 4 C \7 r g" } I5 w
$ q$ B) J4 d5 m& G
# r6 M" ~+ p1 y% ?2 F7 Q6 g
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 - |. i, h' z# |8 m
0 x6 d0 ?. t: \/ N
3 a. s0 n7 n+ J2 A5 f2 K 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 ) Z( \% s- R8 V" }+ R
( F# v$ e4 ~, Z8 q0 }4 K$ Y: V1 I7 Z7 T; ^/ S4 v
+ T& x6 R8 M/ \ u7 D- q
d* ]" L* j1 }* [
$ H6 D' q% ]$ E ! w$ j4 `& e' a+ `! a- w" u E. X
" d: u$ v; {2 M5 I+ `/ d
: ?9 q7 s& @3 d8 M2 h% s# k 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
3 Y0 \5 s6 H$ ~( h, @* q7 V 9 z; Y( a( \ J, x6 z$ v
; T7 x7 k- ^1 m7 J, `
& I7 F! c; w! k: Y1 n3 i , q2 L% n+ m, M8 W9 a |- P2 @
% K$ s+ T! n+ {9 [' _6 R 1 F8 C% h5 e8 F+ U0 X# _9 j% S
$ r; B# U- ?1 B2 h
9 V1 ]# w M/ \% K8 ] 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
$ g r- U! O$ z' X ( T1 y7 U) Q8 ^! V
( z' N/ _8 S/ S* B
( f- O0 f" U. J: G4 W 7 M# e" v. U; j6 v6 s k9 p) ~% Y
/ d6 F& P8 v9 ~- {( b1 d" L 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 8 ?( B8 `$ o0 Y+ B
! _# h$ B% ]: D2 T7 A% X* ?
0 R {1 x# \/ J+ C# p6 N! ^0 ^7 L; ` # u* M4 F8 V$ S- ~& }. M
2 B/ C& M/ {: o9 j
$ _' `1 U, x- ]7 b1 v4 ?# A 2 C4 p4 S! z1 y- p6 _- m
5 W+ P( c! n' b
$ w0 ` C5 F! F* I) u% r9 a: m 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
; t( ]: x0 u: |/ w# J; t
3 D+ t, r' D% J' K$ m- T5 M; s
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
) M/ w3 A d( d* H' ^+ O. o B" T% z
1 s6 ^: v7 |: L: _2 L, V& n; T* L' @
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 ' W# L. O, a! S0 G7 e
" ^+ }$ D: u3 Y4 M/ O; N
$ p- Q7 ^- T. X: t3 m# ^' @
开源的luasocket代码可以参考学习下 ; W( ~: P2 ] d& k3 `/ a
( K) D" R7 ]. K( N, t8 Y2 x) c( a
# Z# O$ ]8 _9 Q: m
https://github.com/lunarmodules/luasocket
: ?1 Q, a" a7 ~- z
! x' p! r: X) D: u" x1 p
" }' h* _, U0 X& M https://github.com/fengye/luasocket
1 I$ _5 R! R7 ^5 m4 {
" N2 h, A, [7 A1 c* V2 z& n9 E
$ g' ~5 v6 V: I) R' S6 J& g0 t ; U# ]! F. M+ d, C: P$ f s
, ]! O1 o" t' _
5 G0 [6 k9 r; K% T& N3 o 1 {$ \6 k: C" K2 v+ q& o1 ]
1 g' C3 ^2 I. o& p" Z2 P3 {
( f8 \! d4 W$ W
. \" Y- F: w, X4 L9 [. L) B+ d
0 @& Y& y: ?; f5 _% `. A+ m( ]5 s( {2 V* }1 ^, ]$ m
0 D" [# J Q/ X7 \) b
n) p- C; ~( {# B, ~! m- j' s w; [
总结
, G$ V& }- }: E* b7 w7 m 1 C0 Q6 ?- V8 @* N# i# u" H
4 N% v4 T2 G- c
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
% {+ n5 i" h9 \' E7 k: k: q : Y# t( Q: N$ [2 T4 I8 ?
$ o: S1 \" F8 n @, f; O/ x/ ?
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 # p& D+ i8 T! G2 P' {
; E; M, m8 W# E2 e% K, u$ T' R
" X! R M( u9 h$ u @; H! c) [( | 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 $ j% k7 N$ `1 Y
, k0 P k- ^- w7 n4 M6 k* Z' J, c( w$ e9 T2 A1 O m* k
结束 ' U; D. u4 S" c+ ~
. Q2 ?$ A$ x( H" W% |; N* O1 H; g- n+ V: F! C' _( g0 A
【推荐阅读】 9 M: t g$ a& M0 r
0 }8 r9 M; c$ ~3 G. H0 c
: G0 v/ a3 W: \/ t 对吃鸡APP的分析
* v. g& c2 L( q% f! {
4 X- P1 I6 B: i* A
. v) j% N# [9 l# o C* ?' m 你需要了解的APP安全 6 A. t; L& c$ h& G j
) [3 H, A9 D! K7 Q. f4 Q9 I& C5 O# u T; y' f* X4 a/ ^" V( `
你需要了解的APP安全 ' o9 b: r! a1 x' x- R4 v+ f
% r) C$ E2 a8 }% z" ]; I, b- l O/ V w8 Z0 p' B6 S, \' p/ ?& Z! n
. ~3 a. l( c% i1 e3 }/ H |