|
0 X; ~4 N- N- i) P7 `! ]
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 9 @ p/ ?$ V( ~9 w! G* k2 H
! e( S$ [8 g1 ]- h& |' ~* [9 d3 P$ h
" V: T8 J( b5 H9 d% R
) |2 Y5 x: p5 i! p4 n+ {- Z
5 I" [5 ~: G6 ^7 `6 X) o' d2 G6 ~( Q8 R, f& k) u, z: ?" P
$ u" u" A ^- L$ X" o
# T# p" L% d" s5 N! ]% f
; B9 L: s; F& T2 I
下面就以开发者角度进行解析下这个APP的功能的实现原理。 # a ^) d) G6 C& M' i2 q
# t7 c; a5 y2 M* Z9 j% t2 f0 ?. C( \
% E3 g6 b! H- m5 t! K. E
7 l0 [/ }+ V2 {, H: P
4 e0 h- F+ `( j6 x 基础信息 : A9 u, \' G+ y" O
; _$ Q' ^5 w3 s
0 M9 [! m" \+ A2 D% U 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 " P q, H9 w' z# O
- U& j% A0 \, U8 q1 ~
: u* _% t8 B& `. l
3 d5 c# c' w6 H ( v* M8 \: ?, M* Y# k6 @
?3 p0 O% x# M) U ; y; [, y3 z" W7 {0 _4 q1 h- Z8 p; Z
* D8 |/ A. J& P, ~$ V8 r# {# e, A0 l# n* ~! G
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 1 T) s9 {8 j; p& _5 `: a
+ W5 Z* t( i8 V0 v+ g
8 h& a, s' X1 v0 a l9 k ; }; \' P2 z( H+ g0 _4 q
: L+ }, h6 U# t J1 W1 \& N. ^9 u
' {3 c$ ^* [9 Z+ {7 x) Z
' b+ H% a ], o! f% c) }6 g
; M( E" k: f7 B$ h. U( @2 q5 M! }3 ^) N2 e$ S" L5 ?9 A+ j
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 ) O: z& [0 O! m
. m6 d/ j/ x0 f. [* z* Q3 P% N& S9 q8 o" e+ X6 ~3 n
( `0 e/ h$ p% I" j
0 f* Q) e, H1 ~ r6 @& w
3 g: E3 ]9 d M4 U+ f- L" g6 L + B* z0 }7 Z+ u1 T, Z7 m( B% t: Z: `
" m5 E( M' C2 O5 e
6 l n! V8 ]/ k6 J# m. x 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 $ T; g" W) ^" ?0 D
* g- N8 l; ]# g& ], C& P* c1 A
7 Y1 L1 V1 K! _' J# L
+ O1 q& ?( _: L$ ~ 0 F n0 c; Q4 d7 h
9 d( z6 L9 b9 u8 v0 B k 2 b4 v! L$ L) v! Q
: Y' ]2 c* Y [6 a5 W/ T, N# s v$ n4 \1 Y
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 2 c9 M8 q6 ~3 i/ z) ~
/ U8 R; o9 f1 l9 z, W
5 t/ ]8 g5 U1 X) ^ ( x" B$ U! |, [ D" H
7 X. K; K" @! w
% V8 d$ I7 E7 s+ W* c [! z8 P
- y8 ] c+ ~ J5 r
. ~4 `3 b- v+ r( b! t3 x B! {
D" A5 [% y7 j
* M. N' p) M; V; u# q
4 D' n7 Z% Y+ N, B+ }# y) Z0 f) A% u7 E
签名信息 9 A8 H; c& }4 o
# r8 j G! Q' _
& \0 }( }2 b9 k 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
7 ?4 W( v" |3 |& q W% E
6 m9 V' F3 t$ O( b! p' Z2 G0 |$ M! I8 e+ d. A3 F( G
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
4 Z2 L9 {5 C* N2 o" Q7 I
* E, c& F6 u0 B0 P3 f$ ~5 ^; j( O/ w4 C/ ^# R
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
5 Y6 }. `1 s, P& q* f! I
7 f* W* {2 w* B2 Y
5 W [, z7 J4 V' V 0 _& ^' @) x1 M0 {
- ]% D. o3 p7 @' P; p
( w9 z4 W3 {* c6 x% c
5 t4 J' U0 b3 d/ g5 c+ M1 m4 ^ q [% \
( U: K4 M$ F' Y. K: K) p% e. j
2 s/ X4 w- r; j0 I1 B$ {" z- n9 } android签名的数字证书的一般都是采用 X.509的国际标准。 e( P: T4 E5 K* g
6 l: \& \$ d3 }- K, [. r
! D3 i' o6 Z* J/ {2 C$ p; | 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
- Q% I4 X1 ?3 V" l: F. R1 z) V5 } H" }# U. D; T7 {! B. v8 C3 L" L! X
7 U5 T9 e, y+ {* T' A 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
$ X1 X7 v4 @. @, a7 q& R
: F& `( s* f/ W4 T) X' m2 ^) f- m! ?& L: f( x8 ]8 K4 b/ ~; i
0 Y+ s' Y2 R- b: c9 t3 q
, x; _. U( u: Q) L0 A; f, [2 g2 y" Q
, f( I% p3 ^) _: Y, y d( H3 F ! r' i( L/ |1 e, ]
^1 b" \# [. G2 a) |! i$ k0 H8 b) h
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
( J' F+ l- m# X5 U3 ~+ x3 ^9 N
T# v+ h/ Y' X1 n. [5 b
' E2 l0 E+ D# x+ f
! y6 A! m! _ `, c3 Y/ u
8 `. i( q1 \# W; Q( ~- R/ n% ~( }7 v ~
、
! e" ~# K3 y3 N S; k
( g" x I+ F9 K9 x# x
0 k0 X. @) m( m4 z4 X3 c; I0 z
. q C f/ N' @" t% Q+ f8 h* \4 G # `% k3 w5 q4 m8 V
1 k/ q$ H1 k7 Y, A
权限信息 - P0 ]# ?# }; x* \2 ]8 K8 K
6 i# S4 x9 i4 _$ T( @+ X# P9 a. W
+ J! d0 ] A' x8 S ~ 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
! c8 r9 F8 K- P. i
) W7 ` M; d+ }2 O8 V4 Y
* b0 w- }3 j" X android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 8 _( I# b j& v5 Y( _, @+ `
' t8 N7 n0 D6 l* w
$ |" C* s! j( q# k% i& X# f
! k# v" P0 t7 R# P0 f
6 t7 w: V8 {* h0 X* w' R6 e1 c+ H" G, k
9 e5 v- N$ a" A# m
. u# r1 p9 ]# S9 V: o+ z" F- L8 C8 n
下面对这个APP的所有权限进行详解下:
! c# Z/ v; `3 F 3 G0 _7 M( H* a; Z, r
2 M6 S2 x% Q6 l% y
android.permission.INTERNET :访问网络连接可能产生GPRS流量
y6 ^; R. {0 p% ~+ ^3 a' u
' j f, Y8 M8 k' \) f6 {% ]/ _9 c
9 {4 |" {" v8 L) J) B' W: L android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
) _: w, `8 b- o7 \! }" | 4 K; C2 u8 l5 a7 m! s+ H; b
* _2 i( @9 W% m
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
& `8 ?$ i7 @0 Z5 M
4 K! |6 d; Z0 Y& B$ b8 p9 y# r9 p" \% G; Z: J% W
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 ; |% Q' J) D, k) t
/ C9 ]3 G2 z9 R" U1 x. @3 u# k
J6 g) }. ~/ R6 ]2 q: W8 p' s8 w android.permission.WRITE_SMS:允许应用程序写短信内容 $ [' d, H3 r X# N# k6 s9 e
9 h4 g+ F. z& G1 c- }8 d$ T( X/ g. d0 R8 o: K+ G
android.permission.READ_SMS:允许应用程序读取短信内容 D }6 `" I( A- q3 Y
6 A+ a' h( I7 m7 ?8 h
, S* A* ]! ^( x4 }) P" `6 I android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
; J4 k+ W, {5 w1 t1 z0 o$ g; Y
# F4 @# @* x* C8 f& J$ j$ k/ l' y! J' C/ I) P) f s/ m
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
6 w, o5 ^( c" G' W5 E
: {# ]7 V) l% ?1 A0 M1 @9 Z3 s) K- e# @% Z L+ o- o
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
1 c7 J, o( i7 g1 X 0 R! T% a7 d( e! `, Z' a
. Q6 x. w- z) H
android.permission.VIBRATE:允许振动
5 m9 } Z9 v$ V# P! k8 E4 v K" G
; q1 a8 f. y6 N3 n4 ~2 }; e. D) r% ~8 A# V
android.permission.READ_LOGS:允许程序读取系统底层日志 7 ~& J' L# R: f8 U+ K
1 C, K0 @3 U7 G2 Y; o) h9 M" Z
* ]( _" L4 n( F/ c5 J android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 ; s: n+ M5 o& `+ R" ]
! r! p+ h6 \9 e* q: U! o1 J
, v5 v5 H% A! w+ E- S 2 j5 Q1 B$ }% `; u9 _% _/ ]
$ e1 _2 U! }% F: ]+ ^. ^% O
k% Z k+ ?( F) i0 l2 m! m 功能信息
8 j# q7 L3 T6 F, `5 `0 q* D; @3 K
1 Y8 W) t% q/ ]0 Z4 r9 z' \1 N ?6 ^
. Z3 n8 Z) H5 Z % B* _! @8 Y4 u) O; `
& i* S9 c- b7 b8 c" c
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
7 L; e4 j% W' H' s" i% e0 D: v( _
- E' B( D2 U6 Q7 n2 D! w& Y" h. r! O
4 r1 ]- L0 W0 m. n Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 6 a, f, e" x9 U7 d7 e; U
" ]! p. R+ D2 R, j1 R5 B
! k7 s- a1 ?3 x' R 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 6 P; R1 G' O' C
% a# S. M) d g6 S. h$ x! H+ k0 S, q ~
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 / J6 G: V9 ~; C; i& X( D
* R3 Y7 Q$ l+ N7 N# x! q6 O: r2 n- _, {# C1 S. h
8 r; i- E2 q% O6 U , {- I8 ]# g) ?- L8 e) H! k/ i' B8 ]
" `7 [3 S' u7 Q) i1 j0 n
9 ~: o/ `9 X D2 ^% } ; b7 `$ ]6 e0 w3 N# r+ {
4 }/ y* c# J$ i* z% X0 D; O, s
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
; m+ _. M) a& {6 x; u" Q ` 2 \( z- ?2 C' U6 V9 `/ X" [
3 L* P7 N. H! k: v, a
4 q' {7 Z ^8 S { j6 g 1 {; p6 @- E6 ^9 t
, D: {) N/ X: c! S
+ p$ C6 ~1 t d3 z! H
; p7 ~% x) @+ l3 C Z9 R
9 E \9 c" z3 Y
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
: ~! i7 Q& {4 n' x& Z5 X) u/ J
5 P% }& S$ B$ U& o' e* g3 d& @' M+ k6 W+ I% U( M5 ]
; v# P2 a/ z) P& P l$ u
5 Q) K8 n- ]7 i ~5 C# S1 F7 t; v$ l; O& h- ?
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
! M! {; O) |3 m' W7 N : P& i! L# I0 @6 F& q+ Q
' O1 W6 n7 c) F5 ~! j5 V 2 m" X' y* N5 t9 G
; B/ A! T7 e& s1 N9 N& g4 Q- l: J0 Y, D
/ T' W' r) I/ _4 G& ?; I2 O+ Y5 N Q 1 C8 k7 j: W2 a1 d K( P3 O- H% N
8 h9 o6 o; _! n5 i0 W2 d9 K$ f+ D# Q
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
_/ Z. |! B$ I% G8 Q/ V/ a {' \ ! W9 j& B$ I( k: f
% q0 x1 |7 u! u# r. ?/ K; T
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 6 j$ _9 G: o9 d% B; A
" c/ _: y7 V$ e8 O2 z. r
# Y; W2 D9 ]# O9 m" B 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
& q* _ X) m( \4 `+ w& T
* [# J! s+ C5 y8 _3 @% ?) z C+ v
: F2 D! `& @: o: ^8 Q# L7 K 开源的luasocket代码可以参考学习下 ( ~: V! \& E. W. L
! h; {$ G: h, v8 Z8 `
0 j& W7 N0 G$ O. u* b" { https://github.com/lunarmodules/luasocket
; S) e1 M# ^" K
1 N; w* V, }& N+ N
# I) e8 X8 ?. j https://github.com/fengye/luasocket , K& S( O5 r3 R
0 [5 k$ Q) |) @' ]: e4 q$ n y9 ?! J( z* \+ r0 b q
5 W9 _- D, Y+ B) r2 P0 K+ m0 @
s& v% L7 I7 q; s* W
! I$ P/ W6 a! _3 R J9 } ; Y. n f- O. K6 a- G1 `5 S
f1 A3 r/ j( v3 x
7 m8 O. J3 w5 t6 F
+ A" C: `, m }3 Q) S4 ^3 k
; w4 t h- C9 S9 s/ M
, g/ u x- |- r$ S
% }7 ~) b2 K2 r! m, M9 Z
9 a2 { K( |7 o3 y
2 Q/ a9 M, d& @! g& x% U2 b' T 总结 ) R/ X0 |& a8 }. ^, e, c
; Y6 f L) @2 o
; X/ Q0 ]; _4 ]/ @9 ]1 l- ] 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 6 H! H9 u E: t2 S! g0 `
# X, ]; x0 u! s, o. _# g, B& ~ l
5 N) T; x# g; \: _0 J5 c 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
9 o* o7 R7 p( B0 z: R ) l+ }. J$ Z! g& K) d+ f
' ]- _9 k, [4 {7 ]7 r
对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 # }# D" B! e- L$ {* B% S
6 @2 q+ t0 N9 a7 L2 c" ]/ g2 M' O1 ]5 o3 v2 @9 J
结束 1 S* L/ y. B r! G* A) Y
1 f+ t3 i% Z8 ]! u2 M1 t, T
5 x* d' @, g. ^3 q- b 【推荐阅读】
9 q/ @7 L6 d" F$ ~
P( t" C+ P+ M7 I
- }, I7 D+ d+ O& Y 对吃鸡APP的分析
1 A# c) s& J6 J4 a
7 Y: T. T# H( \" m% ?+ Y. c8 Q5 O% _ s4 {
你需要了解的APP安全 4 D; d1 n' E2 w+ n! I/ z
5 Z' ]( G; w9 k
" t) y; a# T" r9 c, k
你需要了解的APP安全
, U9 s' W M$ J7 _' e+ ~, G0 Q7 a
! L5 j6 r2 L" s1 W% C M
4 B5 b( G6 V$ H, E9 l' L! y& k1 c
$ j( H/ e- [( c+ @# E |