|
$ f5 k1 D( Q/ r7 o; K3 i
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 9 {4 D- z2 t: C
& Y D: E" X5 g; I7 s1 ]' T( v t U6 Y; M' y# i8 ^8 ?/ z
/ S- L% l! C5 F) n5 w% N
0 n: J' c: E3 d* I5 o
[# a1 A2 I, w6 R! s ( g: I0 o: b. ^0 H: c" t T+ E1 d9 o
: o: H4 _7 }, N" @& g
0 e! V+ \0 V2 w5 c M
下面就以开发者角度进行解析下这个APP的功能的实现原理。 i4 T0 V! Q& j. |* n+ o) |
4 m G+ r5 N* W: y5 E3 B5 A
$ |- s0 z0 T& h5 A
) p1 ~5 E% I9 Z& B& `" y1 z
5 G% M8 `8 i/ a1 S" S' y' H! P) E5 ~ C ]8 Y
基础信息
* y/ k* p u' n% k5 r # z2 L) |& c( v; u" e
^/ k7 f, D) q7 A* x
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
& B% a! [9 f+ p3 D0 J
5 c2 T, m8 {/ i$ D7 H+ [) [& G; U
! x$ Y$ v4 T) M# w, }$ P
+ z. [( O! H/ Y) t) N$ k
" O& W: Q7 @7 u# Q8 o L 1 t; f$ K* i+ T( a. k
# r" P) B/ Q2 Q. u: R/ ]& r; L( o, i' W
# t/ Z8 a5 O1 u0 w8 y. D 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 ' P9 n0 ?8 w0 e7 C( n
" P% i+ ~- s/ a9 T) u
' [: C/ T4 h" l" o
( t2 A/ g2 C0 D- G# o
" o5 E" x' W5 r0 V p
6 u, ]7 ^: J3 d0 p( G
8 H, W# V$ Y" Q [% X8 C# C 6 C0 Q8 a0 `/ C) a3 `$ r
: O3 W( X, S' f8 a7 r
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
% D& }7 `$ ^3 L3 k+ s. P
+ s( Z! m3 z4 E* K1 G( s" V3 i$ Q9 B5 ^7 t
+ k, l8 t: |$ T T/ H8 @# |" y
# t- q9 G h% t( L
, ^( N% F+ H4 v1 @' A& c
$ L' A% a9 V/ E8 C
& C$ l' g* F J- ]/ D" l6 v. y b2 T) Z& Q1 ?/ Y
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 3 U. J" k- M6 k0 B' z5 F) @ p0 y4 P
: u! S$ K( T7 p/ S# R1 K
7 v# C( _/ M4 l b6 p4 v# e
- D3 v$ L$ P: X4 {3 D3 u
: K4 b \6 y$ k; h
4 L. ]% w) ~2 s/ K 3 g4 l6 [. l) l! T: I
1 ~* V) Q( e, P" u$ g# _
2 Z& P$ x9 j+ l8 v! J! D
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 , Q3 ~- s" I# h& W6 J
) w0 C7 ]9 k- O+ D
S/ k7 O6 I2 D; j' ?0 d9 D
) L' ]0 f- x2 M3 I. k1 F0 c + R6 `7 A& U) S# T
9 u8 b( \: o: Z$ Q6 R9 I. o- J: d; V* b
# r; b( }5 K, h1 F& a
2 n$ Z g" u. n# w
1 k, _ K7 Q6 T" m
2 H8 q/ K9 ^9 s; i ; O+ c5 x# [$ S( S7 N0 e
, D) j( {8 W1 c. Y4 t# d( F
签名信息 & f# B5 Z% G6 I% j$ J. L4 a; f; S) P
5 u5 G4 A- d/ \6 I& J# ^
" _4 t) l( Y( L- J2 k" R4 G( P3 u; u 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
! b1 {% [8 r. s$ s# D, t# V: \! v- z 9 E/ i5 F# N0 R2 M. Q
+ R- T- q( b; k5 D" w 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 6 ^6 ~5 ?+ X: `& ]/ \
0 |0 {1 b3 p7 l$ Q/ }8 |2 W
: P. [% J9 A( q( D( o 在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 8 e& M+ |% ` r& s$ }8 T
' x8 A ?! `( P8 {5 Z- B
2 h, B2 c. ?- u9 |$ Z+ ^8 {- D
$ P, k6 T6 |2 M8 M 1 D, t( j3 X" M( `$ A% N. D
' \; F5 e2 e4 T1 p# L / L6 ^& B6 a( s) M+ G
- E6 {6 w0 m" J+ U! L
0 P. l5 L3 b5 ^9 @/ P _ android签名的数字证书的一般都是采用 X.509的国际标准。
9 B) X: ^9 F& K 2 ~8 N- \2 x$ ^; E( A) n/ @) [& v
$ _" L8 R4 K$ T2 H. B 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 ) l2 A0 W' y# k- v; o/ _
9 |$ U$ C3 v, t& }; O
: H) |$ O: C- K6 p! D0 B" t" b
下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
, Q {1 O& R9 T; m3 ~% L 8 r8 S {/ m$ J4 Y: c* o" X6 E
0 J- D) [/ n3 O/ C $ T2 P% p2 t+ G# l' Q0 v
- g9 ?5 \( D# |* F$ _" r, [8 q0 _$ z' N$ K( ?: ?
8 l% s% m, b( K
* c; O; X3 U' a- |( |
, L" A/ P9 J6 Y' K 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 4 i- E4 S5 J; j/ R6 e
9 L3 |5 i+ y! Y9 D/ F @4 F( V
% g- B/ @" F, u/ t" |5 v* @) i: `" \
% O0 ?" M2 H9 g1 f 4 W9 c9 g4 @, z
) _7 M; K9 W9 h2 ]# ~2 Z 、 : t- G' K9 C2 |+ P2 z& f
5 y+ N- ~5 W0 u, [- p4 }! L0 ~7 m, H6 n0 G6 H0 ~; X
. B5 v' p$ g! j) D* L) Q, U
8 E: J b" R v \* K% ^- h/ [' j9 x! {& n: e2 _
权限信息 % ]/ M. L4 G5 m* p( k
) K% T6 Q* A& ^
- g( j; Y9 ?; u, @ 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
( c9 S4 D8 b# W& |( Q " F- }& L5 F# E5 ^, y
T4 w& e2 g2 y& [$ q- @ android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 - H* T9 t M, i
* B' L* {# u6 H
% c7 i8 q9 z: \, n$ s2 t2 O* B
. W( [6 N- v2 j8 w) X( c) o
1 X1 M1 k+ M$ ~- f# d4 g0 T" i. x0 b5 o8 e. ^7 L
b0 x! Q* S; u9 a
$ H3 [) ?) n Z* r. T: z7 Q4 b4 V* T
下面对这个APP的所有权限进行详解下: 9 c) h& A. M8 ^ r1 @) o2 _5 r
+ z/ C1 I8 E1 C7 N4 A- h+ b, g6 L% t: p- _6 i. |7 L- W! s1 U
android.permission.INTERNET :访问网络连接可能产生GPRS流量
3 M1 @0 U; ]% l( A& q# T0 i 0 T% Q* [. i! V$ J; j C" d: }- c
' c+ P2 G/ t: v- R$ E9 {5 m2 W; d android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
5 z, P+ A9 ~3 R; b: ~1 M3 s7 g
6 l: F' _! b# k; s& _ F
1 |* ]. T- _# R android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
( V* f& @! K7 A5 r0 u
% ~: \ x- {2 e# Y7 U# {* ? W% U0 J( ]( O- m
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 J# {6 J* X- q% H
% N0 c3 P0 @0 U3 u4 Q; d: o7 j
! M7 n( Q; v* E/ f1 m1 L A
android.permission.WRITE_SMS:允许应用程序写短信内容
5 B) ` z" I( J- k% X; p" u
% M% N( D o# p( S' z
( S( G. N- M! D- ^1 |, k9 q/ B android.permission.READ_SMS:允许应用程序读取短信内容 3 i; g: ?: ?) h! f. W0 y
- T2 b1 G# ^0 s$ C
& W% u3 }; M w$ H6 k
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
- K% V* n4 a+ } 3 ]8 f; D$ u/ v# E& }" I0 V7 E$ v
3 _; e& F( w6 F) \6 { android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 6 l- j3 t1 y' Y* g U& j: U
. s7 D) f9 `) I( b" W
& c. d4 F5 C1 l# W$ L0 ]5 u2 w android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
/ L' J4 A C; |: b+ a : s. x( V2 R: t6 s( R" B
, `& D: N+ W5 e" s( L0 y+ C
android.permission.VIBRATE:允许振动
5 V \0 L5 @3 L4 I; \ j 2 ^# `8 H* F S4 d4 O8 o5 {
S/ I( k$ v" G! r0 u# ? a4 @
android.permission.READ_LOGS:允许程序读取系统底层日志 7 L" [ Y# L: Z! P
1 Q1 b M8 s2 p8 @7 ?! }
% c9 Y, |( y* o! f android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 7 j) P j% W" q5 z U1 B( l
$ A5 K( @3 \& T& q
1 `$ c7 n5 d$ `1 L
& r/ y* P$ C9 v/ ^& s* \6 N % b- a( j) k- y6 U6 b. G* `
$ Y! h0 k1 f1 M- m7 F, d2 c
功能信息 ! w9 U0 Y/ x- }3 `. O
' W- k. W6 t/ U. h' r( [ |1 c6 R: K8 N$ C' H1 A
- | u* f$ j2 @" \6 ^4 t - V0 o, m7 ~/ f: \" `" f8 X& n
" @0 v3 {( q8 J2 y" [$ W+ r; H# {
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 9 a* K( r5 I! d+ ^9 v
9 h+ n$ P0 T, G; ?2 |* Y
# ]% I" p$ B* M6 Y" L( x
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
2 f, c+ X* r0 c, x( L( X + j+ R; w( Z6 r, `
# |/ P# U& Z5 _8 [ 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 . E9 @! `" O' C, T* z0 U& D
3 C" d: |, O! T# f: W9 V# R+ O2 s E$ E) i& j8 s
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
+ }2 E) L: r; m: m& V% [
6 K- H6 A9 \5 j* {4 ]/ ?; I( G9 `- C7 N. o$ o/ Q
6 C3 _! q. _# c1 P" z2 Z r4 b! A4 }# y
5 C& U/ y3 b2 y
" @# i2 W9 x2 C0 F, Y4 ~' j
; ]: \: w* x$ Q! ]
* e8 W2 G" L0 m' m$ y0 `3 p+ S W% Z9 ]8 N
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 ' E. P6 `. j# v' b
p# g; y$ @9 p# f1 v" T i
, z( z, W0 c" S' P& W+ |
; C' e* P" E) H S 9 B' @( q7 Q/ g5 B
$ f5 N: q( [6 p2 b
9 q0 ?* Z# ~8 z) V5 J% K% C
6 P8 x: d2 j, s* }* k2 ^. P0 _/ W& {$ z
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
% j9 F. ^! w: k, v & x. P, U- h j: `* K3 } q
6 L$ Z3 v$ p+ P4 v, f
+ ]1 q+ B" A9 m( e2 B
5 y O& W# a* K8 |: O, n& |
' M3 h5 R, g/ c* K9 i% } 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 6 Q% S4 I+ S% n' R! R
: u: ?: o* U' ~/ J5 X% {
: ^6 S4 g' d; m
6 }4 ~! B6 y6 H- z0 l- b6 L9 O
$ g! S# l- }& ]0 X, @& ?3 Y# {; E3 g" Q7 M0 }* K$ c5 ]& Z
' F9 h! ~8 C; ^, s0 l# J. _2 p
) P- a$ Q4 t. b' e. a, @) R+ N
1 I$ n" D5 v2 p( [* r& V% r" d
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
. F$ \# ~2 |- E, T" @
, Y* t& A$ p, t. t. n. c
2 X4 e8 y- F" _$ \9 w LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 + R' a0 U8 O( v1 R% }+ C
$ a; n3 R: k; n+ c4 Q) s$ f$ x0 G$ g
( Q6 x3 w; \) j# K
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
, J2 f& e. s$ y* N3 J! }, q' K & N9 z3 i# Q3 m
& H3 S& ?" m9 a7 c* m
开源的luasocket代码可以参考学习下
. i) B ~) j! M6 J 9 x" c! X2 w( E7 n* c
% L5 q9 b& B& q( u( g1 X https://github.com/lunarmodules/luasocket
( r5 `7 G& O/ k! j9 z% e 0 C" E1 I5 ~; i- f+ i3 _% B
! j; r, G( \# D https://github.com/fengye/luasocket
7 l6 w7 i3 P5 U9 T( V% t8 [) O. u 8 E4 \) `' \. h$ R" x3 H' C
( M# }# r3 ^6 M K3 G: |$ M. A
0 g& c4 o' v$ { H) q4 t N/ G' P- y
4 d9 ~2 D- v4 k( [/ j. u3 h n3 c1 Z. q# j
# J; N. I$ ^4 o z( C4 ^ + l6 A! I- ^* i
' n2 d% f8 E- O
! c( b4 C5 Y1 ?- R5 b/ h* S
* u4 ]) y1 |, ]
2 J2 a9 u# L* V2 h/ s. x 8 C* w. L& j" E" f8 l. h. I
& O+ ]+ w9 c: R) l% b+ `* m
- o/ x$ t) m. c
总结 6 _! A7 j, D" A9 z, ~
: d! B) s6 a8 a( d) e* J4 \; x( B
8 x# K1 o& h2 Q, p6 l
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 + u! j8 O6 j- t+ v& B
4 X$ a+ N) P9 Q& a! u7 C& z
S/ d( o: @4 Y, }* s5 E$ k6 | 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 ) ? z/ f8 }" ^- V' }
/ `. C0 t! m3 q; c# O j3 e
5 e( g7 Y. F/ M, q
对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 6 W1 o& ^6 {4 {" p1 q
% Q/ @) l4 X7 S# z, U, x6 ?! I. R) E/ n# R4 U( h8 `
结束 ; S3 E' o4 y" N+ b% `
+ l0 v. B+ T" D7 w) J6 n2 |# P2 U: V3 z) I# `. g8 t8 Q2 }* B% O
【推荐阅读】
, O" g; @' [- Y* v $ Y+ c; w1 ]- D- P2 l; B
$ H+ {3 K! f/ Z3 ?4 I V& E
对吃鸡APP的分析
: H: p) _, }+ V6 j1 \3 ^1 F" X + d' N; z. y& K5 [
0 ~7 Z/ [6 [* ^6 a8 b2 F 你需要了解的APP安全 4 S. d/ h" S) K' ^- J: u# n
+ o6 @+ n4 _0 Z+ l& t
* D, v" t7 N: @& r( I( h 你需要了解的APP安全 9 s/ x" ]8 I/ `( `+ O
/ ]/ U: V/ \! w' n9 w
9 ~ y H7 K. C2 d# B
" [8 `* y# R9 a/ [0 H& p0 s
|