|
! g7 N% W/ q& L: h5 |6 y* Q$ O 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
9 p' F+ H, |" Q' g
. g0 A% v% b7 q" A1 p0 z- @. C4 z( p% t; d0 c" l- y1 y
) V# E) z, p9 Y+ z7 M* N
' C u0 N0 D d" Y
( I5 h3 z7 j6 [
. [; c3 B9 R. M5 h5 D. b+ i% h
9 p/ s+ d4 Q0 S
# z2 t$ J0 F" V7 |2 H% B% |; i 下面就以开发者角度进行解析下这个APP的功能的实现原理。 # y# t, [3 I+ q
3 }, J; M' O4 _$ e3 u0 V3 B0 u# y) {/ M+ @9 y0 c |& e
6 `' A0 O% n) g0 Y8 w: P3 q
. w0 s5 N5 r3 h& l( U1 u
7 o* w+ T: }6 a9 G 基础信息 6 ^! | S1 S" b9 y
0 i3 q, [% y7 Z9 E& Z
4 r" a" `$ U% D! l ^ 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 ) w% l( |# ~$ }$ A3 L9 K4 v- j
% e; u9 w& k( |; [8 k0 U! m* {6 X/ Y, L3 |; c( z% }0 l+ }
- t* Z: C8 ~& [& m
- `7 j* h; @# c+ w- ^8 t4 S* C I# I1 c- W! @
" W- d& A3 I1 ?2 Y! i1 T) o
" _' X" o3 ]/ u! t' K9 g* x& l, ]
$ P& r- T0 f) W0 Z. Q+ i 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
# A/ M# J3 g/ _/ O9 N1 M" z
x6 U# I* U! [* y& [5 U2 J; ~' k' p: @( y
5 I' K( C- Y3 O
2 H2 K- E$ [2 D s
4 A+ _6 B/ I: `* o; u5 ? * b! {) I" x7 ?& ]3 Y
8 H) p+ S, I% S) _8 |& _1 }
1 {4 p- c4 O, }: L, h) ` 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
4 V# R. i5 {7 ?! u$ L# z+ T
: \0 n/ k/ q2 [ w+ ]) S& r) h; }1 j; |/ c
8 R- g2 m8 S5 P8 e6 B P
, y! V1 x9 }; h: U7 T+ {2 H9 F/ G8 K) l6 Y" f+ h# T2 D2 S; w
& Y: z, g7 Z1 x) {) V
h9 ?6 {* n7 g }- Y: L8 n/ f- O. @: [8 k) [
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 2 n! `8 G$ Z+ a7 B# j# e
j- d% J! M% N, S' R
" Y5 x$ \" P' Z7 } 5 p- S; [& n' G: c4 S& D& H
; E' `5 k# _( n2 Y
; R, c3 G* c% }; f& R0 X
: _% t1 B& K! G% S
( d- Y1 m( D( Z0 J; l
; A: P6 X0 _9 P) O! s# b7 |8 }& s 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
; s! \0 Y1 \6 l2 l. v3 ?
2 Z" v* t' v$ f) Y* P4 D: ^" E/ R C v5 E j$ u j$ e' [# u
5 q6 _% L* o5 U) ^% Q. ` 1 e( Z8 R2 r2 R2 }. Y
8 i0 g% T1 w8 w: N0 c" H/ j$ ?
' M3 J, n; q: b+ m# F : n1 }7 \2 g- D2 }# S
. L% W6 {% A% O2 C% p) q
, D( G6 i. s4 e' [
) K# H$ G! X- o# m9 p7 E# J# e, Q' I$ n: T" I
签名信息
# H/ G' w* V8 W: M 8 J% u" I& O& p2 R" S9 [
6 w- v6 t. R+ a+ F) _" k
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 / g9 {% v* W4 g/ Z
0 p$ c2 |, f9 T0 ?; L3 n) F8 K1 x
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 2 E( W* a3 I- N! J3 m/ ^ n
* c% d3 D+ b& Z" o- ^; M# C8 f. m. {0 \; F, }8 l7 `+ D
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 : x/ _+ a6 c. `
8 E- K7 F$ I" p/ [* r* M; T* X! w. @) E i, K5 l# `2 O
7 O5 U+ c1 T$ w2 N' t
, _" ]* C' `; ~% J. v$ y: f3 Z. M% o% C3 ~. r
3 J8 ]0 R" Z2 h6 h% {& ?7 F 1 U* A: j7 O9 y" {# x% N
, @) `- L+ K8 {
android签名的数字证书的一般都是采用 X.509的国际标准。 ( e6 `; {9 {' K1 }. @
. s X5 W4 o3 N8 W* s1 J
' X1 H$ ]3 b& l1 R 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 ! Z" B8 k2 e' \: k0 W6 r
' r. y' V! D+ l! p( N/ w
# X$ m* z4 a9 p* w; y 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
# [$ y+ b' r! u7 a2 T ) `' |3 `0 ?' j; V! {
+ A4 {0 l' u! l' ~& ~* [& A$ Y2 K# [
0 G, {( x: f# ?8 V
, V6 D2 r, R4 L$ u& q5 c+ o! A4 c& Q- M, R# U4 H5 z3 A( v8 n
6 ]9 o% u) ]0 o$ w, p; V # F+ K& ]3 m$ ]" E; E3 P+ N
! |9 P! S% P& |/ D4 s) y
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 0 I1 [2 r& F, P. j0 U4 ~/ X
' @* v z: |+ V5 Y
- b, @: O! ~8 j% q8 D9 a! A " E. J3 G0 e4 S# T+ e# ~$ T! `
5 O7 ~& n, G9 Q" L0 C" K( G. y* x& D) o9 q+ R9 d5 }
、
4 L4 S& R2 X- h$ _- C
$ x, { ?, c# [1 d8 o) m( H. V1 s0 n: F3 n |% B1 O
' Y! `. q. [9 O+ s3 K) [/ Y* ` I) T2 ?+ P: N# K5 J1 F
. G+ v; M5 k0 I4 n8 ?8 W 权限信息 0 n6 U: k d$ Z) [% E7 b2 A- q$ t( P
' e8 k' d3 w, m
! l6 _' X: P3 @7 i/ {- m2 x 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) ( i% F, y/ s. {) I9 e) P6 M
2 @* d. `6 c6 m- d$ E
+ c8 q& W1 Q+ M8 c6 x
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 6 t; C% V* @" l5 Q( F
3 y0 b4 @% a: T/ R
* i$ {/ \2 l' U6 O
' h `8 o6 ]) n, Z8 O7 l
; [1 B3 M9 o* A5 h
1 U" T1 F& |9 n. N9 C; W ( D7 j7 [1 D6 t7 ?# U- R1 U
% M9 [. \0 N3 _( i/ [
% c% H) C4 W6 p2 _9 f 下面对这个APP的所有权限进行详解下: - V3 z! U- {2 s# X7 y
W: @9 s# u" w
: Q9 K* n' Q1 t _
android.permission.INTERNET :访问网络连接可能产生GPRS流量
7 Y2 w" k( z3 \
9 c* C: |* H, L* ]/ \2 x
4 X' c0 E, J w* p6 g android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 B* ~% a7 P; Q+ h
5 ~& N6 X. ]- Y: l0 R
* g! {1 N0 F- @0 O/ i* m0 S2 n android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 . q; @5 |8 E- j/ o! X( @$ _
; A+ y1 B6 u/ t) S2 n8 Y9 F7 U
& y7 P& H( [1 ]) r android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
# D+ v/ h1 Z2 b6 j* t ) E# H$ x5 N M9 s& x- W
1 X7 ?4 m7 j5 ?. c# w android.permission.WRITE_SMS:允许应用程序写短信内容 9 E G& f7 |1 ]& i" f; K; x" L
& { i9 E4 A5 P- u' D- I: L, L
, K# e$ G9 [* E5 I9 o+ M android.permission.READ_SMS:允许应用程序读取短信内容 + V) ]) g r6 k* D" o
, D( h2 l0 E) H3 N+ J% n
F2 E9 J8 M5 ~( S; d
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
5 | x* u/ c4 P' c. H ! M! ?( a1 B3 M1 b5 L, @. Z) X
4 w) S _, F7 H* I! u9 e6 ^' _
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 5 P* T B. B5 Q' w5 T" N4 z
; e/ i$ v) E! N/ Y/ z
/ `5 |) e* @" G0 j
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 0 S, v6 Q# L% C8 y( n6 ^% H
+ h: D( V6 {% C8 H# I# {! F e9 W
- K2 f/ _5 U! H2 h( w. d android.permission.VIBRATE:允许振动 5 S; O# S0 X' b5 w
2 }4 b; z J- u4 A0 }0 T& G1 \& S! X6 t& J. d! f1 m5 e
android.permission.READ_LOGS:允许程序读取系统底层日志
8 K% b" A1 e: e% g2 C0 [' d
/ f7 s; y" H% S6 ^) }9 Y# j: S. U8 p/ |2 J' N
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
+ X1 Y5 F+ [4 V# h ' l7 w i" f9 O% D0 y; M6 a
# h" W' B/ p5 q/ \
* @# n6 e; X1 ~ " {# T2 g" o' u& N4 p4 U
# x; ]7 J+ O/ d4 B) j. Q# y2 Y& s! F 功能信息
' ]6 \+ z" E; ?% N$ D2 b! E6 X
: Z1 C+ L6 ^9 Z: e' ^" {. x' _
3 Z2 k1 R+ x/ C( ~: a: f 0 ~% ~9 Z: |! q2 E* V
C0 S" @+ F/ D2 p9 c. Q
7 [ R0 j: e) p* }% Y2 ^( w
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 - \2 i# l% n3 ~2 L! ?/ H3 @$ s
! M' E& ~- ]/ v3 c8 K8 ^, R* G- U+ z2 n8 L+ M5 h
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 . z+ P* I+ W: |( y
0 B& }" @, z! N! B( s- \' u
8 o& K! c" j$ z L* T 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 . k1 W3 r4 H2 |! V: Q
H: x4 g$ E" A5 `) T% J
2 [7 T. f& q/ m. N 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 ; P# P8 `% r6 _ j. y' y/ o" b
p: F- B% Y9 J6 c1 S8 s1 ^, H7 f" G4 p: u4 y3 Z8 i. a
2 q% J* V. t2 y: W) ]& M1 H
, Q7 ?0 c9 k% Q
9 s3 @5 r! h3 k9 z& b: _6 ]- a
2 z, z8 K& J& m6 R
( ^/ s: \6 n) w/ P- F5 d4 v$ Z8 M: t: @4 Q7 j, @
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
- T8 Z0 i# J7 n8 ?0 i
, a$ X- A8 v- I1 I6 k/ u3 R1 s: W+ Q3 T1 S
3 A$ h3 e) _- O/ [7 r ' j0 d- M u* _4 a/ k
1 O+ x0 l/ `4 H9 _6 l; G% X" W6 N
' x4 I* y0 i6 c: H; N& s3 o, Q
& h1 y4 Z. ]1 r5 g# @! n
9 J. p$ g' l+ ] 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 & F5 g" @' J! f( b( r
. {8 [% B+ z4 k+ A+ E; [# Y! @! h% t6 s, N
0 ]$ N. P2 A4 [" ^0 ?
, E Z. ^+ u$ T# y& |8 G& \$ |, F
' j) U% J" ]0 I* |$ E* p
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 # v# f4 c/ i) V4 W+ \1 ~, o
7 J* v* v- N% m* A0 V1 b
1 K. H y' ^! I- `0 n1 h6 v
6 B' r/ e u3 v* g% f, @, J
7 M" ~1 B0 r5 O' y- l. O& ^
) f G1 E! l- R: j8 W o4 M 9 G1 N/ M0 @' V+ h/ l
& n1 E O! S/ Y, O1 m9 ~ `
% X) @7 u4 E( V m7 ^ S+ q1 J 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 ; O& h" \) l% x# j
4 r4 h$ d/ }; P: H. A! }, F3 m0 K4 N$ H1 k+ i; w: N/ @9 L# j
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 9 E ]$ X2 p. n2 ]4 l4 ]
7 Y: }& n8 Y7 \$ L. h
' M7 x0 N- q$ W% p% }3 _8 Q+ O 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
; A. ]% y; \: s, L8 a- d : s3 h$ q; U- O* d# U
) |3 G- a/ k! Y 开源的luasocket代码可以参考学习下 7 c5 }% J) S, G2 e1 F
, q5 h$ u5 @) ~, m, b9 N+ R+ H0 D
https://github.com/lunarmodules/luasocket
0 y0 w" j1 ?& P& } ' W& x6 f1 C. |+ V- s. A- K& t+ s/ b
% K6 J0 F7 ~( R% d0 l
https://github.com/fengye/luasocket
F& f+ U6 w2 d1 _* I3 y 0 A7 s% T; J% t$ d) |
/ t1 B! O3 n+ {8 o/ d, s% ]2 } 4 u+ W0 W* q) U: Q
0 m: v! c# \. ]% j: o) k( w Z8 ^% @, L: U: N; h
N5 t9 G# O( p0 A8 K" l1 ~
/ Y* p' ?6 C* r0 f+ a' A
0 |: P+ D. D: ]6 |
, f, C# C3 Y# x) K( r, P* v 3 c/ C) D* ?" F- `* t
% I, Y/ d; k+ d9 V# ^+ Z% K / G) E- Q, m$ V3 Q$ O
9 | c3 d. t' v& z8 c. x0 {
0 _6 n1 e4 x# O ] 总结
' x0 U. _1 F, z4 ^- @0 L 5 @! @. [' e0 o
4 [) h2 P; b7 L/ o9 K1 B 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
0 J+ X2 o( s1 |: a$ U. m7 Q ; c6 | W/ k9 [+ T" c
- S2 {9 H6 B" L6 `4 S3 Z) p+ F 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 - \8 \: D5 U( V2 @% u
" ?9 h3 B+ M) b4 ^9 |$ v7 C. x
* ^( \2 |7 D5 c/ u 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 * B# \" q U/ k# d$ f8 |! v
8 D! l6 [- C: t/ ]* n7 w& |
4 R [1 S0 O5 S) Y
结束 1 Y- d7 V! M2 z: i# s
X1 T/ n$ Y" ~" H
7 m# E' G0 Z; o0 h" w* E) ?) f 【推荐阅读】 1 b/ l5 Q) R; C+ H
9 r+ e/ `+ ^" R: O, _0 n# ^5 T. p8 t6 m6 z, R) B
对吃鸡APP的分析
& q, E5 [* q7 o e
) ?- b5 r; T( I+ B$ K# F* y% M' `& s9 [2 |* K- G% a
你需要了解的APP安全
6 H) ^( k( X- w! N8 O3 Q 8 K& N+ B/ s S2 p
# u* c: \+ e; `' {: |9 t: F9 u 你需要了解的APP安全 5 L0 `- V, C* V
) R, T: V' H* Z' Q/ ]; u2 z3 \2 p0 i! \% b; S
! Z6 v1 r% u/ P, Q |