7 x) V' r+ L j' P2 d! G6 P1 ^+ l
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 - ~7 h* n& ?# ^2 D+ x Z
6 Q& k( _ p! i8 {) v# S& f/ a+ k6 w5 S4 j9 e) w1 I8 _5 K
M( i; u* n J' S( j0 }5 Q 5 D% Z3 \" q! L8 ~: i
# K" |7 E( N3 X3 K5 \
3 A1 z" _' A0 ~ }
* b w$ W5 l: A: Z
. K2 G0 k4 f0 ]2 a) a5 T. Z2 T: S& Y1 r 下面就以开发者角度进行解析下这个APP的功能的实现原理。
" X! H0 Y% {8 }6 V
/ K2 v0 h( V/ O) e8 Z3 r8 |
1 P y) l6 q2 o
( G: i8 K A5 U: P$ j
& v! T$ u' n- ?- Y$ P; R+ d
; H: W2 l. \% _0 ^6 O' f 基础信息 3 m, B1 [# _; [# f' r0 ^& p
, a- R6 P6 v: V5 i9 @- `
) t- H: ^& |& v; v; `$ F% X 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 0 s$ `% O/ m( N, g4 h
- \: b) T& l2 h, h+ a1 A6 _% P1 D
5 V7 v( N1 G8 r 3 B, {; [9 z I& Q& o
7 p; [3 ]4 x9 n7 C% O; u
0 T3 Z3 m% s3 e( [/ D% q5 g5 @ ! Q4 N' |* X5 h# V. d1 H
8 p1 F) \+ k5 U
$ ~+ k- W' p& Q, {1 z* @
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 $ A" t3 ]3 {) U8 C) Z" P4 ?' E5 J
* Y" B0 a: }/ I# y( g
, |$ z3 K/ Y& G4 R. h, ]
K; w) Z: x3 X; x, _
; p; @$ Z/ a) h& v! b8 E- ~
- b+ q* U) n" v) Y
- ~# R' ?0 y1 Y0 _1 T
. D: X6 J5 q# Q6 o. T. \$ w7 @* M( B
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 ; N1 [$ x" b, C+ i& B; S4 R
2 w# U5 [3 ]% |( a" k. H
. _' I j0 X* G, O% L/ A
" t/ K+ D4 L# D+ E+ E: e 9 G8 a) I, q8 c% }* M
' v% ~, P7 V/ O4 _" k& F4 _
# [8 U# q0 Y7 \7 x
* A2 k N$ P, y: @) C( @9 h( Z
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 2 D; |* F$ s$ x+ _2 \, d
; [. Y! ~7 p1 i2 x$ Q( z
& P# e/ o' d6 ]; d$ s
' `% q0 [5 ~2 h. F ' y( N6 ]; K' Q& }" E: u* w' I
, @1 A3 ~2 _- r ) |* V/ L7 Y# C% u: U
* c, e6 X1 y- ^$ _4 z
. B ~, h* c b P1 R, Z 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
( g& g- w& s! i / U$ e$ b, D8 ^1 x/ n2 |/ J5 |" d
) G7 u& v4 s5 b
( P- T; x+ Q% @ u7 c$ O# q
( Z9 @: Q3 l) [/ j( x k
$ J+ i; `- V( h
$ ^: a! {8 C8 i* O' a / D- s- |3 G. n, r" Z* i9 Q1 c
3 A) y @# p2 k- [0 ]5 u* ~4 \
; y0 v( d8 w) X$ O# g5 }* d
6 A( v7 i4 z! W# x% l0 C6 m9 j8 O& B, n {* V" {: s6 f
签名信息 ( t a# _9 d1 F$ x- O" q: s3 ^: V
& g6 ^2 u$ J- u+ {% R, G% h7 g
1 H/ D* y( d5 ~) O2 U. B9 Y 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
' n/ `7 t B9 }, ?0 A; F6 n $ N# m' n' [6 T
2 i: W1 \- o6 l' D
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 5 s9 e$ M# K9 X2 y4 x$ U
! c+ _$ r4 H' K, x
0 ?$ ]$ h( ~& X7 L+ N$ s# v
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 # _& N5 l0 G! b" v2 U" E
3 L% [3 p+ Z' k& A9 m5 j5 q/ y7 ]7 ^1 R" Y1 b* U, S/ O* L
$ t( l6 o Q% h: h3 r2 a+ I
$ W7 Y7 J4 R/ B# {7 |/ [
; G% M! D: {" ?9 T/ M
- N( g' V/ g& N6 N, w# A
( g; s$ L- @' _/ X' o; g$ ^6 _2 ]0 _% U3 p0 _
android签名的数字证书的一般都是采用 X.509的国际标准。
5 S" P7 t" e& ^2 R, z0 H 8 }4 B; X, ?5 U8 T, e- k
1 Y1 P. B/ Q2 c0 z
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
' [) S6 p& V4 _7 Z+ z' N$ d
0 _# ~ m$ S; ?) [. q' s' j/ B# g i1 y$ [( s3 t- L
下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
7 Q+ X L: H' O2 B0 _& a
" S$ [9 s4 ]) L u' W( m- o9 s: u1 G5 W- ^! o
. r6 i7 Y8 t$ G5 A
. `$ q/ H- H1 H% U$ f. L
0 ~; b/ a& v& U% x( y H2 }% M
; P/ C' a& u! ~4 k9 j; N3 ~
. U$ X/ _4 v$ f/ v% e% W- W2 B0 N- f$ h E( e
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
: q# @* m% d; }- T' W
+ t& q7 }' r: W8 S( @
6 ~. U# O4 Z8 F1 `9 t0 B
# V" B8 o1 v# s , W4 H6 l+ ~, G* L7 _- ^( w
% J7 p c! N) d8 l% D1 @ 、
! Z# a3 m: L# z9 d : D% N$ ]4 _7 C, p+ A2 N
; G) j8 [" _2 u% p2 r; X: z; Z' _
& J/ @" r2 S) c6 C. ]$ c3 z- r$ z
0 n% Y6 V/ c' e. l( S% h* o( I. X$ p8 r
权限信息
0 w- f/ M+ Q) i+ d" Z - ]* p( r3 T( [; U' e7 c
6 ~. V4 K# Q8 t* A 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
' S+ \# ^3 @& K( y, \& c- v
" O, k! d A% V0 |( {5 h0 @1 |
3 }% b* G! X% }# [' m4 }5 n" O android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
0 e* }* c. l* x J$ r
0 i0 S+ d( F4 v6 q) s L
$ ^2 V7 ~0 J- m" u 7 k, F$ ^8 O& F: X: z
( r) |7 e9 r% M8 }' S( `
! Y( d+ Y- G' o; W' E1 s & l. G0 r m. u$ g
4 F6 u4 y- [+ z3 O; k
- j1 H$ O2 Q8 J: F$ A
下面对这个APP的所有权限进行详解下: " Q' E$ J4 i) N0 I7 ^; K
. |# q% B6 ~9 V$ m n
8 j0 q% ^8 A% x android.permission.INTERNET :访问网络连接可能产生GPRS流量
# t; o* D4 a6 X' l, M8 h& \ 8 l! i9 }9 Y# b/ ^# ?7 f
. m4 M+ l3 C2 }# L. W. S K
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 ' G% N! Y% k! i
9 Q8 ~+ T9 B7 G
4 H, @- V3 q4 O0 P9 { android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 " [- n6 @. ]. L5 k& r- _
8 d! g! {) D5 ~7 [7 Q
3 a; ?8 d1 E+ L8 O# M android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
/ m* K- T# t8 f" _ H" n % ^, g6 `0 }. ^" O
% K, J" q- S& ^, D4 s* d" X android.permission.WRITE_SMS:允许应用程序写短信内容 $ c7 r A5 Q% S
7 p- U2 k. w" a8 I. e' ^
- H0 b1 I9 `* } android.permission.READ_SMS:允许应用程序读取短信内容 , [- e# t% K; y
( a; q w7 i) D6 y$ I
( I c8 A) i# m9 O# Q android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
) ?/ F7 }9 l7 c' F) n% s0 r) k. T 0 D2 L ]( [6 t7 F5 ?0 I
3 W1 j& Z' {5 ~: T- @% B
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
1 ?" ]5 D8 N) i7 \& B3 N7 i . Y' ~& V* e5 G& d5 C2 Z
! k+ }6 R. T& F$ ?- v android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
+ f* t5 q* ~& _6 G/ [
3 E( y* x$ O" h9 j* a6 X+ `' N( x" j8 N
android.permission.VIBRATE:允许振动 J5 y0 w- b* s$ F+ I
% S) b q2 P3 b3 }9 {
' E5 h3 D" E3 K9 a6 A+ q3 F4 z5 q android.permission.READ_LOGS:允许程序读取系统底层日志
; r2 X7 f3 w0 @& s 2 O3 c, W4 q) R6 G* ~# j
. k& d- [! g& [1 O0 D" P android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
( p' y; u: f+ J8 V+ L. Y4 p ' M) ^) H2 v5 t' y
! q+ s" N! X* q - X" h0 N9 n* @0 I7 k
' H/ @: Y, }2 B; ^4 r6 }7 @
; [/ P! {5 n* [ 功能信息
: Z2 R: O5 u5 |/ }8 t ]5 ? 4 T% p' D$ s1 R" Y) M9 M
. A( o7 N0 l9 s A
9 _# m* r* [7 W. w* O, ~ / S8 h( i+ y! Z! x
3 n" o& R) U3 K# n
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
1 ^1 g( N1 {3 _7 b
3 S: R( w$ k. K" O3 ^
" C, L2 [6 e) m8 m# |& z Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
c& G$ i( J# S/ r# a 3 \1 R- V" I2 \6 ~' [
/ p" P& q( h0 b. F# }! g M, l 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 ! a1 b2 W& ?: _( [
# A& W, ]5 ?# s. @' }. I# X0 @0 g' K) M& o q
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
! a3 z; o: u# e 2 W G7 ]+ J# f* r& X) C$ N
& C6 M$ s" _) n* W, B3 \
; A; O4 t0 N3 T$ R) _' y
! |7 g; \" ]6 y: M0 r8 M' O$ l0 a8 s ~" N T" a/ h
7 A4 `" c# w; v3 `) v& h |. ~
7 m" R9 H6 d$ m- z) |
: W4 J ?" |, A$ u ]& \ 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
/ C) C7 a0 J1 { - u( J* g! O3 E0 T3 N
7 J* Z [: u. H0 M5 `
- g3 v8 x& k; q% h- n - V# l. M' {4 S
; K4 C& H1 C( O% M0 {1 j8 o- R. l. O 0 y, Y2 D. }5 U! S0 d- h* @0 ]9 y
5 g0 N' F: L& f$ q
2 l- S/ [- j% T3 B( x: g, o ^8 t3 Q
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
0 E1 C3 r$ A* S$ h$ ?8 `+ Q" V
3 K) b+ @3 t9 P* L1 `, l0 j. o! L) a9 K7 V5 C" F& T- f' a* s
" R9 S2 M2 |( n. ^4 \; I 1 V. T* S, d, K' d* Q- g" U- `
* R* {2 ~# B0 t 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
+ R2 A$ p, e. C2 m
0 e; N4 R L0 ~$ e! O; \( }7 z* r E( X; v2 R
7 t- I5 S1 A& Y" x
3 f: ~ E2 ?8 k1 Y+ f
; S0 t( N/ T2 I3 G5 [2 b0 L+ Q
# h& X5 Q8 ?( e : b) t' A! a* T+ q! R
; y- y4 Y. G8 ~* Z e0 m2 L4 P
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 # ?3 s5 H0 D+ |( U S
( l5 o K7 R7 }7 I6 R+ I. g# n. P1 o! ]# g2 U" i
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 ( g! L0 K9 @) R& s- T2 f, m
$ s% g0 ]9 ^6 V l9 j0 m
. Q: }! Q" b1 ~; G P, `4 c( e 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 6 d: y$ [; ]) D# @( b
+ H8 E% w* C: D& V
1 d: L2 i1 g& `# u+ |" D. G+ R
开源的luasocket代码可以参考学习下 & ^! m- l4 z* Q
- T. Q/ q. S* d3 ^! x
7 {# \: i& h& _0 y" }2 I- Y& p7 q https://github.com/lunarmodules/luasocket
% @; H1 Y1 m% E# v! p ' `, i8 b4 J7 w' T6 s( f" P& @
* [. }9 z, {7 a; g( m& f) _0 b
https://github.com/fengye/luasocket
; g; o! ?* z2 p8 k9 M
7 U/ a$ z+ N) z$ ^6 j* E0 T( q! T$ L& \0 g; S5 I8 u# j2 _. R
9 K' n; ^2 x9 \! N6 t5 n
: _0 L3 P7 ` {$ `- D6 U' n' w3 E/ D4 P8 ?
; K4 i) o& S/ P7 u- c3 O9 j5 J
; q+ J" B. U7 V+ f# G
& T6 a4 t$ @2 V0 P1 Q4 z4 z8 r
* j' ?2 p: [2 V; N( }" a' l
" Y: _$ r9 W7 d+ P5 r5 Z- P' [0 U4 u$ D4 t( x, m e! d& M7 D
; T- Y) {% G* m( z5 j& J ' u& x) X5 P: q5 y/ f" N% C
5 [3 h1 m# {/ {- W9 Y 总结
. K3 C) r# q# o M. X$ I- H
& q7 `# C# S+ y/ C# ] f
; ]+ ? J* t9 X8 i 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
) ^7 T4 q, d3 R6 ?
$ g- i% o t- R$ o% }" A7 I9 |6 l- _+ @$ y% |( W0 R+ \- a4 w& u3 V
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
' t2 ?1 N+ ?3 g! t% n/ V1 d
) Q4 @ _2 P* L- z f* D0 f& |! H& Z1 D
对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
4 ~5 J- ~0 H/ @! G* U y5 C7 B m1 m" \' c. h$ v: {) b2 [- d7 y
! y8 t% s. e- v; U- x3 {& R, m( r) ~ 结束 6 v6 a. I( Y* B* p
7 Y* M7 }9 N$ m0 `7 y2 Y3 S! M
' @0 `$ U4 r) _ 【推荐阅读】 + j: |8 ?4 L4 @) |/ `3 R
/ H# [9 s( w" V: `; n2 ?
" c' R2 G6 f4 }% S: w' i& d 对吃鸡APP的分析 7 G, C" ]6 g" z* i2 k( B1 ^. k9 e
8 `! t2 f; J( U. Q; L7 k0 j2 J# h: B |6 i( B2 q4 X
你需要了解的APP安全 + O4 ]+ ] l/ \
* G: I- \' T( Z Y6 E
& O' a6 _6 Z @/ X 你需要了解的APP安全
9 ?0 X0 q/ a. Q9 U7 J: |
; n# m" B" ~- F! T6 T8 r- m# y' L6 J& ~, b
) Y, Y) {3 s* o, u7 G
|