|
2 f" R- i; t) F- G6 W( N
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
! c2 }* {# e5 m% W0 T
! A$ ]4 n' L9 j' n6 `6 d6 j( @/ h
( l) \, H% b6 V5 p1 M: T2 I ; g6 M2 b0 _) g
% ?& }7 c* Y5 i# e3 Z
6 l$ K9 A* H0 ?% R, D( A, E% C: { + \& e8 H. C/ u
& {% k1 D2 r! e# X6 x
下面就以开发者角度进行解析下这个APP的功能的实现原理。 ' K. w& N9 G. P: E
- |0 J) g: D" k5 U* P# n# W ~- r) ]
6 E+ K6 X8 q# L* Y' k( u: F
4 F- F' U$ {" {
( W+ E3 s0 { |6 F$ a" I/ ^2 q j' S5 O' I
基础信息
# M. m. C4 |0 x+ }" J0 P' a- z ) u. Z+ r- k0 D w, Z/ Y6 E
2 }* C- C) s6 }" _/ f( v; Z
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
) _( Q" Y" T' v 2 v4 ]! v& G: b3 ]. G
6 R$ O2 Z* J, z( D& n6 t3 S
3 i; h4 {9 }" p& ]; F " q E( y, r e. R- z9 r2 a. z; O5 c
) A6 _( }8 q9 y& V / l( r- [: g1 ^. m5 e: t
. f1 Z" t+ g2 c. a0 j
6 m0 }! ` B! s0 {: A& k, o
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
( E- f) g2 H" }! ` { i" Y2 V . b4 S; [" H( J6 I. s+ q) ?
" S8 @) v9 B* z; H* Z; P, Y
" I( O/ B! `6 S' z
3 S* |8 P) R. b' a8 V$ n1 a1 V& f9 p! W* {, E/ q" P6 R
! p0 _4 k; Q5 u, L% `- ]
2 Z+ I! Q2 `+ D! L
3 o A7 d4 p ?" \8 p' F( u 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 5 y! @6 z2 }; b8 B5 M
8 K9 a/ @1 G) I: n4 A/ ?! e
5 B$ Z5 o. M6 x6 W# Y 4 j- P/ m4 f% S P3 K: h
% k% T7 \* ?- }& l" i
. H; x5 }* b$ q- K. F" W% ]
' N. E5 _' |$ D, ]. M
; l# o3 z6 R2 a8 ]7 ?) H) ^5 b' F0 d: z/ u$ g# b
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 / Z7 u2 \+ r1 Y3 t
/ c8 f$ X/ U" ~7 u/ g7 _8 I
" z B& u4 w+ s) E2 n) Y
: \2 B0 I M' Q5 }) R0 J
+ g ]+ r5 E: O% h. C5 U7 ?, D% L) F
6 C6 v& J. ~7 V, h
* y' C; k& ]0 v) e4 W7 ~7 T
( l3 A" g* b: `% q( Z$ H: {. M" L& f) _
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 0 Z2 f5 i% W% u9 M) J! a
- U) {- F$ W! N4 A
5 s3 R2 E5 I- C; F0 D+ \1 ?
6 O" i# r O8 x- W( C+ V
* e4 A I4 W) R1 C: e' c5 k& E
7 e/ u3 I' _9 c( L3 ]9 L3 ^" A, V
$ p$ v" ?9 t: B [& m4 w4 Q' p$ a. O1 K
7 J3 @, q2 t6 l
1 U8 p* ^2 g, _5 \: n- B5 l" ] 9 y) e# L, W9 t; R5 z5 }! x! ~
) M" A0 }2 F3 V& H9 D8 U5 l
签名信息
. _0 N0 F: z- f Q# \' Z : v I. g3 u7 U/ {5 m
% {1 u" b% R: [! T; d
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 % Z3 }0 C9 a# _% c
4 _8 c8 d: [, c7 o
, V( O1 O0 i2 `3 D 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 7 B% X) m8 u( N& U
& w/ k* a6 A. W+ b/ z
- I+ f' r2 `# l& w( e" M6 X 在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 - m* d% U+ }" f1 s' ]1 ?0 Z
8 M0 Q: R5 o. W8 Q/ `- @2 U4 H3 g2 x0 j. u' |
0 W4 M4 m! O4 y2 M0 ]8 a$ d
) k1 `. y! n3 l! U$ i" Q
2 ~3 V6 g$ H4 r) h) n 0 z0 D) S3 v! A" Z
& `6 S1 F( G8 W `6 W# o; ~+ _" k# O/ g( J" a
android签名的数字证书的一般都是采用 X.509的国际标准。
7 N" x X" u' ^# k/ c - {9 R) ]' j, F7 U% p
8 B8 r. B( x! `) s
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
0 Y, n8 D) L1 k8 M$ D/ p & Q$ h1 W2 K M [# y* D. u
% r" l' u- H# I! s
下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 $ P" Y( _# e0 n9 ?* h
) Z' i' C K f
# M1 B! q/ i+ ?" L
) ~1 M* T# [7 l5 A; d) G/ @
1 k2 y. I1 h$ W2 u) a% W3 f _; W
$ Y: @" C# g( \ G; d: k% w
! X& ^! \" Q1 V& m# N* i
9 X. ~! ` w4 C! Z& K+ z- m
/ l( O) {$ P- s5 P; V) N& D 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 ! N! A& ?( F4 X+ T$ w
$ l& ^9 i* p- {' { ~
1 f/ D) `& o. }9 Y( z9 q- `: n( k/ v 7 d5 Y& f! {6 c* r5 `. [% M
4 q" A1 o6 _- m+ G4 o0 B n
5 \7 i% _- q! |0 a! s 、
& _* T* s- ^$ \+ Q2 ~
j% H8 T: d3 \1 N, _6 r% m* B, I8 P
7 d7 k. \+ [) d" a }$ s5 w' i E . }1 ^) K/ B; K( S
3 D) v! X9 p, T( ?! R1 O6 i5 ~. H
权限信息 . I; v4 T* t4 g. {. D; { R
$ |) g( v2 u2 K {) U/ h
# s4 N# i( t" `6 f9 t, t
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) : I% F& ~+ O" ^
( b5 r: ?% M* \2 {9 T4 { r, e$ Y1 g; a+ O; Z0 q
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 9 i, N1 d t6 T! e; e$ Z
3 R+ z; J: F4 \$ u7 E5 e9 N8 Z Y8 G$ w7 {& ~
% @. E- u5 @- t' E; t, E 2 ^8 G) O. a& t+ e; q c
9 u w0 D% Q5 p, M: B
/ O$ L8 K3 r% t3 X: e
# Q" I$ h. h8 N6 z" J0 X& B4 X& G2 K7 T( @! ]
下面对这个APP的所有权限进行详解下:
, L% j6 L" z* i5 ^' O9 E
& `7 _$ @8 h2 o6 ]% j" Z, L7 o% n% [4 {. `3 \+ w* p4 J
android.permission.INTERNET :访问网络连接可能产生GPRS流量 . G2 Q' o' n- }7 |2 M; u
" T& a% P( ?$ ~; z' m5 ]' |+ t& _' C0 }1 q5 B
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 # w( G; \. r4 Y( F
5 F- i2 T a2 D. w9 d& l5 Y' S3 J8 y1 {. j' C
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
' m0 r: ?7 C" a& J! O. V, M% S3 Y- h 3 X S8 Q) N+ u/ S0 \
- P& {, z6 ~: N# Z; d! [
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 6 s+ u+ o/ T* a* }
5 ^7 }1 T; D# D
) C3 D( @/ E; U4 o8 a) {0 O# j: D
android.permission.WRITE_SMS:允许应用程序写短信内容 % c/ R0 X' L6 N
; I ^2 B8 D. D6 W4 m4 ?% M
8 e7 J7 F! i! {7 p5 M1 @) p android.permission.READ_SMS:允许应用程序读取短信内容
; I! e2 q' m; C4 M( z4 S
+ F% d4 d( ?+ ~: K R8 L' ?+ z, I W3 x' C5 x
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
: g7 b( i& d$ z3 ^% _4 x + Y% ?9 S' }9 O6 n
( {* W, t# p) N. u9 w* i9 X
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
- ?" t: j4 d* U) m + p {. L8 M2 f3 J L* g) j
% ^5 m& M& f- w- o# j1 v
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
1 \! X5 }& F* { ! G! F! A) F% e7 Q
7 z- L+ S v+ N; y
android.permission.VIBRATE:允许振动
! `- d6 i( R! [2 y/ x1 q
1 Q/ W9 e, H8 z0 g! U
4 z0 J# E( G- \8 G8 O8 C; ^ android.permission.READ_LOGS:允许程序读取系统底层日志 + x' P5 `' j9 F1 O" u4 U* E
# z0 g# C, H2 ~8 K9 [
2 H$ ^5 B' s7 w! V$ `& h( |' z2 A# @
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
4 T& E7 C1 ], z9 \
0 m# X6 S& F4 ]" G3 O
% G8 S$ u3 Y0 n
2 g" @: L: ^% y, i' m) u" {# G
- E3 g2 |6 [4 X! ]$ L* H4 C" K
+ {/ t: A0 L8 ]5 S8 \/ r 功能信息
0 F% m `' T, a/ O0 f. u5 z) F
1 {- v% M/ d5 Q' [: a
1 D% F6 Y; V; a
* D0 j; N# L x1 P% E \6 m( Q ; K0 w3 ?4 n6 \6 `
, L, b7 k% f& `3 ^! z# O, `
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
0 v/ V2 k- ~; B; \; `' ^7 x- | % q$ P+ O% Y% L5 t. ~
: E3 k1 k2 u. D/ r$ a0 T Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
2 U( S2 K4 z7 U; i $ j" V' t! x, s; |0 p
" t7 t& J0 o2 f7 \( y$ K 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 ( [ G w; j9 b, ] L, {' v
k6 \1 k# [0 ?5 ]
D7 ?; B" m: z0 a3 F+ c$ |
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
u! w, j) j3 M3 a# k* ]) ]$ I
6 q: }; | ~5 L/ `2 H* ?% K5 h0 x
8 ^' U3 P, z1 ]; h- B: H$ B! c 3 D' L0 N- n; j/ n9 X- l! I
3 U6 d- O Z1 `! Y8 @! M* H
9 \# `# a6 s5 d- c) c# `( L8 Z
) L, T+ D7 ^0 _- n
1 B- \, A+ }8 u$ A' R2 [
- F: A! ?& Y- M! w' N; w* q) o! @
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
( H6 O: g; ]+ E; j+ B1 U
+ \6 J2 K/ T5 ?$ E" P6 O& J8 G/ d4 s# F) l N! d
) q1 l& O9 U8 \2 K2 A8 f& ?
C: T* Z. \/ c5 h" P' V: ^7 ]+ l7 C$ s3 ?* N6 l- U
# z# V& h, [5 K$ ]- z
! D/ F' V7 {1 _1 E! {9 T
% S, }9 c$ ^2 H2 e) | 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 # r1 Z2 n% ~8 u$ U' u
l* `' @, t% X
2 A- W8 f( Z( U4 J. Q z4 i$ |
s6 _6 n2 O B% R( Q% V
! R; I, F" {! [8 o0 o3 G' d5 n& p. v* n$ B; j+ n) ?
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 . W k, S: d4 N3 O5 V4 E# r' h
, F1 m" ]" ^4 n1 \1 r, @
; `* V. V- p3 w9 g j) T
3 d& A* e# b1 r O H" _: e ; z1 H) r; t! L( F
; |/ W1 @( q5 f; Q9 G6 e) F 3 ?& Q' ~# w( q" Q& f( f: F7 q2 _+ R: \
; e- [' U) E, l4 U# x4 \
3 \3 `0 R1 w! a2 n
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
4 b: H( o; h# @9 y$ O2 F ; m: D5 F" g! ~$ r- n Z
" y; ?& o* K, ~3 A c1 j
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
' `% ]% V% H4 y c) l 9 h# e8 z% l& S+ H' t2 b+ g N
, }( n. n; T7 u; a( G! ] 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 $ g0 I5 `8 c; e( Y5 |9 G
9 C6 D- @( Y5 U
: I! N- T9 s- M: M0 c# a4 T4 U
开源的luasocket代码可以参考学习下 ( F5 t |- a4 r) b/ z
. H5 Y) T. R, Y0 h) L ^
7 T% C4 f. j% t https://github.com/lunarmodules/luasocket 4 D3 p! d) i, o. ]
5 k- E: D9 B% ]* r Z
. O! |- \/ ^$ m9 T) x6 J
https://github.com/fengye/luasocket
, ?0 b* c0 |2 ^" e- q) @ , S$ |* ^" X& \
, z1 ?1 a2 G0 M& Z% c% X( C9 k
/ i% ~9 |7 `6 \( { + d6 _3 _' g6 D7 u: f1 i' b" d
% U X& r) I& s! \, @5 r
/ J! u: ] E) q0 {- X. D
2 j" k" A0 e% D# ]. D! @# Q- t$ o9 v% e
0 {$ k- q1 U( D. i5 `- U- c
7 A0 w5 R$ t$ Z8 Y |1 j! X
, }% e" ]: _3 O 2 T S, X1 M$ J
4 I% c) M }& o v+ C$ c0 _. Y& W! ?* v
总结 # b; o: e. f" Q# e
: C4 y; M. ?4 g( C1 |- }7 }/ U$ c5 R. `0 k
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
2 V, [2 J& I p/ h
7 h9 E, m& P8 A( L x6 S- v6 D* G. M2 H2 N$ e( _4 @
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 ; D; L3 D; s; Z( J6 y7 M0 ^
4 I; A( B9 y# E1 ~" [/ m( g" V4 s, E+ J2 f' i+ s2 f
对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
# v) v' D: t( u+ G! K8 N# `( K $ I& }9 |0 K2 ~* l. C8 J3 N
8 z. o3 s' ?/ M( g6 W { 结束
: b1 C* n' b0 }+ N$ d- T6 r , k* Z5 I _4 w2 Y
1 O7 @" g g4 C5 c- @
【推荐阅读】 . K9 U# M% s m/ z
/ p0 j& B* ]1 G' w7 m" [
* S7 W+ P5 }3 i; M( a: W
对吃鸡APP的分析 % {% R! Z! v! P! G+ q( L
+ d, ]# ?% N) S4 h; L$ _- }+ @; O1 @
- X( N8 z5 r5 F" C, |3 f7 A2 C 你需要了解的APP安全
* f$ R2 I5 @# }; o2 ^' T " G: P3 |. F+ i6 ]
% v& L9 K: a* H
你需要了解的APP安全 . W5 B# F! V7 j. p. w- g
2 I7 y$ E9 L3 ^) @) M" r/ T6 [ p+ N" e
0 R2 p& B* q+ s; }; u2 H& P
|