3 C; ^$ i: t2 b* T( y6 y 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 2 o) E2 y1 @' r5 I& S: A' C
3 a1 _5 z5 w, A( V: {$ H" ]$ c* A/ B) n7 [) S
7 h+ U% X" c/ p( a" e
* a6 p" q M( T7 v' `/ j& `2 R1 t% k* z) f. k
! X+ M1 G/ m2 c
4 D4 [1 N1 e1 ^! |( S& U! [1 N4 B( U& {+ Y* e/ v" Y. N
下面就以开发者角度进行解析下这个APP的功能的实现原理。
/ J$ M/ x" ?1 G, Q* E& H
* N+ P3 n8 Z1 X @
% k) f$ l) L* S: ~1 O/ S
$ j' J' b5 s7 s- r6 F/ u % J0 h9 U: v D+ P1 g
- I2 q$ Z. W1 Y, Y# |( ^% o 基础信息
* b+ A% B; r8 {0 P U 7 }7 L! } c) k! i: R. u5 Y4 j
0 n) L" E# ^& T* C% ^
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
# o# g) J: {* m. _# N9 T- `- n7 B5 s4 n - m) a7 L p7 s; h' O2 W3 _
2 d9 V. ?( k' a& u, b* t" G 2 d- t6 O8 T5 K. u
7 O: B; \& X' u) ?3 E, |2 \+ j( B, D' F. U& y l
- m+ d# G1 u6 B* y# D% C; g( E
8 O( X) m+ [( ?
; \; E- T* I7 ?2 A, y! X 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
* C! h; H; D$ | 2 E* e& I, w6 q' j+ o% f6 Z
% h# n1 `0 F/ [
% O6 U; D8 q4 Y
' r; o, _0 V4 q1 H1 B7 E* U, c8 ~! D1 H5 ?- }3 o( A) w
, ~! a: v( {5 v+ ]& S
: O1 h* o! c7 k3 Q
! N8 z( u" Y5 B 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
" G2 O: A2 c6 k: {3 m6 _' v6 H6 [' f
7 T. |: p, U. t) w8 S9 C/ k# k* V+ |" r9 w
3 M6 E# _: J% n! z8 t" r 3 d6 C/ L0 t, Y, H& @! O
- ^1 A! j# d# w& X
5 i% U/ c m+ s( B* M M8 w0 x% \: L' ~. i, S% }& R2 x! z
) z" Y: q: v8 b0 Q9 _0 N" P E- j3 N. y 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
: O, i4 J+ x" B- u$ n, u
7 m: Z/ B& e8 J3 Z% N% Q; L! r2 k" ?
0 \. R$ e" g# Q. b/ O7 k
. T- i. p$ `( |
7 P: ], W8 K0 u* T. Q
: o% s2 u% n( o 3 H. g) j8 t, C+ a" T s# q, r
) {& p9 J: q# \. x9 _
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 - Q0 P1 u; T$ {- M" R+ V3 n% T
2 G2 S, V- p+ }4 p
4 u% Q8 W2 l& ] 8 M( k0 l2 F& t! V7 a: _
1 q5 P; g; W, k s, D j' V3 q4 B# {2 |; f4 k. s/ F) T
% Z* K3 f, `, p* w9 A9 k
- @# Z {& h- Z+ r" b% m
, n6 [7 P( F9 e8 d/ `% H
?/ L6 \) s1 u3 @
3 f9 c) E- j* B" p. l$ W( z+ E- L! J3 ^8 G @
签名信息
$ @" {$ ]/ s0 z6 P, ^9 W/ D* n 6 T5 U3 G Z. F0 K
& Q2 \" r. x0 l1 G
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
' E& }; @" O9 I( }7 t+ u- O+ [+ H p
) C, i0 R+ q& T; X0 f) O$ w$ b: J. ~7 O: m: g* y
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
( @6 z" @ Z$ e; Z 7 A! `; ?/ ^; F) V7 D( ^* k
/ p- P Y7 F3 P+ ~' P
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 & h2 x$ ~$ k& `7 V: o0 |' E+ ^' D2 D
C0 q) A5 V3 ^7 O5 v% Z% f
. a! M2 s/ [; i8 X/ u
$ O, l ]* d* G" U3 l h1 ^- ^4 u # H& J' L/ T' ^( Z5 Q; T
" z, W9 l! `% y5 V0 k: b% q: a' h
( @7 @4 o2 `# t* S
4 ~+ X& `' [0 M) \- B! P, c8 J- {1 L+ Y# Y/ X6 P" `7 K8 d. ?
android签名的数字证书的一般都是采用 X.509的国际标准。
. [+ A( [, k0 ^* {0 K5 X ) K% R$ @6 L, q6 T5 q
% M |# }! I$ s/ [0 u) _0 c0 e1 P
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
+ _) K+ p0 i8 B5 Z8 O * Y/ _# r; S$ b8 ^/ G8 f
; ]4 W& M8 L" X6 v9 W' I) T0 r1 I
下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
# d, e) R1 s( x' M3 B + v; O8 J+ }! r, t
5 X' t" \9 d2 {0 F
2 _8 g* B- R5 Y& \+ ? 2 T) ?) }$ m. g1 r" @1 ^
& j |3 h2 @" }2 b9 x f' r 2 H9 ~. J* R3 Q: _' R- o
8 l3 E" ?" I9 p: d
% L& G3 }, W4 {) i0 a8 Q
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
; Q/ i, x0 w$ G7 H$ ^0 D6 k3 D$ ^ - D% U$ m- R9 o6 @2 \! c2 F& j
4 p( a9 u# S; ` Z o$ l& d
) {# K, A0 v! |1 I. z; D; O 4 ~7 D% z8 F# t6 j( q( a
1 P1 J+ h4 C, L4 ]' s D0 k& b. h
、 ! q$ ~( a3 q2 G( |8 _
0 ]( |7 x: F* }. S. N' K0 r# ~
7 o+ ?* a, p! R5 h ^% l" _ , n" O0 u5 R2 t0 x# I( F6 r
. r8 L5 I2 F: q# S/ {
) J$ e1 H/ ^" g) x( U1 P 权限信息 ! @1 g& D& ?% O0 P1 V% W; E. R
4 e6 \( g; ~( t4 o: l- R! _# L1 y
5 |# E6 ?6 g0 L& y0 _8 X+ `3 g0 F& m- P 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
; {0 b( a& @+ }! G4 l
0 N9 Q4 x: }) D( q5 g- ~! A- ^$ ^- k f. V4 U# }
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 0 m& d* r# J! q5 r S
; p+ B6 [6 n1 T" h: A5 ]0 I& S
) m6 }" G4 I6 N5 R3 i% W3 e" q , `: e8 B7 t& M1 g6 ?
2 M" L0 Q- B6 U0 ~ Z
; \" T# t' b! Q& f0 N2 Z- s3 V
n$ X { M# x Z $ @" I2 ?5 `1 d. }
* G& C7 [) w1 P# u d 下面对这个APP的所有权限进行详解下: ! O9 x4 U9 {9 T. \: T5 y5 M/ Y
3 z: x& t% m" S# I
7 U% v6 }( H+ p/ H android.permission.INTERNET :访问网络连接可能产生GPRS流量 3 W- P7 g5 f8 N8 n9 g
4 G+ Z/ G3 _& H, I! i# l) _1 r
) ?6 w3 o5 H' X$ w+ y. g
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
+ S. z# z; @' j I; T; H4 ~
3 B* ]' u o. P, c7 [5 u2 g! O, d- H% M( k5 u: n$ E
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 : ^: Y6 e! p5 g/ m( a
( t+ C* ^: V8 N, p8 S
% C! K! |- ^. `1 O5 N0 b1 t android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
8 J1 k. C; P. q0 x! ^4 S( V9 M# {
* s% k z& {& A2 o. m g; z3 g2 J/ G) a2 p/ y
android.permission.WRITE_SMS:允许应用程序写短信内容
3 `# E8 @5 C% ` % A7 ~% ` E- ?# j6 d
3 o2 Q. D( `: `# r: l android.permission.READ_SMS:允许应用程序读取短信内容 $ K. h V; L8 `5 I
1 f# I. W! O. S7 L7 [
6 z1 m& X# X1 W0 @" H# j
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 " |$ E; P' B. y9 V$ g$ Q
" X$ ^& z" i6 T5 h, n$ R r$ n6 X" m! P0 P. e( l
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 8 _$ R. d2 g5 b% y
, u3 N {' }3 j: a. F5 _* [; S
! H1 d7 l6 C* Y" |
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 , a7 M" z8 x) s8 B
% |+ N" p9 N" r% @0 m2 j
; \7 t/ y, j4 g, K- f7 ~. P1 B android.permission.VIBRATE:允许振动
; b2 C7 Y+ V* E' A3 q3 `' k) C
: k4 I" h; Q9 C1 {) Z) J4 G$ }* Q! P& k
android.permission.READ_LOGS:允许程序读取系统底层日志
! R9 [* Z7 Z, g0 T - `6 k- ?, M2 S( r. G) M
6 H6 E% k; J1 r* L" e0 o android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 : f" e! v* @5 I5 @! h0 y7 b
$ t. s1 C& [/ C7 ?
9 H: z" O) i* O9 [- R9 ~% _ + p N1 K! ]' F' w
: [+ E( S; [3 a
4 _. V2 d7 {6 S; X
功能信息 4 P: T- u" M4 P, A
( @7 }0 v7 e$ U5 S
; q/ e$ q4 a% k( R$ K% K5 Y 9 f( r2 A9 O: G) Z: ?2 ~# P
5 M0 i( e4 ?, E6 S+ `: U7 z3 [: x9 V: a
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 2 i0 B! C" j1 @ M6 N7 e
8 n0 t$ n$ Z+ w3 k# o" O
0 B1 s3 I% M- `! s6 i E! k) n. o4 o
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
5 T7 v2 z- t- B' r # h m8 C& B; x6 Q R( Z6 X
. ^3 i% z3 |# P7 H4 q# q- C( Q 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
" h6 {0 w' m# B6 V3 t
~; [1 `- j3 f/ n m' s' A$ Y
, B9 c* M# N; c+ z4 `- e 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 1 }# Y. E. r; W) c
5 Y4 ]0 Q. t0 l8 c9 p' b# ~
+ m! w" x; e9 H
( ?7 k2 l: I, y9 F9 A; d
: e- W2 K9 t+ r) a2 q/ g1 N( v" q% y' ?! U' y) l' {, z+ x, H4 ?
3 h5 J0 T e$ j! u; a% _5 I9 v5 U% S
- Q+ Y4 K# _8 n; O( i& b
, Y: G" F: r* v) F) L- B9 u
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
4 c( i3 D: U2 [$ l7 I+ g " j. k, q& q L7 T
6 a4 M3 d8 H( x. T
' U& N, l3 Q+ a C" [ `) b " j& N3 W1 M1 ]6 \6 u4 u5 s/ D
, l) j' E% t* t5 a" y
' [+ Z m. k! d3 ]4 i
/ @ |) v" E) ]- A# f
$ ?5 ]1 J$ p0 d% N! U& ^; b 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 * z$ v3 y5 `5 P4 h) r2 c
, d8 w, c( X8 a) n7 D% A7 Q* r' L, A( J$ E+ \ E9 x$ E
6 \6 o6 h+ r6 R4 s/ i! s( i( k$ J " E( r# l! O" g- h& ]( Q4 k2 d( o
. w/ @" M, ~" d7 v 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
, w8 v8 E% {; p* y' T0 X5 ] ) b" \2 |' [) H* z$ Z
" w# M6 V6 Q. p& j! Y8 s9 f; I2 Q c1 w; Z. ]6 c" `1 Z
- [( A4 @& Q0 \; c/ D7 @% [
6 L8 L& U6 D$ ^5 W% _* @) z- \
* B. m3 i# | l; f* m $ k3 c: W8 {8 W- G
, J% t2 h$ ^3 M I/ M 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
4 ~! P( T+ X4 d3 [# \) ~
% v+ I* Y! C/ v- \- h; e9 q5 s5 Z5 D# B' Z2 A8 \/ O f) e
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
4 I2 r; i* y( ]3 r J8 ^ 3 o2 ?# q9 a; a) `9 v4 c$ }- O
( G/ F0 I$ D0 c" L 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 ! p2 T! v. V( h7 C
+ K3 y1 z3 o- i! P
9 g; m; v3 z; U 开源的luasocket代码可以参考学习下 n/ v" t5 ^! i1 N; g+ N6 D
' Y4 ], F6 I) ?8 n, Q8 V9 T# b
/ h8 `* V- P) K/ F0 L( ? https://github.com/lunarmodules/luasocket
7 g- W8 x6 j: `3 m1 A( H9 V1 x( \
; L7 i$ l$ w3 A6 n! G5 q8 {7 n7 N% O/ a( J3 _+ o3 G# R
https://github.com/fengye/luasocket
" _/ \9 C7 q7 L8 B+ n M3 N8 { ' f6 _5 x. h0 F2 i& L
* T6 q& k( h5 w6 z7 ?
: K5 L: T2 G6 c1 O5 G / Q1 F: [' M$ y" b; ~9 p3 r8 y
7 _' {1 E2 |3 l! K1 B. B& ]
7 `$ \+ C: w/ |4 S2 Z $ v ~, w' @4 [: q
& k* ]2 E! X6 k, s
/ n5 R- X+ K% [; Q
& f# R0 B) Q# _! j. ^3 k, I- v. M: c! t, Y9 ]" [1 M
* |$ g: `& l2 N( S# R0 B 8 v: x. T$ l) e- A
+ w& I+ c! M" R8 c# v7 `4 T' | 总结 4 }7 ?( ~; Q7 B& \0 ?3 Z7 w
& J, m. l d: i, `
' d" T# A3 Y3 S. b7 Z 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
# Q0 j% R0 U8 r+ u " d/ `% j' J* [9 I
: X2 u. H |2 O: q
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
$ o y m1 Z i) O) B - {1 a& a- L" z7 J, K7 p! m
7 g% \6 w ^1 v
对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
' r1 e# e& Q5 H' q5 l' k
2 j; L6 R9 n& o, }7 `6 i s4 F+ h! I. a0 w0 v
结束 1 [6 r& t4 v! m4 l) Q9 C
3 J+ P4 I- ^6 z- j& u& t! i
; `, o8 E: P o4 Z) D 【推荐阅读】
# j- f0 [7 g V/ F2 j ! b4 ^) N, k4 \5 {7 J
( W) s ~% ]8 D( ?6 r9 x) z) K
对吃鸡APP的分析 7 _" I) @' G# q' ^! X( f# f6 f/ _- Q
- {8 V3 t: m( P
# L4 c" h1 h9 |- T8 {: s/ w 你需要了解的APP安全 * [$ C3 N1 k: G, X4 H
8 h1 b. Q9 F: d& F$ Q
. B' _8 x4 `# o! o 你需要了解的APP安全
" ^* S3 L$ W; u6 a" Q2 S3 a) B
- I7 @% u) H0 V/ f7 x+ j# J7 s' J2 v& u3 W4 e$ _8 [/ P+ b% h/ m
8 z' @/ P0 C. t7 P9 T+ E" }0 L5 R$ ?5 m
|