|
) X. m2 P' U Z
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
" n6 A2 i3 ^0 O5 P ' H$ _4 j' M; J. G* [
; ^4 G' {. j K$ _
" w( Y) u% P7 w' A- c5 ^6 y! a( ^2 f
. U, M' ]! M, `/ G" S T: f7 I/ X7 ?/ T
# n. S# P* e( E2 ?. C
' a/ e& f7 q3 Z& f& K- w$ _5 r. E9 W6 z$ \) A
下面就以开发者角度进行解析下这个APP的功能的实现原理。
* [5 R/ V0 o; o3 I9 M& q
$ A5 e" Q& R! f* ~/ e2 T6 i4 r2 d* \4 h
* J2 ^1 J1 r" ~4 t
1 a9 r2 T! M" q. f
' y+ Y% a. I3 k$ E4 A4 L
基础信息 0 @& C Y1 J7 L0 \
9 H+ f9 N9 e, |
6 s' V8 Z* n- [! z" U, z# L 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 $ k- w. f8 L, q& [9 E* \) k _
1 j6 t/ I0 b2 }/ O$ n5 P, ?5 Y; E) [- L+ u
% a. N/ a) w$ N- m7 m' _9 [/ m % }9 a i* ]; Z/ ]( B. O( z. `
: Y9 X* O! u T9 b ; y- \0 }: Q' h& R ?3 A
8 J; m. q( A; K1 `* t
2 D8 q% I+ w% [3 v$ a' n
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
5 p8 u6 _9 i/ q8 F3 L
4 A8 n( W( B% y8 J a7 v
# V( P9 V8 R( a# }/ t; v
; b8 O3 J/ t4 n- n; w' D- C7 [9 @ 5 W" z* {* k+ j+ {8 K7 L7 h* Y+ V, {( X
4 _0 l. q& |4 R2 @4 c5 n & o6 w/ H0 R" |) _" Z. L
6 z9 F2 O [' l( w% s
: K, d% j! ]& N/ G7 q, } 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
+ H4 G# a* D7 q7 [4 i / J' N& x0 A2 \. y6 z: U B3 \
1 u* d5 |6 q# z! v1 h9 J+ y( F6 Z8 K
I! F/ H" P1 @& y
% G: B, D4 R3 W1 F5 O* i, ]3 U6 S$ O y
/ `" c6 @2 p8 ^; q* c; u
/ J4 `) E$ K6 X) R2 q2 Y: P0 T# w' n6 W6 M3 H7 ^% \
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 4 }8 g/ d; t( F4 J% y
) ?9 [& J- t, k+ \1 S
$ d/ Z, l* X! n6 A7 s # n( ^( m0 L8 e3 E
# h* s0 [* f9 `* C1 e. q5 @5 C; {# j# A
" r) g }: C9 N
* t5 A1 t, q- }' m
3 K: i0 b2 Q6 b, G5 h) ]% I 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
% ?- |# l" v( k9 l+ v
; Q% ^6 E! ^/ I+ a- o( d$ Y! T: h+ c7 ^. w
* t' H* W" l! ?! H* D% d% l
! H1 p$ @( Y# s; h
- E, l/ {5 F$ V$ ^6 {) ^3 q; c0 A : a; C3 P1 K! L+ P$ b
& R& D" v: J1 v) ^! M8 o ]* G4 N. V& r9 k/ X
e0 R% K- n4 |3 D
& b+ I6 T" e( j& z6 y# {1 I
, x2 \1 r9 ]4 [ n& N 签名信息
; Q3 ~& o& w3 r- l
+ P2 A( J8 R3 P/ @* t: p, q; Z' t3 E$ ~# E
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 / ]2 S8 O7 G) D1 M
" I9 m. b2 V& O1 k
4 Q7 l: b, s3 x4 _8 Z! f 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
+ ^: C$ [; x- F+ T/ P7 w& k ( W! K9 T7 {: u$ d8 \3 v; l
' w* L9 `8 Y" s3 }# ]0 z
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
: E5 j) T4 P- L% e' ]; N, q3 y7 E ; F4 @6 A' F+ W( a8 p9 @2 Z
, N2 t) m5 V% f/ R
0 F j6 @6 M& C5 B8 b7 q: K8 r
. g$ s3 i2 j- B4 S) V( H
8 T7 @ O& o( @- ^+ G s + v+ ]9 S" x5 h4 q& r' e' Y3 B; `
% v' Z" [8 r+ ?4 g1 J( P
- d, k5 G+ g: l+ q: O
android签名的数字证书的一般都是采用 X.509的国际标准。 ) c3 T# O5 |9 Y2 T6 s" M6 `( h* H
4 e( I, P, R5 `2 ~% p
0 m. }# o, n8 u+ d 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
8 J/ G+ V1 o I7 }* _ 5 T* s+ @: [/ q$ `
! h' X1 ^- p$ D5 h5 R! U 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 ) |, {( C. e+ x% N5 z
5 ~/ U: X0 F% `+ _2 T* H
( l, t* j# |8 s7 E- d& N5 w8 z , { k. \ o( K; o: A* w/ I
4 P7 H) z5 J; _% j# x7 g8 n/ {; _1 j( M. z
3 m0 p, k( V( @8 x0 q 5 J! h9 ?2 A! q. w
6 F# j6 ?1 r+ } 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
; _2 ]9 T) F3 ^# M! x
, Z" y8 x; {0 i+ a' A0 z( e
" X8 ^( }# [% h8 E " ~4 _+ x" A3 s
+ b! |2 B1 f" H0 h/ |. R
: W: a- X$ i/ i) [& b3 U
、 % I6 J b( D& ]( n* m( Q3 m# _
9 v/ i8 [; X. z: q# `4 d9 [% t+ t" z; W) R9 W \: O* ?
6 c& s; U/ k; ?2 _
, z# ]" }8 Q( R5 y# ?0 ?5 L; e: m% A' R) ]% {9 o# \) q
权限信息 * A+ e f- ^" R, d3 }$ S
$ s" N5 D1 w! W9 y$ @& ^9 c. r( p* r
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) ' C* m# R1 e/ B: h0 K
0 U; M }$ C8 ?( H5 H( g6 G# U% @: Y3 s& B- R% p% h
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
2 M" f- o2 H; X% O: @ ]* J* b o. U. u: m% w/ h
7 O$ K- X; S6 ~
& V5 U$ K6 J# a0 K2 o+ s
, \; n( X& C0 n+ n( K
t+ h9 \1 O, N; o" d3 x
& \8 c( r% G9 _5 m + w2 }5 m/ T. @3 T8 r) \
' G* ]$ X7 ?6 E) A; B
下面对这个APP的所有权限进行详解下:
4 G- J- I K7 x- x% k+ e7 q 9 y# U( N* _ @3 t4 s: D
# j* {3 j C. ]; z# s! z
android.permission.INTERNET :访问网络连接可能产生GPRS流量
' [1 L( x* c) g- i
& A0 c+ X2 Y# d" q/ S
7 l6 e7 M7 E- F android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 8 _' v& l5 y1 S4 [6 V4 E) `
; O8 ]9 I/ v5 `: `- a8 n" {' J+ R
& x- e6 U# N3 ] android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 6 @, x' f1 Q1 P+ g9 f& T
4 M6 \, k; y9 P* b
7 C8 W; Q4 Y5 {- W% z+ P android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
% U) T3 F9 c3 ]
+ m9 \" T- M/ f/ Y, S" @% d7 w8 ^5 P5 O+ B$ J7 z2 O
android.permission.WRITE_SMS:允许应用程序写短信内容 ; b2 A4 \- E8 X/ q" W0 M
$ ~- d0 q" x5 ?$ v+ T1 ^2 k8 f3 J
& ?- L$ H4 r4 t# A, U- Q0 `$ F E) L android.permission.READ_SMS:允许应用程序读取短信内容 ) R8 N% i" M' P2 G
9 y$ | D, X5 N
# s- Q8 @, f0 j3 r7 r6 d% y
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
- q0 H/ Y- F" O: P0 K 5 n' b! [: j" @
) m! ]" x/ ^) V% G# x4 O w android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 ) I$ z/ t& v' J% ]/ J5 ]
( l5 X8 p% v7 U* d( s$ i, I2 P
, g& h/ H, z2 a! x) k3 a: g, L* K ?
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 ( _8 p! b8 Y" D! i6 k3 x
* E% w+ w* _6 K# h* W/ x
\0 ` b' x1 i
android.permission.VIBRATE:允许振动 2 E8 b) T; x. V: Y
- u0 f0 e, |9 \& u- i: S; I* r7 _& C; ^! _5 D2 R
android.permission.READ_LOGS:允许程序读取系统底层日志
4 X; l- f0 [# {0 _; X * F9 I+ N6 e) @7 }
* y# q3 I# s! q- a: Z% @ android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 / c2 l8 O& l% w, v' m0 C7 S
+ J" k4 e0 C5 ~, u K j9 C4 r- c
5 z7 V+ g" a+ ^& K- b 5 W: N9 M2 ?" O1 a, G6 U
$ W, a, @# E* K6 Z o/ ?" `" t
9 H0 b- W: H* K 功能信息
) F+ F5 b3 Y6 y/ B ) o# y1 r/ a* h7 h: c
& z+ m# o0 O9 u0 W5 A7 ^4 W
) I: z% F5 _9 d2 k
, m9 p+ g7 F: ]4 d2 l
9 [0 P) B/ L6 ]4 \) m8 z2 @ 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 1 a3 {& x( H! T2 g5 y* b
7 W& D4 r3 K9 ^ V# c9 p' C% c* Q1 l" M* x' U
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 - }; T+ K! s& W* x
& f2 Q4 @3 ?6 k- U# f# R
& @- V& @) d- j" k) G$ t
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 : Y& u, h" } B5 m9 w
( h! ~- @& Q4 }# G8 X& W* x3 T: M. j. Q3 R% ], h
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
( A0 O2 T1 b9 P+ c & V" r# V8 O$ q7 h) W J3 `& J" y
3 x4 e& R8 g- {( E; e! z6 n7 A
3 F! i; H. M5 J+ j; `2 T( ^$ _
0 D6 Y% {% o' o5 ^, m: R8 {" I0 K) Q$ H5 Q5 g
$ R' T% [* o; A2 c5 `, @
+ ^- \9 ?$ s7 m: s- i/ N7 L6 B! V, l8 M( `& z5 M; A
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 ; J& ]* c% E8 q- r% j) J1 u
5 k( k3 Z, P0 z2 P5 n9 h" l0 B( H( \
% @! o* \: K+ N5 x5 R6 _
' g9 l$ h" Z+ I. h0 ~" X* |- `" e' z
4 {0 I7 ]" m* U' Z% @. W
& p- T8 G a4 Q5 Q" s : s- m A$ g: a6 R6 Q/ F1 |
% K9 X) `( r* H! ~+ g/ R' {
* d& e8 E1 C* A9 n2 y. {* r0 B
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
; |, B1 F s- p , U3 A; a; K% W
% j& W3 V' J9 g! y9 n: N2 l! `
7 p# O+ e. f' e4 t: d+ e " v& B- n, \0 s( @' |
% d5 t& o* |3 L2 Y: h: X7 p 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
# }& [- j9 W4 N) L 1 D! ?" Y1 F8 j) N/ Q* S
) l" t, }% t( {( c( l- C( j [/ m
4 r. e! {: \$ V* ?, \7 ]
7 O# @3 z$ L( O
( Y- h0 n# Z. {- _- X
, r7 {; S- h3 }' D+ z 3 _3 k9 B: ?, k( `3 W
: h6 Z9 d- b6 [5 L/ g" w# d0 J d& A
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
0 h$ H, }( F. K2 k- G t $ q3 X; k( i# @; E$ X0 \& @! k
5 R. Q8 g. g2 ^, Z# W# j LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 8 V% {& J4 J c* {2 V8 u0 e2 o
. s% L/ m# T* [7 `& R/ Z6 P
. L2 w+ @% U% w4 y L. C
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
+ F7 L" }* X( ^0 a2 p4 ]( E8 [ / D0 Q/ t8 O: f% w' w. [% J
( [* d5 W% v" w8 X6 \
开源的luasocket代码可以参考学习下
/ l& O1 k: M& b8 v
: T( a- R$ K N# K U8 w- x( c6 }1 s9 y
https://github.com/lunarmodules/luasocket / Q5 {; `: C( P! p8 O* c
+ U9 E [- N2 L
- W1 l: {5 h3 H https://github.com/fengye/luasocket
0 T! K: Q$ M7 x1 ^( B0 F ( z0 q! F" e* r- w: [
8 J# N' [8 P7 ]7 X, J
6 e0 `# v. i o) c2 S5 e! H' t
4 t( K& C7 T. Q) L, z' C7 D* D8 w
" i7 X8 j+ H# k' d4 a $ X" _7 K$ a- Z% X* @: c/ M
5 }+ F9 Z' Z6 H. h Y& T, W 8 d% k/ n3 N `5 J+ x* g! G
, P" c+ Q l0 N6 p
% i, R) M; s. `# p* V3 Y, }
3 ]. O! V* U0 n1 e( y
' C7 q+ {7 A2 `* C- [. q- K& h: u2 c1 l0 K! e$ n6 L
总结
! {: }$ u* `' n! R2 Z ; b0 v& A; Z* k, Y# w
0 X$ O" y4 h( W4 @: i 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
1 G% A) R! I0 ]9 v' e m/ D% _3 D$ B) U* p
' y6 M- R4 ~1 X1 x8 j6 Z6 H# }: y& S/ o 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
_; m- B. d: x# O3 f$ | 8 E+ C. o8 o/ b6 i3 D
. r" m7 a% Q2 j# b4 Z
对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
% u/ m1 \4 u6 O8 ~. }
3 ~( S% K9 z; f( }0 N% _4 ?8 R+ R7 a V. `; [3 K/ r5 C; G
结束
9 W: Y) N! A- C8 P$ z
2 O# t4 o% z& G: f
! N- b- v ^7 X9 Q# c 【推荐阅读】
# q* X- A* x7 f9 u+ \
( i1 m+ a: l, Y1 I4 X8 F# D$ N0 Q; T2 z7 J. V# U9 h! i0 R" o; u; [
对吃鸡APP的分析
7 T2 G$ C& |& b" q5 @ 1 `. ?1 v& n, J8 l6 }7 z6 k9 W
7 e! B$ c# L. O* t- ?1 S, \ 你需要了解的APP安全 : v( W3 o. D) ]5 r3 L) L
1 ^: o- }, M L) O" ^' p
' p: \0 U, ^7 u2 e
你需要了解的APP安全
8 A# c8 ~; Z- J7 X * o0 f0 m6 n) k) [4 \: B1 G$ A% B
& [# {! J9 a: r5 O4 H3 \
; p% p. o+ W2 R8 j/ [5 v3 V+ o |