2 {" L5 j2 O; i3 s 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
$ D+ g! |- w9 J 7 M4 k6 E7 R6 d3 e8 e8 S* l/ Z% O
* a' E8 k7 l) s* _; `# H$ a t* y
- D; m; d) _4 y3 h! f: X, q- o% b
2 n2 y& `( W/ l5 o$ y
+ m0 O( J5 s7 w- D' N + F" w3 F# n Y! o" c
. w D4 q' C0 S6 ]) P
) g% ]3 d1 E7 Z* @ x 下面就以开发者角度进行解析下这个APP的功能的实现原理。
$ V$ L; b. d1 K, o7 j& C
1 f) v5 Q) ^9 v9 w% I9 r1 N! h1 F- x0 f( C( V
# Q" }+ @3 I% k B! L9 K
$ f! t& F& o; K$ v# R- l0 ]8 t- G/ \8 U+ ^
基础信息
" K/ p& Y- s& Y8 @$ T: p
9 n, s) }: Y5 ~5 N4 o+ t7 E0 [3 w. N3 @$ z' b! T
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
0 ~' a8 H; I$ B& [( S4 f$ s 1 {8 n7 \8 D) t' |2 ]/ }
3 R7 V1 j9 j' D9 U4 X) c
F7 B1 x- ^( S9 X
; J. v3 ^1 J$ r h- Z4 v; V' M4 ^3 g" I1 d
: h9 z% B1 S; ?9 s: {
4 W& Q* ?: l. C
" A2 y$ Z5 U' h# O& u0 [& I
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
2 b7 t: G: x8 N
% p/ Q7 I. W0 ~7 `
# M) g: u5 }+ f, u7 c $ F5 R4 ^8 V/ s' }) h# Z
, s% z- i9 J* o; @ L" z. G+ X
; h; W! ]: Y3 d6 @ % A, X; |3 ?( Y* A2 Z
" V& W" s' x/ J; ]# O% k
0 d1 m4 B9 i" J2 _
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
1 V6 r# L, A( F) j6 {; k8 I, M. x6 P / A) @! B; p9 B6 S- N
8 m" R+ m8 H% a! Z
- N5 v) n% l' O }
9 y5 C. C0 h I: l
& y6 J% g) O* F8 Z2 Y
- J, J% {3 S0 k/ y- V9 n8 R9 M; u; H/ R
5 x! |, [& V$ S+ v
8 h3 i: s) S+ E# T' ` 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
; _0 g! a( O0 G6 [ |9 t! T% ~. ~
7 Z- X, T: I8 @: C# b' w1 n% v, R5 b; f
% z1 r" v$ \. m
) O* m& {' s0 K3 F" q; N
: t! f6 b. ]7 I( ~
& ?3 z, j/ A c! N/ a% g: D 6 K3 B5 }! X. r8 e
, ~7 v0 }# l1 p+ Z% F. ?/ y 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 + ]& B* u% j* w% E/ T
: U3 Q- {# b4 v
5 N( m( \0 @: L/ k5 K, r
) [4 A. C8 k( H& p) D 8 _9 R4 W) u v% Q) |) J9 v
2 }: t, I4 Z5 T& U6 ]; z
1 z) \1 k+ D: N- [ , [" m* ]% b8 N/ ~& y
. p0 G& S# f4 q4 i: Z$ Y 6 p3 n; R! j9 U w4 O
7 j n$ O2 F/ ^% v
9 r8 H/ ^( p% ]* G, a, p/ d 签名信息 / {: a6 z, l6 p' C7 Q. p& D
" t; y7 h2 T: z7 x5 a9 u7 F' ^7 _2 J
+ i. |; [% `+ j 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 " Y" T" {( R0 o3 L9 R
# |# J g- I3 f& o+ s
) w3 N0 w( C/ h7 @7 [4 Y+ R4 o 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
, s) A5 F0 J3 K9 _9 c, t9 A / c, V' l6 y) b! C4 L6 S3 l( B
. [7 a" Z& D7 N7 C: v
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 $ m5 j3 j% W7 g3 L8 {7 L
q* `4 G2 e# h7 w+ f; D2 E
8 u% O; [ [" g: _* b8 I- w) V
2 {* N/ r# ?7 F3 a
" F2 y8 x, } G; [- k9 T4 K/ M$ j$ _4 j- Y1 K4 _0 G- \
& P2 V, z* \3 T1 r. C
; N) l; G# [) [) ]! N
8 f( P( |- `9 m# n) r7 h O% u android签名的数字证书的一般都是采用 X.509的国际标准。 c9 j: I4 D$ z8 j, j$ u# v8 E; h
2 ~# J! Y; G9 m/ y% `/ K
7 V5 R3 s% \: z0 Y/ R/ e: B3 ^& F 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 + r* H4 `: {8 r1 l/ V
' r' Y. ^! {, a9 a! G* x5 c4 W
3 d# F; X; n, z
下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
0 p: T; ^) _' y Y0 z: C " `7 l, R( f- t& t" Z
9 e3 B, p8 I+ w
$ j4 L5 @, e/ j" D8 t
9 i# X5 W! o8 P
, b! t3 q0 B2 l! ]) V+ |- N 9 Z! ^. |/ P: M5 I
1 o; N! ~, F: v. u- N6 V
% m$ c9 N' d' G5 y- I2 n8 ? 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 # ^# Q& i1 B5 g0 u3 d- f
: J: @ F7 F x7 O/ r
) ^6 w5 O2 o/ Z+ L2 L1 u( {
- e/ b5 V! Q) }: u, h
* b2 a' e) m. p
* ^1 O6 ?1 {6 y& ^5 O5 t 、
% s4 A+ v* k$ ~, \, M
% _$ Q) z! [( Y& R x. `7 h9 x) q$ p7 h2 z
% k5 n% n4 [* p8 @: c, E |& @. f/ \
/ \% l* `. {! t; u
# h+ g+ U! m8 [5 A3 [& C/ J
权限信息
5 v3 n; H& ~ ^2 e0 c! T. s' H * Q% P n' v5 S" Q' G
" x, t2 p& U0 S4 M
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) . G% H; r5 _! l0 \! E
1 i2 h. l" r, c8 f% D) K
: Q* T' ?- F1 g, ^- Q* T android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
. l1 }8 b( B% ?- K+ V; m4 I+ t7 R - `- {) A5 P* J
4 B' m4 {! ~/ l) U& L( V
. Z+ d, O. C \' \- [
& @" @* O$ E1 O, {% l* M
7 K3 A. i7 O/ W+ l ) _, H E1 X6 Z7 A0 t8 Q$ L
% e7 [9 M4 M) R4 i* M
8 N* u2 @% n( z' ^5 j/ K/ x
下面对这个APP的所有权限进行详解下:
. S8 Q; Q7 K+ m
6 w" {( F0 v: n- b# g: v- R* T5 P' ]4 z5 `( u" C4 ~) t# C6 x
android.permission.INTERNET :访问网络连接可能产生GPRS流量 I; Q2 J% S8 v* p2 f
2 G3 e o+ `, k* {( [, t$ ~% u2 W7 ?, k3 |+ W7 ]3 n
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
# k' v. S4 j; `5 k* [0 E6 J( ] : }+ g) B* _- _# y4 t
% R2 }2 H) b! g; r L android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
5 f8 l S0 t1 o* s9 j4 ?
/ ~1 C3 u- i- j; i J! |, T8 y
% s- a( |& l J ]/ R8 @1 [ android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 $ i# w3 V8 L$ Z$ L5 r
5 I$ t/ W, u0 V7 |/ k
2 j, c8 K5 S$ ~5 s android.permission.WRITE_SMS:允许应用程序写短信内容
# c% j- w: n& F 7 k- k' ~, G1 h* x4 f8 o- i
+ \6 P; n% ]. \) O android.permission.READ_SMS:允许应用程序读取短信内容
3 F F! R/ M; P ' [7 D" l) d c& N4 v
8 F- i5 d9 b O. b+ u, \( _1 o" R m android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
# ^, _/ Q1 K3 }+ W Z! R' i4 F7 k) X% }; ?
- j* k/ ^% h9 s& k9 ^/ a; L android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 " e2 f% ?9 t6 [, n' B( i8 s
p$ C* t3 z5 b2 B! a% g* l
, I. m$ c S3 s4 f+ o, V android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 ^, N' u J: c0 ^6 J' {
3 e" B/ T7 |$ u# ~8 V) [" q& u. H2 U! a! n3 g7 b
android.permission.VIBRATE:允许振动
7 e3 l) D8 j& M% j! R1 Y 8 z" v: i" ]! q/ Y. r. i
4 }; r. j% Q* V x3 [
android.permission.READ_LOGS:允许程序读取系统底层日志
+ \' s. U5 \; u) k1 Z
, ?0 f: z9 J* f( v3 W3 N; l" K2 F' D6 V1 J
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
f, i* z0 H* [" o% \7 ] / I; d7 y6 S$ U; b- c
8 l% x3 g8 g' B
6 d0 q! W- ?, K+ E9 K O! s" ^
; u) r* I9 L. u8 _9 N, o: t9 U
功能信息
- y1 n& g% ~" J
" R! e; I; P! ?+ _7 i
- A$ S+ g; _+ e; {) k6 b# r
; x9 ^ D* S8 m2 w2 t# l+ w
9 x+ V& S; ^( k# p! I% C2 F$ @/ _) P9 B$ G9 W
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 ( n8 \6 Z: I3 U8 s! ?1 r
+ g) o3 K4 I7 d3 E+ i
9 Q/ X, S# C- i, U; @ Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
! @5 a9 g! k5 \- C
7 H6 |( D$ p' G% {* a0 j) M8 V' K; {% U2 R% `/ X$ O0 Z
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 3 k9 a6 ]5 u/ f: O) K
1 }& F% C9 F& f- E
3 ^& b6 W' X7 z' R 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
+ c/ C7 i$ [% i( A$ m V! }& I 5 h- f; Y3 }2 V+ ?& c
+ A2 M: k3 a: c5 ^' Z0 @; C. |' @$ D
8 D$ x% ^$ N$ I" X0 B 2 N$ n( y/ Q4 d- b4 h; a& B
) }; W5 {9 ?6 b
( G1 H) c0 E5 M# m4 m4 e , n* x+ O7 z& ~9 v2 q3 r
* Q! A7 \: H; w" P 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
4 _: {& q2 \4 G- `9 \) o2 w
1 F7 g4 D6 f( h& j+ S) W7 N: S* n0 E3 ~; o4 p9 g* b; M
9 ]2 r: d9 V' I3 @% F
8 r+ C2 {$ ?9 C/ d# p z
2 B5 N$ I; |$ ` e- J1 c- o . x$ N9 J2 Q# x
( t9 D2 c' d7 ]% K1 H9 H5 h
4 u+ E7 F6 j* Y/ Z; f
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 : G) h H9 e+ V$ q8 `5 p( G
+ J6 R& B5 w: }7 V5 |) |$ v" v) h/ a$ s9 s5 U8 J: ~
( p: D4 a$ J' c. X) I7 B$ ?
' d8 T+ a" n6 i9 B0 u1 N; e r% ?
$ G. b* y/ F0 [' {2 {" p 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 ' d" M q9 _5 c' l; N2 w! w
4 W( ?0 w2 n Q% r* v; f; d
- b1 W/ t& F6 G # ]) O+ e# K8 D
2 T; A4 F& L7 y- n J2 Y; I/ ^6 k5 Z
% W" @4 M3 K: s+ ]
* s& o1 ^+ ]% Y( c( c. t
2 \( N O1 U! ?- r- g8 C) [' @
^: t5 M$ R6 {! l8 n, b 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
! H f" t0 A8 A }. ^0 R5 a , R+ M. [5 }2 {, B4 J5 R
! B Q% b1 A2 r4 b& F LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 ! W) @. g* S- G0 [, u9 @4 U' E
1 c, @4 u1 {7 o; {& ~- E7 O- w# D7 L8 M0 U% f% r
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 & S0 x0 K) N5 s" b
$ e5 Y4 A8 U2 b; u
1 h/ C" ^: O3 k( g5 e T4 I 开源的luasocket代码可以参考学习下 & U2 m5 z& s4 L% ~& I$ O I7 ?6 Z+ h
8 x+ ^* Z3 Z# u* J7 o
( h9 ]8 I% y% }! ]" E, s$ h3 Y8 m+ N
https://github.com/lunarmodules/luasocket
2 i) g2 {. `5 I7 S9 [, \
+ Z0 t6 _0 l& T7 I4 z2 h! |7 I
+ q5 C, Y" `: ` https://github.com/fengye/luasocket $ Z" W# s# |' }5 k, c7 |
5 I$ L. V5 i; G! K+ L
8 ~+ @* R1 J9 ^/ ]% u
* I* V* k( {# ]7 @6 [) ?9 f3 O
4 o0 A) W, f# C' s7 B: ~0 n
9 [8 N# p( e6 Z
$ H: {; N( W) V/ v- M1 k
! Z' f- l: I: y1 _/ L' F3 D' N5 |
4 [. g$ w5 b' [: _3 K& W7 N
" i9 q# j# I6 ~ 6 e+ P, c6 o; W1 V. H
. i; [' H$ Q' V. w( O
8 n0 n5 `1 _1 [; X: o% i) p4 u
7 y6 v L5 P' d" h2 k: P: A' ^0 z% X7 G9 L
总结 ( x% t; T e; K
$ |4 \1 \# L% F5 p+ t
( {: _& M+ ?' \( G 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
; x b; m& Y! L" _. c# Q
+ E" r! j& v7 u7 A9 R0 _1 z
; i; p) [: t6 T& g0 p- o! t/ [/ T# l 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
2 s( s: a5 E( q3 X/ ?
$ V5 a- ]% a: E/ L, v) {( P# Y
5 O# d, V) r& @) P2 g: A 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 4 M- W% B$ P6 B% P; e5 j* p% @0 u
O3 X" f8 c- i. S
5 N0 ~( O* J! {- l0 N' F) R
结束 ! B# u5 O$ G/ N/ J
& h2 \% K6 h+ P" X
( T3 K3 ?8 r6 M2 w* S 【推荐阅读】
' G0 r- }: k4 W- u
- r2 J0 |4 H4 |0 \# |
" m0 d3 n% }3 e 对吃鸡APP的分析 $ K) H0 F$ Q3 [
4 E6 s1 T# I! X4 e! S% H
. A7 z0 p1 b/ Y3 D7 d7 l( ~
你需要了解的APP安全
1 M# |5 b4 |- B) j; t6 K 7 p6 L- y! e( Q! n K+ E8 m
% l* P8 x+ Y# \$ y, U/ t3 L8 n 你需要了解的APP安全
3 T- D- u' M- z3 i& I % _9 k2 y' Z9 k K
5 X, g9 N3 D+ ~8 [
" B1 c' M9 X# Y* L7 ~+ i3 g
|