|
3 T5 C6 l8 _+ L- O1 T: F+ n 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 # ]: P6 I( B5 T7 p! b
# v& y# T8 r u
) d" P7 }/ P p9 `; [/ t; v$ D. X ?
5 O7 u# S: P0 j, h5 {1 Y
: v2 I& l2 o% f1 Z" O' O# W
$ e0 O X9 G/ |/ M
4 F' i ? t2 l9 o5 t1 ~! a 5 I" `5 Y* m1 P7 F1 d+ [5 z
! E4 Q# H8 n+ a; W* [7 [ 下面就以开发者角度进行解析下这个APP的功能的实现原理。 , Z6 D5 Z1 P- t9 U& y
$ K L K4 U! X/ E. o7 O D6 }( ]
! L+ K( Z. w9 J9 f2 x( Q
" \- }& Z5 i+ O, `' B: R# o# N , n1 d) m7 Z4 y3 N, |9 k5 q. m
+ `9 }7 I; A: G
基础信息 0 w( d3 A) k. h" L2 O/ x
6 o# }: J9 I. J0 N3 _, [# `9 a
7 V6 Y; Z! U! q$ r 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
1 \: \; Q4 u2 v4 f$ [0 |
9 g+ Z4 ~) V$ K( Y. J% \( f! D+ @( ?7 u! }1 t
& ~, C, N# k7 E6 c& ]# W- g
% J# ?- C# k: g; G9 E2 [2 K
2 B& ~' Z% |3 V! ~) c) m3 P ( S. B, @7 w& O
8 S$ n! ~ @% L d) c2 v( ?* Y
2 ?# I+ ~0 x4 t ~ 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
7 e5 r1 Z. y B4 ]! s
+ {3 H& s$ W/ K# y: z- R
( M9 g' n. A1 c* |! A g& I
6 _2 v8 C4 L: G4 s* P 0 `& I' q% I/ f% |8 Z8 L
# H' |# @4 a. C! Q5 r
8 O F/ ^4 J2 Y - X) b0 q( l- t1 G
- |* d+ [3 a( L& s7 n3 G0 k4 p1 R* ^
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 % O3 [4 n, E8 J! F' g4 g. d
0 T7 c3 O" p6 w% x7 m# E/ s
$ b! g9 p5 W/ ~1 q, d( U2 q # o, J6 N/ ?! T- B
V/ T" t1 [! s& a. j, F, ^; i! G- B0 Y2 [, u! ?( E
( \( T$ y# S/ G& M0 ^
4 f% b4 W h7 q- k& s9 u. Q6 B
% {* Q. L% V$ X; L. U: u
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
( L |1 N7 t3 x, L
& ~) v9 f. O- B, U L6 v
% M6 m( d. m: {& u8 { . [0 x) R) D) `
7 W# ^+ M6 {" s; \ j' K% W3 I7 z9 X
, v! Q& A# m; W2 |
* i- E4 N3 @: }
7 b8 x' Z) [6 u: H( c5 }7 b7 E
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 8 u' s, @8 X; t5 N$ C
+ R+ Z5 E% D' ]/ a5 W, i
. v, T5 @9 E G g- l6 A/ c4 m # f$ E$ y) t: l9 y3 Q5 U3 o
) W2 |$ Y. g# w! J C
5 M2 Q& d c) d$ Z. K* Y2 h5 {
9 }$ Y- h" N/ C7 R" k, G) H ' q2 E' a# A1 g; @# B! n
8 v, [+ t- |" Q1 F 1 Z$ o/ f6 X2 G
, _8 ? U* j+ }, w$ ~
' a1 i5 z+ u: m' \- b5 @) f+ R9 @
签名信息 ) g: b+ }" P3 y* r2 O$ ?
: U' Q7 ~, a' A9 \& u- T4 ~: `' q
. F! f& P9 z- \6 y' ^; G2 G+ Y 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 : p# |$ i/ j7 b* @- A& t
0 |5 ]" W U/ B6 K* f2 A* d
M n. k/ @+ K$ r8 k$ Q 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 * Q6 ^6 S! K h b0 X
, _+ D) S3 Y; S& j5 D1 ?" q
2 R% T6 j8 c% T- r' H: g; x# G& D 在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
( E6 s6 f: X& K ( _4 p8 i1 e3 x3 v1 x
" b: ~ F2 l, E5 V/ h4 _3 `% {1 P
" D6 e( q# X2 X! z; e
3 X+ O1 [- N: l
1 J5 U8 \! x- F' p6 n1 g
' T b$ m |) |% X9 b
! A g6 O4 C, Y! k3 ^1 E7 l9 V. g' \
android签名的数字证书的一般都是采用 X.509的国际标准。 + }1 {2 N' H. q* r- z7 C6 W
4 B0 |+ G: U9 `2 `
5 {" ~ d W$ E) ]6 L8 ?0 Z$ S
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 9 g r3 E* U* L, r
\7 j G" ^$ L" U" V& ^
& k# X/ N3 s6 n4 Y0 n) q6 @4 c 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
9 l$ r$ A+ i( }
* M8 v o" @1 t+ C3 f( f7 g- ?( s O: c7 d' ?; J. Q/ G. t
" @8 A1 U& N& ~& u. _* a
. {, p4 t* [$ w2 j7 w+ y& @
* |% f! w8 f+ m$ {2 h/ f * e9 k& x) J/ i) f; _' M
& a7 A& Q+ X) M* p
% _* c, L T+ h; [ 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
3 G' W% |! c ]. k0 |; ]& w; | 0 |3 R9 r' P2 R: [! b S: [
" L A0 |+ L6 e
4 j# u- Z i$ R * k2 D3 Q3 R8 o2 b+ c
0 ]/ J% J# Q7 m, Q 、 8 S. f! ~$ V' T( s: b4 K
2 A" `: ]: u: _6 ^" @, f4 _
6 f3 t; I* o0 j! W; m: }4 g6 M! m4 u
( R* q" j# ?! t- R& `& S7 h7 u% N% C - b' w) L) w, {2 t( o
U# S+ h6 d% q# x7 w6 ^
权限信息 ! p; y6 D7 H- Y: }* j3 q$ E
* y% S, D: V1 s9 C6 G
5 G. j0 f( e1 R7 E5 u 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) & o q3 E8 M$ G, k/ ^4 C. _
) ?) {8 C- L. [- a" E5 d" C
E1 [7 @' l" o/ W! n android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
1 Z. y w O& `8 ]2 i9 F 4 f. D4 T$ i D
: y" d+ }( Y o9 a# B& Y7 H
- A& D0 ~ p7 x. ~, n
5 [/ k3 p$ K( M/ J
- F; B. P7 V$ v" b$ Z& M0 \/ b+ z
z' f% E/ w% C* v
8 O4 \% m) @5 X% Y/ y
1 P% l9 a+ m5 a% X0 @ 下面对这个APP的所有权限进行详解下:
" R: h2 Q5 y, M: M / t% V1 r7 k! P8 W- h0 J4 g) P
& l+ H+ E! n0 C android.permission.INTERNET :访问网络连接可能产生GPRS流量 / E7 U- d, | o* g- P$ O) O N
3 ~% Y& L, l, M5 W% k: d* a* ^- U: a9 S0 }2 C8 I
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
" e% S6 m! @1 {
% S% o" d8 E r& G- I( n% `
L$ U9 i/ I6 n3 c/ } android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
" _0 Q; _9 X; }4 ~ - G- E' m( w; N) {0 j- O6 i5 t/ ?
8 q# p% _7 d8 [% U/ f
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
8 v# k1 A* }' y a. ?, k
: s5 \' t+ x' L- B: ~) V9 Q* u
) T$ V- y- X) Q9 _2 @' d* c android.permission.WRITE_SMS:允许应用程序写短信内容
& a2 K/ A) x) G5 P$ {6 Y$ L ' `2 \% E" }& Y) q
1 X+ f' v9 N! Q/ ]6 @1 {; V* s
android.permission.READ_SMS:允许应用程序读取短信内容
" X' I' k' R$ r. K/ z1 q+ l$ |0 a 7 R% N+ W# r h) i# ~3 Z
( g0 A, c- F" y android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 2 m8 k! X/ s# | [0 l1 X
& d) C! V1 X4 d' Z
4 j$ W/ }: b# a, ~( v- x Z
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 & ?- ]6 d1 ]* c( ?8 Z, D
- _# D0 J& j- t9 a x) l
, x) f; m4 n0 S, K6 _ android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 ! _. |* \; p# V- v& m- O, ]" h
2 C5 \) x" z: U+ R$ b
& n; ^7 A( s; H+ a! R* k android.permission.VIBRATE:允许振动
: ^2 X5 y J8 h( u& n
% A0 ~1 s+ {' `: D9 U) w' n$ @9 |2 C& ~6 }: M
android.permission.READ_LOGS:允许程序读取系统底层日志 ; x' X N' J0 G! M% o& F
3 | C! F" ]6 V: S1 J4 T% u n) U' Z. }6 d2 V
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 ( c7 O: {! A5 |
: K: Y! k" C- v! q+ u, `: k& I1 K8 \ u5 T8 ^
# ` c! N! x0 p( k/ y
, f; k6 }) |+ t# Y& Y2 S) n5 J$ M# `4 B# C w }: c8 ?2 @
功能信息
5 H0 x) Z; W4 ^1 B' c! F & X4 V6 |" o( k/ I
0 d% _8 t4 F1 b7 o$ P* p
- X9 X3 O! z# K7 _" l
4 n8 G0 S: g2 a; p* W/ f2 Y# \' A: ]- a6 D) y( v8 y4 X
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 ( r0 f S0 y# x$ ^4 k7 o% C: E3 ]- f* c
2 o* O* D8 L" H* G) _- M! A Q, t& j/ F* A
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
7 |" [% ]( b8 S8 i, B' M 4 B" h& \! m0 h! G9 b& q( i( l# p
/ b0 l1 W V, G& k H6 S0 f! A
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 6 k) e K$ N- E/ x. a7 L Y. k
) R- `$ e! W- V( }
: u0 v9 W0 s8 U) w# K& I 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
4 ^; m& q9 l! i5 `! x 8 E3 @& \3 n. H/ N# n
. u$ M, |7 N9 T: `! y3 t/ U) @
}# w) z6 m J8 e1 n+ r/ P1 h6 {. E 2 @% v% U3 y3 \% U' K0 a, B- Y
+ y" \" p% L% w$ a# W* l, t- `
% ~- w/ f: ~6 A* R7 }. e+ N0 H
* v- C) ?, A3 \* T2 P* U# x- {* K. c! A5 d; i6 u5 x
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
; D9 B( L; w6 V# x' U
8 l5 v" A7 t, T" j, Q2 M" C. H( Y& M
7 t6 W) Y( u: u6 l0 B ' ~) J6 x. g+ A* w( H
, }! I4 X0 I( Q5 ^) V0 e5 Q) A' t
- m$ J) B7 ~( \. @+ O: A( B
* C! w# b7 U2 y2 |# M . M C1 Y, [1 n) ~: F3 @% H0 t
& {' N/ U& f, |, P! k8 L" u, ^
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
2 D" o, P/ m5 x$ p
- ?) o1 |- e$ D5 L0 @" Q' x! c2 ]9 Q4 q$ A3 d+ l+ @4 e7 Y# c8 d
, D1 o: S% \: r5 u
3 G# q: G, u& O7 M* Y" M* n; \4 v4 O8 [7 g! i' p( m: }$ r, L7 x
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
6 g$ N+ i- L* v2 k( `
! L9 n0 @- k. O$ S: j& a8 V( j2 x+ H, c, a* X3 u
% w2 F) T+ `6 U" H1 w: ?$ a
! Z( c! X9 z/ S1 w; O
, e7 x2 k$ ]* Q9 F ( r: B* e/ V% _ Z( |7 x% U
6 m1 o0 z) ] F
- K& n' W( N" E; K0 Y% R- } 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
+ c0 b% Q7 w$ J- m # L7 `1 ~ _( P
7 {( T1 r+ h6 }8 V! N
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 9 i- H- N6 _) N& z' E
: o1 Q0 d9 _ z, X# R
+ A& w' X O/ ?- j# T. B
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 ; P9 T# Q6 j5 I3 o3 b
! ^. p8 k4 S' V1 B" t
% k" `- Y8 s* k* @2 P6 d' @; M 开源的luasocket代码可以参考学习下 5 [, v; w- F7 W) C) D& D& C" G
" i. U5 _. f" }7 Z
& b O6 \* S. f- ]$ c
https://github.com/lunarmodules/luasocket
8 Z) m2 d/ h# I1 n2 ? 7 G* ~- @, {) L; z$ J; ~ \
6 q+ ^# u* I* r! \+ A https://github.com/fengye/luasocket 5 U$ \$ ]1 W' \& o1 @* K4 f- s1 A
0 f4 U' b! e7 [8 y7 ]8 W9 s3 G, ~
% }5 v* J3 b2 j% v5 L : F" r: _9 Z/ u( [
7 X! x1 S" }9 X& O, u! a+ T
$ M7 [& s' A9 E: P r, t7 `( l 8 [- k8 W) j2 ?9 a. q2 p7 a
. Q8 Q) y$ P7 L& z
" X U7 M9 O. a6 ?: ~2 q' {
% N5 D' K! \8 m k( V 3 R" I1 d* K. `3 f2 P
7 X% j3 ]' E% V& s8 u6 {
; D7 `1 z) a- F0 o2 F4 y - p& n* J9 A! n
6 E8 R8 m8 K) \" p 总结
8 i. O( h; W7 q# E, w4 v9 J ; I. @: ^) n1 o7 `0 f, b, ~! p7 y
6 f( l& s3 h. y
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 4 {3 ?3 b+ _, x! L0 P: @
V% G% L8 c7 U, K. [/ G: G
+ u# [$ w' B+ G( `% t% w2 q: X
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
' ^/ Z" J/ X) s9 ?- i
! T9 J0 s6 Q( C6 N" z9 a& D
7 \* M( t5 a7 t& b8 |5 c! F 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 ; A, }0 ?) j7 s
4 }' W5 R3 b- r' a7 h) T+ p9 V, h
5 V _8 G9 c) C 结束 " y9 @/ j$ S v
& K3 K1 A8 t2 F# p3 Z7 q- b
! @9 A, Q( q" {
【推荐阅读】
5 S' M6 m2 h6 N2 z& ^6 j, z7 A
* o! Z: B, j2 g. E# b* R2 W
: e+ N1 b5 @0 ]1 C1 y: O 对吃鸡APP的分析
; O+ z! k& U7 m0 {- e$ M ! I! _' o/ b5 C' x! D
! b1 d- b( g1 ^- v% E" F
你需要了解的APP安全 : |5 a [3 P L$ j
1 U, l$ a( ^+ ^. W+ d
6 _8 B; t- ?) I; ?3 {: u b 你需要了解的APP安全 4 @) K# G3 B q* Q* m7 X4 ]
1 P( I- z4 l& b# @2 s
Z0 X4 ~6 s* j5 d9 j1 T* f
" G0 m* `% t6 _6 o" I8 _ |