|
3 n# {% U8 z8 S0 W% ^% {) K
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
) y; z0 }3 J! X 2 I* }, c: z# f2 ]$ y: T8 L
8 B: G. q8 ?3 ?9 d: F) E: J- T; t
+ p; E) k1 W1 L/ B$ W% W: Y / L0 W7 A, B% A% w% d
7 \5 g3 c& t; e9 x
6 V+ Y9 U4 k0 {8 E) X+ D4 a
. M) m4 S) s+ j' A& F) N4 A
8 l! q6 j$ ?6 T( r
下面就以开发者角度进行解析下这个APP的功能的实现原理。
3 u! w6 W* @# D4 }& a' p4 z
; u. w( o( [, Y; a1 O/ l2 e0 z1 f5 P
/ d8 U7 Q% u# n" a2 a' Z
# Q& C ?2 T3 g* [! d) S' Y$ b3 @2 T2 `5 E9 J8 v( A# d: c
基础信息
/ R' v; {5 r; d& T& f) m% ~/ ^
3 d9 `# [2 M1 N1 Y# C, [5 ~% F0 G/ I( v9 {$ [ i3 P! _
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
7 F9 }( g! Z: D2 O, K 5 k$ a! J# b6 G6 v: @* g. A; j
/ d7 j8 d! j9 l+ \" [ 3 y' K6 h4 o; t' E; H/ Z
2 K- o) m0 _7 S' ^7 p0 C9 a# {0 \( E% K
. J( u p3 U3 A
2 h- o7 u0 Y: y K6 U8 w
7 s* I: g u9 S2 K( S 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
* @* a7 p6 p3 ^% L2 c' |
( s0 k: u- e4 O4 r
g& X0 {: o" T; V B% ]
8 n3 z+ T( z8 G! ~- r- B( g) S& t 8 o, k: g7 T4 g3 H2 |
, x' C' _. x1 Y! ] 3 f+ c" |% p& B% u- ]. A: R
5 W" N4 v Y! A8 ~
4 \( I; X. T+ E8 o5 U4 a% _ 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
$ V( W5 z$ p8 [. a. v7 T) n! N" x) k
+ c4 r! e; ]$ c; @+ s. [4 k5 l
- k- K1 i9 u( D2 \# x9 U
$ j8 c# ]7 F4 a, a! ?2 c 1 u6 f2 C8 n+ T M6 J0 c$ P7 @9 H
% D5 ^( x! h, X; R. ^1 n 2 `9 y# Z1 F7 r
, i' X8 W2 B% _9 L, ^* `9 o' c" u6 i# s+ c ~+ X4 p
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 # b: Z- ~+ ?! Y, a- C
$ c' p0 i6 [+ J' I
7 ^( L! _" a( ]7 h1 H # q! u: [1 j) l
$ s% M* [7 U" s( q
8 g% f2 }# g4 g; t+ ]
; K& b$ g T$ R# @7 {) q
! i: w( O& [9 i; Q% [4 f. a. i4 F, T
) F* ^) Z; m' b/ k 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 $ n/ \, o! _9 x' u
& W) w6 Z' f$ g* N1 c5 X) F
) t; n* r1 z( o% N 8 s6 d4 f1 I! Z- w0 }
) Q9 A+ W2 y( |4 ~( Q3 f: g, \7 Q/ q( t1 z7 V+ d6 C- @! C! p
3 _9 W, P& [6 |1 s) l7 ?" P# j " T/ V1 J' M4 e/ I# x+ p
7 |! J: ~8 o k) ^5 O / }: T! ?' D" ]2 W5 y$ E7 g& Y
4 D k0 w: q/ ?4 R9 ?2 P# G
* v! n! T3 g& z7 C 签名信息 ! Y0 ?, L$ e) m ^% @3 J
. U+ ? l' F5 J
8 p9 Q+ R4 V6 F! T3 Z$ p 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 D4 [! S/ q) B. n: \& B7 e' W
& f' z4 q# i8 c8 M" s) c
1 f% y* p- r' O# h! h( Z" O 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 # b' w6 }1 M4 [# e# s
+ G. \' p$ O: G0 v. y+ ~- |; \% Z& j5 |9 |# a
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 ! k4 S8 Q" p/ y4 }; w2 ?
2 J B" ~) y. j5 g/ n: k7 l9 I# B |: E: {- n! U9 L
4 a* U7 f, L3 A+ X( u
# U! J0 f2 g' b. u$ D
. c: [& c8 } T0 y 9 |; U# z/ `; `! R$ b
! F& O {+ @7 K" k) ^
; D2 x* x6 J4 z1 U# ^
android签名的数字证书的一般都是采用 X.509的国际标准。
& e* Q* ?" }" y) ~6 C
9 Q8 Z! c2 m; o1 n0 C
X( ~0 t6 F2 S- z" E 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
- Y: z" l# {. H) o9 P7 o# Q
" j# {& i3 e& W' Z9 x4 `& s2 o0 t8 I. M4 O
下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
6 F: N% o6 V$ D2 _- {0 `
9 `, |9 s9 z6 U* }0 }& F
9 d/ {) f5 ]# t! Q# ]5 o
- l& T4 h( D. ^. y" D$ n: m
# P$ Z8 v5 J* c7 p2 S% i2 l4 Y6 U; |6 D% }) w c/ r$ Z
8 J. R3 a* N7 |+ o+ N p
# d8 R2 K" |- H$ P$ u- o5 w
* \. l) v- u' i) f) O
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 ! r: P7 R" n. C3 V z ?; U
0 ?- \* t( x4 V- k% A! h& n
; P. q4 L; a. k" Y
4 v, `& E: o B$ E6 q3 M
; R' G2 d6 H. I/ m; C# {) a$ q
9 x4 Y7 S! T( h3 @ 、 + U6 T1 w- G. i) U# n: O0 r9 ]) u
. n- r6 u1 d$ W" _7 d
: k5 h8 I# _6 f6 }; L5 a; A6 J* x
* H9 T6 Z% F( ]1 v: B- j( R1 ~
! ^: [; W+ a$ D O& S1 L/ K5 c" F, S6 Q+ R8 _; Y& L
权限信息 & v5 j5 D# F3 M1 T
4 u+ L$ @3 K: m2 e; D+ p' |! g' m9 n9 N
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
6 j1 K2 l4 Z# R2 P$ E ; M% j" e6 s' q4 V; u" N+ u# W
, B+ [# X$ L+ F( U) Z$ i4 l
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 ; H0 b# _3 |& z6 | h- `& C
- f3 I+ {" H+ W: G0 T6 [
) Q1 l$ v3 E0 B5 Q0 T8 t5 |- m! S
; T* [. B1 o* t# k5 Z7 y1 @7 v
. f. I0 n- _$ e' {
& R Z) ^+ Q& l- G9 q8 C
4 {! [5 v( X8 _% H" i* u ( g+ @% b' a3 \7 v( A) H! S N3 J
: Q0 l# [( o' u5 L
下面对这个APP的所有权限进行详解下: # o" h8 U: }3 _) ~5 n9 X+ [
5 t" P6 W/ |' }
$ d* d* D N7 e: u! o5 h
android.permission.INTERNET :访问网络连接可能产生GPRS流量 7 {6 P0 H* H1 U" H, H
1 M9 x) n6 N5 X6 Z+ Y, @
, p6 s7 I1 ^# |& Y
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 / k. p3 r2 n" f+ w1 t
& h% S Q* W; |) _. N# n, s9 y& J0 p* a9 \* M. f
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 ! n- o' W# @, }& U4 c9 @6 s" m
& h \ A0 c" E7 v2 m
, j' V# S J \ android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
$ u x. [# ]( d* M1 N- | ) d; U: z& c2 e' F n
4 s; ]9 z. C7 N5 y, {+ k- V& v2 T android.permission.WRITE_SMS:允许应用程序写短信内容
; @) a! x" z- q; o5 T 3 e2 T3 H. `4 a' L
# v0 Y' p( J \, m s' o4 |" l android.permission.READ_SMS:允许应用程序读取短信内容
- y0 k2 F: h% D- J( t. j. l
: _9 ~7 O/ S* m0 L. G. Z3 {
' f" Q% O. {/ C- R android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
* ?. S8 U7 K- E. i 6 v4 y8 U3 J7 N
" W2 j0 H; S; O android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
: |4 M- M' o; D/ A B! Z0 S ; M% j4 y: c# m4 W
. d( r6 q+ d- B: Z6 H android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
, B- m! }6 E0 q# _7 `8 z" t 8 j3 s# \5 [0 W, D+ b
7 O& P5 w# Q3 a8 R android.permission.VIBRATE:允许振动
3 k2 i. ~. D1 r0 e3 z3 ` ( T2 E8 o6 U I" p
& r- L E( Y8 ~. }* @) k android.permission.READ_LOGS:允许程序读取系统底层日志 9 d, M8 J& Z' }) O. S; [ u: d, \
2 K2 o7 M7 V. T6 W4 z
8 ^7 d" S0 w! k3 X: v; x android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 + z7 [) R" N1 _: |$ C, D
3 C4 g. g; t# A6 h3 X- a* ~0 W
0 ?$ m+ W& p5 b % t. ]% x+ |+ \9 u. Z m7 w
) U" A& U* j/ g1 K
# y3 M* C, \7 n' ` 功能信息
9 `* L) G' G! z$ g
( C4 X5 ?6 C1 u4 t
0 L) k9 {5 ]# G7 ~/ d3 Q: ~ ( K) e. }) s* d0 i
3 }" @7 y( V8 E j- Y1 Q3 }
. R4 \- V0 `4 w) K( X/ `! b; c 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 1 E# n! g8 M" M% ?7 A
2 M' [/ J+ P5 A. v/ ^
& @$ G! J9 L" {3 t8 S+ ^ Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 k" F& t% q4 M0 l& v9 {1 F
+ z" k9 N- b. Q; J3 Z$ J) F
' x, U3 b8 e( R$ s; s! }
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
3 v5 B3 y4 F- Q4 S/ }# C$ l , P2 a* B7 d2 m& w( k& `
! t) Y9 O# l' H. _
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 * M3 C; O6 i4 @" r
3 K9 u q. U+ o1 `4 Y0 U8 X* p& O" R
" P7 X1 E, j+ w1 `7 }
4 ]- R& k8 e3 c6 | B# w m5 v/ N, d( v3 m& n1 r
; ^: C! E m1 V { W& c: u1 n" k! p & J) s$ ~/ H" O6 B- p; Q6 L: B9 g
$ m2 n% i/ r! e6 Z
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
$ Q t2 X, t8 [8 A4 g' E& T9 y
5 E6 e9 Y/ O1 m4 w* v6 X' q# W+ M# [" \( C) y% E7 u$ N
3 L5 E( D4 {# I4 P C1 e" j1 S0 h; s) I6 X' K) a4 @
9 C, b' Z" }) j3 p" L
8 H; r' A s4 ~! d
- y8 w1 ?5 f5 l# |' c2 y0 Y3 e! {/ x) V2 ^0 ~) D3 ~) O8 B* p
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
" h2 m) H; w- F% I
7 b: A/ M* F J
$ q) U/ n5 M# W: I7 q+ v $ ^, g0 o! _% l
6 D6 B) C' |0 J$ [/ |) Q3 D4 O3 E% n$ E6 f
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 , w% G# M9 ^: U# @+ f( P3 j3 }
1 r$ z4 h( K9 ~. i: _
9 l9 O. d% E6 H/ m6 ?
/ ?* r( ~; `; K3 q h5 s
! c# J' Z! B9 O! x* t2 u
1 l; w+ t2 B- ?$ F9 Z/ D9 k6 I * ?$ U8 s$ t* @+ j" U" o
0 C: f, j; C, B7 J& {- g/ U" w; h! R4 o$ g L! y: j
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
! X/ j, s2 `/ H+ ~ 7 p8 N7 k& y2 F ~
9 X0 K4 x# A9 V5 |& ]: r$ i LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 # ~- O) @0 }: W2 y( w
, c$ X B' v0 ^: ?# W! M4 L$ y/ _0 R. ]; T7 x
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 ! f& j7 l- Q+ R' Z
; q( L7 b. M. [* K1 X2 [+ V
2 O9 \# x; [6 P: ^5 R! h2 B/ X: d! d 开源的luasocket代码可以参考学习下 ; c% G% v9 \. D) J! P3 {
7 z* @2 W3 ^' f" |- [: v
+ l1 i4 p- c( A2 N https://github.com/lunarmodules/luasocket ; s" r8 @+ w/ q/ ?3 Z
3 p3 H( q9 T# b% T0 e g! P+ r* M' z9 O6 @+ Z3 }! @) K8 e l
https://github.com/fengye/luasocket
: }$ k1 I# e& { + s6 _7 R5 q4 } I& R- i! C
, v+ z( z, i: g2 Q
6 Z V: K& }6 C0 A% e% U
' w( d" c( E5 _8 A+ f0 j
. c% l$ m7 I# ~- w8 J 1 k/ T* _4 I. j9 k) n
: _: p8 B$ B# A5 |2 O$ y, X: Y1 ?" i& u* J2 m: j8 O) k
4 U% f0 B, O" Z9 m* r2 s, f% w& d9 ?
3 l S/ H/ t7 j+ L* N4 ]* K! l: b, ?+ r, F
( H# V0 a; }8 d) {8 n- o- L9 w
$ _' k/ X7 y+ r% M+ u8 m
& u5 ^( q. d2 V, v 总结
) U2 R$ o: q+ H0 e0 k7 K& B 9 |# T/ s' i. I7 P4 b
# G4 a( Y7 [" H, M, P 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 ; {0 e: p( E* G. w$ w
! N6 G% H: J$ K: y7 }$ a1 } x. q
* Q5 \+ u7 F# I8 l; H! j 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 & s' C) b) F1 H! \& G4 A
* p8 h# O3 B# c
P0 n1 v' X" h$ D' n' j" y
对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
6 W- V* \0 E2 ~ $ z! Y0 \' {6 i
! y6 D; e$ t+ A/ e, N 结束
% [* r/ p$ Z6 b( p! i% o
" R D3 D; n. }/ ^2 j
6 o7 W* s ~3 ]( n v6 K( K- u 【推荐阅读】 ' W1 j( u3 |! W$ b' R/ ]& ]% n- v9 Q
: M5 d$ g# i; }' i( U
; M- d* n9 b/ _; w7 @8 B 对吃鸡APP的分析 ' X; R7 M. K, D. y
. x1 W, e2 ]' Y3 A3 @" v% g+ n6 c) v! x8 ?: I
你需要了解的APP安全 4 r0 F S2 D% V! u, a
$ y2 G& K4 O' `2 O! {$ n4 H$ P( b. e/ w
你需要了解的APP安全 * {: [+ K. K& q9 p& p% K
6 e1 n6 x, P! y# J) U
' Z! A+ k/ h1 h$ S; C3 r* d 9 ~* ^1 e+ m8 I x( X
|