|
0 a) Q+ E$ Q. y) C6 m! W
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 - H5 P( d" [/ c( V w F' ?
) D1 n- a( |2 v. V+ C# x S
* J) U7 a+ |& }; k5 A
1 d. x' m( P$ ~9 r" V + K! @# {6 F8 t. P3 a+ K
_% t5 y- M% y# n/ b+ n
; K% P6 M% f3 w( E
3 q V' Q4 R7 {* y( J8 T, Y! I; T p: Z: F3 H9 K& W
下面就以开发者角度进行解析下这个APP的功能的实现原理。 - y* J* u8 ?; V) Q& ^7 P1 K. f
. D5 t( N! }0 g* _3 Y/ B# k
# Q: H* {" K* R5 i: } D" x- i7 k3 o0 L# k* M' o% P
! E0 \3 w6 M- B9 r7 D! ~
+ s& s+ A( g6 v- R; i 基础信息 ) z9 ^! K( M# I: e
; C' j( h F( U6 Q7 `' f' }* M. {! }7 Z' T: l9 j
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 3 M9 e! Y8 v* {( W
* c1 a! ^ }4 `) b k
* x5 c, m, l6 A" ]' t% C& H
7 }7 p) ]' X g' I) G! n4 S! g4 W
6 f* A6 x9 A- W- n* T% p/ i
+ A3 L7 `% |2 [+ p
3 v, ^8 D* N& K* v- L) g - H' X6 k( P# r; j4 D* n$ _
9 N. R' G9 E. j) B k+ f4 M: B 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 0 \4 } q8 C% R- k7 X
" K, {" h( m2 Q5 S6 `$ A0 }+ S9 T
* C6 B, G8 j& O8 l2 Q+ G6 Y
8 B; B9 m5 b) q9 ]- k8 t4 E, C0 _% {
, ]: Y8 G. w* T9 C+ X
' A, |# I' _* l1 U) }! ?2 k3 q {: J& u
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
" e4 x u5 Z1 g- u
! a. v, F# p5 s6 W; u9 R$ u9 {! e0 M. M
1 Z5 w+ R- c# }; |2 c; H
& n2 n0 J% Y/ D8 u. k0 K; L; z8 ]3 O/ [3 o/ _9 E+ {/ F Y
3 A( W* k, c9 P: R' ^
7 `2 x- _4 {9 U" K! R m3 l7 J( `5 a
a5 B% ^0 b# u, F8 I! t 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
8 D0 X* }4 w7 i: Q
. }) W" W4 e5 g/ X
0 G3 \$ n8 N8 Y' B% R3 r" e3 M % Y B: a _! a; m. G1 h3 i
5 i! _+ d! e, n3 m+ c
; ?! M8 s e3 W! N) c, J
8 z5 p4 b) q; |. }$ M
* Y( c, p: J' \# R' B6 n& `7 b4 W$ w0 [2 U
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
& |$ j3 P' f+ D + u" `7 F }! B% V3 W' V2 R$ u: {3 |
% p w* m; n5 f5 y/ T4 k ) I) s# D, z9 ~$ P
/ g$ g/ M- V" @. m1 c
8 d$ S5 D# d$ e% X . q9 f1 e* |; o! S( ~6 j* ^
: p5 S9 ]. c+ W x; d
, z& g0 w6 B1 L! F$ e) S; i ; X* a5 F- U5 z, N7 l
+ y" g8 l/ s3 Y0 @" X# d" g! K% U! m" Y
签名信息 3 r3 O- Z S) x( W8 E
! M2 J# X9 {3 L' M5 u
5 U* ]% u0 f" S* v 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
4 U" z: s( n& Q8 t. m. R2 ?# ]) d
& E! _# m* q4 L5 u) e7 u
, x( s4 k# [8 B4 ~# a9 }3 q 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
' _: p7 X- Q0 S
# q4 t0 P4 d4 u B; R3 r6 s% `' l
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
f8 k" r$ L! N* b, M. v8 l 7 d4 S1 f2 |, e6 o/ t
0 H: |& y& g8 a/ ^
7 b) V& z& x; E 0 m0 x4 ~/ n8 Z! y" W9 }
1 I' w5 }) P0 m6 Q5 Y1 \; K % u8 ~6 p i9 ~9 j! _( I
: W: t% j1 {# V0 f/ ~8 M1 w# G9 A% ^5 b! P; g
android签名的数字证书的一般都是采用 X.509的国际标准。
7 o* V% Y5 y$ R* R& ^4 p# y : B. r: o/ w( q
. N* }0 R* N/ _0 T! }( p
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 y8 c- j$ b' h
" B& v8 _/ o# }
6 ~* b, p; p( T6 C7 y; g
下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 , v2 F' T: J6 o$ u
. k9 V6 Y; j# N1 i; d
4 ]" ~$ O5 Z* \ ( i+ R- i& X/ l; Q" k' O4 Y
9 }8 Z7 w! c- y7 m8 z% B
9 g9 J& K& s) d) \% x 7 ?' u- Q/ _3 [" Y$ ^2 o+ w$ U! [, [# L
7 ]) O# a* W3 U7 r8 f- v
' M! B L; a7 p# u. L# Z 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 ( G" |5 [: v+ \5 K& o' J
, A8 h8 }, c4 b0 j) {" Q# }6 _) i5 U1 V
+ h1 g" k R6 e1 ^. ]) t: I0 d4 h
6 ?) j" J" h& h4 I
% i5 s5 A7 B7 e/ l2 y W, D) O 、
2 Y* N x/ H& \3 {+ B/ `( D 7 J6 X0 `* m: P' y: g7 i
( h) ?8 Z4 D8 ^2 M6 }; o7 p8 R9 V
2 c: _1 X2 w. H$ t& R
) h* V" q, r% w* h8 N) h0 C x& d& O: Q6 s
权限信息 % l6 B4 [1 ` r0 G
V8 Y3 `5 V. C Y, [5 w7 Q2 q
% i. m. t# G! d9 @ 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
2 Q! d E$ W! _( s k2 Q9 n2 g , S" b, F) X2 H3 u# O3 U# P
) r: d9 e* @4 ^6 s* \) l% q android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
* k+ Q1 w) r5 y9 |! f7 j6 w % y* d$ n/ V6 e3 J8 D
5 W/ g8 ~2 r# \' G, y3 M L & V4 Y0 J. c6 r. l$ M& o2 r
# A4 ~- j+ q( n& X
6 t5 D- @& L, J6 z* H B
2 D- [9 C4 y. r+ r0 b7 m; I
4 }; m6 ?9 s" K% z: x& T6 T" p* n% i# f* w6 E4 F
下面对这个APP的所有权限进行详解下: 0 t" {+ S7 e' F
/ t! k9 {' @7 s
1 v H% E- w. M! R- W android.permission.INTERNET :访问网络连接可能产生GPRS流量 + v. Q4 c5 J0 y0 S
2 j: W, h: c8 L- P! h
7 I5 A5 T8 K* H7 f android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 ) l _. Q; {9 l3 u% u9 F! S
' f1 Z8 O2 S Q9 [
$ Z6 I2 E# j* ?- \4 v' n
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
+ ]" Q6 F. B: k X
/ K$ ]( x/ _- k* \+ ~. l! j+ c7 H. L
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 5 P- z+ ^: f+ x: c/ a: L
/ g8 ?& S4 W) q% C
3 A3 F% _2 ]' z" E# L% G0 g) t
android.permission.WRITE_SMS:允许应用程序写短信内容 ( R2 `7 b1 T) a/ j& K! L
1 e. \# m" U; i% H; j
- g. y5 G7 c& E android.permission.READ_SMS:允许应用程序读取短信内容
; E- R0 h' J- s' y $ ]# h3 h+ i) |# [ X6 M( G% v5 _
" C4 d6 p+ ]: U; s- I. x
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
! K8 U. [9 D# }/ d; q/ `- N4 N * |; X5 B0 n' C( R6 ^
8 w0 a! Y$ R( h/ `
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
7 V7 k- q" l+ E& p' Z+ K
- H8 f/ j# A& G0 P5 V( ?2 S- t! z l5 ^9 C
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
9 O9 o3 k0 T8 A$ s& N 4 ?0 n- d) l0 @0 m1 @
: h; e- w; x7 p: L' M) e0 c android.permission.VIBRATE:允许振动
5 f+ h7 z7 s: r# J4 e5 ^3 M W2 [
! }7 }0 d" \2 i. K$ ?& r+ @; P+ T% |
: H" u* Z P6 L% |& s" u7 y1 E android.permission.READ_LOGS:允许程序读取系统底层日志 W9 @* N- l; m% b
1 {; A3 G8 _$ j+ {& m+ n1 _/ [: u) C- E/ {
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 ; b7 C0 ^) b+ A4 ?6 m' `) T
g/ R6 _6 F0 A; C# F/ k6 Y3 }3 J# F# s" ?; Y9 s
7 ?1 ?9 S4 P/ L. Q! _% B5 e" g 7 Z3 w& p- x# @4 M/ K
' q# M' z; Z# K) Q C" u6 ?% q 功能信息 9 d7 D Y8 U+ N! `, q* P
/ ] k) Z$ w( H Q
3 a3 j7 c/ y1 P; x$ ^% \
: I# x' w5 c" w- X3 m+ l
8 c/ S" ^+ W$ s7 I. x( F7 B/ U7 s
5 G! q/ L/ U, C1 ^& \# z( [ 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 5 L' w# G) h, ?7 r# o* E/ e( q' r
$ G6 ^, F( L; \' P4 J6 G
, t- t X9 C: s0 M. `& u9 F! Q Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 - J8 S! K$ M# q$ ], @
" q- u) p7 t( V/ [! G
) q8 l: W+ @9 K8 A8 _ 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
# ^8 T M0 I4 A5 W
" ^/ P" |8 Z& t
; V, B$ T; z z# u H3 z. K 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 " w1 g! x6 E- ?& A5 s
: d. _! v3 P+ E5 L/ }
* Y8 c+ k/ I+ ?. z$ k 0 {" F5 F/ x$ i& P7 c5 ?
$ Y S. X0 F1 c# c% O
5 e. F1 R8 W$ V' Q9 }) l
# ?" K# C4 L6 S; S6 O" @7 n \$ E# b
4 w$ P; I$ F2 c# b+ A% E1 y* U7 u2 ^0 \; I
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 + h; _8 b' y2 K b$ V( q
6 e4 W5 f! M. `4 `0 Y) j
- M) `7 v% e1 a/ P 4 b0 @* @, O0 ^. B$ V) s: A( p. J
7 T6 Y% Z% f9 t3 c9 I2 X; d9 [- g
# I4 }$ o' e. ]& {9 w
2 G6 y+ d3 E5 e) @' _ D# M( o$ u 3 R, J! p, M1 \' r I: d* K6 b9 ~
, O& d& G' E' N( y, @, i2 \3 X, c3 @) e* n
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 ) [0 I5 ~# J" q% m
9 J C. l2 s5 H2 g2 B0 Z% O
' h/ o [$ R( X& B* ]/ Y( P: m
; ~" g0 U3 W) V& M) D
7 t9 V" O* v! X" M
: v j8 s+ g4 O" X0 O! q8 u/ Q4 | 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
2 f. v9 T+ {# r1 I; U! {- c
. S8 g6 M! \; O' @# \7 [* x: f, X5 Q9 I
; C- J4 x9 e$ a* H. h, h8 { " a3 k: y% T8 @2 ?$ H% G
7 Z/ M" \5 K# _5 e( l " l0 @$ t! ]+ K0 f/ ]' {& W( F. J
9 h* _& M; X* W, n, B6 y) d/ }
2 B6 Y. C8 X% O% G: B
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
( i3 h+ ?5 a/ a0 }) i
0 W# z. i7 x* d2 c5 G a, [) n E" ?0 [ [4 H# i
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 ( [, {! e2 B3 }8 ?3 r; h
6 c0 L, i7 [+ M( m) c, Q
( {4 S2 Z- i S3 [ 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 2 H: p* X" w2 _3 v9 v
' c) }8 Q2 p+ t. ~! y# y4 T( {! Z, w* j8 M
开源的luasocket代码可以参考学习下
7 o8 y9 Y, y; w2 a# k ) G, @# S; F2 a. U* c. {' }
4 ?0 o; j" V3 o& M; H8 T7 c https://github.com/lunarmodules/luasocket ! y7 c5 A2 r* }
( Q& [- y( ^+ k8 h
' F4 ]: o8 X& g. o https://github.com/fengye/luasocket ( ~7 N2 L6 x6 E' S& V' S! E
$ C) S( K7 o( M* v$ m! u/ ^& F7 f4 c% ^- G
$ A& E1 C) I! g" ~
' z: b G# A! q8 K7 C4 o( E9 `
I { T( }' k( s9 z # ^# u6 P. |/ A& e
" V; ^! ?2 P% v' n+ n) i
6 T7 B8 j# \6 |0 P 1 V! Y; N. @: z3 P3 ^( K" [
# p H: F' Q7 O C& Q: K+ [1 ?
c0 J1 x) x5 e B& t& ?% L& k
0 g' q/ P& A) a8 G) |9 H# d8 h
T. l- K4 B, N8 u
总结 0 b/ W+ L) i8 q
$ Q( `% G! ^/ B! a* k1 e' J4 a3 i \3 n! k1 ^, o3 w& d
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
1 V/ ]5 p' e! G/ N5 S- Z) \ + D: F2 O( _- V# m; _
8 N, l2 G2 ?6 R 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 $ ?* l0 a+ F' N$ u
% t( u0 |7 m. B, X6 X) M
0 k2 c: M! {* u) ]
对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
6 o1 z, y$ v Q3 D2 L
5 D* [+ i1 E* Z2 t3 |
4 f! H; |- N+ `' }( B( b' B2 | 结束
! i3 H/ q1 m# @* u" k
8 g: { I9 S& f* J8 A% X' c. ?" b5 W- Q z c- l6 ^1 |( Q$ s( `! M
【推荐阅读】
i- e: v4 m* {! L2 j 5 `# K! v$ o# U7 k) f" h+ e' G
! T2 K# _" d+ S9 E; \ 对吃鸡APP的分析
- N% q P* _4 V, Q# ` ; X* L) k3 @2 l2 S7 q
7 c: ^- N$ p. c/ O5 x& H8 p 你需要了解的APP安全 - U. Z$ j% J- k8 z" Y" p3 y& G `+ D
" t4 f7 }$ K# J. m' l( w8 s
# w2 `) M2 ~( ^+ {6 o) T, `" P# I) D7 |& U 你需要了解的APP安全
1 o' p" W/ h$ X5 u4 v2 ^( z: q
9 `. ^0 }" a3 ?, u' n
& u$ r- j+ L5 g/ v8 e
# c3 D V; x% o |