|
# @- |+ S( j* @! F
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 J7 x$ J: n+ y' u
/ u' A: s m$ `* O) m3 Q' {8 [) t6 R# }6 o
" Z3 y' { Q$ G- Y0 ^: m
0 Q& \+ }, {4 j; ]1 b. v" d
3 I5 Y; ]) a5 M' a# [8 g4 k
" e7 B$ Z7 `: A/ G& j* o7 ] & S. j2 O; u( E: B6 l4 X
2 a: z. k$ t \0 F3 W& W) D' H 下面就以开发者角度进行解析下这个APP的功能的实现原理。 , K, Y. A5 T# ]( K
% e$ X# t5 U6 a% Z
6 {. [0 Z9 n' `$ {0 V
; p5 n; d( L% t4 q* u Z
5 r6 T* {# `9 H( t8 b& J% O$ |: X9 q1 L; I+ D% g, A
基础信息
8 ^8 G$ q+ g! l; h$ i5 U+ M
1 _+ y- b$ v" O1 x, c; l9 a4 @$ S% u% O; A2 Z. O
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 * n" B3 f7 R& ]
( O% P) v+ @2 u4 q) {) T6 p1 c, N- \; n
) r- T! t6 @' s8 @# q9 V5 h t 6 Z( N% k& M% o. Z
; e( q9 x* X1 w5 [
( A/ ?7 s* k" {' d5 t
9 R! U7 \" D2 L x* T1 ~
* b9 R: W4 I4 a3 ]* K
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
! L9 a6 \* U0 }0 W+ r5 G
7 L" i! r0 p' J& `
8 {$ _4 \( p0 k& E3 Y 4 N7 ^9 ^9 n7 X! @- g
3 V a* b- x' B1 o7 N" T
2 a& i3 ]( y* I* G7 U2 P8 t
" ^4 _0 S1 Z1 o1 b1 j% s4 P & u& {8 l% N' z7 x$ H. n' @" P' ~- M
: n9 _9 g8 R C/ ^$ u4 o. C& V4 q% X 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 ' u" S1 M. f; \+ Y% s7 K
% L" H8 @) l8 u Q
8 g$ Q" u+ ]5 ?; S ! ^3 X6 _, r: n! m9 q
' I% W0 U" |1 C
. a6 |' h3 S7 S2 H
H; s+ ~& P( S1 x, T( _
( s: C: u( Y' H" F; T: d) b
6 ?& a2 w: P! m' k 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
3 r7 o3 |* z3 j, F5 L
! H+ @, s+ K' Q: K- `) a6 m0 l6 D6 Q$ s3 _0 e& n/ k5 F3 _+ r l
# n4 x d7 W4 R" o- v6 T
# I- U/ p- i v8 L+ E% s2 J* [, H
' |% M0 y: L% H) | / ^+ B3 w7 F8 O/ C. g3 e
+ S5 B* s$ ~; t1 D( C [, V+ [
( l9 G! {/ H$ p' ` 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
. r: y4 d5 H% H+ C. O
0 Y/ P6 _3 k l. d, E9 Q; Z5 [4 z6 _
% q5 {) j( a' S " `, c; Z6 @8 e6 y5 U
( q" W3 i' i' V
; C6 H/ Q9 f& ?- M/ H( Q
1 S& D" G1 q% i3 f9 S, H. A7 Y ' I! Z& A$ s ]/ m$ G
1 _/ o; d2 t! Y9 v$ t0 A- M' r3 C
* H" @8 X. g8 h) `8 n @) p
4 ^- S- P, D& J/ ?9 z/ I" N. ~6 L2 x' L) t+ j, U" g
签名信息 " P1 K1 L+ K- `" }
1 ?7 g8 g; _- T- h; R$ Q1 ?+ `
1 f/ A& b) k# M1 j5 q
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
) h: {, Y5 }7 T5 k3 w3 D " m% j% [: _( [$ ~: [
! ~/ _6 ^* c% T' x. j 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
2 g# f; B) H+ }
, p* h2 z$ {0 ]4 B( S# M% E9 G
4 ~! m- M! V' k 在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 . }0 k- f* S* ?
, J" H5 r0 H2 U. e$ _& c+ r; Z* g& d/ A. @ o' j* E8 R- [& P
. N4 x8 C. _' ?
" W, d7 c& o8 K4 h1 }; Z. l$ F) m6 l7 A) r: \! b) C
W0 a' `. H9 c8 n9 S( [ ; z" Y; n6 y/ _' a: A( n1 ]
* ]/ P+ {- P4 a% F9 n
android签名的数字证书的一般都是采用 X.509的国际标准。 . `1 v/ b" Y+ d+ H
# V) y2 N9 b( B& T, V
$ Z; { R5 q: V7 y' S$ Z
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
9 {, U y1 D2 n9 P% l
) `8 U5 r6 X5 Z" w, x" L/ X/ m' q! V# U
下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
4 w2 R$ J" m- z6 K " g2 _. }) _$ X8 R
n/ d5 L; ], }9 A+ }4 y% T9 Q& _
9 U. ^% @" ~1 J# `3 O* m
% @4 t0 G3 p4 ^) z3 s, K0 d7 A
* Y2 d4 E. I5 E4 [$ Y
- C2 j2 n* W* P$ `1 m 8 \& n# M- u. L& s- C2 r
4 b' @0 P: |8 }/ i( c" r( a# \3 A
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 3 a i5 p) G+ Z9 x# y. v( {! C: d+ Q
# S. n! P1 Q! R2 j) c5 B" c
% G6 N; c, q7 j o2 J* m5 A
( K, `2 S& l4 Z- |$ v) T" j2 v+ z7 S , i) ^# u N- N1 a+ `6 g8 o' {
" [9 w$ G1 ?6 a6 z1 E 、 " r3 b7 ~ }4 V8 K$ v
+ ?: i) {+ e* Q `0 D8 B Q' J7 F+ g
* a$ P- v4 z8 f$ a, _# Z% j
9 }% L0 l8 y( k# E% y 1 F1 B5 I8 [& _! E; \ a
/ G, Y3 K9 H @0 b+ @% Q4 Z 权限信息 # h1 [" J; _5 A, O
% i! W1 K5 M9 n i: c1 A3 L. x# v9 E& E: N
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) 6 z/ [! G* S; }9 p$ f4 j1 e# @% u/ C
0 [( p9 [8 c5 @; V3 L) A8 Z
4 `! j! q# A9 E% F/ j1 n9 F
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
2 m, @* o) i& A3 M. P - H, _/ f8 a7 Y) a
! w% G$ { V2 }9 B: w) k" w& o
3 W1 X/ Z( p: `
. Y Q* c& U" r. e6 g! `. h
& y, { A2 m. Y4 u' B8 S 0 F8 z& ^+ j! r0 [7 l' Q
6 M2 T0 ]5 j/ n% z* z. h* R2 U- Z: r3 I4 K
下面对这个APP的所有权限进行详解下: 1 X* B9 {0 b+ o: }# s0 j( p8 U
4 M& a5 h3 t) _ N$ r
- {) Q$ D4 J2 e9 o- Y
android.permission.INTERNET :访问网络连接可能产生GPRS流量
$ l% p" p) _8 f9 Z* q' x% P
% {1 B) x0 s/ J
& k8 Y" m+ c! ~6 f# i3 G; | android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 / X) _8 J! L7 t+ k
0 L/ `8 i3 D. m. ]! r* U( W
3 m7 T1 x$ [) h9 `2 S/ `0 }- M% l android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 $ ~8 W$ {9 L/ t: u1 T) S6 L2 S8 ~
3 c, Q6 A' [% w0 F- ~
" Q* ]6 ~( t: ~, y: P6 x
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
3 F. G9 N. Z, D7 H. [0 e# w6 D
+ u0 I$ b) A& A, d" S& i
) J1 S# ~" J2 v) S: V0 L android.permission.WRITE_SMS:允许应用程序写短信内容
% |, O( r+ H# o4 _8 a
3 q |! S- c/ X" X' E" ]# `4 ]# ]7 Z8 g& y; {2 S
android.permission.READ_SMS:允许应用程序读取短信内容
A1 ^+ h" U$ j( n! R/ z; Y$ P
* t# z1 ]1 Y/ S" l3 P
$ Y, o D5 F" L8 {* D8 b* w android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
1 H- u+ |7 u9 m' S/ @( Q
2 p2 Q& Y: [2 H$ S l* t
i, E' \, t4 H' _4 i+ J$ O- c0 G: L android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
2 m1 t" G$ t" ?$ R% T " t8 `8 c$ Q# @2 A! J1 o6 c
) M/ o1 Q$ H' ~. Z& v" X" w9 ^
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 : l k/ M, U$ L2 L, l: |8 M
$ ^, H1 f. U& ^' T+ V4 e4 a# N8 L# a
. P# P0 z8 ]8 g$ O android.permission.VIBRATE:允许振动 . {, u7 f% T3 W- [* k$ q
# |6 [7 ~* R! }5 ]5 O: ~, V4 n
. i0 @& z5 S" g( `$ v" P
android.permission.READ_LOGS:允许程序读取系统底层日志 % c& Q6 \0 H: l# Q
2 f1 K! ^. h2 ]' w; U+ S& v
' {4 d1 P$ A; L: b$ [* U android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
* c- ~; H' n1 i9 }1 L2 O4 Z
7 B- r) E7 B! l" u5 a0 a' g1 X- g/ @4 E' O
2 S; h8 r7 v; V2 \; [% v; m$ O
8 {9 g, h; q7 z' N) H
# H& v* y7 K/ u; U 功能信息 . T, ~4 M* K) `) D; Y! n
! Y4 m- Q6 }) d% h% ?0 H5 T4 _! @: ?$ h5 o/ w0 i6 e. `# U- b% R
% G7 d2 c3 k2 [. t& J
0 C4 D. H! Z" C3 e& c2 ]6 ^( C _, r, g+ ]# K9 \" L
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 3 m+ N: Y) l* u5 ~+ z
, o' J. n2 e8 }' k1 C$ m' O& t& J) ~8 e' g
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
/ m# t: m! C0 k/ _ 3 d9 k+ m9 F' x9 h9 e5 q
8 `+ N: e, T$ [3 t+ q* w8 Y4 m 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 & D" Q+ T% o" m% |
9 g: p1 J; I4 B- d& s
. D. Y; [5 [& X3 |5 B 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
7 k; ~) a" c |: C( P4 W4 m
9 S! s; ~6 \! Q& X; V+ g
; w: t" I! P, K( q# k' x4 U- U
7 Y2 @2 l1 Y9 X8 n$ A: b7 }
0 M$ P6 P2 B; e/ z) q
* v4 ]/ [. j2 T 7 T/ t4 p: e# W# p" ?# _( p' R/ L
4 M4 ?2 i+ n* X0 O6 T* ?. v5 e! I- z7 U$ e+ n1 G
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 , l6 W* s+ G% D2 q* ~1 I/ x
6 H+ s4 N( J; F
* I; a7 R9 H t3 | " D: s2 G/ u8 y' c* t3 q: Y- ^% N: h
* F8 k$ s4 o5 x4 {3 D1 m; @. {: ~0 Q- V4 e
" j8 l* }7 B3 W. m7 m. j' T
% i- v) G! E1 @7 w( {6 h6 ]
" p p* o6 j5 O) f 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
6 L: {2 V& o W9 _) v . R R, H' ]5 o: G d$ P
0 Y# |! d+ h; C& e , [9 R$ x* n+ Z
1 J0 B, P, `4 j1 g% h& @, K0 r( R8 x6 k. M" t
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
, u. Z" I9 d# y. n( t6 T( j( }
7 K4 ]( \, k7 E! y' ]' b% H' Q& q
- ?& Y3 f V2 n
; d0 q. C& q! J- L: K$ g6 x 3 T' o" |6 {" I1 L
( _& ^6 Y" ^# O% E+ f5 w: @) Z " i9 i6 f0 c9 S7 i4 K o; _
" ^: K/ \: M- x! X) y m% P
6 q9 |+ y& [ ]0 S
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
$ d+ E% `5 w% w6 e2 Q5 J( D Z) ^7 H0 ]9 s, u3 `2 P- t8 z
4 W6 \3 e- K& E6 {# j
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
! l- @8 W4 k& E0 t' }+ |8 R
* N4 I' X$ p. \1 R1 V W& j1 l W- e5 t/ |$ K* ?) x- U
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 4 `/ T' f( _& K
# l* B! U [6 @2 I6 O& m. M% a4 i! ]2 ~7 Z- x- u! r2 [
开源的luasocket代码可以参考学习下
6 |4 Z4 w2 E7 x+ a; J9 F $ _9 B b8 r6 n9 l: K, `' o
8 M" }# E9 Y2 J' L0 X' V* c https://github.com/lunarmodules/luasocket 6 v. M. b# H# ~* r3 O! `
5 g8 A2 q+ D% }" h% ]' f% t
6 o4 S7 v" N; K+ P1 ~* V0 Q. A https://github.com/fengye/luasocket
# D# U4 r3 E8 h% i/ q4 ^, |
9 T2 d5 r' L/ L4 D
, s# J. X8 m! K8 ]; e/ x6 V , V4 b# H3 o9 F: P5 b2 V
0 \5 X$ P" v: k- O/ B$ G2 a
3 r9 t7 ], K. P7 p0 v' `% h, m
& F+ M: x. ]2 U8 ?# L* r j f; R. p+ o0 l- G- R" L
1 a% y; y5 c' ~- N% a4 Y 0 c# D0 S5 E% u- u' U
6 d/ A$ z1 ]& S7 e- Y3 z' M& `
1 q: h w; [# ?6 I& a* w
. D! V& B! O a- G% V2 w: C, A! u
: K c. h8 X: ~" W0 q! j/ e4 W! T: l4 E& Z. W+ X8 w
总结 # l( F7 w, w6 J' A* K0 W
2 x$ T; T& C( x; D3 A P) X! J
/ L. Q# p: G, U& j# b3 K. [ 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
0 T: s4 Y+ o; e4 [& l! b7 Y, _, |
; N$ c$ T5 q5 o' `8 h
& G+ v: W$ F$ p! Z3 Z6 E4 [/ f H 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
2 { Z; T/ g- t9 a
8 Y- M/ J5 w! Q3 E7 }! o- k6 h5 A; k
对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
0 z$ f, a) o5 y* t! t- b+ e
6 s5 Y2 M+ Q" K$ [& W8 h4 f( O9 ]6 r8 s% v: Q1 F
结束
8 K; m: g# h! D# G# s( |3 v4 T
. L' W# a1 y7 c9 h# x* g: ^0 Q+ ~4 h7 U
【推荐阅读】 9 d. X9 A5 W, Q0 I9 z1 A( r
+ ~7 e' T) @/ c8 e: e
/ h b4 I+ u; p% w+ z 对吃鸡APP的分析 & \" o/ W$ ^/ t4 h8 i I m
& S) [* r8 X/ k
# K4 l% t$ `7 J 你需要了解的APP安全
9 h) x5 W4 D, Y ; |2 I6 N( V$ \2 Y5 R2 n
, `" A" R/ }2 [! w! J1 A 你需要了解的APP安全 . {' h5 a2 H- v$ X
% m8 q! q! A$ b
! X# Z/ F9 F7 F4 b/ R % y; W) \5 s4 S7 v- x; o# n1 [
|