|
( ^5 {- t0 r, H6 f. o: {
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 # F, F3 ^- Y$ n9 ^, H7 c8 l* u$ S
+ }; c) Z! H( M6 q0 N8 m- c
+ R# T! n- S6 U D+ p3 P
3 l) H3 [1 f9 L. D1 m2 J & L! q) ^5 K2 i
9 h) W' P2 ^; `$ Z
1 [! T6 l5 U+ W: f; E
8 g E$ v$ J$ e! T) u
. ~ X9 q/ b8 k. u& |' W2 C 下面就以开发者角度进行解析下这个APP的功能的实现原理。 & ^8 N- P: s1 q+ C6 }8 ]
: J& F' C8 I. V1 V& H9 m" M+ |/ Q
& ?" x4 w- C2 e7 o* S& n
$ b/ x* s) X0 y2 c& K, {2 A$ F
$ \& R6 q% A/ G
7 S' R! Q( @" ]; y# e9 e 基础信息 ' q3 @& |0 Y% i
& i; O' H3 T. r2 @$ C
9 c7 v) ^4 D9 c
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
* O3 G! [2 J7 j, r 1 h6 d1 B; u0 U5 ]4 c
3 ]: \8 }5 A; x
5 R: D* r. T/ k; Z 8 j1 X7 c/ m- f, J, a* m+ k# O. q' {
# I$ n. r' h( L2 g6 {
1 f* \7 B) F9 P5 V ~5 \6 I0 f
' b. `$ G0 k9 e- S8 W
1 ^# ]) H" J! P 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
* ]# R4 u/ t: y3 Z! H& } + G8 R/ L3 r1 e
: G1 w9 r, c4 L' |" w
( ~5 h m% ]$ p7 d4 @
$ ]8 Q- m" I) S' r+ S- z0 x4 W1 \; s
8 z+ m7 }( @% |% e
+ ?: x P9 {. r8 g7 q6 c* J
# J* S" M! j. E# I G 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 ( ]0 O0 i4 A8 d- q$ g
: g4 f, {& D- b( W o& W6 ?9 Q ]
% G" A1 M% D" x& I
6 F8 k, a7 F, H* O
* ]7 V4 V1 b1 w# q2 Q* y1 ~2 n3 L2 g$ \& q, c. E
8 U' K2 t1 j. t
+ J- R Y4 n/ s0 Q( s
. Q. S- P) O+ h' O 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 8 ?* K3 l8 K6 c, C& ^
$ y" }# r( r! Z6 ]
- E0 R8 ^& k! P0 X) E ) M% r: B+ H" c5 A& E2 D, g
0 }3 O) c# ]# e& P3 ?1 Z
: ~8 \5 u) R* A$ {9 V
& ]- ^( v9 v- f$ d. j! I
- k/ l# ], z) Z8 s8 E; ^2 T$ ?* z* q
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
6 c0 \ i* L9 H s8 V6 G. Q, T+ C: |
1 d; f* x2 l* Z, c5 ]
/ ~' [. D2 W, F! X
, A1 T7 B5 F6 w/ z, M6 [0 L8 ?
7 x6 V( r3 @! Y0 h; o! I ; Y' m6 \- w1 I, Y7 a Z6 c/ A
- V# I6 r2 I' v8 U5 P
! O# F6 f* N& F' i! Z
8 ?$ ?. i/ n5 I# g e
8 A% y6 {( ^! u/ m- p+ \
7 Y5 b* \+ \3 v; x* P
签名信息 7 k$ U/ E" A B% o3 T3 j
+ k6 ?* q/ a$ E
( L- b5 a: H; ~, b' q4 P+ F. w 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 2 g- I9 y1 _* S# c& q
) Y& Z9 e6 \+ `, c6 P ^0 G
- n$ P6 C1 p8 q* p0 c/ ]* N 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
9 J% d7 w3 @5 T% g/ o( _
; ^( s+ u" p8 z& Q! c& u C1 W1 s3 t6 q, P4 p6 L7 `# l
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
7 N' y/ U7 q2 g ( ^# x" x& k2 D/ n
( W+ Q0 \/ ^: z4 @
1 [* ?! x, v: Y8 ^: p3 y
1 m p3 f8 C$ J/ G- y' m" k, c* u0 X% g( Z
) f: @% g- ~! p) h
* D: a. \ `" f9 d i: W/ t$ n0 d# I! u9 r3 {( j
android签名的数字证书的一般都是采用 X.509的国际标准。 + s3 C5 N8 S# |0 i! M2 a$ D
2 w3 n, m" k3 X" s( o" T) V6 n; M/ p8 B
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
J6 M0 {2 l& a9 j0 `. o0 B0 n
; I4 s( H) u* d1 f9 x# S6 _0 u
# X4 T, R/ C7 I H8 O" v+ ^8 J 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 1 |5 g$ n' g; S" u
9 u! d1 K6 u. ^: m
6 x8 V( l* f6 e. g, z* F
" h, C4 \6 W+ y- _ @: f- q7 F$ P; s) `
0 R! i- i9 }( m4 o* z7 R4 n' a
9 V/ B h0 [& o5 ?0 \# z
8 l3 I* r; ]9 Z. i1 c9 u
% j" F, j s; ] a 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 ; V' J1 ~. U- a3 Q7 Z- F& K
' h8 J8 d# I! @2 ?, a3 f' [
; B/ ^% r: _- v* M x * f) R/ B4 u0 Z; L R
0 u' n: O8 E& l: Q$ A% a
% z5 @ q* M. N4 x1 {- I3 c' ^% { | 、 % J8 k3 A0 j7 p5 G) L! V. b9 U" k$ O& n* J
# V& N1 ~& G3 Z- e8 U' g# ]2 ^( o
/ b( j5 `0 B' E
' X) F" o3 `* _, V* g
( Z+ t! S! P0 k+ c! k. m
权限信息 3 }3 W: `$ O$ {5 r
. U- l9 b6 h& w+ F# Z3 y7 b0 s; x J! h! Y* s* c+ M1 \
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
2 E: c/ i' ?; [3 n- \( L * |) y' [, d b6 p
& }( p) R: B9 S8 g( ^" _
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
* \6 \- _, a( l! s" @% D - I8 e2 C% x' F4 {, v, a7 F7 |
6 O# n/ E& @( L+ y
+ F& d5 B L r5 Q. z2 U3 u
5 A+ |4 O" \: }% i+ `
2 E7 _0 W* f6 F
, }' t6 ]3 J& x2 c- A2 B1 K
) i% o/ _1 a" D
5 _' w' D3 x8 H- ~4 q7 e. _6 G* M1 {. N 下面对这个APP的所有权限进行详解下: 1 A4 n2 v1 g; e! J( I
. E E: }* X& W
' _# { ?# b: x! V$ q4 B# O5 h android.permission.INTERNET :访问网络连接可能产生GPRS流量
1 c: L; K9 L& u! N9 Z2 }8 |9 q
5 V' H% T9 D2 z7 [8 Q m1 \+ @
; J! V$ U: u) n% y, x' q& f9 K android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
( E" c+ D% [+ | K- V * Q. ]+ r' Y9 @& O+ P( o
d* K* Q& u! d- D, i android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
2 X1 C7 D" W5 ]2 b* u' |0 F7 v T0 ?$ e2 l) @, l+ E# T% |$ d
7 S( g2 W; m5 \9 Z' I0 D android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 4 X& p* c" K4 \
6 A# ~, }% ?; ~ S+ p* n( C) o! K8 U9 d$ Y$ n) m
android.permission.WRITE_SMS:允许应用程序写短信内容
6 p: ?2 I8 [# S. z/ g7 p
& ^& a- p, b. A- M2 R. c6 w, H, h6 K7 T. X0 C8 |8 i
android.permission.READ_SMS:允许应用程序读取短信内容
) Z# m* j1 ~6 l+ P
) l" n5 t% I T1 g! M4 C
- B$ m, F1 C) a$ P" K android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
$ T ]7 s" \* c, o& \9 N7 l" I , h9 [- v6 ^' R
! t+ L( | _) R0 }
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
& ^8 y# J. K7 C+ n& z 3 ~6 ~1 V }# n& `- _# M
2 H+ ^% N7 `* g. x: ], q. `$ f
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 * r2 m' n3 N U _
0 H0 M! @2 {; i& D
8 R% W9 ~, P* [6 z ?
android.permission.VIBRATE:允许振动
& E1 K0 ]9 y. I' C
* P& W0 Y! M ^" N
% g; ]% C: r; |- G$ l5 H android.permission.READ_LOGS:允许程序读取系统底层日志
4 q$ j( H1 Q7 i7 [. B! D# p
2 r, `' v* f6 |4 I( l; T$ m) A: T/ {3 P& X" t( s, q
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 - P, I7 i& `6 M$ z Y: k
% G0 S/ P/ l" u# U% @- h6 H
D% v1 D! {; E' |7 f2 C + p! ^3 a% H, {: E3 ?: [, U- B
0 H3 ]+ P1 e" w" I( X0 J9 N
$ V3 I: |& @0 p 功能信息 . r% w% T' Z, s0 x
" }1 R9 v4 q% L8 Z! H9 `9 w$ ~5 C
5 V/ r; ~4 i6 F+ @
% \' i# j, X) u- S* F
! r4 b. W2 o- c4 k$ O+ O+ }. J, V* i8 l, y
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 , d- {/ M6 k9 E% w* N8 |/ j
% B0 @) z& j5 j. R
" b- l" ~- \$ {8 p Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
/ M( ~) K3 R) ^5 t4 \) B 5 F" n% H; {1 R" c
e& l; u; d: v
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
3 }% k1 q8 D, c1 f8 e/ [) L* c7 z $ I4 @+ t$ ^% ^/ f. o" H5 n0 k& X7 ]
% l6 ~( }+ f0 }8 C9 M 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
0 H1 f! v1 B! C2 E * C$ M: p$ K* h9 c# X7 j
$ {$ v0 L: W" I ) ^- T& }: S ~' p* x0 L* a
8 n* f" X5 u6 q Q! W
. z# G* W# Q7 M% ?5 _. ?9 e 6 g+ O4 C4 g5 p& m0 O9 @, {
3 O& e/ x4 G6 |' W
( R( s0 W- J4 H+ d% f( j! m 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
4 o9 Y7 T4 O! n/ p1 ^$ J }
9 n1 G, w" V) M' d% B
( U6 E9 u- H( n6 m1 w3 M1 i) q0 ] ) G& [! A9 u* B( k" w
1 r8 p: H; C V0 `2 }: |! Z( b
0 ]% F/ W& u4 v& F3 s& F/ ^
4 ^8 V- Z$ G# Z - j' ~: U0 b4 O- K% d- }
N$ B1 d7 ]) A: d3 A9 _- \3 u 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
% ^8 V8 a: B$ D( ^) p/ R* w& s * H7 `0 ~/ W1 V
6 C# S, n/ B: n5 U4 }
/ r4 T: Q3 K% A% p, g7 Z # r9 n% `9 A- X- D, v% o
% O* [, I9 g% ^2 O4 C# x
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
& F& Y/ M. n! Z2 }) }5 R5 { $ Z6 r( U4 h% l1 i0 e' W
0 X; F: N/ P% y) b3 p* z ; g; S. y: t. e" @5 S% ?
5 J0 u7 u: d* M6 N# h7 m! n0 T* l
* G( ]/ J/ }# ], `6 g
( q2 B$ g D V
* D% ~! I6 T: i* V3 J4 G! T
$ U. v: T8 L! {/ O) M3 z# E- c+ d 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
# j! G; Y: c& _& `: k& E m- b
5 T6 Y& w* r: A$ O, T& X! i/ m6 e; h4 h$ G& |9 I3 G
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 5 V2 p8 {+ X+ D% M, s
+ u: N5 ]* H$ M1 V9 r; U" ~& c8 O0 J$ L u( N6 d
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 1 i! J2 Y/ ^' a
# d8 o" T& ~) n0 ^2 @
* W6 _) j6 g1 [+ ?5 a 开源的luasocket代码可以参考学习下
- l6 O* q, j4 S9 w4 X+ K0 D 2 w _ c8 \* ]' U+ I0 w; P
. ]- L' L2 @2 S+ U https://github.com/lunarmodules/luasocket 4 }& `+ \; o! Y& c' `# C+ j7 y% l+ Y8 E
5 W# ]- ]( \/ g0 H8 |
p- ]; v7 }8 E1 }. G: E& [ https://github.com/fengye/luasocket ' R5 X4 ?+ I* K$ @
1 v: c$ ~5 T7 U; B" Q/ l
/ ?! w# R/ F6 s; ?9 T* s
) `) K: ^7 E% G* S1 A4 P2 v! D% t8 U
4 ?: X4 H. }0 z8 e$ q9 g% x- K% _0 M
q7 n) w: z N; W, J/ ?/ R/ V* s
. D% G& |6 F' @. a& V5 ]1 M' l; i
9 l8 d/ G( O; W# q - u" I# E2 m# u" R- ^
0 M. z0 G4 N- u" P
1 A y; C5 Q5 v P! _$ n4 q
8 s# c; I4 R5 b' s! h3 G M
2 s( p) | c" P2 x6 e
) f- A( U# a$ J
总结
2 V, q7 M. }9 ?) t) v
- j; G4 Q7 @1 \ B. ?
# B/ y W3 X8 u" \" U9 Z/ g 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
! N! `0 `3 ^, B- I5 z" n 9 \9 h/ ^- ]/ X1 p$ _0 M6 a
$ L* O* Y$ h# q) P9 g
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 6 w+ s/ i4 ]3 k' p0 b# t. X
0 m# ^$ m, C4 c8 u& J
3 W/ ?: W. e- N$ X) s( r" C 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 V7 ^8 p- y- t+ E3 `8 Y
* j( W# D% x, j8 O
6 R) T( y6 T4 }( o9 U
结束 5 W! `' ?0 n0 [, C$ S/ _8 @8 H
- ]: Q2 y6 p' p* i( P
( n, g' W1 \ {* K% G4 I
【推荐阅读】
( e4 y/ `- t8 B ' X( S/ T, d# e# b4 g4 s% B/ j9 U
# d4 n1 m# k4 V0 R6 q C; @7 `
对吃鸡APP的分析 ' j$ e t- n- L, t, J: X. x, _8 N
: P9 U6 i6 C" h, r v; h+ C
: N$ P( U7 C+ f" H) f 你需要了解的APP安全 5 [* h1 G" p+ d8 N; K9 m% ?
K7 P% P% }+ W( l
. l5 b+ H' B% G) |0 Q9 f) S! x 你需要了解的APP安全 / @7 H% Z+ N, p+ {
+ s" v) K# M3 y" O2 H* T
3 V; ], B6 X {3 F9 M4 n" X! N3 Q; x1 E
2 T" q9 Y; q5 \- `6 Z6 y# x |