|
l( @0 d/ a. e# }) Q3 p1 ] {
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
5 c, Z1 A7 L% K2 T9 }7 I 0 H* [$ k8 L1 ]* i4 [' O
' ~1 c9 N S1 n
: p" t" c- W8 J0 L/ ~
+ E6 a5 s( V( j1 b7 l' x; v7 C( h. w' v
8 {0 A) [7 `. P1 m
+ j. G+ h' o/ A8 c. l+ v
! E6 V0 N3 c/ p F. M1 p
下面就以开发者角度进行解析下这个APP的功能的实现原理。
% k, q6 Q' }5 w8 a8 E" p
$ {& v: {* b! `+ v& t% `$ U8 F' c8 j: [( l% l4 C
9 ?* T& R7 C4 Y9 m
; ^( U& E) X2 Y, D$ i9 G/ y; ]$ P0 T1 T6 ~6 m
基础信息 v* m U( p ~# r% h: b& E" u. w
N& L: W1 H3 J4 N6 R% T2 x
& _" G, ]" c# I0 g, M
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 ) _' w7 o8 X0 P: M3 e
' g$ Y' s. i J
8 W) B- e% [& m8 F8 O/ x
7 a7 T- I5 P( P2 Q& l
$ O6 X$ ~0 Y* E7 K% E) N9 v( V; r
; o& B% g6 N- ^( U6 s) c- p
( W E5 d' ^/ t T; G' L ~
% B) j3 l) W- O; n- t9 O- L1 Q4 F4 x- w" O- g: a; v: ^/ J
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
) a; ~! p- q1 X2 k* K% x; p2 a4 @
# X! Y4 p3 w5 t" d2 H& o
- n7 G( I0 K* O3 R . S2 c6 ^3 N- g! f! K
$ e l% a$ G3 @* R4 r
8 y7 E3 s2 Y8 d2 _$ H2 P
3 j: p% Q* B: L% q$ {
) r6 J9 A( Y5 ~6 r% O$ a
9 F( q o" H8 w7 W9 c1 X 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 ; }. S7 Z, y3 d& W! u4 Q* b- U
o2 l, N+ \: q* b* O
6 v* P& a: w$ A; l6 I 9 D0 e& }: D& a# O
e2 h: U) |( G' B+ h7 |
' j7 w+ _0 x2 b( F; H Y7 e" v3 R( `; C
; m: Z& v2 H, S9 n
* {* P: i" t+ p9 Y4 v% g: b
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 7 L& u% l0 D! c. A; z
5 J: \* l+ K6 h& |: t; N: H# }; z6 {/ \1 m0 L
1 f6 _3 W0 y7 f7 G C* q! i. b/ {6 e! p
' C y' S+ e% Q5 Z! J3 F
. t9 E! q! ~3 Y( o! M! m- U 1 A$ c( y! p: {( r( D8 m6 P) W
3 _" W0 _! q e, Z9 P: H7 S
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
8 w! a% C9 R% e% y X9 v8 F- F 2 B2 o4 p! v5 _, ^* G
! S8 T# T1 T8 e9 z. L* Y; g" D; k
1 Y6 J4 @! h/ D! {* M' |
) ?7 o" V( R! @5 ~) @; n {+ {
2 g$ N2 M( Z# P L4 c @# W' Z7 @
3 C- u! c D1 b3 f, ?: \9 q: i& S) j3 e/ r
' H' G! ~4 v+ f2 A3 J
9 Y8 O" D* e" Z4 ~+ H( D. {+ w% Y1 n9 ^+ Y1 d# K2 `
签名信息 ; @* g. v2 t' D9 A0 `8 M* E; {9 t. `
9 w- x3 O+ b% w8 g8 O
* O3 p' |5 E1 y8 d! q! P" o1 U
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 " k1 }8 s; e' M
/ ?4 ^9 P; l/ P( W' b0 |
# V* ^. T ~8 m0 M- u: x 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
" h1 B: j$ I* d# @" o/ N& h- c8 _
' t/ w. ?& `# T: r. |/ h5 Q' N2 X, ~. W. z
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 1 z: f8 t3 B" b$ w
! N$ H2 `$ P" F! r0 _" m! L
4 S' v3 G ]- C5 n. n$ Y
/ T( L6 u! j8 e/ M6 m
+ |" R0 g5 U9 @* [; r
3 N! K( b' Z* E6 r. S & d) C) ]$ I- T7 {1 [, n
) `' |! {" \8 R, w
( [8 _: a4 Q; @/ q7 N android签名的数字证书的一般都是采用 X.509的国际标准。
! _* `% N3 g" M( s
0 s) w$ ]. L1 P0 T3 ^# W# m
6 }! c$ M4 |% R 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 ) c' z& O4 ~5 U8 G
' G2 b; ]; ^% j) ^" _& a7 [* X b: n
. ?0 \1 d0 ]6 g4 G% { S5 F 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 , d/ e9 l9 M5 }. B2 U" n3 b
2 P* F2 J$ r2 c+ ^( l: }
! z3 z- }, g8 M8 ]9 G 0 ?+ F, O! ^$ U
( q# O+ r3 T x z% p) m& `
2 n; m* I8 E9 k5 U, F
$ ~: g# r( X) ^7 L- l1 U6 y# s * d- T* c) h& ^4 B1 y' @3 P" }- r
9 y) Q& g- A( c2 O H* j
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
7 l4 l5 c3 M/ B5 h5 m* [1 @: ~9 x
4 g' M% m; p- k* ^5 |( q0 P/ g, @$ ~) H- l1 J" k4 T6 w
+ u# h& n% \3 o6 E7 Q# G
. Q3 G; B p$ k5 E% E3 b8 _1 k+ @( G2 t- X3 n8 r9 H0 t: F
、
/ ^# ~4 Z$ z% ^& k
]. d* p& k5 g7 w; k: [' f
5 g$ A2 t* G( M& c4 G( p 3 ]* \7 d7 S X. f8 e; }
/ G7 f F. ^0 t/ {6 P* ^
2 U: |7 O9 V- y+ e0 P 权限信息
$ _! g+ S3 W1 F! z- j- U# h. C
* `/ e. Y9 F5 u* _- k' I( ?3 Q) X( _) ~ r# Q7 i
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) ' D8 o% T' }' R; Z. T5 I$ z* w5 l
" ]' C, b# m% R. |2 I9 b% e4 ^2 W% K
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 `7 \ H& G. }4 r$ d- x: R4 C7 e
' k% c8 x! b* o9 P
7 t7 w- T% C N2 i1 X3 h) Z8 V
9 ~! d. f8 k7 ]( l
8 |8 d( M( e. X/ w- x8 ^
. F. z1 w' W9 _ I2 @3 r
& m, ^+ A( O/ [+ A7 ]" n
5 W1 I4 r( x+ H, B* E4 T" P2 J( }. m5 v0 S' V7 W4 ?! y
下面对这个APP的所有权限进行详解下: 4 H8 [% L; i# J
+ d/ F# d# O! w' {2 k
$ p; ~( R. W6 A5 R7 H& n; q) C android.permission.INTERNET :访问网络连接可能产生GPRS流量 5 O; K# j- v- ]9 K7 h3 l
) G' s% F0 Q X
( M9 f( {' G; I1 e2 y. s
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 $ E. h$ f6 e% G% P8 _8 O
6 D2 j6 D2 \, D
1 _0 z& g6 e( l9 ?& `. B/ T
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 # U. z0 W3 {0 m& c
3 \+ e. N6 M* r: ? }. ~ a
0 r8 |8 J: H1 C) s* ~ android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
1 t( |+ ~! R" z9 r9 [5 w1 t ; `8 [$ v8 z& ?
: D P7 x% J$ w' J
android.permission.WRITE_SMS:允许应用程序写短信内容
7 r4 ]/ [$ M! O& A! Z# e. P; D
' c3 P# f- t( z5 X! x' \( a! g" J3 K z
android.permission.READ_SMS:允许应用程序读取短信内容 7 W" K* @* A+ O
/ a# v. `, _: o8 f, f9 n
7 x7 R& L6 c& P9 w" ^
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
% y; [) U& P( Q1 q2 W8 l
: X( V3 Q4 m. @' W# h+ Z+ {3 Z$ B
* S; J$ G8 L5 i2 ?" } android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
" p& S1 P" l- T 9 u6 ?' [; d* h( b% @6 R6 }
8 f4 U- m0 z/ U$ e
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
% A: F* u+ d1 t' V0 w8 l 0 ]5 I, {) P& l$ F
% J8 c3 U& l' {$ |( q2 Q android.permission.VIBRATE:允许振动 ) X. ~& \1 c! d/ Z4 h1 |) Z {
/ U) [4 r/ x0 g) ]' a6 q, c Z
& k. _) @: f: Q% I8 u! c5 O
android.permission.READ_LOGS:允许程序读取系统底层日志 1 |- M* Y, h5 u- { G k. P
6 i( e+ I3 [9 S6 O% S* c' F
+ M b# e+ |, }7 o4 t android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
* s3 S9 z' N/ g2 M& v
" j7 I- `7 @/ h; D% {' t7 _
) m5 E7 J' x1 c) V2 q
u" O+ E- o, b D; j
0 s9 u+ h/ o; e1 d4 p( [& E! z3 q9 N
功能信息 - F) g- t# r' U( R: e( E
7 D. d$ A9 Z4 U( n- @6 f l4 g( x1 X# D7 R4 ]7 o n
) @" x2 G, I6 U/ R S; f& {
* b9 k! N; u/ w5 B7 ~1 O. w
9 E, w% [5 L9 e; M
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
" Y; m4 R A3 K/ ]7 `
+ P0 L: ]: `% E
) g. a3 R3 k; y+ e Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
& Y# W5 k- G1 ]+ k% H# `9 k
( ]9 }: u, r$ J5 w$ M2 r( k: U+ ` g- U0 w5 ~7 A9 U
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
& h; t! p) ~/ F" F; S
0 s) F1 }8 O1 u; v) Q, c$ X, }8 ?$ h( @. K
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 1 Q2 q' c7 U/ P: c! @# {
3 H5 o4 ]8 Q. i
8 J% h: X1 Y4 s6 o, @4 J9 a
% } O' U* o& J9 q: N+ ^
4 n6 a& r0 s# [) z
/ I) q7 s- {1 k1 y
% r* o" R8 a7 u7 p! k6 k - ?4 f; `7 |5 o/ x
* g3 K% s. B# [4 U+ n- h4 D/ t
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 5 N- o E# F& s: C: i
; n; h$ o" K" N& F% i2 p3 V1 c" I, Y" Y% d& a8 m1 `4 h# n* ]
. N5 d5 m' t/ t' h+ `
. H4 B+ x; T- ?3 ^' C3 r
; i2 ^2 l; ]1 e) ^ l " @, G! _9 ~$ n% P& l
/ ^- W3 [/ U8 h8 F
! J9 Z9 ^) W# o% I g- f1 c, ?
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
0 K/ @8 U1 F( M; _
( Z9 t( |6 x0 `3 j3 x9 I- h# b/ C/ ~/ e! _
9 @- |1 r4 z R3 C L" C
i* H0 s! t* x# s, x2 B+ Q8 t7 I3 E
1 d3 Y$ n. v3 e6 b% W( e& [# A4 H
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
8 F5 t! B7 O; e. ]& b* e2 m6 B' v& N% u u1 C5 Q" E9 S! F" n
2 |6 q! k% G7 r. h
7 U! n" c8 N! M& \* _$ w 6 E2 ^: e, z$ i) A- O: a
: P' l, Z+ [" l* y/ |2 t: I
4 E3 E1 u- b$ o. x3 N
8 ~6 z9 O; L; x% V; U2 A" s9 z! a% s" P3 g4 I5 y+ {) L3 ~5 V
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
0 f2 T& t r* ^9 ^& Z / m# Y; e, o. U( R. D, f
: N u" G% v2 r LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 . c9 i0 b1 q1 G. N
' O! {1 ?6 P; o& h* x/ ~4 X1 K6 f) c/ `9 S
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
* z, c0 h: ] x" z9 t. H8 N* c
1 u! c; {( o! M' B% K' u- u1 x2 |1 |/ d
开源的luasocket代码可以参考学习下 - F$ V3 {: y, V
) H4 ]8 t" o; N7 R
% v: I# i" v2 J7 f+ {0 Y8 |
https://github.com/lunarmodules/luasocket
2 Y, Q9 W2 h" I; b) \ 8 v# o% G5 E8 z# O
, K5 Z9 S( n. e$ u# l
https://github.com/fengye/luasocket
' U2 Z; D, a0 t7 v2 O; h! ` 2 e1 k$ v0 d* i6 V
( b; u; i8 O6 k: j2 r5 c$ ^ 4 k5 m# I3 Y: a: s1 C; F
* b% }- S, R" a# L& b/ U7 ^) K7 T
/ ?4 w) c9 Y$ A; D K, f
8 Z5 f/ A3 z, z0 b5 W0 l 4 X6 W! V/ v3 f
( ]8 P' B6 B/ |% D5 g* }( F% Y- j
& H2 s; Z: v. V8 \* W
4 {( @ Q% Q) S# Y" T; A$ \7 j- A; Q4 g4 |
# E% `: \* G4 w/ {% T; H4 @
/ e5 @2 w2 B2 A9 X( I3 L+ [& G, r/ N) u" u! G+ k1 Y6 g2 b5 [
总结 ( c' O; X0 S7 D4 T! Z9 K
: m$ ]) w& ]7 _: `9 ~( Q( c" J" q- e, h8 G5 g4 @
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 2 ~! B1 `+ w" ^, X9 V @8 B
5 I: o& b+ ^! M9 b6 o
& X/ W, b8 x2 Q% v+ Z+ Y M 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 0 l* o$ @5 i2 k" x
4 u, a0 I1 k; A/ {4 @
G r; n6 z- x+ d 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
& S6 L1 L# _8 l' K" j
3 x, B# ^) U1 Q" n
6 i, X' R: `/ i3 [' c! N 结束 ) s9 k) ]7 Z1 q' _( K3 S/ i
& L. u1 x* ~. r$ U' S$ ~
4 p A Z2 o. ?* c 【推荐阅读】
* K1 E0 K$ A( X
+ l0 O/ w+ C/ W7 [6 T C8 T8 E3 c
对吃鸡APP的分析
/ z3 L. [1 o( z
& P2 s& S2 `0 J& l2 {$ t" B$ X
7 s/ h( x6 Y' o5 Q0 [2 U' h$ L- o 你需要了解的APP安全
- X- S& V# f- C8 A 6 @8 U1 h7 n5 ~! G% A5 t
% [8 Z4 [8 W9 N( i+ N4 R1 }7 }( c
你需要了解的APP安全 ' P7 t/ K, _* ]! R( A/ p$ T
' R7 N0 R: S) ^6 y
- {& C# e# U9 _( C! s/ L& k $ d" F' H) v/ k: L% b/ g
|