|
: A' ]& E% X0 i; ^: q7 l! x% n# k 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
) j$ c' I5 b! v) w' I* e) ]# Y) S) X
0 }. Q! R) F' ^- t8 k
2 x; Z0 _3 a+ T w " A4 T& u" K/ ]. N
6 P: v. S8 ^1 Y3 s
) a/ {0 c0 X6 p! L5 k5 V
* P, f3 L# w6 y$ @' q
- a; i: k0 y d- M K1 N j8 {$ L- g& } z4 k9 r. M; U
下面就以开发者角度进行解析下这个APP的功能的实现原理。
6 ^8 z4 u# g+ M: R$ w0 w% T
! s, F- t% H% J/ G% q
% i; t/ n& K: C" Y 4 W; S1 l5 V* J5 |) R [3 g
; n* E' ]; u& U; b/ T2 r* f* U$ q( N* J
基础信息
" r( T3 ]1 x8 p1 T* z# M7 C5 C
" t, \; |" V4 K
" B, }/ ?2 s7 v, F1 x 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 ; F- y% U& A- ~3 x7 j( J
' r9 |% ~" J+ v; K0 m* U' H7 v: g$ T5 a3 @( r
4 M/ [' O6 l. a. Z+ ?5 X
. J) m/ I* l0 Q: f. M
# u6 [. J- h5 w. A. d # A4 \# V* C: H0 R! A( h. ?
) \6 C3 z& Y! v( I2 [) z, I/ L4 f. D/ y, l' ^3 l0 X3 m8 X
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
+ z3 b. v9 I& P3 i" [6 i5 C, O 5 n" Q7 c; f, B) ~9 N! m
7 I w7 T0 q) \4 h! s$ g# n
1 T4 ?9 X) N+ b ! }. L! g' M& x! r
% n. H9 a2 _ D2 B: P a! l
2 J5 H+ l/ R- _# ?
- j7 y& g5 k& n8 G/ t& D
* M7 |2 f9 M) H, P7 v5 [ 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 0 ] i- T) s# L/ e
+ }: E1 g) h, o* g' s/ C0 n+ N: @ z5 c9 Q) a5 T
7 P% z$ ] a7 m- X- w O
9 l: R! _- v0 u# K6 |6 X* V- C1 B$ R. c: E) i5 c1 y
/ A* }( X; N) _ ) y) C( s7 F6 B9 r2 W, W
% B0 X' o: W" ^9 q7 O
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 % P6 A! ~ o" r) f$ W: z
; `" k& S' k5 l
1 Q! s* H% s8 n) h5 w " f0 f/ s* S% s+ R0 Q; y- a2 v
0 H0 g- r7 v7 q7 r/ y8 K* A# v' v
# L- @/ c+ F9 ^" n
( R6 x9 {8 S) r0 i! D1 G/ h$ ^
4 V6 m1 B) L0 g0 Z2 E 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 1 v; j+ M6 D" ^% D! V f# Y M
& L5 v" Y/ N! s* i4 ^8 S) |
+ g& h G5 r$ R" ] 6 f: Q! U. n( M7 }
. A: l. y1 }; @" y
: V" a) J& [# k4 _! ^$ b & g* |8 G- N5 O
, }8 L: B# K4 @
$ H! Y2 F# _) m7 w' u2 K" Y |6 L) ?
/ D R) b8 u* R6 m! } * I6 h: ^- \! o
7 H$ Z5 ?$ P! \" {+ c) ?
签名信息 4 j" s. j, }; I% _6 ~. }
- {, M. k2 H; ~# \) H
+ b6 ?+ I0 ^5 s1 u! g. Y6 a7 D
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
- N( q9 e; O8 h4 K% l, a, U
" A4 E0 [% P, \* L& b( U
7 z& n3 d; B7 J/ r* ~ 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 * D; N1 A( t$ @0 k: I. A' t) I. e
7 H7 n, B+ R5 C3 A8 y# K0 i9 X, P3 n8 E1 G$ |. B' y- l
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
) _0 \' W# o7 |5 ]2 H& l0 V
- [1 l7 | ~$ X8 W+ f3 q, d) f6 p, y, ?% w+ Y, m1 ?
4 p' d |" m9 P: a1 Q, B- m
+ w7 x, [' o0 I& G0 p/ t/ u! o
k' ?. }4 M1 w. E% t
& h8 ^) D2 S1 X" I6 i) ~7 J1 u " v$ D+ q! d1 ?' s8 W) Q, L' k& A
% `7 W% p0 y8 l" d android签名的数字证书的一般都是采用 X.509的国际标准。
* M6 f9 z/ D) |1 {+ U' k8 J & X5 I) |3 G9 L! ~1 s( b/ S
( c$ B* y& l& m" O
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 ; J6 L/ J. ^' m3 v
7 m2 l ?4 T4 q, Z) `6 d8 c3 }
) y. y) J* W; ^, |# w4 { 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
% I1 q5 V* O8 l 0 b2 B% ~, H: g4 v8 ~2 L3 h+ J
o- }8 b. T% r8 [. ? X2 | 3 u8 p% F% b* A" ]& t" I! u8 z
1 e* v7 z; Z% F$ W/ u2 x& K8 V1 K' ~, T) v& E5 [
/ D* |3 `/ u) R
( o' I8 Q% W4 e7 A' [% R# A8 p' e! H) j6 w" E; C S+ Y- O5 H
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
$ Z' t& j! b) r0 n / O4 L0 g8 ~3 |& ]. q
! J: E$ ]. T& N* t( m' b - \6 o. u5 [7 L7 r
2 t" Z$ o% D& L; s2 f" g1 C, t/ R0 D- I' v4 K
、
1 G3 }' E! z$ ~. e# c0 \& r / ]" h% ]. n2 d* n q
" J w- [* l6 V: ^7 m- A # \& j) T6 H7 E* v
+ h" y' @8 B$ F, _ h; J% H
, @9 O" L/ }' a% w8 O; j 权限信息 ' q8 i& K6 ^, G. Z' z3 P
6 K' E9 ]) _! P* F& c" T3 q, N: \' c* G6 t
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) % P+ b8 c6 T8 e0 v3 q
0 ?% u. d, m5 S' Y5 Y0 q) q# F# H
( s# L7 E% o' G. V+ {5 F! f# |
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 : E# b0 R2 w4 [4 |/ E
: u; i' i7 ^ R0 y- Q6 B, o! R& s4 v7 ^5 s9 t# E3 e/ X+ g
& b, @! C& v' r
4 R* u) M- o: C1 c9 u2 ~: h
% D3 o& \7 {( {, d9 Y" a
6 b' E1 ~! `! k0 o
3 s" v' B0 ?% A% k) h8 ]" {" r( t& C5 [5 K% v
下面对这个APP的所有权限进行详解下: ; l- E9 V" }; n- v; `' N7 j) L0 u
' Y! M m8 B: Y8 {
4 J. N, P# U+ u' W5 ?2 m android.permission.INTERNET :访问网络连接可能产生GPRS流量 4 [# y& l4 K5 n3 b6 n( l
6 t7 B" T& [) \. W
3 r5 W1 }5 p) O+ j r9 ` android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
' g* ^- N$ T# R+ h. _, Q) ~; H
, C, G/ G& b! S) K t( m5 _) U, i
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 1 }; }/ a( V. {4 t1 s0 `3 ]
# R7 c! B5 ?# }; O- B
/ a) J1 Q2 D7 m* N+ J* o android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 " N' n1 q3 k; L. W" Y/ h ~
, R; H+ k. \( u! F/ E: B3 H
) a' \5 v% G4 |, ~4 u! U2 W
android.permission.WRITE_SMS:允许应用程序写短信内容
: g- }& D2 B% ?6 X& v! s
r6 }6 _3 @$ G6 ~# T6 d5 h- d0 Q1 H2 Z. R5 ~0 X$ F1 c7 v
android.permission.READ_SMS:允许应用程序读取短信内容
9 w, S( k* c2 K' B # ]' k8 ^6 l1 Y0 d# ^9 ], n
7 @9 u; s, o6 j& q1 O
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 3 i6 n7 ]* g. A1 _8 ?
' X9 }) u6 w3 q, D9 E) o
) Q- d0 g. @: b! P8 V( F# f android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
' e% K& Z7 V) |) k 2 n: ] `; F8 Z. n( e5 X$ ]
8 D( B9 @7 ^/ f! y" D+ D3 ^
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
/ H$ P3 h& [% o 2 G4 Y) l1 J( `5 q6 k& v- r
+ t! K+ s" Q; y* m& ]1 I android.permission.VIBRATE:允许振动 $ Q) y& v1 {% C) N0 h4 z2 r w! [
( L( l4 B/ `* P) E$ ]
7 X; @1 {& B8 ~4 |! M4 ^( D android.permission.READ_LOGS:允许程序读取系统底层日志
/ a- v, g3 n5 X ( s- N+ P! h! m* }
" }- C, p3 h( z2 E& S" e
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
4 `- R. E3 z% o/ L! L# {: Q' Y
& Z# T0 t* @! R9 z( p" K" O
2 o- l+ D' l* S6 J U" I+ V8 T/ }& @+ v % `1 j0 ^2 t+ g: a, g. B
. Z7 D+ v8 d9 [; i5 b
. O1 I& H: V/ W' l8 o! R0 C0 y/ \ 功能信息
; f' D. K* U" e6 w. m
" L' p7 k1 T% E
2 S& X& `5 W, N) e( ~- B5 E, F
O; C2 ^/ z% q- S" N9 P 8 Z$ \ Z* p* r, X( r+ R5 {
3 U9 H, D( U: F' h 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 4 A' f9 T0 m( o6 A1 f
* C+ H' A; T% m8 }# O- Z
0 A7 C1 J2 t. I
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 & b: G6 ^# @; ?
% \; S m& H' }$ a' p6 X* l( \% h0 v% r& b9 _0 B2 T& {
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
! ^# m& g* t+ m( ]
; P' U2 Y5 i- D `: k/ z# }$ }
- C0 h! U! C5 b 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
4 R6 f6 {3 c1 \- Y & p! z& C/ a7 g/ j7 B2 D" k
K7 i x) i M# g# W' B
( k8 U, A; Z& o# d; j9 g
8 }6 V! s" l/ ~+ |% q
* H7 P- y. h; _
4 @% F; s1 C+ P2 U0 g- N' r
8 L- z! ]: z" I j1 i- V; @( m* X/ m, k- A3 E' V- W8 T$ w
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
; p3 i+ u+ N# w" W" I
5 G: ^2 ?6 r/ t: n5 @
; J% h- K9 l) H, m! n+ M, r- _
7 \7 A' O# A j
9 k1 I$ [$ Q5 a- ?) n8 @( x7 t$ O* @0 |
5 J9 B+ R! B* w3 { - G7 V4 a% |. m8 g" D
& ]' @9 o7 W9 Y% B% \! K 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 6 O+ p' U: O6 ]& P) X
% J9 l3 G8 a: F
" ?* r2 w7 B9 g1 z" |. p
$ r6 l8 t* ?# R ; }& i4 Q: J7 C& |8 M0 t
0 }! }9 `/ V% X8 `
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 / t- C0 Y& e9 e
- F. V. A0 G4 `" s
/ L! U9 Z# W# Y2 D& ]! g 4 p" w2 ^# v' [8 `7 x; t4 f( W8 ?. M: F
0 X( x( j4 n: N$ u
e1 F9 E" W: R- l 0 W$ x1 Y0 y% A) @
6 [$ p- b0 g) V5 k9 U) {# t$ k. N* \. w
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
: V) D% q. h) N. k 2 M- i; C! \/ Q$ `. N
2 p* L3 ~, c2 e' [6 N: R LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
D4 [7 K1 l+ q. V
5 f$ o( s8 z3 R$ k( y9 _" Q' ^4 g' c6 U
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
' p; l! V6 @: {. U 8 j( h( x }0 ]5 |) C
; G: x0 K0 @3 q) ~" {$ i6 y$ Z
开源的luasocket代码可以参考学习下
# S; S, K7 I/ {4 a& V( m& d6 v' L
W$ Q4 y& q0 n$ m0 Q3 Q
& A; A5 P: c+ T https://github.com/lunarmodules/luasocket
; R9 O& g) g5 W5 d- `; F! ~' @
" J$ i+ E9 K4 N$ u1 {# X, v' g, u2 \8 M9 x$ ~6 i3 V8 Y
https://github.com/fengye/luasocket
/ `+ |5 {. L; `8 O4 e
7 [9 m8 b$ P3 Z: \3 D/ s
7 y1 }+ g! T/ M& V ! p3 j/ {% H* V9 P. H. W
: r- b+ S! j0 @; F: `# n; ?& {5 T
7 t, w9 l( N% ^9 v$ c( X, U& Y
4 k& M, e4 n: O( Z) u9 _6 R
- j9 T9 q& d3 W+ Y2 ]
; n% b% S' e* q4 h K
4 d! N" t' L. ^( m6 j8 R' M# Y9 r+ a5 F7 m
3 y6 I5 @8 x! B: B
* Y" }# b8 t* ?3 y
" ~ r+ u, Y5 n6 [4 n! p
总结
3 A& o4 t+ k1 ~, D7 o$ O
+ t- R0 w& k8 `& g. I& e
* ?, T7 Y* Q4 k( c* O# P 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 - t; ^7 O; Y: S; d, {
' i/ M& W* _* h4 w
5 P2 b2 i3 _$ F+ l
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 ; D) o! Y$ i, B% L" i
* I; K1 f% T" n) t
2 X8 v ?6 S+ g5 x 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 : L4 |5 K6 s- K; p6 i6 q Y; \
2 O O) n' X% Q( k% p! e+ y5 ?' |8 t5 ?$ A6 ]: b
结束 $ p- g, U0 m; }1 Q" w
3 L) X/ @7 }, }( B/ ?
& x! R9 e3 s4 T$ L: e8 L% K 【推荐阅读】
) h0 K6 H, c' G! U
3 P9 R+ ]. }5 }/ ?" G
: f1 z; r* ?3 N3 d; c$ i/ J! \ 对吃鸡APP的分析 ' S7 ~; ` u& g" Y1 {
. {/ L$ k" ^: z5 w' u. F
+ z5 Z/ ?. P8 {' Q* [
你需要了解的APP安全 : l4 r3 ~1 s( w2 D
& v D) b/ P% d4 m8 U8 O- E3 x; v1 u! _" _" h: `7 c
你需要了解的APP安全
# B$ s" T6 D; K; w r 8 ~/ P0 j1 @2 e) X c8 j v1 }
' o( c+ a! N0 W: E
. |7 V1 O% w9 {! x1 x |