' U, d; j% e I5 V* w) P 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
% z- ]- G5 W \ b3 \
4 U% l {, z; l" h, N" ^1 l' e
& k- ?1 t: x6 X! }9 P6 ]8 a
; I6 h! B5 I1 _& n6 E1 U( c; }
6 u% Z' M1 }- X7 k$ J6 t4 K [5 @
l8 }% p9 B5 P$ D( x2 Q' O 3 O7 |3 j. S' V3 Z
/ c8 g/ f4 u& [+ o( p: `
: ? {/ {: S/ c8 L$ l 下面就以开发者角度进行解析下这个APP的功能的实现原理。
5 u! P- w; g* ~2 Y4 i' w 0 X' z$ m+ Q3 [( d' ]7 ?- d
o' B# S! L. B9 f+ h 0 E/ ]% a6 u0 m, u2 O* I$ q: D
% n3 m' Y# H; ?; g9 A
) }! Z; ?; Y9 |) u9 s3 v! {
基础信息
) I8 Q2 l6 ?; B
* q: y5 H* H" K7 Y- v' U2 J
! a* @/ W: ^ k4 z7 Z2 W) T9 V& O$ Y 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
. D' r" u. Z1 y9 ~ 0 P7 g0 e8 }4 F8 c
" P. @9 T5 P* C) a; x! M0 Q
9 H1 L q1 B8 r! h8 I
& Q7 H1 U% m b8 h" l; n" z3 Y3 z: F; f. f
+ e5 _7 Q r) j6 T. v ! i/ g# F* K" }' u+ Y- E5 L3 G
$ w$ t% e" `! `3 k6 Z3 m 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 * v& Y7 a; i5 D% a8 j) H5 w$ w! u
9 m$ H" Z3 {9 \% d A# J* ~& s
0 r q, ?* l1 i6 v
2 J$ F$ T; y0 k3 ^5 b) k ! |9 z* M \9 R/ l9 L
7 S* v& [' }$ k: W& D0 c
3 `3 j A5 C8 T& {- E) m' o# | * c6 s5 c' I: J7 v; ?- w2 h
$ f0 j2 E& g7 t/ S3 N# |" N
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 , q0 B/ c; ?/ U" ?5 h
% e7 j# x: b* J
5 T3 i9 P- z' ]- p! I4 ^ ( h/ o3 x: b6 @) w
! M2 |: T+ a4 g D. w
y% l' K3 d6 R ' B# \& z" `8 d! b: L$ h
8 v+ P- K0 M. E( g, L+ m" Q$ D/ o
+ v; p$ u+ B! P% k 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
& |! [; E) N) d% Z
8 g, [4 ~6 g( D" x4 l! s0 P) t% i$ ]% l; D/ U& V
6 S, e) v& S+ p0 {$ f5 k
3 ?, \! q+ X+ \. w6 r
0 Z4 i: G7 C( `4 G
4 {0 b' \- D% m# Y& z" X( g& ^ B
! n; \% f. m" m
! w7 S/ A: [# Y, W0 X; N; g; m$ z 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 5 G. w# o: m/ ?
8 w0 `9 I5 l* q: U
5 U, T! }% M" g$ e3 _& ^5 r2 G8 h
, U6 P6 W3 g/ v2 y
q1 f7 F" b; y) t: y; F
! P0 i* W9 J) k9 o5 V , _- u# m3 i4 ~& R: K
2 i$ s2 y/ J9 @$ m$ L( J
2 j9 p' L5 q( L: X2 O' O0 Q / R0 \+ ?0 b7 c3 |
* ]; _( ~4 U W& g, v7 u+ X+ P8 P3 N
签名信息
1 }! S, a" {1 x
5 y( J- q. `% y+ O: R7 U& U* ~4 ^8 M' _4 }5 v
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
1 H; c' e4 J* N% i4 Z& k5 Z
9 I+ z9 z0 q1 ?( Q5 ?4 F
" ^2 a0 Z2 r# L. |) ~ 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 & |0 u1 c9 ^1 l h* m
0 u2 G4 G. O2 o( A0 X: d
2 f$ u$ \( a$ V+ z- Y) g" W 在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 , g' O7 J1 Q! R. p3 W# v
2 _. ]; ^/ W/ o! n/ Z# l+ y1 j6 A. @6 H& L) A8 Q3 I# V! o
, j- }3 L: G0 V2 e5 ^* Y $ E, U' p# Y E
, v; n* _ ]! C- \. u
3 V: d7 l" ?# |2 R, ~& G9 O
" Z; I1 w' V7 m2 h7 z. r$ l8 X& }
+ K; a+ s2 e: t# E( x* w android签名的数字证书的一般都是采用 X.509的国际标准。
9 N9 J# B2 B& n% G- r
7 B- D6 m" Z0 l
7 }! i" L5 J2 p+ Y 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
6 h4 T8 Y( ~" `# Z
2 C5 N' L# c! z0 H1 H. r, f/ [3 L
: V% k; [4 B/ r w5 [ 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
5 ?2 N D. a. M) K2 R) S. ?1 S7 | 0 w2 X6 s& s2 s, `
) B6 r! }" H4 w) @/ g" _
- [8 ^- i, c1 @: N & B" ]" p/ B* {* f2 M6 ]
3 |7 N4 \0 L& T8 Q0 j9 p) ~
& [% w, O5 O; Z- u
1 Y7 e8 G% x: u5 U( i
\, V0 i7 d% `5 t3 Q 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 4 S' k4 f! l* y- v( N+ i
1 T9 a4 I5 O6 H9 A
6 o8 o# n [' |8 ]9 o
+ j# ^# ]' p; F& l$ X4 c" x3 G$ ? ) ^+ i Q* ? B8 `+ G9 a
; f I5 S0 c1 o$ M& ^( e: T
、
6 s; f; R/ H0 Q8 R! w' N6 P1 y : W& c. h* t0 W9 |; V `* M
2 _+ U q' i% i; _
& _ j* o, v2 v6 u 6 L; [3 @7 _( N( x
) B' ^+ G0 s* T 权限信息
( m7 \3 c) e# G5 {2 ]. N2 |6 L 5 a4 q6 ?' Z4 n# L z1 X
: e$ H( S v( J5 b7 I
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
0 v6 B" {6 D$ D 0 H6 s7 r U; G1 s- D6 D
* A$ p, q- L1 ^3 l) R; ? android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 8 s6 _% I4 d4 t/ x% n- U
5 I0 X9 b1 D, i+ U0 @
: ]& [# z. ^% ?% q, m2 ] ) k* l& ?9 ^8 ?! r& H+ J) x4 j$ o
' b7 q7 V1 \" @, L# \4 k
! Q* R. @* t1 v9 C) Z+ Y. p
8 s ]" `9 {6 [- Z/ v 5 a/ y# p* f m9 b( O
$ j& t2 p3 T. O+ E5 U; [4 a
下面对这个APP的所有权限进行详解下: : |2 E* P8 f* ~9 X' k! F' W: m
) Y1 b( p" C& p- u9 Z3 f3 u" G/ C7 e6 p# \& v
android.permission.INTERNET :访问网络连接可能产生GPRS流量
/ c" n+ _( C! y# V9 h' ~ . g; G& v9 h, O, n H
. Y) U5 L, r1 R; |4 C5 t
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
5 Y+ m( p5 W2 T4 J, l
% \, w( W9 b, S& N" w; a5 e o% Z
- }- y( w/ v$ y. V( U android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
8 @! M9 b. Y; G6 }1 c' W# a6 F ( S Y$ f" p2 Y" b
3 @, H1 o( s T7 t; N+ K6 F
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 5 @7 o/ a8 I/ A% h# \6 s$ S
7 ]# b+ z: L8 p+ A8 A+ R
) y7 q; V% W; u1 i$ d android.permission.WRITE_SMS:允许应用程序写短信内容 0 h0 D3 e' w5 r7 w+ m% H
4 ^3 N/ T% X6 V8 p+ Z0 Z
5 G" v/ B7 ^% E
android.permission.READ_SMS:允许应用程序读取短信内容
: ?2 u/ O7 V. j! v
9 L! x: [0 v$ l3 t3 Q$ {6 j: I- E! A4 B' J( t* s5 p
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 . b9 f% T0 H1 P2 ?8 F% j8 b. z
5 D$ ]' t0 B8 g3 P8 Z7 i
. Q: _' c% c7 o
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
. ]) D- F1 m) x, Z% Q8 y1 K& i ! r4 ~$ C0 X$ Z
! q% x0 L# D2 G( E! Z android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 : k- W, I8 c1 C
) s/ F9 F# c. Z* Y* p
' _: h0 O1 v4 J- F* c# w
android.permission.VIBRATE:允许振动 ' |' a6 A \$ K' W6 B# [
9 w& h) v! o! J' M/ {+ d/ b
) l; T8 |; @1 {: o; R' \ android.permission.READ_LOGS:允许程序读取系统底层日志 $ s) J+ F) Z, G: \
4 O0 l2 Y2 L l" \; e
# T m1 m& H+ o- o
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
6 ~1 Q8 ?, v. w0 n" s" t
# S6 a2 o6 E1 K4 ^3 p2 \: g- C2 ?6 i; r: p/ Y
" u, ?* f4 g) ]4 \9 k( t6 w- H
) E# U7 o3 a$ k2 @
$ B% A2 K% d% W7 h6 a 功能信息 0 H! t' t. Y2 X. }
b# H9 v* j+ D+ ~ ]" K8 W; |3 q# s# F& @' _3 h
* t$ O/ b2 j. W8 c! E
7 @% T! J( D* @/ D0 M! M9 G; G5 ~, H! I( N9 S: j( c
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
1 q3 I* w0 e8 T. Q) Z 0 `: ]& a' c" ]: {
0 ~* E0 a! Z' p! |
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 7 ]8 l6 {2 `% M0 m. f
& ], i0 O" T0 X, w. @+ n* J4 \. _/ K
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 : I, E6 X$ w* a8 U+ p; |
- H, _9 N; B0 v; d9 Q, y5 g9 E* N4 K. @; Z. T+ ~. y! H/ m9 ^
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
4 H8 t+ {$ P- I) D' l0 d, B& s
/ r3 k7 |8 R: i1 e7 t
2 c; s6 B: \5 { c 8 i5 |2 H/ U m% ^
0 l2 A% [" m0 b
* W+ A; o3 I! _9 v( v
/ G% N' V# h: K& r , G' B9 g( l/ W, e% m+ t0 Y
- C# z+ _. L& H4 V. H; q9 H 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 3 ]( x: _6 @6 V2 l( o
) G# R7 _* |3 d( ]8 u
/ S3 H9 F' l3 O- m6 b- i* f
" _* T% j4 E# w
+ f+ t0 A/ s# [0 n4 U) }- A
3 d8 b1 k1 ?3 i
O7 f! b2 F+ E# ~
( [+ q3 T N0 p3 I- M: _
% V* V. F0 M4 f6 V3 v 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 5 J$ P3 L* F' y1 s8 b0 ]
" l9 n5 |& q2 m$ s2 ]& I; q! o- C! {
x# W* h I, u' _8 {* g3 P; K : M, ^# _- A1 b4 K7 D) U* {
& s4 l/ ?' l1 g# Q: y1 n1 w
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 , X0 C& b' i; }& k* ?' y
% F* z' h" ?) ?) S, n5 y& Z$ W: X7 |: L
2 ?9 q3 t- B3 f# f; v' \5 F 0 d2 k* Z" D: l M4 T m1 A
* T: S0 a8 o& V- E9 R+ q
Z$ ?* t& C( W3 q" s' ? 8 `3 F1 q: ?: ~; a. n
" V; e) X' t8 z! e; n; | 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
% F( z0 ]; x0 y4 G; M5 { * {( _) v' {0 X- O8 y
3 v. L" w, J9 L9 V* N4 R9 L
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
: |/ b# X2 l' `2 y4 C6 Q3 Y) w3 q$ O$ o
* R$ Y8 o$ k4 v* o' w5 M
& l$ F9 ?( W; H$ N8 h K 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
" l1 H5 S- w: b( ^4 s3 y# {" ~! a: K 1 ]' b! G- K4 r
& U: O+ e$ G6 [% {/ q& k: Y 开源的luasocket代码可以参考学习下
: h% y* Q6 ^: v' G% r0 h( S. |& b8 E
0 D" z! D+ c+ \4 V/ Q1 F" g* I7 v( i$ f2 y- [, t# b
https://github.com/lunarmodules/luasocket ( H+ y3 [ `% B/ z8 q1 u
2 c+ H; H# h7 e/ H# w1 w% O
- i |% H/ m- P1 R6 w- q4 @ https://github.com/fengye/luasocket # U+ h/ v% l; j$ w2 D% y2 j9 A
4 ?$ `- K" B/ e
9 b6 h7 S5 o2 J/ N, h4 h $ o0 S) L2 |9 N, x0 R: n9 P+ c
- |( l' \9 d8 n* y
& F5 W$ Z4 n s7 R9 ?+ S5 q) z- j 2 z2 h* i1 g8 e; u, D% t4 q
" O) T+ L4 `. \" c
) v% k8 s9 L- S& Z . c. D( `# ^" L: Q) C5 N9 u
' A8 B, A, U- |
8 h- a( F7 y7 a9 y2 x% M" ~
4 z# Y1 h/ o5 ] 3 [: F4 X8 s6 B3 Z
: M: [4 j1 g6 a. W4 g 总结
8 a" \8 ?& Z+ k8 K! L% X8 K
, G% D) r" } U; C8 b. q% K% f3 a
; T+ N5 R. Q* J$ a9 r8 Z0 ] 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
) q8 o- E6 v' }3 f. l9 q& t 5 c% Q& h" W. [3 S2 ^5 J6 [4 G
u& F! M0 {! W; L8 k, i7 Q# a
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 + u/ o' s8 [- \
, b/ Y* m* u! K- Q8 U0 c- s8 C; j
6 {$ X. R" E) `1 `2 I' D+ d 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 P ^( n5 @% n1 \6 E
5 Y+ s7 L5 \% A$ r
/ m7 i8 l6 N' y, }2 |- M- S9 | 结束
: G3 c& t( ~' {& q $ ^8 F" x0 n/ b# s, x: T
6 l* f" c# s/ S7 e( F3 _1 X4 }0 P( U
【推荐阅读】
- ]0 t. y6 W, f [+ b: P , l. }/ H ?& M1 I7 ?9 S2 N4 u' @
& j' C3 d' O! [5 B
对吃鸡APP的分析 ! h5 k+ q" _; h5 s- e8 g
$ e4 J }: B! Z- X( h& ^" C. d4 r2 Z# l- c8 X$ z1 K" ^% S5 ?
你需要了解的APP安全 . O3 u) ^2 O( [- _" _
6 E$ L- y+ _: P; I
" |1 F* Q0 N3 Q# A- s0 B" b
你需要了解的APP安全 6 [, o6 J; p$ {' ]2 Z
8 J/ P" L# m. c' l7 W* K7 L) p, Q1 e% j7 S) M' T; e0 |7 x
, U( H$ j: n, [2 E# z& J
|