|
8 f3 M; z0 P2 P 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
. k9 M# f/ Y9 h8 o( U% V2 C
0 U; v! c! g2 j5 e% h" ^
! Z+ s; O& w+ D" ` r! w3 J
' E) l& m4 C1 a* o/ T 7 {# E& s% x' i/ j
! S' z9 p1 `* c% ]
4 U1 O& i8 j( t; l. L 2 P( r( K9 ~. u
+ o: j' L3 {/ Q$ F2 N 下面就以开发者角度进行解析下这个APP的功能的实现原理。
4 S, O" f! v1 W1 a
3 O+ o" Z* n' \0 K" I2 P x* w3 h: f0 H
8 u9 j. B, ` l% N9 S
/ R; @; X- a0 X5 Z
+ v1 q7 z$ m% ?, W: Q9 X+ E% G 基础信息
6 o1 k4 P( L1 _6 k6 W
* D) R) J8 V; n, ~! ^$ Y& K& v$ a: l2 x1 r' ^$ t% V
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 ! e6 O, |' i( Q! c
1 X4 ^7 M; D; `: x# Y$ n, t7 R0 q4 v* I! d. t
- v: s' Q! t4 u2 D % ~- u- g s: f+ n1 \% Y! K
& E6 V/ {0 e$ z9 N% c( I" U8 P' A
5 r, z+ ?+ K$ R" M/ s K8 e
! O7 J) g1 N0 l) w3 k3 A+ \- c$ J& q& `: {! M Y3 X' f
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 # t5 i: E- T) h. ?8 M- C Q3 R `
5 G- u5 B: A- [# r% y3 |5 o
- b S- a& c" ?2 K1 L' @: k0 h " `% M" T1 u) [3 v' j, D* ]+ [
' x r# p+ }( M7 _# R: E. [
! M* j9 i/ J+ {; \3 V
; |! x# Q8 s3 z5 N2 S9 j) t
, [+ y7 C6 A% `( f
]5 z3 k: P& D 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 , ^ K+ B/ h$ E4 ]# P4 {" v
$ _' j8 K( U0 N" {: i7 M* h M2 |1 r" j; i" m6 U- o3 U
. O0 F6 O) [! i; T
7 M" F" T0 k+ a( c& i: E, B$ N9 H. T* V. n2 ~: ^. q
: T; R# S4 v3 b7 d ; M& D' T, R# O4 }3 |: P
+ \2 L9 l v5 j5 l! m% S. C, k9 a7 A
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 9 a# o6 G) V! {+ `, P
9 J6 G. r! [7 q2 V( E" s+ Q3 X1 `
3 O' O1 N8 f0 u, a M8 T! \# B
( ?7 j$ I w( t/ d! ~
! ?) n/ d S9 o2 X4 S$ C
9 a; M& z* M1 R5 r) V4 h
% y( u8 l4 o9 _: O1 Z6 C: l; h% Q! T" L5 V4 O, h9 p) X% E6 |
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 1 D+ _1 B6 n+ P
( T$ M9 N0 p0 ^9 C! o- h9 _. {$ H$ n* t l3 M$ v
) C5 W) I9 m% q& M+ x
7 D: j% C1 c( |* F v3 g; l. v
, t% n3 w0 W& }5 S% P1 G" f ) E8 d0 M$ n2 Q
; ?5 N0 n# i1 j. v+ k9 e: k4 n/ m+ {# `. f5 }
3 c3 |, ~& @" F8 l
# M" c! T2 [* `
7 w+ z1 [" z+ N$ {
签名信息 ; O. i7 y8 o/ G2 M N
( }5 h7 k6 E; l. f6 l+ E
+ j6 ]1 ?. @# a! z; } 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
b7 @& L$ E/ y$ X& M
4 f& X0 U/ ^' s6 @# {6 \0 `; ?' H' g
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
' z O" n8 J$ S7 q W5 J
1 P5 t* ]4 Q6 q& z
9 d1 C, l0 G4 y' y |8 ? 在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 # _9 e: M$ r+ ]
5 ^5 B! R M1 z, Y& J o3 K) H, t: G: w" r
6 f3 i9 l6 n; X/ b( F" h
4 O5 P( N, V" J4 j( G( Z! n. Z2 g
0 j8 x; y9 W7 |" y$ f# s0 Q( B) [
! ^2 j8 p I( U Y; Q. [0 a4 S* P c
5 J" @: `3 h* f! l! {
android签名的数字证书的一般都是采用 X.509的国际标准。
+ o: M0 _- }6 H0 u, l! Y/ N; p & ]5 G: G# Q( o+ o
0 ?% H5 R: U P) e a 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
7 o' N8 s' T) c/ h9 A
: s! c& z" G, v) L4 A
( E W0 X. M! E3 X+ R* s( D9 ] 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 - q3 w$ e3 |8 e" P0 c C' A2 v+ Q
; N1 K' x& x; q& M$ `' _5 \% L7 h5 g( f5 P6 h6 b$ w4 J( W
^+ o& U' d7 l" x
; O2 o+ C; w% n" D/ s3 Y7 \' s
s |( l" _" R% _4 f' z" r/ }. ?' O
& Z: B* _6 S6 v" p9 y# w: }2 I
6 }9 `6 W& P- x2 H8 j' I+ ]
0 ^/ R) U, C, s& I7 g 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
$ G3 f- i/ r- [! O8 D4 D & `8 a2 S2 _ R# |7 i
7 d) }( @$ n+ ^
8 @$ D7 v. J5 ?7 z% F* I o ! v. Q0 C% ~! N# S: U6 H1 J
; |, V4 O5 R. N: B% r$ U# a 、
: f# W# W: L9 i 2 q8 a5 i* @" x+ s* p C
5 A9 x" K7 L1 b1 n* f2 {
# O* @) V. B6 l 2 e0 Z u! U, @$ c
" e1 g5 M# s: u$ P2 z+ g
权限信息 / n0 C: M/ F6 P2 p1 L6 b
4 T! J b: t( M1 J
" S. h4 w! ~# P9 F
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
+ r* D3 z( y" Q3 ~ : v8 |& U6 q9 _( q2 T; A) E
0 i! [. h9 n5 V) w0 H: R) h& u android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 * T# C, h* W3 I- U+ q. G" P
* b# {8 n$ _% \; W+ l6 [
4 f, ?: ?. N9 i6 M# o# ], f, R
J. H- A$ U% B$ A0 _5 \ " h+ [3 v; F3 c; l$ ?5 \" l
; U- ?7 b' e: o/ ?$ f 3 j! q% j0 O7 B- t1 }
) N% F% N* V6 u( R# i' b" k& Z7 c
. q ?8 K( P9 o3 B( H1 Z# p$ c 下面对这个APP的所有权限进行详解下:
( E1 m) v1 X* m$ }3 g: x8 _" F ) {" `5 z0 a4 E+ ^! d
3 S' |. I- x" T" v! V; P
android.permission.INTERNET :访问网络连接可能产生GPRS流量 ( U0 A/ {5 \3 m# N) A5 Z
$ Z% n- w& O; O9 y+ T- N/ N# r+ W" F. C* w/ Z) L' |5 [/ T% j
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 7 C" s$ D$ O. u `3 e" G" q
7 W2 T1 W& @ N* Q) a
( z' h3 K5 s5 Q5 f9 C0 y
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 9 S5 f. j: m+ X% G
d0 W( ^$ M/ w% @- T% K; m
# w) U7 L4 |" b# q0 |, O
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
( N7 U0 x* e: f7 r& i* E * l/ x# @$ @( F! |9 V3 b
# v" `; [7 o7 x: x android.permission.WRITE_SMS:允许应用程序写短信内容
- B/ o' } S. A* ~& e* n
9 Q, t- a, U& j2 b+ q( G0 f
3 W# e j5 N4 P- g* ]0 I$ p3 R android.permission.READ_SMS:允许应用程序读取短信内容 9 L; d A4 A! v4 {% T( H6 o8 {
& i. S% v+ _" P( I y
0 B" `% j1 d9 I+ T, \: q android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 ! S9 A/ D; e3 y, l& h" G/ }
$ V& o, G. n5 E* s& S
; q, e9 i0 E9 `0 @/ a) t android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 # b, T' f, e2 G& { Z8 _1 u
/ ]6 G7 Z1 `/ {# ]# T9 t8 V0 t
1 s. T2 L) j1 \1 h5 o3 g" W
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
, {# d- }- G% B
& j6 ?5 n& j2 | p8 f+ |# H; A8 |! L6 P
android.permission.VIBRATE:允许振动 / W9 F3 h/ {: x+ S# d- ?% Z
( ^! @8 U) m$ \+ S
' W/ W5 K$ |' C/ i% u, m( }! t# q
android.permission.READ_LOGS:允许程序读取系统底层日志 : }6 Z, _( E; ^+ r! J7 k
$ u' |8 T. d8 [ Y6 B6 z8 O
; X% k# n! u5 y( w: R$ N! k android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 3 i6 V7 k5 L0 C$ N+ z) ]+ ?
+ b' x3 h# ~3 C q: h" G
; W- j- |7 E( h. g) n3 l& N
( D4 Y3 W. ]3 t! B- F
' j8 R% { R5 x2 |, a- e& s' e9 X! j& P$ F" k
功能信息
+ N1 G" J" { ~3 C
& }; s3 T3 F) j7 N+ \
3 b' A- H" U) n- H! b # G( S- Y* p# N8 \( B
6 |0 M( [9 B1 K m1 s, s" n: l
9 t& q7 ?% V/ a5 t [
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
1 H9 [# P+ o8 i8 q; j7 _$ } ; c, Z# O; c6 o/ n0 b2 q
3 z) O7 _& R' i" I. W- r# S! S9 n Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 : f; U6 C1 f% L) U
4 j2 u7 `$ o9 B& J
: ]& w" b: l0 D/ d8 O 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
8 \: u! a" ?$ \( e5 _" K # z5 I- Z. {. H: x; l% q) s
, ?' E! A! H, w6 |
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
9 g5 S/ g' V5 R/ G/ `7 ^4 q; ? ) a6 b1 z, C! Y% j
6 N; @& M! V4 u$ F3 W" o) O. q 2 t, m! U2 g6 }: _
7 j, X5 h* a7 u! L8 u
+ g, [$ [) I+ r* U7 T( ] , m9 q0 x5 P B" Q$ A1 D
# M" K9 }! u) M8 t) T0 m
. {3 s8 o, P' s% _% x. b3 ^5 K
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 3 V& K9 _' Z: g+ m m
% z2 b1 E4 A7 f/ B6 V: Z) b2 u
: ?) M. g$ ?9 O9 B, O
4 e3 D( s& H* a9 g: [
1 p) ^1 Y( |5 q7 H
' I+ {" ]- o6 L
+ E, D$ a9 y3 X / | O' y z# u& x+ B Z* y
6 K M( q/ z/ r) S/ _# O
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 ( e% R% e- K* u; @( u- [9 x3 [& ~
8 z/ N1 G( r2 ?+ t3 I
. O( S s* Q- n3 Y
' d8 X- `. P% X: M# y5 G |5 |" b) D5 S$ w; c6 W4 p
Z# m" w i+ ~! l* ?7 K$ j
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 1 U5 U; r5 l5 ]# [3 V( G
4 n! I# {+ P* K3 L! V- N# W5 W
' I! @# Y1 I) c" I
, I. g, a8 t/ V, X4 j1 o5 l- E
% i, z6 Z) ^* B P2 C, d
4 B! a5 D1 q; x, l( p& H % n8 H8 j9 D% X7 Z+ B9 s+ N8 k1 U
! @$ J6 g: q6 \1 y
% A0 r" T% e) W6 ?
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
& Y- o+ X4 B$ y5 m1 i " Z/ p- X. c+ S& T
2 z# _* V* x4 P7 ~, P LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
- X @3 t6 j) ~" \& d. V2 c , \# v7 [" z9 @$ z1 E, t, p, K, T
d8 g+ @" ]/ O4 D7 ]
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 r$ f8 X+ c3 G' w- V" ^6 b% e
3 D; m+ }( r2 T6 X3 O' A2 i9 R' }" T
6 E/ |9 U4 X- K! o! N 开源的luasocket代码可以参考学习下
3 ^ o! b) {/ R + n! K! X" i4 ?$ O2 @
3 s1 u7 N! j& f) l8 w: H$ h* l* ~6 N) o
https://github.com/lunarmodules/luasocket
/ Y: N G# i! u$ j - S% b' R3 U. K
" V: i! n$ W# g https://github.com/fengye/luasocket
1 d' W: W1 s. M2 |5 ~
; {2 H9 E3 t" B9 E4 X
* B$ M& ^3 a- d5 f% L: h4 A! c
' K3 s: {4 U; G w+ l. T : t4 I$ k# X/ T6 J9 C
: i: A$ a9 _: a7 v" Z / B* U: \3 K& }) a
( [1 x9 o3 N7 A9 E O; U. E( u! |, ~6 P) w: Y% O }3 u- R
+ ]5 X2 x5 W w' X+ | 9 x0 Z! t" y! ^2 g
u c3 @0 }$ ^/ t9 a- D4 T" @6 y
' n% w, e6 r! C0 v7 l
2 }3 b) n j5 ^' ^3 o; A4 O9 \$ U7 B/ c5 z, X
总结 : a/ N Q. b5 y1 Y4 w; {
7 T F# N' g! ~& D3 _
* f' n5 W" @5 w }( K) k
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
O+ S/ k+ t" E% m
, h7 h4 @" J: y( d! H
& E& Q- O3 V: t# }3 p 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 3 ?' t2 z& i5 a1 s
3 I+ _, B9 |0 r+ k3 K4 G* E, r
$ `% b0 T5 n5 c1 F: Z( s 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
7 A0 F- {8 H% L3 h5 {- q
# o0 E4 k! `" V( r! `
% z/ X5 S+ G9 D( z 结束 5 k8 S/ _1 c4 ?0 t# h# ^8 v* P4 n
2 U% B8 Q5 K- ?: x) H" M3 W, U9 g8 F" d/ C/ `6 Q ]
【推荐阅读】
- E6 s1 q' |# x1 k s" X; _
# X: O- N8 A1 D+ |+ R9 _4 }1 c- d# g
1 q6 x8 `# ?, Q- [9 g 对吃鸡APP的分析
! U$ ^& y t. k" u. d! @+ U 9 _( O3 }( W' K6 k1 Q* r
, [' J/ `' F3 x 你需要了解的APP安全
9 Y5 h1 G7 h ~9 K/ i* t' q ( @5 W4 C" I% l" w
; M3 a, m- T7 { 你需要了解的APP安全 $ q& b. v- t/ V2 {4 n
9 a$ O9 k* n. P+ p# g, t8 s
0 N! N' l; |8 s. i$ @% J
- m* l! `1 p' C |