|
" ~3 n- z- {( f+ L9 P1 e- ]8 K: w7 s 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
7 ~% S- u n/ n0 @' A
( `0 l, x+ [+ j9 I/ y- T. r% z
% Q+ p7 q7 _: K3 b
. o. Y- |9 ]( g7 W
* t* K7 A# s3 R( g& ` y2 ]: A
$ h1 t8 L) u8 N# `! X' K3 u/ t. I- j, m
! [6 D* S6 T# h% H7 R. a V' H, b) z+ ]
下面就以开发者角度进行解析下这个APP的功能的实现原理。 # a4 \ S% i1 _- ~5 T0 o* {
, ^8 e8 q% ]8 {% S- Y6 f& U, }
; G/ `/ y8 ^+ l; H) @
& W. u. p( t0 p* L
4 R# r. D; [ p% \ T3 ^. `* m$ Y5 D/ T+ f" W
基础信息
4 X: ?0 ^: d. u! W) g; J) h, }
! p! n% \3 i. ?) ?1 G( l* F& F
% N% ~ x* f# u( E! {! s 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 , ~. w! @5 L' G& C% R' R8 s
, i! S3 D! l& K) P
) l4 ~ k+ e6 v( ?3 Y) Q / z) X" L) u& S6 C. }) U
/ K3 F" P1 _3 n& P \
9 j$ P; H& K3 z4 x
/ [% m9 D- S* m1 U
?: ]) |3 z, i
* [" O9 x' [. I* a4 ^; Y6 d1 G 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 2 g' o2 s' I7 S+ T
7 D2 Q0 G9 b$ U4 K# N: ]+ V
9 \# W" K; z7 i # g7 S7 D2 U( C0 b) W: r% m Q! |: U
/ R8 G9 j" m) J
0 Z; Z6 G! Z8 q K
& N+ x4 R2 Q& L! g
( p+ r: T [5 b; Z' ]7 n3 B. u) T$ {% f S
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 . M0 F* e: K. s" x& I( t8 v
1 F6 l# `' I9 U: x
8 l: j! ~) ^5 q) `) F ! q1 P/ N4 U* i
2 Q, I9 ^; }5 Z7 T; O
# `/ h% ?4 | s # Z5 K( ~" j5 E+ v& r' j
$ l2 _8 \, v: [! q8 S. r3 A) j! y2 ^/ r# E2 T) D1 d/ n' J
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
# W. G* N: m) }) K+ C5 g6 w 6 ^+ M7 J4 [2 \% o% L
( O) D' | ~7 K T6 f. | \( ~* ?* _# P3 w' Y
. A6 R4 s# ?2 A0 g, N6 a
# q' p) Y s* y, r* `4 B. M
" k2 K v9 P' u" o9 n6 a7 ] . y2 O+ `, i8 W7 a3 j; e
$ R/ ~" n8 ], ]' P8 K5 A- R K2 a
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
( S. W: w3 [0 Z3 r
. e* b. `" Q! [& [! e
$ B8 K3 B3 a% r" M* r4 P ! Q8 x. e/ `, F5 e* a
" J5 y t: w& I1 V
4 \4 q: j6 c& {5 o5 \9 Y! o
3 M0 X+ n2 K6 b' ~4 Y ! n% e+ W5 F& }
! d; D. f8 w2 G * n. f2 A1 D; i( l% g2 Z' K# f
8 e% M% N# q! g& c9 C" U
\! T8 Z$ t2 D8 x! q
签名信息
/ m! K/ ]% p$ n
' w5 ?$ t, ], \) ]/ W+ a4 j" U/ B* u- l- `" W% m! K3 o' [+ N* V9 `
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 ! S# L" c9 n- ^( K ?; W7 N2 ~
" L- g& x7 H5 v# C5 j; D V$ b; f- [
0 E' M2 P4 d" I$ f2 f
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
' C( @$ q9 C- ~0 v5 e
1 C3 T2 x5 g _( g& U: B6 [5 @+ V- f) }! o! n
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 + s- v9 f8 \) Y- {! M. b- d
5 c1 g, y `' l
6 m( c# F4 A% k) Q9 U+ E W
% X& L7 E9 p! C! ~ + F0 D# i) {9 ~. u! @. s; p
6 X; [) s% \4 u: Z3 L/ R: w' @6 u
7 ~; Y* v0 }" b6 L
, M9 {& v& K$ e4 t' t% g9 u/ ]! Q G& [- B
android签名的数字证书的一般都是采用 X.509的国际标准。
! Q1 t( [ C* N9 O! d
: W( c T6 @% ?
8 I$ k: F, r: z/ I 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
9 }0 O4 @" m+ R! S! c 9 [+ k8 {7 @: k; G( v
5 y6 R8 [& O: z5 Q" L 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 8 ^& E# W0 v* q2 e& G
r; R J1 S! t0 k( j7 N5 w$ J# L
: g R- {' E% z. @) s. Q4 F
" f" [! M: q0 ] # r8 Q, W! ^2 y& ]8 l; Z7 X
( f( e( \* ?8 f$ y, A! k* N
/ G' V3 N5 S- x- q! R. R
$ Y+ j9 [* x4 m8 h$ r
% a( _6 m1 ^9 I! N+ I$ @; n. J& O' Q% e$ n 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
3 E! |$ k) a. h$ j
$ R8 j8 k' a3 p$ a+ X
' r, g/ p; b" S2 R
d6 O9 A+ M+ o8 ^6 n
5 U4 }; a( B- _3 t7 i4 k0 I Q b! _$ v0 {& A2 n
、
6 o* P, J. V K9 E , L6 \' S; ?5 _! [& I
- B, K3 R9 @( B$ |4 L ; K$ r2 Z1 Q( F1 ?" l5 |
) V; Q& d5 |6 ^" T" N8 d1 n& R) G( X8 l0 ~. _% }5 W0 y& O
权限信息 : T, f7 e) |7 w( b8 h
8 Z2 P3 P1 U0 g' W& G
) M: r+ n8 B! r Y& P: w" w7 f, R! K 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) * ~2 o# M; G8 j/ D
- ?% c! F! F: U, u5 u
4 b( M. e3 s4 r8 d- q" u android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
: t3 o3 M6 J& X) _2 Q% K - I; X$ G& v& h7 J. a O Z+ @
1 h7 C' V$ K' c( t' I $ f7 Z6 f6 }% q& y T6 X$ f1 x
1 Q% Z- A) X6 c& g. ]( O' q* C0 P; `/ {4 C/ O1 f( k2 r0 P+ R: G& M
1 Q. Q5 k; r& _6 @* _& F! [
) T/ B4 H5 z' e6 x
3 j& _1 z$ A8 Y: Z7 l. C 下面对这个APP的所有权限进行详解下:
4 }5 M M3 E. W$ `5 }% Z2 D
- c+ Q8 M5 ~1 m9 v5 ~: Z( Q# s& D8 s7 x0 ~: n8 h; ^0 A
android.permission.INTERNET :访问网络连接可能产生GPRS流量 ! Y. M4 Y1 u$ m1 I
P& z3 H$ g' b. a8 @
* J2 s: W" A. Y: ~ android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 1 J2 D g5 U& A1 ^
0 e1 {* s1 D3 M; w) T3 M& M( |
! \- p& G2 c& ] r9 N+ i* w B
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
; y: p0 c3 P' f; U0 n i
) m. Z6 P; L z* n# h1 [+ |( b& v5 q( }8 f
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
5 G5 x I, w7 G i : J: W, ~) {. Z1 {3 G8 `
4 z& `7 Q4 n1 _( o$ b4 Y' u android.permission.WRITE_SMS:允许应用程序写短信内容 ( x3 h" ~" @7 \1 q+ R" A0 r
" K( Y9 j0 r. |! z2 u8 x
: S( [ q: G3 B, O. A" q) | android.permission.READ_SMS:允许应用程序读取短信内容
+ r- u& ^. u* d" E1 i# M
- K4 n, y/ b3 [5 S/ s+ c9 \
; n2 W. u5 n: ?7 N, ~3 g android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
; K: z% ~! u( H7 i ) a8 g" H' O8 M# a
2 `/ V5 [' N A2 V
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
3 v7 r& b4 d. [2 i6 H( z ! }. N% }3 J: r
* {0 D; {$ z. O8 E$ K1 d* B
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 * b0 {. S7 Y/ D$ E! A7 ?# x
. t1 U# X8 ^9 I* j/ w7 _$ Z
9 o) Y% K* C$ a. A: O; c+ ~ android.permission.VIBRATE:允许振动
7 `5 h; C+ P0 P
" \3 K' A8 I s
2 f' i+ B8 {5 _6 c android.permission.READ_LOGS:允许程序读取系统底层日志 * l1 h* [4 L, @# @
8 D( v8 T4 L0 ~' K3 E& N( [" t
. f& s# ]) c* v* W android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
5 \# l+ l3 j$ C3 b" u % c- Z( o1 \( ~+ Q7 j( L9 a8 w3 L
8 R1 c# O$ G# V! j8 Y3 [; H
+ O, v$ |; M6 g$ }9 Y) X0 ] . h4 }7 V) B+ n# m4 D- Z4 `
0 U3 G& Q9 p" E' I5 p# Q$ p: G 功能信息
; o5 j* s$ }% l2 \6 W8 l* u! b # z) d( x, V& q# E
- M1 S7 b3 v( \1 U
/ }/ R7 X% k% x0 M" ?9 `6 f8 {( L
% g9 u. f: H6 n# b6 |- w* v+ c& ~
! r( {! e" B7 B% U3 C; _* } 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
. r" `2 r, D/ p" K, `4 F6 K $ s1 h6 t9 D T+ A5 g
0 b2 L: n8 l# w. f Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 ! j9 ?3 w4 J3 b1 U3 m4 e
6 [4 X! D7 i$ R+ \' B" N; h S J
; V5 ]6 m$ _6 }5 B( Q1 g* s& i( ] 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 0 r, Z& l1 {+ p. v7 P
- j+ l# C9 M G. ^' ~0 ]$ \ g
* t( V+ u8 j% n R4 L3 e% a% {
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 0 G8 H( P; H7 T- [8 ~' W; U
, x/ p) ^ m' g) h+ F+ [& V; g$ ?6 ]6 Q& |
( c$ x9 G1 s! ^ w; p
- W! b" @# g0 w8 | ?
6 ?* e' a, ]* o
& Y* D8 R2 P' B3 Y, x' l3 K
) O7 q) P/ {: ?- t8 ~, N; h7 ~, Q& C/ G5 J7 H( W5 T5 b4 P/ ^
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 \7 i+ W# a* D& p; A) }
- K; d$ y9 R" R3 o* Z' U
/ v- `. b! ?" S+ x7 n9 l
; K$ @& O) S* m% k+ E1 r- \6 }1 K2 d- W
8 [. t4 J6 @7 @/ f E; D- h" A/ Q, J' X
1 y/ L4 q4 ~$ y; S) U" \ " V# D1 \$ D' l: t# X
. v* S3 [# p/ o% a( m 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
, U' W7 I2 f' X& h9 L: q
% {6 ]" z; e @; A
1 P1 P" e, A# k# x6 i9 l7 `5 T " o0 K3 V* W; b4 x2 J
6 O9 m2 ]5 I" A) u8 w! N! E) N* n
+ R# P& H7 O! f1 X9 e6 Q
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
1 h5 s- w1 c7 H) f- m: H; C / U7 ^. @9 V/ a0 G D- ], }+ U
+ b4 V& w0 v3 y% b0 L9 X' C
\7 u' D5 W% \0 Z* v, ?6 U * C1 v1 [+ D$ ?7 @% i6 j4 [9 }
1 f- ?) V! F( ]
! P Z* ]- Q% u) L0 h' v4 Z * T: e* M5 \: [. P& ?# n' `' D
+ P3 y- N v! r9 }( v 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 & l" h k/ w& i; _" j
" \! y: I$ `" C1 @- d
/ @+ f( B) B6 J" z+ d. [5 O LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 $ g, {$ |1 e! w
- p0 X+ ?3 Y6 \, B4 m! Z3 a5 V: m# g: m% {8 ]8 x
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
- A7 a# X+ H" ]% C, [1 G9 c
2 X! ?- |7 v Y' j2 D$ J; g) g( u0 D0 }7 R8 w9 z: h1 c
开源的luasocket代码可以参考学习下 8 F2 s$ L" y0 ~3 d5 ]2 \2 e5 r
& l$ d4 [3 J& i8 v& ]) X
) R3 M7 {) y+ p& V$ B https://github.com/lunarmodules/luasocket t. a: R, q8 M
" n* f; Z! {1 O! }4 N4 \8 Y" y9 ?7 D; ?( f' d$ Q1 `
https://github.com/fengye/luasocket
' r3 [& S& }8 b W* Q
( K1 L( i+ E; w2 Q
( ^- v1 K, `6 t k8 j* ~% u3 } j
! M' G' g+ ~$ ]9 `6 n
" C0 Z7 ~* S/ u4 y( Y; q2 T# y( h6 U0 t6 n
v$ I3 J2 d; u0 Y! `7 U$ o
8 a# b( j( y7 y/ R' P5 F8 S+ |' E/ b3 ]/ G V- ?
# P2 Y( o8 y# t8 ]
1 T2 l8 u( U) U: M. o
" U4 W) U3 P" ~9 x! X) J- K% B 3 B$ p( p0 Y, J2 {, v9 t" r! g' @
- V0 F) g* l( v5 V
4 g( K3 @* S# c% B d 总结
& G7 B6 v( q' s/ l 6 e; q s s$ J& c, a3 o
3 ?) c; ~6 [8 Y- D 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
& G" o; t) R. w* B+ N8 }3 Q- e& e6 B J4 U$ {9 R3 s2 U' ^" T5 M
9 L7 {, R- @9 O+ {8 k8 W* r
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
% T( v9 p2 ?! o3 |3 Q1 w. C7 }# i ' a7 s* ]" g- B
; \6 K* f0 B$ ~% P3 m# _& J
对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
2 f6 c/ j/ u( p" |$ F 4 y+ S# B* x4 S& X! R$ s( T! `, y8 Z
( ?: d; ]1 P/ I6 _0 p7 T
结束
" \& r4 e6 g. |! X: J `
: {4 s1 B! w" U! R5 E
. }) B3 l U) u$ H E! j 【推荐阅读】
: Q1 g2 M f9 X
3 I6 @3 r, s+ g$ I e- j$ |
" Q% D: A$ S- Q L8 T0 Y) E 对吃鸡APP的分析 1 g9 H+ L% l/ B* T
/ F( }! X5 Q7 _$ O4 p# \
) n8 E2 c9 b* N. Z2 u. U 你需要了解的APP安全
; ] L2 _) ^' k4 x- ^ # ?4 L' N) X) A
% n. R! _, E+ ]5 Q3 y. x6 q
你需要了解的APP安全 - \5 C( y e8 \% N9 q4 t Z. c
' g, [4 o/ t! ^& ?
) }* g' r6 o9 Z! { B, J ) S2 _( d2 J7 d: V8 I
|