|
) _( V$ D2 X$ n) p5 {% i
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 " ~2 I& H. p, G+ c# ^; @& B
7 I; W6 u# w6 u- b
" ]& Y2 _3 f6 r. w9 | # X! o3 }) I0 l- O0 |5 i) {7 p
C1 ?7 k9 [2 u) [
. v) K7 p/ K7 x
+ \! h2 u; K) J3 i8 @% E
5 @$ U3 B0 ? B: w" P7 Q8 c
9 k3 r6 |3 F$ k1 k) Z: P4 g 下面就以开发者角度进行解析下这个APP的功能的实现原理。 1 C2 E2 F* z' X; y& I6 L# M
* g2 V5 w e- T0 e8 R/ ]
% c1 j" Z+ u5 j! n! U/ p
0 t0 f" Z, i' i+ L+ I / p2 c f+ }, U" \' F) _3 E+ q3 B
, L, W4 b1 k R; J. t7 J, u8 G
基础信息 ; X- \, s6 K N6 Y
7 g3 T" n; B" @; e5 x* |( w% l9 x* I2 j# d" P+ T
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 6 O3 L2 h4 l, t$ G0 R4 B
, u0 Z0 f H- W9 }5 P. J, Q5 O$ k. \6 a1 s; f' y, X' O: m
" D3 ~7 A* A U( D1 } `
( F" U" T$ I) b: S% A: A4 \
. x, r. M; v) s2 M, X6 m
: C ?% u, w t+ X% y ) b: f) u" T/ c! A1 {. ~3 A! l0 U
4 [+ j" Y# m0 ?
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 3 {' I$ l5 n5 W' T/ N" P; F, \1 V
8 C# a% R5 _( o7 ~0 h. X: `2 E) N! P1 n
0 O1 s M, a# S
9 r8 L- v/ e! ~% ^, _0 \ t; t" q
) j8 l+ d8 ?) p* \$ I* |# N 2 i( I3 n7 R% T0 Z7 f# t: R
) k1 Y5 B. q* V% @0 c* s9 L0 x$ e M
3 y9 o6 k+ v; J! r 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 , H/ R# h! I. m- t
/ ^# U1 a+ q. F3 `3 ?0 _% Z2 d3 \% s8 c; q; F
6 [+ \' b% F" J6 b6 T0 o: L: A
" `" P3 G/ l/ R r9 j0 K. q( f5 L' u5 T
( N6 f) |! U- V. u3 {* V. ~! f' a
1 _2 w7 n9 B* G5 O! q% A* W! M# }: b; P! |. p
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
! | R. J" l/ r$ ]7 X L) T , s" n6 O$ |) ~2 Z
: Y; Y5 X3 r) I, ~; C+ u( n9 @# w
& k& ~0 g0 ^+ l* t1 J a
) t; A" a- K1 |
. T9 m9 D8 ^: T 1 Z+ M. h, ]) h8 o# K. }
. Q+ R( f. D/ j7 O6 T& d
: K1 D/ d, H1 W+ A, {: @
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
+ N3 E/ {$ ]9 Y3 ?( ]& X
2 F/ [; Q+ m) m, ~# T1 P# y8 |7 U6 O2 q7 s$ ?( Y8 C4 _- i6 T
0 `* f% O" M; |# \# Z( D ; k, Q3 M& L5 Y+ \7 V! b9 O
% L, a, r! v) I* c
* V7 O3 K* ^5 _ 9 {7 Y; ?) h$ J$ \5 P
) T# x, L7 |0 q# j
( w" h7 {% ]7 a l/ U
% z5 N8 `+ s) @& ?# c) ~2 E0 i* ?' c
! J* A6 r8 v, |3 F% e! d6 k. Q. { 签名信息 . O( v0 T' P+ R" R- q
& t& L* ~4 y$ B2 c( l# P2 \9 W% C6 H% m; e9 M
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 5 L; ]) c v& J# O/ R/ A
+ [# r7 I) P5 U/ k" l
+ q" m6 b w! l 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 2 x% m4 l; f5 Z0 [5 X% N; r- l6 _
' n$ v$ e; ?% A) C! a0 ]
/ ~6 ?+ _ d3 r K1 D$ ` 在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 4 J. N. D" L+ r+ T1 c! n v
! }8 l2 v- V6 o
. S2 P: c+ C, r: k5 }. a4 j9 Y
$ L0 N9 K0 y% I5 x8 O: B
, v. S* Q' x1 b; |' I& d6 r- c' W; Y) n( X( R: C8 {& s% D1 ], ~
8 w; H8 ?/ c" m4 L x3 _ : _& d+ m1 |( J9 z; N
4 F5 `6 E1 ?2 x- z3 f; d android签名的数字证书的一般都是采用 X.509的国际标准。 7 A- p, W: K' J _0 H
. \8 A- Y7 E" C0 W2 U6 \7 {
1 g' Y" p# S7 l. z) r 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
6 g+ `: M5 ~ T" u( D
; M: R( l' e* X
5 \+ i& s: {! @/ x3 J2 E3 N: F( j 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 r" ` M9 `4 h1 q2 ]
0 a& Z/ e( \; B) E. ~, C" L( Q. z3 E
0 s7 h( t& U* i/ R( ?1 ?9 _ O. o6 t7 F/ _$ g' c+ {
0 H% W' Q) K5 u( O# P* Q$ @3 ?5 S" D6 @) f
8 o6 k+ L1 P: l1 d' `# u - l9 V& `/ p4 q- G# Q8 W
4 t$ P$ N" o8 S; T
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
! F# S. H8 ?4 A) k( i# ?( U
% K( l! o& g/ {% t. L
% x- p$ W8 q2 N2 z8 s/ D
3 Q3 r) \: f" G, o+ n6 p1 c' G* z( d
% V1 A0 J! E0 W% [$ W4 P( V0 ]. m. X. M
、 3 N( [2 z8 g9 u/ R- ?
% e% r2 f+ h6 [2 i v$ D1 L9 f- n
+ h& N7 c& c" u4 e; \2 ^
* e/ E9 }! K9 ]: C
! y7 K0 s0 T1 x" o: e6 R# a& s9 I' e+ R
权限信息 # F i- V# b+ p9 Y7 f* j4 R
" N- R) H$ M& o( ]8 D9 V4 h4 y* G c1 ~
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
) v% O3 U* k4 E/ c ' L, m9 W9 u7 R6 F5 ?7 ~ R
4 G. V4 o# B8 w1 y6 x
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 0 |, ?, t* L+ L- M# d- w
/ l& J0 C0 h" E9 q' _5 H- R3 [ V9 a
' e1 S- F2 H% v" M
9 \! u* v4 z; P
) w# |9 Y2 l- x, h# ^
3 t9 G' c5 ~. C! y' E2 z
. \2 _3 x7 T( u3 ?' R, j, M! H, W, ?6 d) L5 c
下面对这个APP的所有权限进行详解下: 4 A) ?: C$ }# ?0 Z
$ u6 S' q+ Z" N. { Q
5 d( O8 W# U& M! }) y android.permission.INTERNET :访问网络连接可能产生GPRS流量 : C2 r( i- K: g. }& _! K& S; I. `
- e4 v$ }2 H% U9 E
% d1 K2 I0 v& s) g4 B" P7 r6 g
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 ) B0 y5 w, F" `% H0 J
9 k4 n3 [7 q: K9 L1 O
% g' p- x* d; b& |( ?5 a( |+ J
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
. g0 o4 }8 ?7 @) V) J( L
; j$ r8 B w2 o" G) I0 \
7 r8 z y9 _! m7 a+ A/ ]* P1 P android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 l9 x. b4 C, @# B2 z
! w) n+ s. `; U4 @" W& f' k% o2 o; |# U9 a1 \( B
android.permission.WRITE_SMS:允许应用程序写短信内容
" X1 C7 t: M) ~/ Z) y) w 4 `% o) m3 k' D* C6 H
. I" r& C" _. y/ h! Y3 t/ | I android.permission.READ_SMS:允许应用程序读取短信内容 7 l. t/ k: `5 C! ~, c4 I- U
W4 s3 J, T; p: E
) e0 H6 y. m8 ]4 a2 R8 l
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
5 C1 {9 y, V5 S6 Y) i# |7 O# l
6 |7 g) j! ~4 \+ g; Q/ D+ q/ O0 c9 q0 p- M( X5 V& T9 }- H
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
7 ?8 w0 C3 O S) K% R* P# W0 i2 ~9 e
1 t* ^' g. E; o, a! R! n8 ~& l- z8 V9 z1 M6 f" |
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 9 y. d" K, D$ O8 x+ l
% G# b! P% l( W+ ^9 B3 u, P( G9 Y$ z' M% K& j
android.permission.VIBRATE:允许振动 5 r) Q9 M9 q" q, _
! m& q; q; O P
9 @8 K$ C- j5 G9 q android.permission.READ_LOGS:允许程序读取系统底层日志
$ I- D6 [- F* f9 t$ \8 l+ Z
; `, E' z2 d: W# a- V. g- `
2 |) T- D5 P! i$ _$ D* z I. k) r; B android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
3 K* L/ i* P0 a# w d7 P. K0 R1 O! u
$ W. l5 W2 ]: J" ? $ c R% U) q7 r
) Q4 l, S! s/ T
# k/ a G! Q% F% q% Z Y3 o0 H) o
功能信息
5 R! j6 u1 ~) y0 v % z8 x- _& c3 r: d5 b& [9 B; R
3 v, b/ w1 X7 d$ G9 E2 B R
7 m% t w, r$ P
! W2 Y. B, ? K$ c O9 l9 g1 M/ X: }. z- F4 g8 c
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
/ Q4 t' H# e# p & f2 b# S S1 T$ ?
" {, Q! z6 W n0 Q2 ~ Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
( @6 Z: d, c/ R ) y% s" ^* t( \
9 O$ _- `% X1 T* q) \
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 6 F5 J7 X, j2 g: r- x
1 [. j- X9 s+ L3 V, Q. Q) i
9 Z- ]: ~4 N. {2 ~5 R6 q
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
* ^' y, a) W _% z# y1 P
4 g; T3 J( Q5 N9 M% K1 F! o# c: |
) q& D: i( u( g8 M1 |" @0 f3 n : F. L$ o4 O6 l; ~. T3 P
5 w: O* n* N/ Z0 n
/ } r# z8 Z0 w, T5 T+ K$ a, v ^ 8 ?1 ^( k; C: A" j$ B1 p/ w) t
# \0 N- r* |9 G4 l' O
: v, P8 Z2 E0 T& H7 u 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 , R3 I2 v) Z7 O" z
0 }* ]! w% g H! S& y
5 `: C0 R* |# W' U
9 k# O+ g/ I, h$ L3 Q: k ) c# T6 W8 e9 ]
" t9 v/ Q" H& y3 |* p
6 z' T- g3 }" w* Z7 W
; T- z) w P" w0 t8 S& C" Z* S& ^. T( {
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
+ D' u/ T. E6 z 4 K3 o1 n8 G2 O3 q
! p0 A2 Z' c0 D' u, f v, j; z w % s( }& Z3 ~+ X' @: Z( G
' g7 j, D- E$ I
2 |& f3 g2 E0 [' \9 T# C8 Q
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
, M/ ]& E. f& L5 r" |0 M
& r/ b ^, R9 T9 ?; n: K {# S+ w' _1 @1 @
( c9 P% X4 _3 D2 E; G/ X D! G: `3 g7 |
- F8 A: X" q! {
: ]' n k, e5 L5 O# R( Y! U
2 _+ u5 h2 T4 ~, h' J/ |& e
; J, i& m* n) } 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 # o- U9 D/ }" N0 J9 E, I
% F' X# g& w) p9 u, f! i) I) [# h3 S% ?
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 4 r: F( d1 C" @# q; ~5 d" w
( o! }/ O5 [6 N
: f6 \% `# J) e/ X. V+ q
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
+ _! ]2 V1 }, N/ D/ r5 z
8 p, r4 U9 k5 a& j7 ~. Z$ G2 j( L8 A0 N
开源的luasocket代码可以参考学习下 . E# ]6 d5 `- H+ b/ n7 v) N$ ]: T
# U6 _ _' g& a0 {, b R+ [
8 j) y+ @. T3 E4 f https://github.com/lunarmodules/luasocket ; s- x# E: U* B0 `$ a L
3 x. X7 x/ e6 b6 r, N
9 M( D# w4 G5 a2 q
https://github.com/fengye/luasocket ! u6 g8 }4 x# t' y6 c- d5 s
# T! q5 X( y5 T9 E$ T& z; M
7 a7 m( Q9 M0 |5 P
& {! P, @9 N7 i( Q; u( Q
$ d: S7 ]0 z9 J, n% b% u: e* g1 z
1 V8 q' w4 G' k& |! M! f. M3 h
/ D u0 X q4 h: l9 W. v
: |+ ~2 t2 M" M" f
$ l6 {9 T0 ]/ J
( F2 H! `' _. d& A& @* e1 Q5 t
5 Q. y. |7 t8 T, [/ o( E; q; d X+ P
# T" I; W* Z- a& ?
% d" M3 b% C. p3 O6 I' e7 L! t
+ l0 ~; D2 N. @! I, K! T2 d 总结 - q* I" n0 D8 U' m
5 W" D! |9 @# X7 ?+ }
/ ?: _$ Q+ ?$ D5 H
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 * e# Q1 g* C+ r' J+ ?9 N
8 a! q' m! R6 U
! z* B; K4 S- }+ m' `4 P 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 , w) I8 R& Q2 g& y0 p) K
x8 Y8 O, b7 [' M5 S( J
9 {1 b' R- @! p# O% S 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
; K8 @7 R4 S+ u* u1 ]4 P
, }& w. c Y: }; B* e. M' v# X& f; H/ ]+ l
结束 : Y' \( f$ \( X5 w8 H8 P- p6 ^
$ n" G% c! J7 Z+ v1 x
9 p3 z1 g' l$ \& ~. K
【推荐阅读】 : A/ b8 s) u h: |
& U; k: [8 t5 D. ~. p
6 \* Q& N$ |, w& Z- A; }8 G+ x 对吃鸡APP的分析
6 r2 r1 A+ E% B$ n# o. t % [+ @2 x$ R4 S: ~4 G5 c" w
' F7 c5 a* I; Q( Q8 G7 I
你需要了解的APP安全 7 ]& M6 F( ~' x" W: v
s# L& J" n7 O" V6 Q- h) x
1 s6 {4 }" W8 n$ R 你需要了解的APP安全
9 Z- P) r& B) ^3 e1 h5 R- R; }8 c 2 ~. q4 o3 j% }& a
0 H" w0 C5 l8 ^+ B% ~% N
( U `6 R0 k# Z9 V
|