|
2 B% w9 G1 U; s1 Q) \; J( ^
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
4 G. {; H7 U2 H+ l) T1 H
4 b1 c" {8 e9 B$ i7 t6 G9 `
* C% u% j- n6 b# N 3 y& p3 q( f" ^
& u; e$ ^& p3 K2 `2 ^" R6 d5 |! X5 y- P
7 t/ Z) ^+ K4 _
! @8 _) d/ j$ `& V) f) p
: V# Y! \7 c( m 下面就以开发者角度进行解析下这个APP的功能的实现原理。 / K L/ @* s# ], P( q. a4 X# d- S3 m$ [
w3 ~ i9 G1 M1 d# T7 k0 g0 M+ O4 R0 @# K; m y. G* J8 W) V% G' w# t' d
2 L8 F4 ~4 t& I0 \) K
$ I4 w. q6 ^7 T; \
6 w. h5 K& d k
基础信息 % y) G0 h. V0 ]$ `. v0 }9 q! R
7 H2 C9 t; \' n7 ^; E0 a1 M
7 l0 b' `; {( }, u2 ~/ A" ? 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
# h: Q. O! M+ [* N ! q5 B& D* Q3 D
+ [9 v( X" a" U% o # W. P4 A, n l7 z5 v8 I% K) S; s2 I
0 S1 h2 u1 n5 ?' ]1 y! Y: |5 a+ A7 S0 l! F
3 Z5 c! h0 c) k( S0 g 0 u1 W0 \& R' V; F
' Z* M. @& `3 d8 _ 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
, Q0 p) L+ T0 j$ z6 g" {* L+ { 9 U5 E, o1 K7 R& j1 ^3 N# [% \. O
- K+ ?2 P/ X5 r e
+ e; i: o, R. a) l# g0 z* T. p
8 X$ w% {" t l2 A ~- T R2 K
: G0 r* o f: F7 U3 l% o+ g. v
: V1 U/ }4 F0 G
0 ^+ D6 J( D3 u1 W0 L& P
u0 I( g8 Z* X- o1 O& U 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
, d% s0 S& j2 i" \! I- q: j: h
2 R! R- A. q9 X
- S+ X6 L- ~# i" m1 R0 c2 H/ z % q& D! W1 X2 K% @# e" P
P! a9 E0 a' }0 c8 b& P% ?3 s/ k! t/ i6 C) X. i: I
; e6 H1 }1 _( D) z
) W: |2 j6 ]" e) }( @7 d
C2 V4 C0 c! T4 p) K. [
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
/ @6 G X# ]+ {' j; x% j, f ' M% ^' }' m6 F6 A& L
8 x9 R. M8 r3 c$ }5 r, @8 j
. {" |, C2 e+ ~' m
7 z* S0 I. r4 {: Y# |5 J" @7 \2 G) F& d' J
5 v" A _1 w0 b! ^$ N, M. ]
9 E( Z. B. j( L" J4 C8 }; n2 L# Z! u, G
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 6 R3 q+ p. {, f/ z, i' A
* ?& s d& b8 t2 B2 X* |; l E6 ?; C: Q; y* }7 I: W! L6 t
5 q9 X- x6 q5 v# p: d7 b / ~& n; ]9 b" H/ j Y
% g" t0 h( Q3 c) ?" r% v8 Z
5 {+ K. H& t/ T% b7 j ; c5 v, i, m* D( U5 X
S. D( _& u9 y( q% q' x7 d
# p* R" y0 U7 b0 @4 ~, i ! C+ y+ w/ j3 T+ B4 `3 T
9 d* f- L, F' r" v* n; U
签名信息
: |' F& n4 S8 Y7 k
) L7 i% _* Q# g! F7 g4 x, N+ J* s" p
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
6 @" b t: X7 [8 g! Z/ P - F2 v- h" Q8 m% V# h3 P
8 }* V7 k0 b2 ?1 S! @" y 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 9 p z* C, a" _8 o4 P$ b( R$ k1 l
% O& r8 X, N+ ^8 ^+ w" T3 h
' u( S6 X/ z5 b0 ^/ _* j( Q1 M
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 3 D- `1 f. x9 }6 L, @* d7 \! d% t
3 q8 ~* P( g5 T/ N
. c, p; u9 |* g, |/ `! N/ p4 G% N0 ^4 X 8 `; M P& V% K& Q5 }
( ?1 f. x3 L+ r' Z+ D8 Y" G+ ?
, `6 w w+ S* K C/ ] & X/ N5 O$ i/ A6 O: E7 {6 t
( o! R( [# e- z) }8 g" i
0 i" K+ n2 H t- b: y+ n! F2 m
android签名的数字证书的一般都是采用 X.509的国际标准。
1 J! ~! ?+ a- W$ T4 P
( M) Z$ M0 Y4 Q/ h9 {$ q; U* _% y H C: h; {- O- v/ w& F5 d6 K
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
. x) q& A" C0 b+ d* T3 e4 E
' D, c7 l; ?/ Y3 X* F: d$ g8 {* d6 z C+ X$ f+ \
下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 & a$ Z+ Y8 j) u+ D
- [; f0 }3 e$ V3 y v' W/ e" k/ y6 Z5 a, p" u! B
% v' i5 K+ u* T5 Q7 u 2 I5 u( Z6 f1 P3 ?
0 m* _$ K9 e' O$ q
3 I" b+ C+ ]( I$ e _, p
% L( H% M X# I, i# d3 h
8 o$ _9 F$ y8 _" c- u0 b 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
4 e; ?1 L& A6 T
: X9 p9 F) P+ ~. \# q$ G1 |4 I
! M0 S" f, F, H, a. D( l3 {0 W$ O
8 I5 l7 R1 j# d0 l' ^+ H 5 O- S$ T+ c3 }; n/ _
8 C+ k ] e! ] 、 : F% @0 {9 |4 S/ H- I0 X
( _. \9 ` C5 r7 E6 N- E
+ ]3 m: u- S: k# ^
: }1 u. u% r e k2 ^( @! t
* Y% Z. `, Q* \9 k( K. y# ]: `9 O3 ?2 n
权限信息 2 z% ?4 |2 j. G7 _( }& n" b
" o% K! I1 s \3 y3 t, |0 T e
% q# T% R& e. g 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) $ A& f% f6 h* c3 X
l2 W3 F. z1 S* q E6 r/ Y; Y6 b' W% I* g4 C" N7 {* H
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
/ a! k! {$ p4 C6 K! g4 T U1 N
2 X3 t. @5 g$ a d0 q5 r1 B+ J+ F. B6 G5 M
3 g. T4 V/ Y S3 e p
6 E9 I" S( K; H7 t2 f+ E8 o) J4 m$ J8 U7 Z% A
+ U( l7 Q- G$ e9 f {
* p# u" Q: h6 {1 k% [' D7 X: L' Y2 M; |, s% w
下面对这个APP的所有权限进行详解下:
W9 z! j6 \- r) {" K& a$ _' R$ w
( k* N* I ?% ]1 N) A/ s
5 ]0 d% b! G+ _$ n n3 G android.permission.INTERNET :访问网络连接可能产生GPRS流量 7 f6 k! L7 w! X6 f0 z" Z
! {9 n7 d+ H& N' i* E! H; Y" B( Q& N0 o0 j9 C
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 9 R9 L% h @( v& G' m2 m
( t7 v5 a& j! [; x: c0 I: E# U' s# S- b. F' G' A6 J
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 2 ]/ W9 |/ d' J& d
' O# G3 ~6 w ?/ X0 I0 T3 ^ J& ~- U2 t
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 # G: s3 U- A/ {! |
; m+ C- t. X" @* [* X b8 }6 [1 u' u
. u/ w. K6 [9 r+ u3 s$ y5 V7 d q
android.permission.WRITE_SMS:允许应用程序写短信内容
9 G8 R# ` L' ^4 [( x6 ]0 n6 i 8 U, ?7 n2 U4 p r0 s
) q& ^5 g. G. L/ u2 \
android.permission.READ_SMS:允许应用程序读取短信内容 , h2 R. h3 Z- b( _7 a0 w; ?
6 ]: K+ {1 [0 l9 o' r- C
, X6 \) ?2 U7 d8 ^5 B android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
9 S3 `- Q! \& h! X7 l, I v5 `6 c, A) z! p& _
+ w' N- ^9 @' x5 X( q& y R android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
" }5 ~) u# t, S& h6 n ! ?" ] d, f: a: f' F. x) e
" r$ d0 r. A! n. c j G6 M4 z, K android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
0 C9 E/ {. X8 ^# R. V ( d3 i3 R: f$ x0 D7 u
+ M" h5 F* Q8 E4 T android.permission.VIBRATE:允许振动
/ u1 Z. J8 ?+ [6 o6 s0 D; B ; U Y, m4 |. h; D4 p, I/ t
- K$ @* Y8 e k6 V2 l' f android.permission.READ_LOGS:允许程序读取系统底层日志 ' ?& s% s5 O" n* T4 `1 Q" M
9 c) \0 P# _/ _6 ?5 X4 _# F0 m
( ?; h3 n' x$ `: G
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
/ A4 O& t0 X% L* j; c
" v0 F7 g b. K9 s8 R+ g X' g5 u. o7 U/ d
6 {5 F# C; o: |6 {; c7 d6 r# ~
7 e, v9 b G1 d- n
* l/ G! ^8 N) ~ F% B 功能信息
L$ ]2 C; b# d% @$ O
* X7 G& L1 X |% [; K" Y! }+ o, O/ U! O: P" R+ @" g
# h$ y! w- ` Z6 k9 V- D; V
0 [+ v( v v- X7 u
4 E8 B5 [3 F6 g# M5 A- P 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 ) Y( k4 c9 [. H7 V
B6 p) R8 Y' C, L4 H
& ]) _1 f4 s m' C- P
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
4 M8 @2 h) i7 K. D. |9 ]
- W0 a ]0 ?$ h. N) y
( t, M# @7 \2 k/ K 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
/ J( y1 b* J ~" o8 ? . H8 z( T( { R2 Q' _
% d: |# ^9 s3 V 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 9 B" [% S9 V$ P; S+ @4 G D
! L# y7 v) m5 P* U0 e a3 F1 T. R( g& L
$ m! }- j4 [6 H/ t* Y/ ~
: `- c' w9 a" c" ?8 b9 I# t( `/ r' r
$ n7 W& r7 ~& A/ g0 j. r' T. M0 h
8 X ^# A0 h3 `. ]3 Z. |: Q- G2 _
V! @( B) b: n% {( z& N 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 ; G ?* w: c: K* \, l% I$ S$ E
& A5 Z9 C! s, I7 w- t2 V/ P, h6 k$ O# S; M
) U- D$ P+ j7 t' }. w' G
- w+ p. a" V3 N; S. a
6 B$ e- O6 ^( c" e1 x% r3 p
$ H! x: Q! C3 l& |( B4 Z! O
0 e; u. v4 Z( Q7 r3 U1 u
. Y( ?0 W6 V9 i' r2 x" ~ 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 / o, s; D1 |# c
+ O. u/ R8 R! k! \
. p: a# z0 j3 j9 T3 ^( ? 0 u* r! s# e9 k) D; ~7 g
5 @: y8 D; s' j1 Y. w7 S, B2 ]+ n( R2 d
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
! Y C4 G# |! \ h' O/ X 9 f1 [* j+ F" p, |0 D
6 t$ F2 B. G- F" S" U% I. W % d! L% I8 a. |7 M
% a7 \/ [" n" `; t1 H3 T0 m, o+ D
. r4 ]8 R. M- S% N7 V) V / x6 g3 s; M2 t' p2 _' ~
- F4 a( `+ W' a1 G
" s# L- m. F6 ^9 x6 r* Z; w5 L 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
) Y$ S, N) \/ ` 2 Q. j$ ~4 a$ u2 E$ ]
: f8 e8 V& T0 V( {$ D5 B; }! D
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
. v$ w+ n" @% M L0 i/ B
' p3 N& O/ H' P2 W( E( r6 e& ]
! `/ J/ ^& Y; ]" l }! E! U 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 " q5 B! @# Z. l8 B4 G# z& |3 {! u
; A( }$ O* c0 \8 _4 r8 w
; i7 v2 h7 f ?6 {+ O% S# S 开源的luasocket代码可以参考学习下 ( \9 ~, e- P) X' `0 [& p, T
) I9 v( B, ^) B) R6 T
& W, F5 E1 f' E: h( H* o* s https://github.com/lunarmodules/luasocket & j# `6 B' C% [. S/ I: y- e$ t" u
# b( o6 Q! s; N9 A C# {5 t& H
. u- ]$ @# H" s I& i+ O9 p# @ https://github.com/fengye/luasocket ) ^+ W# o3 P! I8 O$ S- l9 q+ s
% L0 @+ P8 y9 |
, W, J/ x7 Z8 G2 g# h
' n, r. a. u+ B( a6 w- y
0 }' j) M! Z6 f! k& \- @2 T7 r+ q/ t" g
: c% r' j! h" p
0 z5 ?6 z: k9 U( a
1 @4 A" [6 i9 ], [* T) ]$ h$ X6 L
- R* B; O5 G" x* a+ g
5 h& _5 `, } G8 ]3 {
: H8 m/ ~% W1 s2 }5 K: d! Y) \5 M , f, A h& ~5 ]$ y* P1 p3 s
7 A3 J5 P9 `8 {; Q9 J
3 s0 D, ?$ V1 ] i l4 Y 总结
( n' W9 g5 l4 s$ @6 ^1 ^2 H , G. k: w$ ?! M v' W0 S
" Y8 b8 N s( P) S 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 * s% ?- R1 z$ x# b* M$ a3 G5 L
8 q' g+ z1 f, L! c
) W/ [. ^( } j4 r' v& L+ ?1 S 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 % h' p1 r8 W& S+ R5 L! z, R
6 m! ~, G5 W7 o- w- a* o1 m7 N" U8 }
$ v% o$ f3 ^$ R" U# m# O 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
4 V* k9 [9 M) j1 { m 4 `% \- e. X1 p2 W
! W& {" C3 o. N+ _. E- b, G/ _
结束 6 ^* V# J0 N6 b( t1 t- J% N
- ?( l- l$ S- Y
/ q- c7 R% F# E1 ? 【推荐阅读】
$ Q. J+ H8 s6 s3 m( \ : ~" Z) _9 V T2 S2 E2 v, c$ P
1 l" j1 H6 u9 [3 f; V: T 对吃鸡APP的分析 1 [5 h9 L6 H4 K
8 F# Q4 V5 ]8 w0 B; d" s
9 ^% B0 g, \. y: E7 Z* u 你需要了解的APP安全
, H1 ~. I. f1 ?; k2 w! B2 B 9 ^8 u% L6 r% I, `
) q- l1 l2 n; R& Q( ?! _ o 你需要了解的APP安全 6 J T/ A% z5 X$ ]
. T! I0 v5 \! S) h
& Y; X, O; G( U8 J* t/ ?# s+ ~
+ K. _5 ~! M3 Z2 |& v. ?) o |