* S$ {3 ?5 Y! y% f! A0 Q d- Z. p 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 ) d: [) m/ z, e. y
" z9 J1 P! w% a9 ^3 Q5 T1 U
: Z* \4 j2 S; R% D* I7 \
7 E. s& q2 R( `) Y- p4 Y) T
; P! v7 C2 Y" h1 T) f6 R% A8 }; t d2 y) |
: d% l2 F+ u: V7 o+ r" J
! x' W4 \! Q* Q: P" b9 Q1 S
' S' m) [+ R$ T- W% g" v9 c 下面就以开发者角度进行解析下这个APP的功能的实现原理。
% x5 `3 m9 m: f9 R; i
0 q$ \, [5 C1 A' [- b, N0 C" {* P) p, d4 W
g8 k3 K5 H$ r5 R- q8 p3 N
* l P' w6 p3 S0 Z6 }3 J8 n9 G
7 f q5 ]: [. J/ Q 基础信息
- U& [: ?% B' I/ ]$ u 0 U4 F9 c q" j1 J
, v" R" z: P* E9 Z3 \. M. p
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
/ \; z' b5 H* P0 F& }5 u6 h
1 P2 }2 u$ `8 C, w; k9 f
( `; y) s z) }5 N: K, ~5 [
' h$ }1 ^7 x! J$ ]$ U6 ]4 @ # I# y' x6 x5 [6 @" j
' c# H7 v; l" d% y0 O8 [
9 _8 J( J/ i& X
: A' [7 h. a3 H0 D. ]
4 e9 p6 L2 z: |& G% T9 u; w 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 8 G( B3 e6 K) m k% w# T$ D/ J
( M1 ]% W1 ]' I1 I
7 W! W) G. h& P& j1 D; i , [3 Z& a( O8 Y
( P3 I) {8 I( m" A1 Y; D6 i B
2 f& F W5 |8 p: ]9 ]& o5 Q& v
4 Z, S5 E2 Q6 D; P/ F. |
! U/ L' \7 Y) l- @& X/ I% I+ q( m: s v u3 N& A7 ^: M9 L
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 # ?9 w3 S( v8 G2 e- R* r: }
+ o. e7 H+ x- t, _/ g5 N ?
( y2 w* r5 r, m) n 6 d# E" z* U0 {6 O' q# U
5 I! G- Q' j9 w! x3 c
9 n% I" c0 A4 r1 i _5 i
$ t2 r. y1 d: f0 ]# T* E6 ^; n' k
% C$ h/ o2 x0 C& J0 {0 j' t. i* v6 j$ e
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
6 [2 B6 W& u2 e A! Q* N: J0 w4 }7 n/ p- n) V
: x" D" y \+ q/ B! l
) \; b- b/ K4 i$ j$ m# [' V 4 r' w$ ]9 d# ^* {9 h, a+ o
+ ^9 y: h7 }0 ?9 b2 S
9 v: c, {. B# N. K3 `1 p |
& `8 m* R1 o4 R- L K _4 t9 k, n7 r* c* u. x n% v- Q
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
6 _; ]" q" A% i p& Z" A; I + V/ N' S7 t) d
- u! `. Z1 C: |" r) a- j0 w3 i
; i" a+ M# j1 h4 K& u
+ |: {3 q' O4 G- i& @# A; u' G$ f. p6 w
0 r) j1 P3 s1 Q
2 v. t; j0 T9 B$ {6 k6 S% b $ m: h( \( [8 {0 J W- q( M
9 t9 \ {( C( S, w / T* i' O) z6 H" h# P
0 T# T$ `' F+ v7 D$ k# @- h- Z; c6 \. L
签名信息
6 s0 ~; t6 {) b9 z& x' i
8 V* @* E: v# {9 u# v
; V- O5 W8 [! m3 j: E. l3 b 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
5 n# n+ B2 l/ x3 t2 F6 y
& S- v% [5 l2 q0 C( T( y1 J7 @# f' W4 ?, y3 ~) E% o+ h: _
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
7 p1 T4 w5 v2 d( X$ \4 {
) G* t: L$ ], X! N5 L" |. ~+ I w: Z7 e* {5 n3 [
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 3 q0 Y5 o5 A4 a; q! P4 ^4 x* I! G
9 I2 g: K' L6 @; F, H; U
+ k W$ u( N9 Y5 P L, a% B
9 g' o7 m& K0 s, u8 f! Y
% k! S0 t- u% V) I- |6 X1 q$ G3 j* i
, i$ q% O! P& `: X2 B+ W4 `4 j 2 u( K: z; A7 z# X0 j
+ K( s. R, ]$ p$ ^2 M
; R8 s ?* j8 T% ]- D: B3 i# I android签名的数字证书的一般都是采用 X.509的国际标准。 2 _3 L6 s8 Y" N% m8 z
X+ b' j0 Q; e' t( m; }; {* C) @* E8 h, u, R' l3 |/ F, J
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
: [: b7 N9 y% f+ S& t8 Z - g& m' `# [7 v9 s: b
1 f, C5 O, v2 y, v 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 3 G. J# ^8 m* u; X& I( J0 [
- z, |) {! U. `! x! A0 A
. ]! g/ S5 D0 f! d4 o4 l
# }5 p; G1 V! \* t! u1 Y
! | x/ f3 j) a" K f" l$ B5 Y4 C( M0 ?( f1 O
. m% Z4 D5 u; t- G. o2 z. t - j+ e7 U4 n( G. U" i( Y
$ i: p7 \ z2 ]" ]7 T0 S: O. q8 S 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 " w8 K$ F0 F- F s0 V3 {
! Z4 W. P0 l5 u$ c0 Z
8 ]( ^. r4 y% H" k8 H9 Y3 X8 L 2 N- f. w& V4 Z! r
4 D. w5 ]4 Y8 j4 G0 Z
) i% P+ D2 e8 c7 Y; m8 n8 ^
、
( o& ^$ G( E! c1 E3 x) v' l; x & g: B* z5 T) x
5 s- F& T2 d. b- ^3 J& @1 D3 v / N3 p5 D2 K* g. p7 A; Z: Z
' s* ?# h- q3 b4 j h/ A `8 R/ n! F: ~
权限信息 % k- ?. s# o: X) \
- c! x4 x6 H8 |) U" J# F4 u& a2 h; A+ @2 O ^* P& w
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
@5 h: h8 V! S+ p! k; E+ ~5 E* J- m + }$ K, A s' D) O$ }
2 W3 L/ s) u L5 G7 u% k
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 0 l( n" V! v! g- E+ s5 ^2 d5 Z
& [* X5 d3 w+ H- U8 K& X }# h( x6 y, o
& [: a# c/ {" d5 d) Q9 \( u , K8 h C4 l* o% ~$ F
6 o1 b8 ^+ M% w0 i9 }9 G) [
8 m0 M) h, ]7 c& S1 k
& C9 E: f8 {7 ]9 o" ?$ I3 ^/ @) \7 B5 L0 b% n {3 r7 c* K# q
下面对这个APP的所有权限进行详解下: ! m: Y5 W. [4 y! l6 c
0 Y' P; T% h2 R
' c A! X3 `' ^( U, L$ b
android.permission.INTERNET :访问网络连接可能产生GPRS流量 % h* H) M/ Z) v# x5 s
, ~- A5 K* V7 \4 d5 Z3 q$ L
: e- u, W+ z+ T4 w. o7 i
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
5 \8 T" [& N, ]$ o+ i% |) m) |
+ I7 W6 X9 e+ D7 @8 b/ T9 V. [2 _+ b3 k+ g% {/ T
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
0 J5 |1 g$ _) l. n: J+ K
4 f6 E, v; s. Z
% x. {9 [; f' {- O5 w7 W android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
; c4 Z( ]; V# g9 p( X 1 ]7 N! }5 J3 [6 d. K: B q7 T; H$ B
! O* u% i. h$ }: @1 v) Q9 l4 @ android.permission.WRITE_SMS:允许应用程序写短信内容 8 C: O6 w& h1 y' w
$ W* w) L+ E; Q; l
- z I. H& `; U$ E
android.permission.READ_SMS:允许应用程序读取短信内容 & P1 }; V# e6 |/ {( l0 ?1 ^+ {) ~
! @2 x! u3 S/ ~
3 g% o5 G3 U* B0 o* |) |6 c android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
$ Q1 r( B" {4 ~- W3 Z8 W1 z# a T; D' ~! P, Y+ v& L
6 M6 J! g' a& [& c; o( p android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
' p5 ?/ |- Z# D7 i - a9 U- o# i( j2 y
' S# v' |! G: s6 J android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
0 p- `, {5 q9 e; s5 Q
5 E) c; W/ C9 t% h1 }/ [- n; c
; B* [6 B4 k7 d* f android.permission.VIBRATE:允许振动 + t; v0 t$ D" I% n0 e3 T
1 ?7 d3 t+ i* A1 u. d
' F0 z a8 R# o$ v8 m& @ android.permission.READ_LOGS:允许程序读取系统底层日志 ' g. r- A j/ ~3 w' ^
. |" c# P# d9 A& P$ h
. `& i2 P8 F$ t# M android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
7 Q3 a4 X1 F. c( V! ~5 P 3 c3 m& R! K& ~8 ]0 u% ~
- b/ l) V" b- o9 B, _% R7 Q
2 P- K) K8 x0 W- ?# e, Y
[0 y7 w+ t6 Q& K
2 Q9 P9 U* Q; q 功能信息 ( a, R P" A5 ^# W- C. v
% z- o% E/ A2 }4 l9 P. x& m% y+ r; i$ K. Q7 @
7 T4 s* Q; l6 C4 i5 ^2 W; K
5 A: ^& L3 N# n% l
8 H$ \5 {( T) O. i
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 ! g* k) O& u$ \/ g) a) r' V
7 {& `9 C. n/ E* D. y
$ d- P, S: `6 ~3 B2 l Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 ! c1 G- A3 ~8 r
* I& A! I+ D& A) x' W1 ?
2 h) f6 N$ m" n) N5 t( }' W 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
- ]2 h! \7 J! [5 W/ ?9 W; f% m" E ; z: @; j+ t/ f# Z6 n1 V
0 @# f+ o6 P6 @5 g2 d' a
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
' U. \8 r" @, \ * a% ?5 `1 }# n6 t- j( W, N
V) z0 @! j2 `7 ]+ C X) t
* A6 j, N8 F$ k( V . y8 j( y% c( F
& {% J0 K+ ?5 |6 f6 ^% v1 b $ p/ j1 X+ v1 V0 n
" E3 ~9 G1 i& C. h
$ Q% T9 B6 l# b7 k 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 / v: J: b, {5 X
& y( N# j1 I/ k( Y. f: m% v3 J7 s* r$ c& a8 ^! {8 @5 Z
7 P/ T, w' ]1 X( M% _- [% k
: Q, x! E' `+ u; e# `" k) o% P3 y; K
) c( {' y, O" j: Y$ a ) Q: |. y* J B2 I
+ @: d2 F: W; w1 z& R5 j! k 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
) S5 e6 S1 ^3 a y5 f# a2 j/ t# {, a8 h
' n" f" }2 z. z% \/ Q: R/ ] / g4 j* }0 Y; r+ \& w
/ E2 C6 o) D9 e) w3 K
0 S- x+ Y8 ]2 ~) u' y F! ]& T 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 # t9 m5 m9 h& B. [# @) c* |, U: P, j
) Y7 p( l* Y0 f' B7 @2 Y8 B
3 V7 p. i) u* j; F U* k+ u
, C L2 E1 U# G- p9 D1 o
' K0 k% l" f3 m1 `, Q- q" y8 j
- {. z' T, p- { ; e- g$ n. R& ?# ~5 D1 H
: H- C7 T5 [, j* @. @/ E7 Z
: {( |. j9 ` D! Y$ [ 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
, P6 _* F/ S- m- ~& g
2 Z% ~4 ^; w6 @, D! g# E) [& Q, w# Y0 i/ `, f6 a7 _- n
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
$ k7 ]+ q9 x; j9 F9 S7 e9 h! V 2 \$ C; N1 P: C
1 I$ R" c% Y2 r* G2 g# C
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 4 r4 B! Z- t ~5 Y; A. _
: a! z( I8 i+ y
7 s, u4 ?& F# l
开源的luasocket代码可以参考学习下 : c5 b7 C/ D& l
# F6 i& d1 B) \1 N# e4 _
6 M* J" G: ~! |$ g
https://github.com/lunarmodules/luasocket ! u! n# W9 H: x1 C Z. S; `
- c U' w t- @$ y
- ^6 b( c! @: {
https://github.com/fengye/luasocket
) a; E, D! t+ w2 C; b# e/ s6 J3 K
; o, T4 k& ]' b0 n( ~0 G2 D7 t% w2 U1 X
' s. x0 V2 \ O. B# x/ a
. m0 I) e* g- u' S6 T$ _2 \. `$ \; D3 w( D1 _% M0 h- _
2 [/ H& y$ t6 @4 r8 H1 N) h( L( k
; Q& `* L+ b- W# R, y- y- z
* H6 J" c% u5 s8 [9 n" s
, _( T2 d$ W3 x 0 x2 P& b5 H# [
5 {6 m' d2 O9 A5 b4 h' S0 Y) i$ p( J
: v4 I" s0 O6 L$ O$ C7 K4 L
' _0 ^0 p% S, O5 U% }
( Q ]0 t6 ~$ D/ z0 U% Q8 f
总结
( g$ \* z8 {& W) g, d
. f$ B; I" S+ P2 ?0 P& q
2 S9 V1 b) I9 t! Q 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
% k d/ \6 ~2 }3 w& c9 D
6 A( a$ M$ S- m, ^. y( Z
; U$ s2 r; F5 F, ~ k8 E 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
: C: d$ s, v% {# Z2 V & H8 o; f3 m# `) s
2 D3 \6 H1 D1 h4 a7 N9 B% r/ _6 t
对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 " |, x% c6 H$ N9 s+ B9 S$ u
8 }6 T _$ S4 D0 m* U& ^* K8 S/ n# T' I( l' U4 j* c1 x$ I& w
结束 / [) i* @ @7 l( G# u
: t' @5 C! e" ?. D" A" j
9 l: y! E, _& l8 G5 }: I" Z M6 I 【推荐阅读】 . e' _; l0 A. p' l/ x- N
8 R" \6 Y, H7 L* L3 @1 K' C! I
% z4 D: H& M' W( `9 b
对吃鸡APP的分析 " Y4 b; }6 \ t3 f. V
: w$ i4 G: Z( N9 n3 a* z& C' }" b* E4 l: A* t6 g' t0 ~
你需要了解的APP安全 & a7 K1 Z3 G1 _8 e! k" C& E8 F- S, W
* N* E! x9 L2 g& l" Q! n( ~6 {
- R7 t" q7 b4 @3 t 你需要了解的APP安全
`. }1 ?+ |% R4 N3 K 1 K8 m7 z/ \& B, A9 I- S4 P1 w
: ~0 A& q, r1 h: }) T$ p
4 C$ ~' A. N# M5 N, \
|