|
+ W/ q# s8 E: b 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
& a& d/ @8 p& g ) @ ^0 T8 D4 _3 L5 O. G, w
' r5 }2 D; d1 ]/ P; ]
7 f$ v) g6 L, ?+ z$ G 7 \% ]* Z0 P4 C7 w; }; O# u% O& d
/ Q9 o! Q4 H7 u6 _3 ?
# O! Z F+ j) ~; \1 D" E0 a y0 J
6 Q+ M2 q2 [7 Q
" T4 l1 s; n: V# I# R. ` 下面就以开发者角度进行解析下这个APP的功能的实现原理。 3 y$ u4 M. Q1 W- t6 \
$ Q$ C1 |5 v) z0 X* ~) S& _/ _- t W4 L
$ I8 i0 E7 _# u6 W+ w1 R8 ?9 N
; G w' m) E! X/ | 6 u% @& \& ]" m- O. w" G' I
( e3 H- l' b! z( W# n0 q+ ] 基础信息
' n9 _) ]5 K& h! Q* M+ _ o
4 N4 r5 ? c) ]( p
, i1 l& R2 M- f3 m" N 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 5 m! y+ ^" r; d6 r
6 U' Y+ b. g* ?3 @8 p% g& k3 A% i
" |) I6 F! I$ F) U# o* H
7 S1 Y+ {5 ?9 M9 a: P
6 K4 ^( S2 p0 j& |& V
" @, t! p3 o' M' Z! J$ w; E. q
8 V! S9 w9 q7 E ~8 j1 `% [+ Y8 a: q6 x
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
/ Y3 L( q. f, D$ H ; {1 J- K9 |/ p+ }8 ?8 P
: Y! w c+ t, ~% x
; H W7 `* @8 ?3 Z8 o$ A
S3 `) M& S7 e: q3 Q
; Z3 u1 h9 ]% y% d9 V
' ~# f3 }4 s7 I" y& m* ]
# F5 f. x5 n( X
' U7 b2 @6 N# M7 {1 a" h9 D 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
6 f. ~# x+ h' v) U+ I
' v$ m" P4 D K ~! N
- h# F& \/ `# c. L - J I& z8 }5 S9 x- I
+ @9 G; ]$ ?- d( b7 ]1 ?
4 d9 E6 i3 X# m# N- E# X3 Z* B - a# z A* f+ T* e) e0 g6 }
, Q( R$ F) F, A1 O) R& ^& J
/ G; W. G6 [" O' |4 U" J8 N9 q 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
7 K1 z9 [. T$ D/ N& X
* H, w1 e* M5 A( H% U, e4 e$ p o- p8 j5 f+ f4 z5 W( r. M
, s( O- B t+ j% x% U - k# x* j. l( f6 e2 t
1 G: F+ [$ h+ [# P7 d- e/ n 4 q0 y* t5 d9 q: E a: T2 C0 a
! J4 {+ C. \% z, M! D
# C: F7 c% l6 t1 D
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 1 i) Y" u% w* g( a& U" l
5 H' v h& [7 g/ v% }8 n9 z
# k- O4 L/ X: U4 J: L2 h: V 5 Y3 X7 r9 K& j& |
! P. H% s0 N2 S2 J/ x1 @/ [* w
* B, d& U' i; [7 A
; _& [0 @- z7 O7 m$ _# a
( L" n& L7 a7 |9 U# z& y: y+ Z! [+ {. ?( _* D
& \9 E, ]9 S6 l3 Y: L
$ A9 d9 C- z7 u- k- B9 G+ \7 B' I$ ^
/ e3 M; a4 r6 T: @
签名信息
" M! ~; S8 |" T; _; m' K% w5 Z# V - p+ ~5 L1 Q9 m0 v1 X
# Q% v$ {0 x, T 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 # F; a" C7 ~5 Q4 p
5 z9 y1 f5 _( Q8 B. {# n$ I
( q% z9 }9 i) o3 k# p: }1 T8 m
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 + s( n9 T: [4 h, K/ _" j% F8 l
: N! `5 V3 p* h( e; q
* \7 A1 s W' ?- C! q1 l" P 在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
% S/ J8 y3 h- a$ T2 j/ S: t
) @/ |* T# M7 i8 v( f4 r; ]# }7 c" f9 O$ ? m
2 P. @3 H0 }; h7 O( o0 r J
! ]. C; N( Z0 p3 }: R
! U e6 y: J2 f% O$ h ! g7 C# Z! i1 S& i% P+ Z
, O; ?, {* G* L! Q2 G! ]5 e) p9 `- o. {% ^: V
android签名的数字证书的一般都是采用 X.509的国际标准。 6 G, X' z! {* z- D7 x6 f Z
5 a! @, z A0 \3 G7 G( L$ m* l0 Q; M/ ^1 A* G" S
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 & p1 u! {, V2 P* [5 F
6 Q5 I& M4 P, t- B( z, w
7 L# U$ h. H- n) ^; y ^
下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 ( q. S5 ~, G0 N" j6 Q$ c! n' T
8 }, @! K t% a
9 a& e- E2 _6 |8 u$ M" v, V- ]& h2 N
$ p% v' G3 o& X4 e/ D% j + r3 P9 O! Y( r+ V+ ?2 E5 K4 |% p
% X) B6 n# A! @# T7 l7 P 4 {$ B$ f H6 N
0 H' A5 g' T4 ~) R
, y# m' Z, h& L. F0 A) M4 V# V 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 7 S9 P/ e. y6 F, J6 r
2 h* o1 l! l- ^% h0 i# ]) @, ~' ~" _( [" V
! I k4 G, b. k- a/ ?
+ h. ~1 ~3 p1 ^& f1 B
$ Y: f0 v9 E; b6 L6 ^/ M: _ 、 ' r5 Q9 D* f5 k) V" J, A1 c
: M9 e& f3 r4 R3 l8 f
$ j0 P# l* s1 U; y
+ [ I' ]9 W3 t4 y0 W0 O , [1 c2 \1 H* Y: x& j
$ O( l1 x. I: a1 x0 {8 l 权限信息 ' ` y" d7 v3 L; ^8 D
# I- m: H1 J+ g V0 F6 {0 ~6 @. x; |8 u, T% s+ \& v
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
. {2 C2 Q! I: U8 m3 ]* @
! n+ r0 I$ Z/ F
* N! L3 w u6 J( q* Y% l5 q- i android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
( e9 R6 G+ B" n4 ^
8 n/ ^/ i3 X3 H' q
- D w+ y* \7 i* h
6 E7 P5 W& M i- Y
- L0 R( \) x$ b1 V% s# k/ L: ]. ~' m: z
6 R: x ^0 m+ a6 c& j
: G! \) Y3 O3 @3 Y/ ]7 y2 O, w X; M5 ]% t* ]
下面对这个APP的所有权限进行详解下: : M" C' f5 m8 e
# m5 v L2 \* c3 X* d3 A2 M) _' {9 m* S' E5 n
android.permission.INTERNET :访问网络连接可能产生GPRS流量 . M% `" {9 J- U; m; \2 e
0 A7 I4 S" I# u9 u$ j% p7 E( u- V6 A% n; h( L6 U1 e4 \: M
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 1 }; @# C+ b% ^7 b$ [' S# a
, E9 d" O' A: Q" U& u* l1 O
; |) e- W' p4 E: s) U8 W/ U android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 . l4 T' [! S) G/ N5 {* _
6 |0 E6 k1 D% f+ p9 M) ~; {! z
: |5 ^) i+ n8 J
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 - @2 s% g- x+ M. V9 `
$ u( ^0 _5 R1 h. P6 k/ C" z
/ N6 _) r* a' B android.permission.WRITE_SMS:允许应用程序写短信内容
: t$ ?3 w% p$ z- g# g$ D
5 V! ?$ P8 x$ t2 v+ I
7 J6 k- V( e+ |2 z android.permission.READ_SMS:允许应用程序读取短信内容
( x; ~. W4 g4 @ J
& @3 I4 \4 l2 u1 A' S( ^- F2 Y+ J$ r' o' e7 H+ v. J
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
2 ]( c+ r* a# J
5 ]6 V; j( E1 y/ M0 Z; {; P9 h; z1 |7 \, C& S# x
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 / r5 I/ `6 S; k; W" D
6 g+ F1 o! x% l1 n7 q8 }% H
. P% r7 o, p* v4 j/ d% V8 T9 u/ H
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
& {6 u% D0 h$ s5 F9 G3 R
- Z! N, Y( z# e/ j9 ?5 n6 Z( Z3 o. X
android.permission.VIBRATE:允许振动
3 x2 K. B( I% W
+ Z4 r) D, I6 P: @
: s, {( Y$ V6 a android.permission.READ_LOGS:允许程序读取系统底层日志
7 t7 Z# C- E3 }1 w0 J* b& l 6 P: M" ^; d9 {- V: q
3 N1 F5 _4 E' e) n8 d% l2 K" a( I# r
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
, A) @" f! q) F2 @: w2 F0 v6 k 0 U0 Y3 [6 Q# W4 x
* ^$ x/ P& V: `( G
% F3 F: j3 C0 v 2 m7 k9 _$ Z) N
4 Y6 J5 G. d C$ p# `2 R( |1 }& r# g! x 功能信息 , o0 u C# @9 d- A9 i
. J; Z& @# c# u. R/ ~* h
) x H7 {! A" {" X' t @& q" o
3 _' T" @, f4 a- P' B A' {
/ g5 P5 I- l! e/ P% R
: W8 V2 C3 y+ [ 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
) ]/ h! X1 e9 B1 t3 g6 Z+ R6 U" ~ 5 x1 M! a; b8 I, x* p* e- b+ m
) k* ]6 v3 Q4 W& s$ o Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
F# _7 i. K0 n, ?, v" u: d , u; W9 Y- I& i
; k, T& }" K1 a0 }/ C6 x& x1 U" R( u
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 , e5 l6 ]/ @# \3 q- p2 u
1 ^- }1 v8 k' b! F [& f( `3 l8 N: T/ O7 l
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 ( w4 C; D! ^, h- Q
/ O' i1 L" ]& \- b0 u: I
! K# y( \- _( f- K, B1 i- i1 p
7 @# M" f2 {, Q: J) w1 d B, Y" @' g' ~+ Z- X, h- Z
6 S. \ s6 D) V; N / R6 V, K$ o1 R5 [ j
. ^/ T: c1 H c' M! Y& c
6 ^1 m- _ Q$ W8 m 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 " X2 L' m# f9 m) G9 u
& }: i7 n: [. i! l! I6 Q5 r, h% E& r& B* `. r! O' X& s
1 B; N) S+ b% s; E8 L/ c
8 A& l7 }% E9 h& M' `& I# x9 ]
& b( y9 P. A8 Q# k* w
7 L( j _2 c# x; v - N) j. F; N g I/ @
9 _- G3 F8 F, f( G9 I2 L- a 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 9 |3 p& E) K" `- B5 G' S( \7 \
6 Z. ]6 |, H1 q) z0 ~% p* B
& ?6 h T3 {# f, T . ]/ ]/ e6 i8 p: A% \
i- d: y" K$ E8 w' F0 ]5 d
) X0 C e0 K$ V( q4 ? 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
- Z1 m; S' l% Y) ~) ~ Y3 O0 D0 b7 J! t M8 n% Y
- V, H& l) B z" X1 t: Q
# p/ j5 h2 w: Q! ~9 j4 ^ l/ R
+ u( |/ w* W, p5 N- p
8 W* B1 A' Q1 v' y
% W* L2 Z; v3 p; Q' K! c3 [ ( H; g2 H& C$ `! H" Y b
6 ]3 R9 z) Q# P' w( a0 W+ E6 c( a. U 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 6 Y- Y8 o: ?; }1 [5 i! F
& B+ e) ~+ ~: K( Z4 q# c
; G+ L( G N$ ?7 L2 I LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 z- T k2 B* e1 r! p% s; m
0 J& N8 s. g) L. K1 y$ Y( o
( i3 X! U/ y4 ~: I4 { G x! f$ e 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 ' G& u" Y1 O* @# q
]/ L+ U! @4 a7 {8 ~1 W
/ c) N9 }# Q; S( t$ u; d2 ~5 P. v8 T 开源的luasocket代码可以参考学习下
3 f m! b% B# \9 i- I 8 c& F/ G9 h3 i& P- a# o
1 B$ }' C9 s9 y+ r7 t0 g# |. K
https://github.com/lunarmodules/luasocket ( G8 D# [; {4 @, J" F1 n: z1 R
' I9 Z/ h" j0 S! a+ k* c5 n
6 ?0 L: c& L( K# |# T; Q https://github.com/fengye/luasocket ' W' [/ c$ X; _5 @1 o
. v. c0 n( a1 P9 n6 h4 I
5 D: H r# d2 K- V" l$ Y6 `4 Z 1 X- {/ S- u! _
* i. J8 @, f/ D
+ C8 Z3 Z6 E* G4 r
3 }7 |# O$ M8 N- E, x& w+ T* S. _
% ^; I1 Q, q0 ~) q5 r/ T6 N" E0 i0 c& P- |2 E) S. K4 F
. M1 k$ Y) U5 u* X 4 q; S4 T: l- c" k9 e2 m) E C2 j: M. G
' D6 b" {& C& k f6 ^" G P , x7 {& G9 t% I5 P% y2 I
0 {7 ~+ {- g6 i
* _" n& `7 }$ o, d" d 总结 " y& G, E! @8 R* v9 ~( A
, t4 E$ q- R2 d# z" h5 b1 E
" M$ {4 l5 P" \& h
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
4 ~3 O5 @) g. k, U9 y1 H3 r
% E( \; F( ]4 G- N
3 ^0 R3 `0 H- [; h7 C 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 0 I0 ~) j8 K% Y; e
% {8 ?1 J) u; k; c, u& x; ^* B
. O2 o* C8 B0 b% U2 r 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 . y7 E0 H! D/ t# {) O
6 d& g6 I$ d1 G7 i: K7 j, E! e, n5 u, e
结束 ! a6 Z4 n* c- G) {4 k2 E
7 j& W! }% D, P7 `# l. O) f
7 ^% E( Y4 }( k
【推荐阅读】 / i+ v. v+ i/ v- r- n
* Q5 E0 r7 K4 z u' P9 I% G a1 l) C2 [! T# q; {
对吃鸡APP的分析 / F5 a, q- ^% ? X9 h5 _% n+ [
: ?9 g2 R* F* J4 h- ]1 H5 ~: _1 }
: f0 k+ D% O/ v1 x% c; g0 m2 X 你需要了解的APP安全 * E( G0 ?, t4 z: `/ u+ k, N0 e
0 U7 g& N9 L5 T. T6 g" ]7 z. y( \& F+ H6 O. M) a% {
你需要了解的APP安全
. H$ f5 |1 `6 d8 M P' I, u2 @ + ?/ C6 b0 _# }# G
1 b1 A' h9 ]( ^. w, a
1 E) y6 w; J. C7 m6 _6 e |