|
; N) q, i7 O# C! v. G$ o/ ^ 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
% d# C7 b- R0 |6 X9 E* v% c
9 e2 P% b1 y, _$ \/ y; X: e# a+ a( X' s! _8 t9 ~: k, m1 l% O5 L% r
" Y8 O5 r' I4 Z
$ O- A& A) \% F2 \9 g' n+ H/ r
v- l2 m5 i, S2 W9 A ( a+ n7 _* o1 m8 B
' B* s6 {4 m9 |
. H4 l6 H3 F) ]" _ 下面就以开发者角度进行解析下这个APP的功能的实现原理。
* V& `7 W7 k+ W% ^+ A) T3 C
9 b4 r% {0 R6 Y- [# I! U. t$ P
% z# S+ n$ s! z2 V( Q5 K
! j3 _) o0 @. o2 Z6 B
/ R8 b2 x. P; t7 a# ^4 x3 ?* R3 T0 a4 n
基础信息
O- |$ X0 \* w* o/ `+ c
9 V. U! r9 q ?4 P8 O( Z
# W& ]' g7 ^7 e2 c" X- X" G4 O 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
& Z/ n2 f, @3 y. p4 P& u
& Y) s9 J6 L& W: @1 ~: b( k
7 u$ Q( M$ u7 d7 F. ?; E - S6 D3 y5 z0 E' Y( u* |' x
9 |( z6 u5 e) z' c$ E! ]- W
" X" \# b# D- z5 K, D
M% K$ ~5 s) U
1 E) \, r7 w, U3 u3 {2 O! y
* i4 U+ Q9 ], E% w* \
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
. r R& ?& v8 }6 z
2 p) q/ p1 I- i2 m" b1 b1 s$ T
- h2 E2 e: j8 @
) p+ L3 v" x) R2 |( g # Z/ ~( Q: e% k9 T5 _
8 m( x( S* ?* {+ m( O7 D4 T8 N+ j
# n, ?7 V, c2 K2 }; u* Q9 L; j+ l f' _
! L8 j4 m i9 L P- p; a7 n/ P
3 e3 O0 ~$ i" [8 E- _5 n
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
" d& A, M/ r7 c G q6 I% h0 _. m
" `1 p5 c' f6 D5 n
5 u, E. y9 i. U! c: m8 G. p7 | 3 c# d) ]: s2 F4 t: v" H0 s
+ W4 z* t4 p7 f7 i
( K6 I9 K5 ~: K! L$ D5 a/ f" a / U$ E# {& I& t' a& [4 A
" f- M$ N7 O( q7 L
6 {3 `% g3 u% c6 t) z% _* \; \3 E' t 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
* H+ B6 ^5 ]! b7 f0 V & r: Q1 J1 g: r7 a
5 F- v8 R2 [5 K9 Z9 o4 y
6 q' s S4 T* c L9 f
. J7 w! Z6 Y" {' C& S% U% S5 e8 @& Z6 V$ q7 P
/ }5 M+ i7 h0 Z. O( Y + t$ x: a& Q- e5 j
; m) Y% |- V/ H; f/ z 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 ) f+ u3 S# t6 ~- K2 C" }. y, D
: ~ D/ F+ g7 D3 ~2 F9 T# E
: o- w4 m4 w% ~, r " k* l, V8 u9 b: T6 W
9 C; L: h& p6 g- k
' [, y, N# y5 W& D( L% `% a2 ~
, m1 _$ x0 N2 k! F4 q! x ) `+ |+ ~2 d: d) p+ y9 f6 d9 t
4 Z! `5 J5 k5 E3 Z ( D+ g. u7 \0 _$ d; P
7 K0 _$ `- I) g! P
" X' M1 K2 w Y 签名信息 7 l; O; S0 z/ N! A* z2 D
& C+ b- I/ r. A. F1 A E) K; i
4 {! Z9 Y! x6 ` 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
; |! P% K6 y2 I' u5 [4 K
' S& O+ T, J4 x: P4 F' _) P) T/ U7 Q5 o; j5 K/ x5 T9 M z, R
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 % H' z% @1 t5 s; k1 i. \
3 g% L8 c# o# s( t- C* d
+ I1 W7 y( {2 Z) r 在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
0 T H7 u* ^) v) l & z$ E8 ^! l. J! r& U
. c, y7 {/ i/ f
6 w3 U r2 J+ Z: L1 Z0 S
+ g: T {$ W& K L4 ?1 b7 g. D% e" O- ?
, Q6 n" S( ?8 P& m2 P4 I9 o0 { 6 X- p' D* X- r I
) {0 c5 s7 `0 @ android签名的数字证书的一般都是采用 X.509的国际标准。
; `3 H, }. W+ X" C4 k
b% p1 p- M/ O- n& V0 J) A% C9 b+ i& w6 a, |' r; p
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
% r7 K7 c( ~ v* |9 d6 ]8 C* I / J1 h2 }, r j" q: u8 Q5 u
?8 l" K& a9 i. ?3 Q5 O 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 9 E: }$ `' u" D; {0 V
* D4 G# t$ X2 _
6 G+ B K6 L8 L& Q
7 _$ O' U, @ x# d) w# | 0 Q% ]& \6 z0 d$ @; |5 o
1 |2 z& f8 e2 @' \' Z
1 g% _) x s# S " k8 H: Z: t2 u& h# u+ ^ p
( f8 b) `; F9 A4 v6 X# b8 j1 [& j 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 : v" Z: `% e. t! N% i
% t* o' O1 L( ]1 Z, l
+ ?1 l6 ~1 V( G! Z/ K* n ; Z/ ?8 B1 X h1 r" Z+ k0 q, o- ?
- \6 V L# O3 R( [9 G7 k' {2 p
& B) W8 E- T _1 A
、
* A! h ?: O& h A ' q! t$ L3 m9 [4 Q( J. F0 c3 F
' A4 h6 B! B1 F# O) H& L" Y
6 k! ^( O) W3 I, V1 }9 j
- v" M+ J$ G7 a% C& A$ l
$ ?! E' r. P* Y; H2 {% a 权限信息
0 r3 Z4 ^8 N+ ], j; N' Y5 u: x
* v" l( W$ Z* E; D1 n, C) a+ w' x/ m$ x( @5 Y/ k
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) & e( ?& I( g3 k( [$ {, Z8 V' a. |
& y. a7 u @" e/ h# I& Z
2 w& A3 P8 b0 z2 b android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 ! b% Z6 p! i$ f: z* ~7 G; h$ O, N
; m1 `0 v8 R9 P6 Q! b( Z4 p
) W6 }( o2 E" k$ \) Q
C8 ]) |- c, c8 q% A 6 R7 Q! W& E6 l! M$ S% b
! R* N& x1 R' [8 U7 W
7 r1 u" t2 ~, @7 W' p1 r G
8 q$ e' Z" }. K& R4 D6 N/ y7 j6 s( ?/ B
下面对这个APP的所有权限进行详解下: , w! t! w; r# y y! s: x5 k1 T. Z
/ `# L) ^- s9 x
l5 ]4 b& D @1 [
android.permission.INTERNET :访问网络连接可能产生GPRS流量 . J5 a# Y* o4 Z8 J/ e
3 J. I- g+ V6 A# F1 B" i& l5 e$ ^
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
K K6 m( Q2 _9 W k
7 k k4 l3 `7 n3 M$ {1 n( E* S
: r [ ?; V! { android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
" K4 F; O- @; \6 z6 I& @
3 m- W" |7 q! k5 e. `4 k
7 z6 G7 D8 G+ E4 K android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
7 F; Q: {3 o$ T4 f9 d# _ P) f
, j3 a5 ?' c7 C: B! S
. R _- y! L& p) T! D android.permission.WRITE_SMS:允许应用程序写短信内容
8 D; z$ E) N1 q/ R. j, Y' t, O
% B; i8 O3 e9 F |7 E4 X
0 ^% w1 d4 ^$ D5 a- l android.permission.READ_SMS:允许应用程序读取短信内容
; Y9 q, B9 \" Y4 e3 k) D
) F3 l9 `, O4 I* p6 Q( y# W* \" L/ ^* i" A% D; V- |7 F! Q
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
4 L" t; P! ^1 F+ B, i- n2 {* N& n4 I 0 l! _2 S: a. B7 T' A6 G9 D; X
! ~, W& D+ h( c2 }. j+ h
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 - j; I1 y- i! r& J( l, \) G: T
% ^4 B u2 y' h& e( f* P' |( o# j! q0 F+ z/ t
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
: m6 h/ p+ R$ g2 B
9 G* K% Y8 ]$ [
9 b' Z: Z+ q: e% {. U+ c3 c( F android.permission.VIBRATE:允许振动 7 A. q, [6 o: x# f) z4 n
6 z' D3 @' ?2 `; _
6 f" @0 O5 S2 x: m; X; h android.permission.READ_LOGS:允许程序读取系统底层日志
5 j" T( H' z/ ~8 r* [- o9 h
7 p$ f: o: \4 o) L" l3 A0 ]2 e& `. ` L! L
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 % q! X, u( l# y2 P: m) @
3 W# J% m+ M2 Z u! x
* t7 l; I& p$ O. [* z7 U. C
1 J& M* |6 \. z. m% O
* K2 O9 g2 P& Z4 C1 u4 T9 [
: B% c. A/ H9 o$ K2 K. M3 Z 功能信息 ) T+ j* Q; x5 u, f
4 S- `! |! t. U. T) \4 L
. F& O+ H5 F( o
/ t* K1 D( E9 K1 b+ ?- k$ H : |! }5 P6 A& E, j$ n
5 M- S$ h* i" t+ N6 i
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 9 @0 {- i# I/ v
: G. P+ [% o9 U# ^( [
' s ?5 ]" W) z6 c) Q
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
; K/ y: D" I& n: e
+ Y; ^4 N/ h7 H9 e, B. l8 l9 ], @+ L! U% E5 l
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 1 r+ i. E ?8 l; G4 H
2 I/ n3 ~/ D3 e) b% E& `
- ]& U- s s5 g" s+ n 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
- K" s L, ]9 g8 S& t8 J' T
: w) e5 \! Q2 X5 ~! |( }* m; s7 B3 J: s
. ?2 G4 u8 j x! i* K7 d) P' p ( `' l, D, ~# E" O" G
! r4 V1 S+ A- c* u! m r+ e
; L) X; f5 Q* l3 p$ z+ T
5 F$ i7 p. w% t& ~0 w! `- Z
; E! u0 i0 Y5 y& z 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 , }+ R- B1 m4 }4 f7 E Z( D# B+ S
- e, \9 A) q, o% K8 }
- C* J( H) K* Q
; S. R7 B0 o& ~' U6 g9 o l* ? 5 V( }; @, ]. H+ L2 n
* K# S1 q5 B1 b2 H, X7 `
; T, b( }/ [! M9 Z# \- Z
; k0 k) Y X6 J% a" S% p: ?- {
! U$ y* f7 K+ k6 L+ Z. z 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 4 E6 K+ q/ g9 p; T' s# x$ \
7 B6 g$ y8 v. a2 L
% n" ^$ C3 }! `: K, D 2 h6 f3 \+ ?- ~$ N
6 X1 i) S* P. I/ _ {( e9 y
7 w7 n; F4 _3 a/ c6 c
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 # u3 x9 C# O s; P- C4 b+ a
! {: y4 |% {, ~5 Z" u$ |+ Y
% \$ x' s* P0 G% G+ \( Q4 u * {% g8 |7 j- o
. e' L, ^ C- o6 Z; {( x/ i% ~/ @* S- \: a' K, W9 D
" o0 _5 p2 _2 q2 e: p
# F- ~, J: z: k8 G
A E9 |; y1 O7 l" V( \ 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
3 w7 }5 g, @% S# p8 R' [/ D5 R Q
3 a7 @$ t3 l) C. ?. O; L: ^% R% g" S8 \6 X# I
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
% k" L, i% S% L* C1 F # ] S: G8 z, O
* h; C* d# ^( e8 c
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
+ M6 ] L) B2 y$ T/ z4 D6 }. p
5 h; t' m4 ?7 z6 g$ P! \5 Z
! x s" S }" `# y4 S- M$ J" i5 u 开源的luasocket代码可以参考学习下
+ y. E0 j! C7 n/ i+ l
1 }2 C! f0 ?: y+ A9 m, N& E- G* P. _) s
https://github.com/lunarmodules/luasocket 6 ?3 d! Q) C! k- B
* \0 m. d6 B4 j8 }2 `, t5 R% C
: k: s- h5 J% J2 ^* V) D https://github.com/fengye/luasocket & S' K C* G2 W) F: W
& d9 W* l1 o. t; `9 H. Y3 E! f& x2 g# c% A% M) b6 R: s6 e0 H
! G+ U# V4 l3 y& ~ 8 }$ S. z2 ^: U* F `
7 w4 N- P1 X: k1 s, c
9 P! o' ]3 u4 o* Q2 u
' r& y. \7 w3 I( T
7 a9 J( h6 ? {, D/ K
, F' F) x6 P \% ~ . _6 W( T" y |. @
+ F6 R6 t. X/ z/ \$ t7 q' h
# C; j3 T3 Q" r- v& p9 N+ j5 h* d( A
* @2 p$ A' S1 ^ J/ a/ v1 e
! k- W j1 _4 I. P& X/ L5 h ~- @0 |' Y 总结
( U# l4 n* N: U+ ^3 h/ q 7 {: f4 M9 y5 W- e
8 k1 }" U5 L9 k
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 # [( N' \7 V4 P0 \
' |- \* l0 @: R) H t/ G3 Q! u& I, \( d% U
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 / a% ]+ j9 ?3 Z8 S3 B3 w6 n
, Y M. `2 T9 R9 n1 q- V% h
: g- A9 f% ^9 x/ ? 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 $ e/ \4 f+ x. W9 v
9 F# r% `0 G( o6 D
V& C: a( V- R g- Q% k 结束 3 A3 V+ N" C; g% t& ~
p, F3 E% ^& p1 ?
# }/ N, X/ e& P* \/ |6 t 【推荐阅读】 7 W5 r4 `0 e( R9 ^/ ]1 m
$ G8 p9 [2 [; c
. M f* r: f( V$ n$ b0 k, h 对吃鸡APP的分析
. y$ ~: N" O" } $ T$ X r- I; A% I! q
- t$ U+ V. p5 m: A; ?; d7 {3 d6 K 你需要了解的APP安全
* _' B6 o1 S" {1 O
6 v9 A) F4 E/ R E O0 w) i
9 L; s# @3 q; {2 S1 J 你需要了解的APP安全
]: V9 C% J, |1 j0 ? ( N0 h) u2 a7 h' r
W( ^) _& O" c9 ~
- s3 K; i# y- _1 X |