|
" o' j& ^) l8 J
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
3 n$ H/ K% e- t8 l! @; p
6 x. }9 V$ _% U% h I/ r: q3 u. N% j( y4 C8 g3 y( n' R8 m5 V
7 w: Q% G2 H+ \1 X; ]6 C ; j/ x4 s! y( y/ f, n
' [& b6 I# \" K $ j# {3 B% ^) d+ ]& E4 }
/ a4 D6 |4 I' ?. p& x
4 ]- {- U+ ~4 L! \; c; \3 Q 下面就以开发者角度进行解析下这个APP的功能的实现原理。
0 g& T" D( ]9 ~+ C h3 _& g8 {$ j7 s
y" i# ]7 g+ D# U v' x4 {/ O1 J! G7 |! V: E
% K5 b, U+ V. U, p$ @
$ x1 L7 N7 H; M5 }2 o a0 Y2 D
7 Y; o. ^- y* G( V 基础信息
9 k5 \& w: H+ P
1 I, C) L( `2 N5 U. l+ H8 a2 s( U1 y7 z. b% ], F" p0 r8 L1 i' s
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 & P Y" y5 L. N$ X* Q& {1 U
! v- N3 M1 e2 N/ B% E; t; i( }8 N" S6 x
1 a. K6 `" Z- O- X; o 6 E8 J8 ^7 z6 B! s3 G0 A% m
, o( H0 L! p* A: v7 Y! c' b3 g% F S7 B2 u/ y' Y0 }
: I7 M; p2 t" A* l, K( v; R
* C: A4 s" C8 |) R/ |
0 ^( [6 U' V/ r. S
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 ; M0 H! O- _: ^9 _
1 o& |9 B1 i" f
H3 }- O* n% ]7 A0 L3 q/ |; e
- `# m* R \ Z! K
- ~* r( Q' N& s4 A$ P/ O. k! [% E [5 @. q
: ?) I, Q$ O n$ ~0 {$ u
/ E+ W. b9 I3 g, D$ M
7 `( D( H i# a% U6 J+ Z 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
' |: u* K! C! C2 l: I2 R& d, |
& c7 @# Y9 b: P8 z6 l
. [, C4 t" Z/ C9 q, h
& V7 W8 e. V) D+ `" V
5 p4 z" a0 _4 P2 x
( z& P# O2 \1 R " J! h1 _* T3 ], Y `: }& A7 N
/ B) K8 [. G: Q7 n! G* X* u: d# z3 f" W3 |. T
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
5 |% o. ]- @/ y8 }# L, z6 Z6 c K 5 K* _! Z; i$ z9 J* S t, I5 r
: X3 T9 V. n( H% z6 `' D2 N# q3 S
. X8 [0 b; ^( p- i ) f: i% m& W. c" X
0 v0 R1 y4 [( F6 V; F0 |
; w4 i8 t: {. x9 X, P: j- e % p% D$ u* k6 T5 z E' t7 U
9 R. |& ~8 E) M, B 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
1 {" `5 ^0 P7 a: ~- A+ U+ b. ] 1 t. T: j/ \0 m: B; { Y# c# F( s
$ M% {( W7 \$ \6 `) @
# W4 d/ A# @; A1 o; {* W; V ( n' ?9 y/ R) |; C$ h' ?& f
: C$ u3 ], ~ X5 L$ R0 @
% j& @( z, }* ]* D6 ]8 }
9 P3 I" w) ~) |! A. ^. L
" o R @3 s: V/ F
7 s5 i- }: j. N5 H' O
! y: n' r4 U' M/ d7 z0 S* L8 T) j+ y1 ^$ k9 X/ p- ^( D+ l
签名信息
( |# J& L, x. i8 u4 L: M6 P
0 x( R* D: A* W
' d0 M1 o2 F& D8 y5 J; M& F 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
) E( ?! ?4 I/ {4 R! [4 }( g
' E q& h5 S& c2 i
" O! P& I1 q7 N' F3 I# x 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 " I( K! R1 z3 v% C0 `) j# \
2 ~* u; P1 D; ~; S* E. j
3 S8 l' e$ f0 O* I* s$ J$ R* k# {
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 a' p+ X- K. T# y7 O
; y& a) [4 a& a4 G1 M/ z8 s; p; w6 \. D" t( C
; G4 M4 f$ G% I& j+ a. [ 5 r2 o$ I5 \: ~
! {( D% l/ k6 u, m$ l6 b7 J- u# y% L / |8 y% I0 m! c2 }8 d
. t8 A( j; T: ~+ m5 d* P
* A- F) }# ^! G5 T9 i4 |* h8 l android签名的数字证书的一般都是采用 X.509的国际标准。 4 z2 \) \, l- t6 B# P
* k7 I% @' L* r6 m- G* g$ `$ t2 m+ ~$ O# t2 `. b
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
. S' j* w% z* c: Q; n9 D0 m ' g( R) c% k; b. r% e, V
$ J. x0 A8 R8 r4 L7 i$ |9 j4 y 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
9 z# v* `3 E! I+ N8 D0 j
& H8 w5 X7 j. ?2 S% g8 s# I
/ j8 _- ]" r$ @, v: q& @5 Q * B2 _- T8 P, m* r
% Y, C, S9 q9 i9 `1 L, ?; _8 D
N5 a$ G" l/ V1 C: ^" \% F
9 Q" i1 ?; W i$ Z
# `! H+ K5 N" X0 A
/ e' ^2 V* ^% C* Q) y/ P+ g4 \ 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 - j' }& {, x* ]1 k. ^0 y3 |
1 @* x. o2 [1 v0 @- w. e u3 H% L- n
) }' P0 J! I8 z# |1 v3 W; Z . c$ P O. O, S; [2 f* k) @* v7 o
/ E0 e6 U/ {! t6 r3 I3 [5 m
5 x: e4 P* E0 W4 i" [ 、 : U2 G0 k. P" i& e/ C5 H
5 J! Z/ {/ H0 V( A% A" x9 ~
" j9 N {4 _3 r6 w/ g1 J1 {& q
8 X. Q1 M% J) p, g- G$ W/ }- v# W
9 H* a ~" S' J( _$ r# c* i3 _1 S2 @( @7 }- H; \& x1 e
权限信息
0 Y, }) X$ O1 m* ] M
9 D2 B% G8 {+ A2 x& o3 [ P A+ F6 ~: c+ f9 h# z
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
" A/ v+ x" s& H% g
, a& ?) R4 y- y0 {( k/ S7 n8 p' t3 s" a
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
8 i+ }0 Q5 Q5 L/ C - x& }, u, W1 M1 w% y
$ W- p9 X o# v3 o. e; ]0 S5 V + Q' u1 ?9 }, v9 | O: _. b
' H7 v; B& d9 J* ?+ Y
8 Q9 o- R) }7 x: V1 G+ x
4 d5 q0 Z( L7 j4 s7 M/ W, f7 n I3 p7 {" D( R# [
3 O$ M2 W1 q0 s' V4 [4 ~: Z( \; Y% K8 I 下面对这个APP的所有权限进行详解下: 8 @. |, U/ p/ U; S: d4 G
* a4 l; F+ f5 A! x' V+ v7 S5 U) i+ t; z& r U5 ~$ c# D7 v( g' Z. K
android.permission.INTERNET :访问网络连接可能产生GPRS流量 $ x4 O5 s4 t+ {* ^ X
1 K4 r! N/ ?5 r* Q1 L7 q. @6 Y
& v; v) r; B- P9 k6 @; R5 M android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
$ r; ^3 q9 T; H% S8 }3 L
- B3 c/ @) F: R( r
! K) c) S E! K5 ^! A" X; @3 i5 v android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
. y9 T" G7 z. s e( P; ~ h * C( T- p$ X( N5 ~/ o
' m; ^7 o! u7 A5 v4 }) J android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
! M: [( R3 L/ z/ D$ w 1 I" {! o- [3 a# ^3 h1 B7 [
' s1 C( Z4 ?2 W0 F android.permission.WRITE_SMS:允许应用程序写短信内容 : ~/ N8 p6 j# ^- d# j
0 s9 v& D$ {8 O1 P# ?! q; \
6 o' ]% y) E0 n; ]- j6 R# r( X" D android.permission.READ_SMS:允许应用程序读取短信内容
5 e2 @* v1 ^6 U8 {( u 3 z7 ]$ N3 v2 P j
7 Z. t# K' t N: p) p android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 ) n& K/ C: G0 L2 s2 E2 ]
, g- k* m5 \4 m& z
8 T1 F: i. V) Q4 l0 y5 u2 z7 Q
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 9 F+ }' u+ R& Q9 S- k* y8 O
1 ^* B8 ^. ?3 a) m
$ Z: j. U% c% Q' T7 H" D, n android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
' e: C) K) x$ F* k4 y' m( a- P& V' C& b
4 ^2 f" q6 }8 B7 _* Z" i5 a% m
^+ ~! `9 X, [* j9 U android.permission.VIBRATE:允许振动
& S S3 W+ D! h( J0 i & c" W4 c& R0 T! g! D
: |; E! r+ B5 X2 B- ^! {/ g
android.permission.READ_LOGS:允许程序读取系统底层日志
- @+ p' q/ k3 h0 L! D
+ S# k; |2 Q; b, P' S; r4 Y
. [3 k- C. a7 q android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
- m' u0 k- K9 h1 N% p6 r
. o- j+ i: ~ k. O/ J- o$ Z9 f
q# b0 S+ W7 L+ m& x3 O: D
, d/ U' j0 f) u& v. m : A, r3 @+ D( ^2 p8 V! s3 a! g8 R+ P
$ f: D3 u3 v% h/ D4 d6 t
功能信息 + G$ }. P) n5 P( ?0 x; ^! [
$ m$ v( d, @. j# S' |# d
5 ^: p+ G9 S0 T0 {! s
6 P; a/ d0 j+ b' ]
6 m, \7 y* D/ v9 R4 V0 h' d
) S) m( b- Y4 u$ V0 G/ E7 Y 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
7 O+ R$ r% [$ I
: W6 W7 s/ Y0 C; C6 p: R4 \
( |- j0 t2 `' @0 c5 {- [ Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
4 j# }9 g! S q# M% `& T
. `& c' l2 Q1 A8 R( o1 V" k( v9 s7 l3 v
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 3 w5 E G; q% a' v- e& B: V2 Z( t
" u& a \) c8 `, k' a. l6 @) Y S
' j$ a& A# G+ y; ]" s2 u( o3 s 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 & s6 ]% u" v& W2 Z+ G
& V" j( B8 y4 f" Z$ S# V" f; b# y3 F/ O- L4 P2 O
4 G0 a% e1 ]! }5 P) U
% b! [8 c0 D( C8 ]& ]& f5 z7 H) i K# D
- p* r, }/ |! d/ M: ~5 J8 ?
' w3 c2 z' a: w r0 _3 f% |: b
3 ~. _: H0 Y% d& D! S 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 ; {" j% o' t* ^
3 K# S* B0 `- V" [' N
% @) k* ]/ c5 h4 ` * j( K: z' h: d8 U
+ f7 I7 u5 Y, j6 k8 R. G
7 z+ k1 Y8 s% H7 n 4 K( f3 I% a+ m- q. I% H$ K. Y
9 {, {) w0 c s9 m" _
$ O9 c1 }- B. h8 |. u' [. f 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
5 p( I: K6 e5 \ V4 y; ]
6 B( |: s2 `5 | @' \, e1 U
: A2 ^" G) S/ `* i( z' O5 x6 [3 e
" V' e9 s% J9 J" w' y. N( y s; m& o2 d1 D+ ?0 f: a
: ^# A8 e7 f3 D* G$ h! S- b5 N/ p" R 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 # H. N( |$ ]; W. `& G/ {
1 @8 h; L1 W! o- B; t3 D- i, b; ?4 p- I/ E6 Q* [8 f* H+ }
9 B3 t- j9 }9 J. n
' x" Z3 y2 B( e) F+ o% `" g
9 i/ C/ b4 U9 u $ ^3 Y/ O% E2 O' I* I
4 q5 O* r! l% b9 \% a# l
: p% K* B# b5 P2 R3 f 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
$ D- ^, V7 L/ S# W n
% z5 s- j& `) ]$ D3 B* y- z
. q! v( t/ B3 {- d4 R: R LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 5 N! G) ^4 Q1 p* @
3 @& a, ]- U8 o. m3 _" Z, _
4 h( I1 A6 A7 J' n 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 . O' y# p0 G, Y* c6 T/ V' N
3 Y* D9 F7 r: ?
0 Z7 r. Y0 F( F8 x9 S: j 开源的luasocket代码可以参考学习下
7 R% G3 p4 r# h* f- T9 p
* [' v/ [" u( v' i! d/ ]4 m5 { Y x, A( o8 P7 r
https://github.com/lunarmodules/luasocket % H) g( `& i3 x
; d' _2 r- S8 C' r5 G2 L4 C
% b: A6 b2 M5 ~' A
https://github.com/fengye/luasocket ! }6 |7 v6 x: \* [0 R9 A. F, V+ W
& D7 {7 \$ K/ s' ~3 p, t7 }; S
4 `: X% D' Z% R9 p7 }
, E {' O1 e/ |8 \ 1 V/ s% J t6 q$ ]
% Y3 k) f, j K! m% n m; C! r$ \% l% P* D9 q2 v" j
: S, ^1 T/ U) I' t" Q
/ ?- s! @! L9 h1 |* X8 @. ^ 3 m% m8 b* T* v3 c9 z. c
! T" w2 [/ z9 j$ ~1 K6 ], t, q, _/ D! r! c
m7 H- h8 E& p' d% |+ K ' _% W; p: W% c, j x
. u0 u% Y* g0 D0 W 总结 ) u3 L( }& z& B$ g- Y% K5 Z v
3 x, q3 e2 ~& r0 b0 f/ v+ I1 `# K) m( t) n* [5 F
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 ' K N: D4 r7 R' \4 C7 P/ {
$ t2 o' Q. a1 Q. k
8 Q, j+ y0 ^) V 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 : V+ G# _3 L. q# c4 T5 [
1 L/ |0 I; ^% j3 c6 ~- G4 s! E
3 n8 |) D7 W8 K# m) Y" y+ ~' @
对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 , d: v# p( p+ ~6 H& }2 J
! r. f/ S( Y6 Z! J& T/ x+ N2 L+ f' |! c
结束 3 t6 f! v* d1 ~2 p( u
" j3 ^, Z0 S% ~! d; @7 ?
. r6 }' r5 x* L% p3 l' ?6 }2 P 【推荐阅读】
p- {. v5 h& N! w g& @' ^ ( j- a$ `/ O# Z' |- ]
9 e. e3 o% O Y2 I* f 对吃鸡APP的分析 o! |- X3 q- ^
, W6 b: p- Z$ N
/ V: g+ L8 k$ O6 c" X9 ~
你需要了解的APP安全
5 O% z _. l1 Q% r" ^ B
5 b3 v* @3 o% n! }; W l
+ e% Z( q' f9 i( P9 q- u q& Z4 N" [ 你需要了解的APP安全 & h4 p4 t+ C N, |- \) p* S6 G; d
9 [9 z* u {1 {2 U) r, T$ ?( S0 h5 x1 |6 W1 J- c, w2 z
2 v# z+ |: ]$ L i, V+ K# U
|