|
: L3 d0 o3 J* s; K& \. g/ E
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
) {5 j7 e9 B, r9 w) D. i. o! U: C S+ H- u G) ^: D
! Y- e) O9 x) J( @+ o! ~ r, a
. F+ m0 t6 a1 C+ |1 q R
4 H9 K5 ]2 h5 P0 y3 L
4 ~. U: _" K2 ~! C1 a1 X8 K6 m
1 h I: P- u9 d6 Z+ \ + k3 Y$ G4 C6 s |
$ E8 g( _# v) P3 { 下面就以开发者角度进行解析下这个APP的功能的实现原理。
. f8 Z5 w9 ]3 b g' y - k+ s9 ?! n1 H5 s8 h
1 |8 c3 q# D& T; x' z1 s) n! _8 `; D
: } a7 E; e3 W0 R, p; M 1 h' d/ n2 p1 N7 }
# b+ _& y! T1 L9 j" s 基础信息 ) j- a5 { K7 r' @
, k$ K+ k& f" M8 b+ p
* C8 l; \5 j& g% Q 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
* R# Y3 r, |8 \! X# a3 Q8 G% C
. {$ q" s; t" f) t- F6 T
. Y9 N6 M6 W# U+ a. K/ R0 F9 a . i7 e0 Z: X8 R. h d
! D$ ~% B" \. n8 U
$ L" g9 j* @8 @5 {$ f; m , D, G5 j' }6 ^/ @: u1 O) k1 v
: M( Q7 [8 m/ |; I
, c$ Y- ~7 Z: J2 j8 \, A5 o7 Q
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
: j4 b+ ^8 E3 ?9 A) | L: j
- G$ }6 u* s5 K; G2 Z
+ T3 b; \& g5 p+ [ q8 c ; l1 F0 E+ s6 c+ Q& X: |4 G( g
) m& m6 h- X: U
# n' S& K: T6 p1 T: P+ {9 |/ N" o , X* r, F, [# d& Y" z
. O, B* `8 v6 l6 l: c8 K
. ^4 v) |2 e) Y! o
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
+ ~1 ^; ^" }8 l$ t 1 L& t0 s$ X( f# \1 y
/ t5 E$ p9 S. j: n0 Z4 w8 d 0 O; I7 x8 u# n5 M) G2 o
) c) y+ ^, S, R, {5 Z, O& V
1 \) `* Q% H1 z" c
2 ]4 e7 y: I0 P
7 e2 e: d% c% W: V; R3 O" z% [1 O b. F! m$ `
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
+ Z {3 ` I) N$ E4 E - ^+ s1 q" i1 C! W
7 H1 q- U- N4 t+ r
- G+ Q/ v# M. {5 j7 N
- E- S# |% b& l- c$ G" @! ^# Y: v2 }, J0 r2 R! s+ K
" _4 |/ h+ Q( u- j* v8 t
' ?: O/ e4 O& q
5 o. ~# ^- m; \( S6 _ 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 , P$ f5 j; i6 s$ m
: }) x" F0 [8 y8 ^
- _9 n& ?) }7 f
$ g# T y3 K4 R/ U2 v7 J % J1 ~" ~( ~! P
9 B% G' k4 B9 ^* x * I- n3 P& I/ @6 O, @, P+ [& T
( c( c0 Q/ d! U/ Q/ |" S" N4 f( R8 I/ D9 U+ c. _" E" R( N- c+ f4 o
' u/ [- r( ~$ |- s, b+ j' s
2 ~6 `$ a. }; [9 ]; c4 N& R# k4 ~) `, Z, f( o
签名信息 * {2 H+ }7 f; m% N/ s, D% i
! P, y) v' C4 X4 D2 b6 f* o& m
/ u7 N% `4 R$ O0 t8 z 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
& T' Z3 w2 w0 a
9 e8 t6 I! a/ P! r
! r3 \% d3 |" S9 z ` a1 d 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
& N; Q. s1 R. U! Q6 O" j , y% [5 k; t0 a6 l! k
" H {: _& B* Z. j& d1 g 在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
5 L( D+ ~6 p( p
( K# C3 p* N/ s+ I: W4 v1 a* C' |9 ~2 u
, j" K6 h- G# R
; Z& C" @0 s# W5 I9 N
0 b. A l/ F( x, F 6 A* n& E3 k: O$ K% f) Q
( C* \5 N9 c9 }2 s8 k( K8 E
# k* G: d; \0 i+ n: Y1 ?* q( z android签名的数字证书的一般都是采用 X.509的国际标准。 9 b8 ], V& G( ^
: j v2 x. ?; ?( e1 B e( O
# r8 z% h7 f* n1 p$ Y 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 / [5 i7 m2 Q0 Z2 b( y
2 t7 Y: z% e! V* a/ \; y
2 Y, e8 ^8 ^/ s" h
下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 ! M' z& r% y J9 _) r& G7 m
) b+ E |6 _$ w% ^& M; ]0 t+ g. V" @4 g! x- D
9 U3 }3 E( R4 ^% I2 F$ G- R
) s% f# h" b/ T2 R3 ~
8 u& X7 d" ~% U, \# z& n# f
H m6 K6 Z$ Z: s) T7 y! k 7 L3 i, K0 {7 V. G# j
6 q' l8 x& _( ` `% }+ d
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 8 H0 a* b [8 g7 E
5 ^) v% f# K9 `; s& a+ @' W
( K- G: B% W7 d6 A, q4 g 5 b; w! U+ W# y' b
5 j4 S' a9 K1 q0 M% x& ~ [8 \; g% |! s, ~& S2 w
、
7 L0 L0 }$ R A, S& d : t5 ?1 V3 t5 D( D3 m' R
: T, Y( T7 T! P, y: s$ T/ V ! y; T6 Y I% j0 |7 I
' `( t5 x5 w _4 _: v3 C2 X8 n' c: l/ ?9 _4 B9 V0 V- }% b
权限信息 , m6 e' M0 ~- p. } {" r! q
7 w- H1 {. l' F4 {$ K0 V, I
" x; z2 U- L, @0 V; z i* Q `5 {7 H1 O
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
1 B0 f: m9 X/ j* M; R) @
* {3 `1 x/ n- o- W# P/ R
. v, e& x$ q; h! `" @ z$ p android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 ; V& P' N1 p( i# k/ ]3 }: d2 c; }& Q
) \) Z, Q6 P5 p4 Q( H% N- U
" |; S6 k1 V; } t ; N; e4 ~ h. t" i, D% S0 n
K$ D$ K) d8 `6 p6 f! s: z' ~- o* A2 q9 e+ i+ P* S6 Q
& U& Z2 B6 g, ~* _' g
" {) Z$ D [; d% F/ D. `; n$ U X: g) m! B% x3 t. t: `
下面对这个APP的所有权限进行详解下: 9 j% T" W) m( D i6 R# j
" B% P5 w7 N7 h$ }1 h w( ^& `3 S; x: E
android.permission.INTERNET :访问网络连接可能产生GPRS流量
; M! g, P$ Z5 B! O4 Y. ~/ t4 r+ _
5 C/ ^6 s& ^' Q1 K& [* Z z6 i7 m+ e1 y& }8 q) `/ M- f3 ~
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 % r0 @7 F, D5 P: g6 W7 ]
! O; M: F! ], ~2 t* T O
, O# i/ Z. x ~. g. V
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 , I8 @0 s* B3 ^# S' I
! ]3 K, P1 Z# S7 T- P3 [
- V$ \. B; y7 {2 y android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
' k: O% g* W) i) F: h - o3 J+ \6 r/ w3 B6 N5 T5 ^' ]
9 ~* V, r0 P3 _ ~7 G6 X; Z android.permission.WRITE_SMS:允许应用程序写短信内容
4 ?* y3 I5 ^7 R' {: f
3 ~" N6 C6 I. |& `$ Q* ~) R
* b& H5 Q& \9 F" u! g& T4 f- c android.permission.READ_SMS:允许应用程序读取短信内容 & s2 Q4 k* b Y/ a: P: M z7 B
7 K# e2 X, s9 N/ v9 t
' K; m( z% j% ]( G android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
$ j: k6 r0 c/ s" c 9 v( D+ K" x X
2 g9 A/ X- M7 p0 T+ \ M' D android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 + W2 r3 [* G4 m" T& S
- m: e( t' W8 c; F+ o
& m# q6 T! T0 K android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 4 n4 B/ S# c& Z0 W# t
4 o4 H7 @8 R& {. F9 u0 X
2 c( y9 [/ t q' F! R3 h$ c2 T android.permission.VIBRATE:允许振动
, B6 v/ b- \" M$ q6 c2 y: ~
2 p* t2 l' w! i
$ X3 Z5 u% R# ~" K& l- R7 q4 e android.permission.READ_LOGS:允许程序读取系统底层日志 6 q) G' U: t, `0 H
% F7 k, J9 _" O8 w# G" v& o+ R: ~
3 I: c6 `8 {4 a android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 , O! q" T" N- a! A% C
9 ]* d* W. S2 M2 ?+ `& Z% R
" m* u5 p1 r0 c6 }$ U" `% X% P3 L
1 p2 d0 R% {1 O# ~0 @" @2 q2 h , X2 J* U/ `1 A* v" F3 h [
$ g0 v" s1 K; z0 x8 L* N
功能信息
- ?8 D+ G$ g% [; w. J
3 i# H s1 O: V- @ B( }- |
6 O' E# i& `9 Y" k" [% A4 u7 S! i" K% s ; Z" r& u# _- b3 ?
y( x, f8 J& g% S# ~; c
- n e. t9 O D) m4 q" W# G6 ] 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 , T9 C. p8 R( f0 {. \
9 O- }, {" p2 z) J- T
2 F. v( | m# T: s3 g" B D
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 ( T" F- E- r% N/ u& W
# x) g4 H8 g0 j1 G5 P. I4 f6 j
7 J9 l, W+ |; S$ O, i
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
. `' I$ U- `* L* t( ?' W; p( c + P5 w# _6 M- D: \* N7 D3 e& K
8 s; o0 H, W+ u( i6 h
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
# o$ a6 n. i2 X6 [% P; A5 H! Y % F' S5 x1 p5 ] N
( s* p3 V2 B0 S9 o/ _- V / M' M1 B' _ X, e9 Y& \
2 ]' f2 U5 [- S1 g! c8 E$ x
; H3 C* Z+ g2 u R
+ Y# s3 b9 D* R5 j 1 O6 Q8 a7 e( p6 u3 @) A
& b- c, \, a# F x# ]4 `9 A 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
" T# q" o. t6 F4 y3 j
% S) }1 K# W8 D2 K, S8 |6 @+ v5 h3 G: W0 F. H
6 u' o4 I" r1 J. N; Z- @ 2 I2 ^6 L% H9 Y9 j1 v- N
, {) `& Z q; Y; j$ ~ 8 N$ R9 R7 \1 J' f7 k8 ~
" h, X8 S+ b$ r2 f6 Y
7 U, l# [; g ?; X3 p2 @* L. g 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 & E. E+ ^, j! F* w+ q \
7 c9 L) H9 L4 T& Y+ S
. w. x3 m* v! c$ N
' Q% B1 |! w( g1 u% b ( X. u% @. J1 k- }$ |
+ O: }( k3 g/ h4 _) e' F9 g0 D 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
2 J. b, k$ ^0 E # y1 u% z+ L, c/ n( ]; j
' f0 a( V7 w+ }0 t, G* m7 D7 W
9 W2 j0 D# x) y, g- ?9 h( |) M 9 l k- |( d5 D; Z& a
9 n) o8 Z$ I7 V9 F& ?
1 Z6 |( E9 J H/ v8 N7 F
! j7 \. Z8 Q% v% z% R6 Q! F' e7 f
+ f' d) K/ p) K0 {- m6 {$ Q2 m
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
2 Y7 G9 W3 E3 W) S# F' C' C. p ! T6 V: F& [4 Z' a
* h" f% L3 {; }" Y: L LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 ) s g! x6 E# u3 j, e8 t
1 K' J$ }: }) X' w3 s
* S T' f* @/ k' v; @
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
7 V& e$ e# T2 V* u0 ?2 R! S
0 Y7 y7 S$ R7 o! R- R( Q( h o3 ?0 V6 V6 i/ ? N ]. c
开源的luasocket代码可以参考学习下 ) I; K! O* G- J; j" c7 R
; \, L1 K2 M+ Y0 e U/ n
, o4 z2 @2 E y+ ? https://github.com/lunarmodules/luasocket , t' M& Y. H1 O M0 Z$ X4 o
5 `1 m0 p) V ?* o9 e
' W& H: m' v t: p
https://github.com/fengye/luasocket
! c- S8 N) L; D- D8 D* a $ B' r$ u# X( e% {" i* p
/ f' Y# v2 j" z8 D, |
5 x) d/ r7 s' h+ n! d# R7 u ; [1 E; `' T' s& A" U
) _" `' u$ ]. k 8 _% ]) I7 {! `
4 x0 I+ P1 x% U% F! d: p* q
9 u8 H& ?; Q3 _7 M3 Y% C 4 C8 a+ M2 `. E0 F0 d
0 i7 e0 l3 C1 T. y& d" i
$ T! W' E6 c: g8 ^! m) ~, g % y' l. d. V5 u- L G' s4 `
! ?% L5 h0 I) K6 H
) L; D' A$ S% i 总结 . S/ B- C) k% c3 a8 M: D
; e }& Z. g% w7 D: o" X+ N8 X
- |( F5 Y; h) r1 c' w 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
4 ?/ A% U. O! d% T 2 x/ W7 h6 Q/ n/ e. w
' H. a; y& |0 q/ C/ O
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
& d, b! l! _5 G8 F! ~ o4 L 0 B- x& {" R- [$ e" k
) P" @/ ]0 W8 B9 w0 J 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 & m7 A( v5 B% b8 w+ u5 f0 x
y; }$ W2 ]5 n+ o6 | d% p4 ~( J9 N
: H2 ~" A' W+ h7 |/ Q( O. \ 结束 9 j, R1 J+ H0 w
* d L8 h) M8 g
" W+ D6 F$ s$ P% ? 【推荐阅读】 6 r1 R9 @% c- Q" [; t2 E% H' a
5 ?) I( n: m0 G/ `
5 k4 V3 ?. K l( c 对吃鸡APP的分析
; j8 N' x7 ]( ?% L; a/ C
0 `1 ]8 Q; r, h6 d c0 u5 n0 s; s; @
你需要了解的APP安全 ; X+ p# j# [1 g( y( Q5 C
: @- f0 b9 I0 |6 s' ?0 l
4 w. q! V: l* g. o! q- e4 r
你需要了解的APP安全 . n, @' }/ s( ^2 ]; [2 W
- L$ `, y1 C6 |9 [
! ^( E3 o* E; ~% b! z {
# q) J: S* J$ N |