; T; B( O6 L4 t$ ` s
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 o" I! c& w% U2 [. G3 x2 ^
+ ?5 S) e& [' v4 B, q" j9 h, n* p$ i6 y2 u. V o
+ V) r& t: @- B! O+ ?
2 w9 r$ G' C0 W8 W
: v! s* N" R. G. n2 c . F0 Q) c. m) A, E0 @- a5 H
/ V4 F0 r2 s0 p* B ]" M* `+ t: i- j! Y& ], ]9 @8 O: a7 o7 k. ]- Q
下面就以开发者角度进行解析下这个APP的功能的实现原理。
3 Y" l+ y! [4 b8 G$ x, H 5 R& S4 h1 c, k0 `' N* f7 |& u1 s
* V6 c9 T$ c6 b) u# r
4 L! j" i, F3 V& M5 w4 R: V
9 D' U6 w6 o; ?. _$ {# W9 h: T& h; k$ }) J$ C: c" {4 g( m
基础信息 . B4 b$ l7 a" R- h9 |$ b
3 R; e7 g( O5 a* Z& P) X# F9 C0 F8 g5 e9 X
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 # {8 O5 u# J! w s+ C3 T4 p
! I3 E; u- X v4 k+ E& d
9 a, D4 f2 y2 q/ p# D0 H6 E3 Q4 d( Q a' {" C4 n5 z. `$ [# |9 Z
1 S' Y, H& O& B' \2 [% n( `
# y4 \' ^, w" B7 d 6 w+ J/ I. }# n# Y( O( a
4 _( S& y$ ~) r% e
' Q! o+ H0 ] Q" ?. U Z6 [ 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
4 R( c1 o% Y3 ^9 r* ]) h6 [, y ! m) _0 |0 a& j* G3 M
' k& C: Q! t0 G7 `7 i2 J 1 C$ g1 R, k1 \( L/ r* @' \1 Z; L
5 c7 J( _, c5 ^8 \6 d$ ]) @+ |* c, C' a9 U( l8 M0 @4 ~" E% r Z
2 }+ s) e: E- T1 U! Y' ^
2 l2 o3 N% j. F+ o" q: A n3 r
; }$ d e( K) f* W) s9 [6 U& z
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 # r% h9 n3 b1 _. n; {5 X
4 q- q r3 H2 c7 I8 U; ^% l+ ^ q" Z1 T. k }' q; H. h: U4 m5 L
9 C% `0 s/ E$ _ c! y9 [3 Z" W
% u( }6 k# A+ @% a1 x
+ d) g2 U1 ?$ T# e' m l# Q: h& R $ z5 _4 L0 n4 ~( ^ d$ g
2 A8 ]( U' V, }. P
0 L9 z9 ~5 m1 ^8 l: d+ S7 d 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
4 f8 |4 b4 g: Q( N% }: J
+ ?9 Y. o) `3 O- y# f2 e" W
9 S/ D3 m" _4 \% s
1 u% K$ y# y0 e; ^' ~ 9 I* |9 G* a; F8 c
, w6 n- b1 c, t1 C7 l
: h) H& I4 ]5 L% C / Z' X) ~ z& j+ U: Z/ e+ o
% ?' R/ `) Q. _$ p+ _ 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
; y* F, j% K( E- f
# P8 E. x0 y' I$ w7 [! _
8 j' x( ~7 t; Z
4 {$ M* K0 o; C. i# J( z( h
2 u& H4 |5 O+ B( m- W4 ?: ~) q6 ?: `
, p- }. Q& b+ P* v9 Z
- U7 O+ H! [: J8 b, _+ f/ F4 @ B
+ `" B7 j g7 F3 q# y3 r
1 i; X1 ?4 Z @! v% V
: e0 A4 N9 A& M/ `" _0 J2 Z
0 ]( V$ U* A7 l/ x# l# w 签名信息
; [8 \: `% q- ]# }" k + q- ^% a6 ^8 Z5 C
z6 S; Z( O7 N' m 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
7 e& m8 l0 n9 ~8 O P! ~- r. Q + Y1 P8 b4 m+ O/ {
6 A4 m+ [/ c& }9 n 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 7 p3 Z/ _ g$ J2 H! `
, H, ^% a1 L( I$ N
' ~. Q5 o. S) m' g3 t 在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 1 G1 A: ^3 q2 a
9 `+ l) C M; A! q) I Q, N" y! E' W/ X1 G' W
! [0 v" p6 K# }
1 M$ I a( e5 D. t0 L I
* R+ @' P$ L$ D5 K1 p( [3 @7 g - G! ~& _6 l6 g+ o( u' k. X
. h+ |- o1 }, g; d# z8 a( b- B, A& v
android签名的数字证书的一般都是采用 X.509的国际标准。
% _* J5 t) W7 V0 W+ m
" W. X) z3 A! @' B8 D* V& ~$ h0 V
8 _+ t; j. o; K; R5 e6 g9 U8 s 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 0 y/ i7 s8 f0 n. j; ~# x0 J
- ~6 i, T# S/ v8 R1 ?$ ?6 T4 r
2 p: m0 H/ f9 @$ M% E 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 ) p& q% X' [1 z- l
7 @- i3 H- U) f% x1 t% M* g' h/ M& H& D3 ^% N3 {
! Y$ o$ e, j7 C8 M
7 C/ o1 T; e% S0 X4 f) l5 @6 x
8 o; G5 s4 o7 f; F/ e2 x6 e- L2 i
/ E1 l0 m# n5 l* j& | - H6 h/ d* b, ~# c0 p; }% Q
7 `% }+ h$ m3 v4 K6 \0 U( g. g
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
; ^: o4 L/ e% Y/ h
& `5 L* \3 c& V9 a7 `" R' J+ S& |' }
6 P( r0 D7 f# r1 ^4 v( i/ \( g6 V5 r ! P i* |) h! r- y# W; t
3 D8 D: ?4 c# `2 c, g0 e3 [ 、 - ^9 Z1 d9 s2 A) ?3 y
}4 r, u7 ~/ |# v1 i3 v% t' ]' v" Q$ ~ X8 y
0 Y# D; \: g' r* q+ b 4 T* a7 ~) J2 z' D+ K! Q5 e' m" C
( c- {& j) D1 b {5 v( s; Z9 z6 i6 X( e 权限信息 / h$ Q" y# R; Z: g' S- [; e; s9 b
# D1 U6 z& W" P
# o' C# H H4 y9 q$ g8 \8 B
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) : d5 Z, c% i9 R! t
4 }" q; ?/ z4 Q% A6 a
: X* {! V3 i9 A9 }# A
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
; ~- n! }0 s. ]! z& S& T, L5 m
5 {4 h3 L* Y$ Q* K* v$ p/ H% {: X0 k- @+ ]
5 r8 B9 ]# V7 Q% h$ ^
* C) ?6 W% s. M( _: R7 w4 p0 u
% L: G1 y' R! c# z! u7 w5 G 2 i( H" _: a$ s9 E% }
( h1 M0 P2 D" \; W1 t. q
* @, [+ [$ @$ c5 G6 i8 q
下面对这个APP的所有权限进行详解下: 4 }' s/ D5 Z1 R. B9 |
0 J# R: H C7 l j+ b# i
t3 M5 Z2 S" ]5 U6 i2 q; E/ _
android.permission.INTERNET :访问网络连接可能产生GPRS流量
, S7 h! Q8 ]/ z% v* i( e
5 [7 ^1 S' I9 Z
0 U& K( l' Q6 ?* e& X9 ~, p0 B android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 3 x8 g5 O, d9 O0 M
% i6 `; ^9 j/ [( m7 S, i4 u( P2 f5 o2 d3 L5 [4 x
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 ! Q' g; O7 |& B, e3 h6 a
; v3 A4 E9 ?6 t2 P# R# B' k: u
' f' T# \1 v0 Q) C" M android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 ( q9 F `$ {+ N+ D* M- V( w
- n5 V! j* d. h8 E5 w5 V( K
" i5 X1 G+ l4 ^! u6 O5 G% r android.permission.WRITE_SMS:允许应用程序写短信内容
: i* O2 \# @; B6 _ 8 X0 Y6 y; c1 A9 J- w/ H n
$ D7 v( h* a( I ^
android.permission.READ_SMS:允许应用程序读取短信内容 ' d8 F& h( _; ~* Y9 q! K
+ j+ B3 [8 g/ S0 Y, |' w
) Z2 J, q( V$ V9 r0 j- R
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
% y: r$ r# [( `8 j5 S1 n; s9 C ; L' d2 b O& ^" r
, ~1 S! y% \* D9 Y- | C$ X android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 8 K [* q( @( F+ p
& o; f0 [9 X1 {- K0 f
+ E* ]' ]& z* E; k android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 $ x0 |' b# D; U6 e/ I& G7 k& \
v: p8 q5 C, Y& P3 I8 @
% f. B$ j2 c. s1 l4 n5 E android.permission.VIBRATE:允许振动 7 P! H( D$ _5 Q4 T$ @1 ]1 c% H" |" v
, {: x1 t" Q+ b/ z6 h" U0 N
7 [! n2 f! _; O5 h; K5 U6 w android.permission.READ_LOGS:允许程序读取系统底层日志
" @( ~3 D' z& w9 D- t- B' ` Q
# v( Z7 P. l c0 h; V4 m" M. p* k1 m: k. I( E3 `$ r
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 % h( S4 I) h j( w
- e/ _6 ^5 s0 j2 l) O
2 H6 x) W2 ~. k' \) j2 Y3 _5 H3 z
2 [( {+ h) C9 e+ f ; W1 C Q6 o" n0 _
: N* t! N+ g5 a, _% O4 O7 ]
功能信息 9 X2 O ]* I6 i1 B0 q# L# `
+ e- n9 i i/ k9 A( x
8 g' K: b! u$ D! t5 ?- x ]
- u+ C1 I# K! F0 p
3 Q, O$ i: f$ \$ d& m$ t5 P" K1 B8 p3 C4 r O$ H, Y2 I
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 . ^: J% K c0 D" H* w | e8 R
( e6 M6 V7 W S4 |# B9 |
# M3 z; D4 F! x# M# ~6 q1 d5 { Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
! z# M4 j5 \& U* z
! b6 B+ S0 T5 c+ K& m1 ]6 A0 A1 X7 P) J6 c7 T5 D! g6 N0 [. C
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 . e/ `) F0 D$ t" M
+ {0 M8 i/ u/ i8 p* T; s& Z7 _- T
' h! a( ^" v( W% i* G- h 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 8 e3 U, n) L* P1 L s: F
& D. @# O# M3 o M; z+ k( W+ ]
1 S4 g) q. P+ t4 L 4 ~8 G7 s! Y/ y2 s8 n3 f! ?5 o0 r
; |& v! Y7 X4 X$ M
% G V( A+ s u$ j
1 ]: \$ }5 U, r& d/ \
8 l1 W/ O6 B2 F' l) w2 C
7 N6 W: `% K* X4 p. k0 z( J
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 / B& f7 N) P O
) s0 l$ Q% v+ U$ m# ]
) p; o' b7 I9 T! U7 l; p/ C/ h
: m$ y0 y' j% I3 s6 v
, P2 [! B8 o7 o) B3 g5 B; P0 v2 V0 j
. Q% I2 z/ d7 F0 F
" k$ ?- H8 V% V2 h* x' M - B4 D* M% y! o* P
+ \9 L0 K5 m0 @
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
+ \, n4 n$ l; Z" l {8 a' i2 s3 [9 ^
$ V& F$ d2 S3 {% a0 i
& E0 i E0 w' ] # d) [: d" \" S9 F2 M: q. D
, k: ?& x2 Y0 T
; C+ P1 d0 [$ G3 O8 Z 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 0 N6 Q9 y9 {0 {* d
+ l1 N3 M* }( a# Z& D: R
5 T' b/ e- T% L# O
8 Y; S+ v ]+ G' a( G
$ h7 H( }3 b M8 Q5 x- ^' n* V2 B
+ s. U. |/ Q1 y+ t3 t ! o7 a/ j7 ]& s+ n- {/ o
# K' `+ T0 A) S+ V+ \% W* r$ Z2 c @7 ~, E# f- f& C' y: _
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 ' \; N/ Y ^9 Y' W
6 m/ n5 P1 l3 z# w& o; W& E7 [- y4 ^" P& M
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
' P: I: n- y# u
, i1 W( @4 U# [
/ `# ^/ d: F, `* o1 T! Z 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
o6 o0 F9 W' r8 T$ k4 z
( m, k( F6 Z/ V6 C% ?) |0 H! f- f+ }$ E
开源的luasocket代码可以参考学习下 5 h- L0 y- \5 k& ?2 e
% c6 U6 E( A' m
! G6 Q9 o% b9 H2 n8 V! D0 d7 i https://github.com/lunarmodules/luasocket 6 w8 e2 c }# S# q
! W# t9 {5 @5 H- D: {0 b( d
$ m0 ]3 Y( J& v8 }$ [ |/ L
https://github.com/fengye/luasocket
6 ^5 ?8 m/ O% h1 V/ [9 w 1 V. O& [4 ?6 } w
/ N. X( U/ e p( B# D. O
7 z0 Y- ?- M% `) ?3 s* [# _7 n
3 L$ Q E0 ~' K Q* j5 y4 q
+ l- E6 f$ s5 q* Y5 j! y. O % x& r1 u- W, r5 ]6 s8 _
9 t3 j: T; C3 f; N% [- [: K; x) c$ I7 |: x1 W2 i% ^% R
6 P9 z! H5 d( d# `1 l! y! f ) n* G" {! ]# w, W" \
- J/ f# R8 I. R/ q# @
7 J& I3 b8 D, g( Y) u/ e 9 O2 Z) l2 a) k6 l4 d0 q; q
% ^5 A m+ T1 f
总结 + Q- C5 H1 M$ m# Y, D
* W7 \, [+ X r6 I% Z P4 [
1 s: I' Q2 [, Y2 V9 A4 g! E# g
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 $ z& X, H2 w: l* L/ \; Y6 v/ ^: L
- [& r3 \, t h# m/ \- n0 ~. h& m8 H+ b9 N, q9 R
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
$ R6 E j$ B0 D+ S$ V8 T+ M
. r, H2 O9 e3 Y& ^7 f
6 r% T' o9 X, ]3 U1 W! f* N 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 ! P1 `. u' m" }. u
2 @5 e( y6 F5 D9 i _1 a8 z4 L1 k1 h+ [
结束 # i+ y; V/ o, x% b! @( B$ x
9 O: l; o1 ?' m3 L8 v
* p# j8 R0 v0 A6 H ~% j5 U
【推荐阅读】
( N0 r* p! F& f' o; _6 ?1 N
?! B: m4 Y' r" v) }; v$ q, i+ f$ t1 R2 ?/ H* q; ^
对吃鸡APP的分析
/ n, U7 ~3 R# s$ {
$ [( f- q3 h8 a- g; Z0 w- S# P8 o# N+ _7 v
你需要了解的APP安全 # [- i0 f$ ~( l. E2 H/ @
6 u) z: j6 A& d) h* {* G& a- i' e) E" M$ e( M- r
你需要了解的APP安全 0 l- ?: P" N0 k2 b* ]
0 C0 a% n+ s- | k& p* H1 g$ W
}0 b: H$ u4 s/ z
6 B5 S5 R9 T7 C) y |