|
# o4 \" G5 E( N1 q- I
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 8 \2 \# z6 _5 \6 r. f
* Y, V# L. [( Y& b4 v. ^5 o/ H' O/ C
; w D* D# I" a4 ? I! p6 c# B
- D. o; J; o: x) {9 q$ [
5 w( M7 e) |3 g, m. D9 }$ c
, {9 U3 o# `# }" {9 ~( _
$ _# k; Z H: z9 E
1 {! R% S4 g7 U: I" i* s
+ @1 q' [+ a A) e* B7 n0 ] 下面就以开发者角度进行解析下这个APP的功能的实现原理。 $ M" [" x% U9 G( X( [ g
0 \6 s. P1 S7 P- v) Q. K( W
& V9 K- Y4 G+ ?3 ~5 D) p/ t, r; H. e
) b G3 C4 j) O9 z6 d 5 ~8 C5 b) y% s) Y
- A* _1 w& E. N2 Z 基础信息
& O) s" Q; L1 E8 |# b * [1 U6 A+ n8 _ M3 w
$ F2 ^# d$ ~ I1 H$ E2 b
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
' ^' F3 `* N2 c0 |
5 B8 \1 z1 A2 I3 l l% E- x0 d, s! U
! e2 w( T0 F5 {
: C9 H/ K. b, J3 [! J: K9 E
8 A y0 g) y* q 5 N) q8 T8 L" t: }4 G% [
) g9 T2 Z! d9 t9 r
. Z2 ]; M. [" M+ [3 D- {. m3 c; u 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 $ m9 x k# @3 i6 D
}, E' G5 f1 S- M; z6 E8 t5 g8 g8 |* P
7 a8 k6 n3 k' o% V! o6 H: [
6 |4 J% h4 G2 b7 k
) l [, v k$ |& M/ j/ Z& t/ c ( r9 j" y) |+ h6 v
9 z Z4 `& V" x( U5 j- D( x/ H
2 v+ S$ I- a6 H 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 4 b# T' {) x1 g5 t6 w! l& v
. w8 ?3 _# U+ k. L# z% Q& E
( v/ s7 E9 y: W6 r0 X& y
% t3 K2 `' z3 {* R+ a6 W% v
& W; h! X1 |0 j$ `* y1 z4 a0 Q
" y; O. ~3 `$ X1 s( y& C! a0 R
; P# |' b% o- v. g2 p
4 l8 @" \) M9 a 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 2 u' _* h; s+ k9 |' H O1 ^
7 S' v3 f7 _4 @0 ?9 I! G" e4 A( h1 S
+ Z) ~# f4 o% j9 d3 {
2 t& c9 Z: T8 |& g
9 S/ ~2 e# V4 z% l/ F5 A, u
3 l! W# }5 D) q1 ` . w! C' p x9 o) j% J9 w+ k( S
, I6 O" T* M( R. C, e
" J6 w* [ i% n0 k7 b, v) t0 s 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
* U1 f5 h/ A$ I& i9 d8 q J
% E6 i" @2 @- B7 W2 }
) r% Q) T! D; R$ V+ F: |7 \5 _
9 s: v+ ]" j8 a. b5 ?
- Q1 b0 e# J6 r9 q& x1 _( n z' {2 _. h; |; y6 O5 E
# Y- o5 H3 v0 I( P " M2 ~* U# Q; M/ ~
1 i' g) U" {3 [ S+ N
1 s$ e* t3 A2 R: h& a1 I* M
1 y9 M5 U+ n% A" E4 R k7 H
* N" \+ z8 G" }4 h; E( S0 S 签名信息
' Y- o* F8 [8 S5 Q2 n * L p6 \: h" \7 k0 v: _
- H. n4 i- u( ?+ D1 c 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 7 @2 N+ s( o0 ]) O
% U4 j, W8 Z! ]8 Z5 X5 [3 i
, Z% Y( U/ F# i! e5 Q, p 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
; y4 I; Z% Q5 b% x) P5 q
8 Z* w h, D6 t. g! x5 b! O) w/ C/ {, }& S) ^' E
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 & x4 W7 X0 H2 l6 p
& B) {9 o" m6 j. {$ t7 U
6 {3 W6 ^5 d$ M4 J' Q6 U% H % G3 z# ^4 `. m$ M9 O: D
4 z3 x4 E9 p4 P! j) B. S
: t# @- a! A+ A: M$ `7 W
% ?( P- g9 [4 X- y( a- p" V 4 z" r, J2 P7 J: B) j; y; K
& k- e9 D0 h* z
android签名的数字证书的一般都是采用 X.509的国际标准。 ' f9 k& A+ X1 z
: i: N6 I% l7 B, H" e
) u2 l, G1 j* p
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
H& {) r3 O$ R : I! @ B) c( }
3 L, Y( w* v, T. Q1 Y 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 , k; S# a6 q% m3 i8 x% d
& [% i+ d1 o: V. d+ o
, M$ B4 O$ t7 V1 p4 l 6 ?, X& T: N6 Y. [
2 C4 @0 l" }& z* t: u- G' G4 p! P* |, b' m; @
0 }6 m& T3 V& P $ E& M5 V% d$ n6 g; v( \% o' f
9 B, t- G; c$ h3 h. d) } K
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 ( z) f+ E9 Q4 b- Q9 X$ _
% M2 H$ I' X, ?% R7 k, l& D, P' a6 V n+ {5 j% O5 I
, @9 X2 a5 {$ `" E& w # u' |( F) f& ?* c& `
+ y. G* B( F W- t$ r 、 + i7 h; i$ B. m6 J' U
K" _7 @6 h4 n3 a8 r
: A; V* H9 z- [, S2 l9 z $ o9 ~" i6 v3 L9 C2 i8 ~( U
" u* I( E/ \, N& i6 Q
+ t6 P5 ^, a& L! o
权限信息
* l# |4 p0 F' h) d# m }4 i * r& B9 n8 P3 M
( R1 q2 p( Y& ~+ u/ D( W$ j
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) ) t* v6 c8 z" I" c+ J& \
' K0 n& O% j2 N. a1 C3 V l% S, D+ Q2 K, Z" c4 ]: p; t% Z
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 : A$ y0 c6 Z; w# e* J4 X& U$ ]7 y: D
4 } J7 |) F+ y& l
. }9 ?/ w" U2 Y4 d) v' _
* H8 r+ w3 k: E4 Y
- i# _( {1 Q( j1 X! G( ^( e
8 c: S! T7 I% x' n) H) [ : b& B9 O8 {( G' X0 b: C( W1 P
" ^/ |/ n6 D5 u: [
- a- L7 c( o: k# h! D. A 下面对这个APP的所有权限进行详解下:
7 ^) J+ j3 q8 M ) `8 s" F8 q# v& P* H; T- H5 s; f0 w
* \3 K' {; W+ B1 o0 d
android.permission.INTERNET :访问网络连接可能产生GPRS流量 + s4 i8 w2 p9 K2 H, W$ E# U, @! s
' m: C. b5 [" {, b
4 O2 Q3 Y2 L3 z" {0 c) x android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
: w& ?5 W: q. p
4 A, r: L& f4 K$ x6 Y$ l _' C( e' o8 _4 |/ d
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
S$ i4 y# x" E $ r2 q; N' M" U7 v, N; S" a J
( W. L+ r y b& x8 H& w [" m% K android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
1 W2 a" ~7 H6 x' \) h* P' S/ `
! M( N" p" _ F' z
8 {8 j. J' T! e4 ^5 h; q; h android.permission.WRITE_SMS:允许应用程序写短信内容
: J: D+ G( R3 [& u9 |4 {
/ Z f4 X, Q3 D+ Z! Y1 @( B x4 f; r2 c7 b8 o, B4 @5 t
android.permission.READ_SMS:允许应用程序读取短信内容 ) K. x( }/ C8 m: W' F- k* T# D: l7 p
6 U4 x/ d% T. _, X& j
1 r, g7 Y' y8 Z% w4 t% c
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 X# O3 K2 ^- L, Z9 d4 k$ D
4 m! V5 U" @, X4 J8 W- |/ E- k" |* a
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 & J; j0 z. L0 m' B; x& @8 y0 I4 \
# j. I3 b! g6 b. H/ X h, D8 e
) i0 \, Y0 i3 G* M+ R; L android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
! V' v1 F: g7 i' U- m & V t* }3 `3 J( U6 u
$ u! Q @' I8 ^2 M4 a) C/ N/ X! |' h
android.permission.VIBRATE:允许振动
) u( Z4 i3 X* g* s' y! d7 m& @ a
/ L) ^* g3 J0 y( z2 _
4 Q" _: z/ _$ S1 C android.permission.READ_LOGS:允许程序读取系统底层日志 * s" h2 _# Y" t1 D
9 L G" ?+ k5 R& N( g
6 k! r8 d6 Y' M0 i3 n
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
4 `7 ?! a( V" {' b' _( }
& c3 X0 {9 |" x7 G2 @" c+ X0 [ ]1 U4 c X; H
$ [6 f+ H- A* C$ ?
. j3 R" d% M' b4 i$ ~
3 l6 K r7 n9 @ 功能信息 $ f* U( J7 v; H, A2 o+ V& [) W
4 i- h2 G r% ?
* G! I. n8 ^ n" i% R9 K
8 q) ^. P6 i; a* X
P+ S. H* [1 E5 C$ ^: q: S" w% ]/ F
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
5 E& d. D1 |4 e( F ) C T1 Q8 w& I
7 v) u4 o. P( v; S; C+ n1 ^9 o Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
( P0 X/ s- g z3 k0 r; H- q 6 p: H1 M: T9 m) [/ H: K
0 e. \% A- h L% e8 d) W 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
9 i K/ ?' |2 B% h. a+ g/ g ) s W" z" _# C9 C; l2 Z
' r' w! A* c; K5 w/ p( W1 K( I$ A7 _
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
! r: N; D/ p; | 1 T2 J. E: A+ l. E# f, T
1 Y* [, N x0 t4 c( D' }6 y) Y
; X6 [1 a. V6 F; ]1 b
( h' H( e3 l2 T0 l: z- l! l# k3 L' K, G$ H a1 o4 k% C
& L& S7 [+ y( o7 u' h9 }! y9 Y; J+ h 7 l: R& ]8 T* e1 X' @, v: P
% \4 e9 |/ \( i# Z+ {0 S7 Q 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 ( C: S6 \2 L3 ]# m# H6 [6 h, F
+ H7 V6 N- n3 U1 h& [3 A N/ h
/ \. a r4 O: E2 K- J: x
x$ x0 ^7 x/ L( g3 f* [: G
) z& r7 |8 M6 j. o+ q( n p8 D1 y# D# r
/ T2 z5 ~% M. P4 v. E: G
; g* X p5 k: l% z& Y! B2 w' z: [ X5 ^" f* T7 R L; D0 B" |2 v5 h% q
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
$ y2 d3 _# C$ ^9 Z$ S # z: A7 M9 J2 G
* X: ^! J1 }& C7 H$ m: Y0 j8 k 3 R3 h0 T5 Y2 \3 U* h0 O
5 A* q+ g% R/ ^# R$ \ w# m" s9 ]
L* z0 z0 V# Z; Y" X
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 0 O* C. z9 j" `) [( E& G; N
$ A: Y) f' \* ]) b+ d1 F0 O; D* T2 Z# b8 \
8 m3 x9 R: T' D
5 n9 E2 R) R) A4 E5 _ H& R1 R0 \3 `2 f$ e# f
1 U' o: c+ h3 E. m
) |/ z2 q& m1 z: T/ I# a1 x, N2 w
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 $ ]5 d$ L5 F7 o3 o" N2 t/ h, ]" U
/ W- Q7 Q5 I3 Q$ K% d/ I
0 H0 K, R7 l5 Q. @9 r3 j8 L
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
8 x# d6 @/ I; N! ?) l
% S0 S/ ]5 D7 o! h
9 \$ T2 \/ d5 v, Z! Z4 D3 C 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 % o, P0 c' y, Y3 t. l) V
4 i* g5 g( h* `% S- h# L5 R0 K0 K9 J- }( r# M1 U
开源的luasocket代码可以参考学习下 % W+ m# t4 x9 a$ _, E8 s9 c
/ _% _4 `! \+ w: p' k
$ h: O$ c8 t- v; E
https://github.com/lunarmodules/luasocket ; R& I# _$ L* A8 I0 j/ o" K4 F
( j2 h: N* Z- p" G" ?0 g$ H
7 W5 C. b: V) C. j- G3 f
https://github.com/fengye/luasocket 4 O4 `2 ^: R2 _, s- K
! W6 K/ B) T7 f F6 ~+ W* ]8 _0 k/ ?
, R3 t8 `$ h% _! ^ 5 y6 E9 u# @, n
* v" r; y3 d4 ^
) ]. b$ i" C% I. k
& \3 d. A9 {* E4 Y3 E
9 G) [3 Y' F- r, O
$ P; N1 `. Y" w9 z6 c j8 ?$ W
% z8 H g# X, ^+ I: G
* k8 {6 X2 L$ @. I
7 Z. S7 D1 B u, L
, a# v8 s$ g/ n8 v! y. Z! O# o9 q9 z8 b9 \3 }8 w
总结
6 M$ Z' l1 b9 r. L& o, N9 y
$ T& t; [4 c' }7 t! S2 M5 N
) @4 M5 B% t3 t$ q8 a 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 . x; C) |5 h, ^. ], g6 c8 f
) W$ G- C! _& I! V
" U7 C( _) I) |% v! H! H 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 0 R) I1 E+ S4 a8 ]& X
( ^* V4 N# v+ U& R
. l# B3 }- N$ Y% g: U( @ 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
1 A. |3 \, z/ o9 i1 M4 ?
% V6 {7 \+ e% w3 c" }- a$ u( F8 }) N6 @
结束
" n+ d {+ ]6 g6 A; c ( ?9 [3 H# ?1 Z% G
! `; P$ W3 G4 t4 o 【推荐阅读】
; w7 Z4 E3 c1 Z& }1 U# V6 h0 \ : F7 i3 s( X. \) f1 G+ T
# o& j/ I5 U# W ~ k" ?, x1 E 对吃鸡APP的分析
1 m6 T3 V/ {) v! g$ | ! W$ i7 ~: e1 A/ p7 S
* r) W$ Z/ q4 j# F; [3 v; |1 D 你需要了解的APP安全
) X! O+ J) e$ k. }/ D" N3 o: _" l " P3 _4 ^0 }. x4 Z5 N/ z
. c3 ?$ v# y3 B
你需要了解的APP安全 9 Q' z5 P' o: `5 |1 u
: q" A. a0 F C8 D5 F0 H4 A1 I
, i( B+ A& o( h2 x/ S: @
7 N) t1 m. G3 l) N |