7 x8 P$ B% ^* o r
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 6 R0 N* F% n2 x, t! i! f* }
2 b# z, a9 C0 L- Z& F$ v
- u. I* P) ^! ]8 d
+ t0 |! [% y- h; t
3 a8 |- Q! u- p9 p& b+ T2 c
( Y, W. l* Z% J* }; ]& ~ 1 k2 d+ A6 f, X4 |. f! m3 K4 Y
: m6 }3 L7 t; V/ K
( Y3 t* h+ @* `1 h& m 下面就以开发者角度进行解析下这个APP的功能的实现原理。 ) V' V6 {) W: R
/ X7 O$ D! \6 s) c6 P% c( Y+ }
% C N% m v$ Y ^8 A) s
2 C% t9 d& H0 ^ ^6 I
8 L8 l* S. Z9 q9 s2 M; ]
. W' t! T- D$ M5 }0 l% [7 [ 基础信息
- q: r @6 R8 V% K1 l. H9 [- l
; L! Y* Q& e( [* t6 p7 d/ }( ~6 _% x" y7 Y
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 / _( \2 }1 i0 I& m; s! L3 o
6 ?, t* P9 m- F0 i) R$ y9 j
! D: \, o6 F' T; H' z+ r
J$ N& X) P8 M4 @2 ]
) W; |# s+ y) L7 \
' u7 Z! T6 e2 h0 U 3 o+ k# N; b3 U4 q
$ n) l. h( K+ q2 n/ @. u4 p
' L( G4 b. q c4 O5 u
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
( R2 i" j6 b2 _1 B! C
! \( n( }/ v J4 M, J$ @
9 g& W+ r& p/ g5 N ! m5 Q2 _$ R3 T5 o; v% E$ K* A* q' b
3 a Y. I0 I' Q/ Z
: } [9 }6 r. x. T7 M
0 L" n; V% v4 Y+ s
^& z( B6 @, a8 {0 f$ n6 P
- r. k; A& p, @; o: u W# w: J 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
* v# N& c* t3 r# H8 E
& S0 F3 w7 l% A& y3 A
$ T- b9 z1 ]) I- |$ ?
: {- J) r i5 i2 X. l. A
3 j$ _- H7 r3 l1 k0 f H9 H3 d9 I! k
& m8 \2 J" f% l6 d2 K ! E3 q$ ?8 L* d/ l8 x
* f% G& B7 E, Y9 q5 i2 y0 R, k. S, h' Y8 V
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
! L% e% {1 c4 W6 T9 w z% ~9 s9 Q3 M: X* ?" y
5 t* a( y+ q: w& l5 T; U, [% y
6 Y* q+ o& h: E( i l6 z8 B - k( u( k2 J1 k6 B, }
0 ]0 r+ }7 Y: P* J
# x: d# {% ^3 d ( o% j3 v. Z1 p% ]
! T7 K5 a) r2 {6 c
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
" E F1 r: g* ~ L7 ^) s
6 V- D+ W# A4 Y' W
( [1 w3 d& k5 n) m9 P {/ K
, S, V4 s* r5 C0 i0 O
: `! I0 F& {+ ~( _% N# ~8 d; \$ _. y: e
- @% C( k$ ^- i $ t/ v4 P2 W+ i. j. y
9 ~5 \1 \' O4 h, K
2 a* U. K4 m3 H9 V e* h# K8 {9 l. E+ P$ D+ F d
/ d, U: s5 G& C# u' w
签名信息
# r b$ @# _1 i) E% E& U) Z7 m# v: l: ^ 4 \- d o2 C3 }& |; s
# Z; D$ D7 {3 t' l 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 , Q# X: V) z: c" V8 _" t4 y
5 L+ e! r* z( I& m" L3 g% V& p2 M3 E4 A: e: S1 x( `0 Q' v
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
: M9 N2 [9 C) p8 X M+ d # M' C0 N' r; Q) k# o% m
4 C+ W+ ]8 k* O( i$ ^( i" ~2 y+ f
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
' O2 x. i6 @, l5 f# x. f( j , z4 O2 B" T, C
e' K1 u$ ], b 1 g, w$ ?# Y' W7 j/ i
* z6 F2 U* O: Z/ T8 U
( v% Y' l8 c& C4 ^$ E8 ]& p - T0 W. ?. [' \, Z# ?
, t! { X6 D! L
$ M" K* [- d7 s" M
android签名的数字证书的一般都是采用 X.509的国际标准。
; Q$ l( D* E; d4 E ( @8 \+ p6 \$ e9 Q6 c* _7 M
! ~3 l! x% j5 j' l; D; @6 U 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
6 Q9 e6 }8 D# P: b . B" H( ]% T# e8 g/ Z
' ^1 O0 S/ d/ p2 Z9 n1 r" c 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 , T6 {2 L% }) K- `* y: U# p& b
2 j! {9 s8 J! O5 i8 Q% D
. f/ A R# a) b8 H$ G/ l
; Y: `) b5 ^+ I; w9 n
" F4 m! i6 s1 g6 T" e( x# [. u' j7 b( ^+ z; n2 @$ {& ^
, S; c( f6 k! f
8 e) m; \- U6 G/ L6 D
. ~8 y+ ?7 D1 y! @& A) G2 R
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
* ]( O* C0 Q8 [ ! E9 k3 O* _9 l! Q
7 I! i7 l# e; y, D R) W/ Q, K" E8 G: Y
2 K5 w% Z" K8 o1 R6 G; }# e V: J
$ t3 Q3 U _! V7 y
7 i5 G& o% K1 b. l4 H' Y 、 / |( ?6 ^6 M1 l0 p) O$ \6 X% ~6 T# n
: L1 q& s) H. [/ q) t/ A Z% J9 x
! [! E. `( G5 A7 U1 }4 A' w; e- L
" h& v, O7 X( E6 \
8 u& Q" X( l7 ~9 ]8 c! K
- K; z! T r: ?- R# f, c
权限信息
m% k3 ^5 U4 ?6 ?+ _; k0 R6 G
. J3 ~4 F3 e) }$ J) U' S- x; g: [& s4 j# q: \* O8 v" w
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) * u! f: W3 C1 z. }4 l6 h/ g
. K4 B X# m. _6 s$ S4 |$ P# ~+ p0 w/ D! g" Q
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
: s% b1 f0 N) k2 @ W
$ T5 w. b+ s% U" O" \ o1 O* H. D6 y# i4 F) n. [: ?9 U! t
( \7 R+ a9 S( \3 q; C3 d% U' a0 `7 l( c+ K
1 L' v9 F3 E9 i
/ A# r: M2 R c8 B5 R$ _: L , m8 r% M7 v5 s# y
. `* }) Q# [$ A, h7 @' A s) f+ H9 ]3 h" v: T
下面对这个APP的所有权限进行详解下:
7 Z0 V: R+ j# U' \5 o0 X4 ^2 r
/ u# _$ L- B# s& _9 k% g, ^, p$ j+ g& Y, H
android.permission.INTERNET :访问网络连接可能产生GPRS流量 " s% y4 u( A3 ~* ~6 ~5 C/ x9 j
6 s, R) g# W- x% P( [' ^
/ O# a; l3 o+ L9 r* o. k$ R6 @7 y android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
5 f K6 |- i2 T; c( ~
7 @4 d/ Y1 c# c
) Y* r3 a( N4 g' L) N android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
; t: P# n8 i4 f
% t) v8 F, c' A6 N% J8 |( @/ `7 g6 C( C4 F' s3 c: x5 l
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 , S' }8 I0 \7 W: |
1 ^% p. }$ G' _9 U
' E# C" U6 x% P* k. L android.permission.WRITE_SMS:允许应用程序写短信内容
& I/ W5 Y! M; p& Z
! {& X2 Y- O$ L! w- ?, o4 u; x+ B6 f/ x$ r: f1 O3 J
android.permission.READ_SMS:允许应用程序读取短信内容 8 M2 n/ Z! @1 Z8 G0 x8 H$ d+ a" O3 h K
I$ c5 i; [: [4 f
6 R9 q" O; F, ^7 L" Y3 E2 _! U% l android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
* \) X/ i' O4 h+ ~+ ^ ; {, W* M X! S+ E3 P! |
! k4 H( k' h1 ]
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
7 _3 E# c# \& u" y! k! |1 J5 g. x $ c; o7 F8 M- b/ z6 F
" ^! @; T0 q& Z8 L- k
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 2 Z6 L, M: S" H/ M# M
* T& k! O+ v- D9 r0 q# t7 f: z2 t- b( T) L1 ^
android.permission.VIBRATE:允许振动
4 }. @! [3 N6 T
, V: [6 Z6 V8 |0 S& y# ^" I7 ^8 K# K; O: @1 n, o7 b; ?- E. p1 t
android.permission.READ_LOGS:允许程序读取系统底层日志 7 [/ p8 Y& x" Q3 G2 _) W
7 ^* B. Z# m$ z) j
; [ m8 D% |; N9 \, Z
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 , Q8 r! S/ L& O8 p0 o; ]/ _/ s- Z
2 f( Y3 M, u8 v" ^" c
) s3 H& \7 l& p6 j5 t
6 `' J. N! C7 Y8 T% J* a P
y3 ^0 g- Q) x/ \" v) e+ [" H" I
! T9 C1 S% C! a0 y 功能信息
1 B$ u8 U* a; `' Q4 `7 ^& S [; _ 0 y0 p2 n* F8 B0 a
# O( w# Z. X# @$ v5 ^. ?
& ^8 Y8 v7 a2 F4 n
* T. n+ k7 R# c. C% B1 Z
, X5 T/ g* ]6 |4 F1 q6 T0 ]* `. s 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 1 y& f% y' N) ?5 {1 g+ z$ ]
6 d3 |: J' O/ C8 w( B# y# q3 S- }
1 c3 J! |# A/ @% o Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
6 E, _0 I0 P2 G. h; b
4 p; y: ^9 h! _+ O- \9 A
( G2 R7 m6 ~, P s 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 ) ?+ y d* N, l/ `$ P
' g' l" C2 U3 d* K
0 u6 p; U2 p$ x* h2 p
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
0 S4 ?9 j3 i) U5 r5 v7 ]; s* m ' ~3 p9 l0 R6 u4 Z
0 C h0 w C, }7 R2 h
9 k4 |" d% b+ j' O% g g+ w ; Y# z3 D4 ?/ T% S" I
2 o. t% z1 I1 ]- t$ v1 L( |
8 J# L1 L+ r6 u0 Z, \* K. L7 D% \) K
' P/ W3 u& y3 L9 l
# D0 n4 s: Z+ r) v: U( v9 F) J- e 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 ! G9 s6 E! o+ F7 ~6 K) R6 `; y
0 ~% d, @( ?: z
1 u# t6 F/ [ Y) y+ ^ l4 L& O0 e* @$ |" o( ]
- ?! }* S! j7 v9 n$ f
+ L0 b( s+ Y8 {$ F( X8 c5 i+ s
, m+ A& X2 B! N
; z9 F! R; }; p- f# N8 L; k! L. [5 M
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 " G4 }, G% U3 E+ {& D+ Y8 d
& w0 L# ~' U: h$ A3 U3 v
5 e. _: t7 p0 l- i, f8 [) g' Y 7 N: {+ G( [4 L* x
$ |4 s) H& u0 N
1 s+ u' y6 F0 H) T' y2 T 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
9 e* F, c& V, c$ i- o7 z; j
! M5 L4 K2 F& G) o1 o
2 W- c, M: u( j: ?8 D, B: {& o5 m7 j 9 s( \8 y' ]% S! ?5 q
Y1 n8 q4 a( E+ l5 Q% Q
3 S, M1 c8 V& } 0 v' Y( P8 _; D) H/ g9 @9 \3 K; A
. ?+ G! z5 m# m1 U- G3 h5 L! K3 n. s, o$ P6 F h' y
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 5 `: p; f, V; D# Q
7 @4 x& D3 O2 z! |
; E9 Y. j6 I2 m1 _! C
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
, |1 K/ q/ D% l6 {. B4 h q$ E2 b' L 6 \/ l" e" F/ K5 w
7 s# G6 b2 G& ~! [$ L+ m6 l/ o 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
, l2 B7 [* Z# `
" s$ z- H' o1 c4 K$ \
) M* M% H5 J5 ^$ z8 }6 O 开源的luasocket代码可以参考学习下
, v" S8 H. p7 Z$ T( w
* q0 _/ |4 e& H9 o; N4 }5 q2 b# ^% m
https://github.com/lunarmodules/luasocket 4 O, T2 B7 Q* F9 r+ \
. Y! z8 l2 G9 r+ J3 d+ f0 L
. j& `% Y' T5 e- |9 D https://github.com/fengye/luasocket 4 G2 t0 K* d3 o/ _: s7 _5 F6 V
# m# ?; e2 V0 F5 b5 _
, ]6 a5 |, s: k: T/ l Z/ F! N4 T
' `: t% e$ A. i
) m! t2 n- a& x/ a
( f- f) e1 n. v" a
8 {' H3 K# F" z! V) U
7 M) V0 j) ^# F) B$ p
( j- d& E! j- G( N3 q - n4 j, P3 ?/ }" ^6 {
" p* h3 I* f. B$ ]7 @1 U* {
) I' \ d J( Y" U) L
, Y( @* C. x4 h% Y 7 I$ ~! |+ e6 T! Q* E
+ a: c$ K9 k6 `- [; K4 B8 t) L6 G
总结 4 L- q: f" H v! f( N2 ]
9 o5 J& W* N) D$ H6 F. M5 h' G
, e: b+ g: a! Z1 z) d1 e( f 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
1 L* n' }% o; e( l+ \ - b( C4 K2 N7 N3 S( x3 O: b3 ?
2 k/ m! _) J" ~" q+ y0 h% c! s% { 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
4 g, S9 t" r: O5 D- ]* |
3 f8 S% M2 c- l/ j$ t3 `+ [$ t, W! X+ y! Z
对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
+ Y l: r) w( q9 v
5 j! z( x1 _( X! Z8 b4 ~, Q# A
0 e# B6 T- s s, N 结束
2 N6 @ I' E0 M6 K; d8 R( N % j0 _1 s7 f9 S4 H
1 Q5 K: p7 |- _3 [# n 【推荐阅读】
! C1 A8 r' a! ] d & ^! k" O8 H' T* A4 }3 _
/ a% ^0 [$ X) t5 F% ^7 \, E0 l
对吃鸡APP的分析 & ]7 j. X A5 B/ P8 }9 Q# r
7 w! B3 I+ ^: G) c' ^& |
, @$ X- n( K( }' b
你需要了解的APP安全 0 U2 g9 {8 x- F" m: Y+ }
W. S7 S- H7 r: b6 G5 e1 l
~) G [1 ]6 c0 K- X% ~& P; R 你需要了解的APP安全 - ~; n0 A5 r, p& q5 o A
* G' O5 E0 C$ v7 F ?; f
6 S+ w# |7 T- _5 f& y9 }/ T
& Q0 }8 r" F2 n( d) n; B |