|
/ W5 ?: o, V9 o R1 \% t
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 n6 A) B- y/ t" G
- c9 C1 K, H0 k9 G7 C: h! U1 o$ E. {# q$ J3 B3 g( k) w
1 t6 ~% I. l3 b8 q- d" v 7 m; Q' w: ^1 J/ N1 I
9 \1 G# M* f8 ?# l7 f: d4 l/ M2 M- K
- N9 o9 }; b- J# F & H% D- {! Y3 _/ M, g- @
8 t5 [* I( K7 z# \" |! H* n
下面就以开发者角度进行解析下这个APP的功能的实现原理。
) e. _3 n9 P* g% F/ N6 `! q
4 R+ }' Q+ L% K2 V. ? A8 k+ T6 D; m
! M2 D! l! O* k8 w, _+ E
/ N! I7 b. z3 u) U0 |0 h
) ?' W: p/ z4 p 基础信息 ( Y" T d$ S* G6 N3 I4 H# T
: ~* P+ ]# ?5 r! Q$ k. Y& J7 `0 `1 a8 c: [9 M: O' ?( t
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 8 K& M# [7 h9 x* X9 {
8 t9 h7 C+ l S6 b$ A
8 L5 [( j: K' A- {- ?3 H $ s$ Z: b0 w3 i, U& ? O2 f
! y" J9 [' {) @: B) t4 x
( _# s% Q, ^6 b: ~' N5 L6 _
$ Y0 g* M: V( }2 |
. g4 d3 k6 D& B
, |( J- s: t3 a 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
$ N5 u h2 j% \9 [ ' p% a, J1 \* {
, t7 N" Q6 P; y! h
+ {$ K; D* j/ c) B1 o0 N w
2 J h" m3 R* W+ l7 C6 y
0 Z+ Y b% r/ e2 @+ i
/ N9 ^0 W0 J* r5 M! R
+ V. |: f/ G* d8 s
1 E0 E9 A7 A) W: J0 h& P 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 ; P6 h- M5 J" H) g3 ]. W
$ N" J! |' A0 C" B! \+ Y
, r; q# @& v+ D0 x+ A $ N8 D( l6 _2 K) i2 c q
- T/ W1 O# ^$ @7 s
4 K# ^) ^* d0 ~9 @$ o/ T
) ?% R) E' ~- B, Y3 E4 s# @9 X- g 5 N0 R% _$ O. W+ J7 r! J
3 T1 u9 r/ n6 P; d
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
- a$ d2 [/ X. q8 z
8 B5 y$ l/ a0 i0 x$ O9 e7 b! `, }5 J( g/ ?3 [
! E- L+ K) ~% [
6 G! Y" D( c, h9 W& r& u! w. y
2 ~5 _! {1 M5 G! K 0 }7 E8 q9 Y5 A0 n1 F( L
. B! g O1 a; X0 m9 G/ |1 M: d# p) U, B0 y
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
$ q. h0 V n) c4 k # h( v8 x! e7 I0 H* j
4 n8 e* [; q# Y7 \) r/ o
. [7 o" t7 P" I; x( ~+ K * f$ _* L5 u3 i! l2 F3 N p
: ]# {1 m& N8 O; }. E
5 ~5 o& M# ], ?' e# E; f/ E! [9 n1 L
, |1 M( s% o$ q* c9 Q% M, E1 _
- n O+ |% Z4 C. ^ & m6 W4 U8 r: m& E0 R3 Q
; U: j0 q0 V) b# ^! e# {3 s ]" x% w" M) E1 A# y: ]
签名信息 - L: m6 i, Z p* i0 |: H
( S. G+ i% @5 ~. E2 j4 G$ F. s- ~) L$ h) L0 ~7 k9 e; s+ J% |4 D
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 $ Z; O, ]1 q; |, ^2 p9 z ^; Q
# {1 Z- b0 \# X+ m0 e
; C- [. @. H- N' M4 U+ _
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 $ o4 U- |* d* X# E4 S2 E
( j2 ~) H2 c! ?+ }7 {. x! r% U) j
0 G6 I( H, W3 \* D8 J 在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
+ I1 Q; V2 H2 M# ~5 N1 a
' g$ U3 Y3 i+ j% Y8 Q3 C2 ^. r8 ~. R
) k! }8 _* Q' T& I- S5 f
4 A* O$ t t( s9 D - ^- C: w4 Q% d" v! I" m
. g! s) ^2 l) S( S
v1 ?2 q$ y6 _8 M& t$ S4 g : Q& k( e' T; f6 B8 R3 i
]8 C V' |$ h8 o z, m7 I9 i android签名的数字证书的一般都是采用 X.509的国际标准。
( b) Y8 k! h: r" L0 F! ^ . L( ^( ?* K7 M) v* u4 B7 G! G
# b4 h5 C+ B6 F2 A4 z. e6 E 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 " X6 `1 k1 i( R8 j( T1 ~
' m! m- I. A# o& _# }5 V8 a
" U7 d$ o) g2 {. ]; [! X6 W
下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 6 X# r0 ?9 p2 R: q
) s* J8 l: J' M" M' t0 G
; j! X3 l+ N" \( ` @ 3 d' [- r" S3 s
3 U7 [* M$ ?* w( S$ o! h( r+ Y0 Y5 f+ W8 G, b" ]! L$ H- W
7 @( }6 g! S6 d q
, N4 c* b) M# D9 ^) B
0 X2 e6 ^. S* [* t m! C! P5 k 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
, V; j3 `" e. X# j
% ]5 s0 M* s7 X& s) d# v! p
' f5 e: v3 r/ c D8 L6 q' O/ j1 B1 D/ Z
7 ^" d9 }/ m( i5 m7 b ` 2 u+ @2 O$ k5 C9 C* c
0 V' J0 R* P- F3 x! R. w7 J: T% k 、
b* ]$ ?1 {& K: z# e; V
3 q5 l$ b# _0 P/ Q3 q- B
! @( P" O1 W: R' }! n
7 ]! d8 `/ g3 T
) h' D* z [2 ^7 m9 D6 o" E' r& }4 r$ F: R. r, z% ~! _
权限信息
9 ]3 G; R$ V6 S4 d. m ) {- v" H3 d* q& \6 o
9 I$ c4 k, [4 ^/ ]: D
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) : [7 [% ^0 w* R7 K+ U
9 h7 R( E' v( s' n1 r
- |: \- Z I" N% f
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
$ M5 k f# u' x" h+ s6 ~1 g j ( }% U6 s$ q# G: b
' k% ]! \% y& p- l8 n
3 o3 b7 e; H( Z
0 A$ W5 r, u0 f" b' N' H, w; ^$ ^0 N5 V2 o& {* b- A" q
. T2 f& D" M7 Y: L, S% F& g/ b. o
( X+ x+ [2 m. }/ w) t- X
3 f6 ^- ]5 ~8 K# U' E
下面对这个APP的所有权限进行详解下: , t& B9 t, A3 f
+ P9 t5 a: F, h. r. O: |% D) ^$ f5 |8 E4 L6 K
android.permission.INTERNET :访问网络连接可能产生GPRS流量 1 W/ g% k" B. W; [
3 e; z( x, h4 R. D7 H" R) N- F% R; b
3 G* d$ _* m; b6 B8 J$ e2 F/ D android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 7 @* H& e" z$ X; }2 O) m+ _
( f" G b& {- v5 k- M' D' ]3 s N- u; F3 E. a3 C& S) Z
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 1 |2 {+ z% ?; Y" }, A Y
. r7 |! z: r/ ]' Z7 `! X6 Y
/ p4 s( M6 Y, g" n: J/ e android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
& |) E2 ^" G9 c; v3 y' R& R ) b0 Q% {, i8 _8 o$ E$ }" {
! X1 z# t3 e5 n( r android.permission.WRITE_SMS:允许应用程序写短信内容 1 o% F: R9 k3 {6 [8 R |& R' W
# y: F4 t7 Q' [! o
- }) X4 p' O) @1 \
android.permission.READ_SMS:允许应用程序读取短信内容 6 b( Y+ D- p+ m& L8 A5 n
0 P/ M5 I3 z1 \# s
6 p% t8 i$ d0 N android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
, N4 |( b6 [' H& X( @* y
0 p) N3 m) D3 ]/ @; J! E+ z& Y: f, g0 i8 ]# f Q
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
! b. b" Z" }# `- z
' q" m' L4 I& P5 I% [; w0 [1 b5 N5 L3 `4 }5 E7 u3 r
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 9 Q& \" Y2 y# V/ M
1 M: @2 b% d6 o4 @! Z* p* z
: C! f8 a1 V# x' K' t2 o& X( N v
android.permission.VIBRATE:允许振动 3 E$ p6 j! x0 Y* a+ `
5 D W0 m9 H" B ?$ ^+ x* o/ V
. n: N$ J0 p2 T1 t+ o1 _) \3 u9 l
android.permission.READ_LOGS:允许程序读取系统底层日志
; P' T. |* d4 n- n& h
( m, i2 `3 |* B7 b2 g
0 U; |0 w! V& j3 A6 i android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
0 X e- Y, W) a( \ , ?) {. f6 k4 o
7 j% ]- h: E: i: }. s* t
: d1 b% v& R+ ^! u ^
$ O2 g- z0 ?+ ?, r6 r5 v; U( }
! B9 g+ M* e1 }8 F; ~# E 功能信息 ) |: E6 K5 x1 r2 L
/ H# B! N9 u+ k6 X
# n+ r o! i+ E5 O/ E 2 h# |( D8 q3 d* Z7 t
* q" ]+ b" B" u
* M* q+ C) o/ _
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
* f$ ^( F. w2 a( S1 T8 p! w u7 q + n: ?9 P; n& ?( Z) k3 ?
' A+ K# u y% ^) I' X2 z( ~
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
# f4 M, O% z/ N5 `0 ]" o+ e( ~% j3 j
. C) c/ d; i, f8 z& X4 E; `( Z: b3 W6 n1 B; B$ R* Z
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
; K% Y9 R, I/ t4 }- ?: A 4 [( c$ }/ P% _7 U. T5 _
: B, c; n/ }* R @ 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 0 T) D6 v; d$ T
3 W$ \$ Q: Z+ e* j; S& S* C- E
/ H8 t# K2 w. I+ B% H! p
; q4 o3 K) T( u% b) I 4 s. U/ g$ y# V, L0 c! B
( }3 S/ U0 h4 @' m8 C
$ i$ i1 d! p% B9 K% j- \2 q 8 m( @8 N% Z. n7 g" ^
( @# b" T+ q* k0 |+ T" T 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
0 A, Q7 S2 m" \4 K0 G * _9 S4 G* H( m4 i# P; o
& x3 D- `8 a# H+ y
+ T l+ }" P5 k
. T7 V- ~6 o; S9 I9 t2 U& F: u
$ W0 P6 l5 I$ Q% t) c
/ x" T) L$ p, F
' E" O, E+ E- X$ \& v# m8 s5 x; q7 c7 c' o) s i, r v4 {
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
. g) ^3 q6 _4 K- w; v 4 I( h' R% ?$ B8 I0 c
8 V) x3 b) e6 J$ _5 T% A6 H! o* s ( H) R; s5 L7 q$ {* H+ {, Z
9 p* l* J5 x% }7 G3 y4 q
1 s2 u, ]# q' p& |
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
9 C( \6 q+ B% a, v0 H
$ ^5 L7 R% P, m* u. _6 J* p
. |3 D( v' D1 B; f
; f& _0 M6 S# A
% L; K8 F: b9 `# {2 j5 \; B: D( X& | N+ c
# }5 C2 f) A( W) v! @6 Z% ]
/ Q1 w- T7 t \$ o. X8 v$ h% P X% L& }) J7 {
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 0 }1 ^* I- j6 F# W
! Z H h5 T5 v5 `4 O: D% e3 v" `6 n% A& a# `1 ]/ T1 ^; N7 T
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 8 g6 h' ^7 v0 t# F
! |$ Z" Q; Q: ^0 G" X
, I& u) U/ T, P' b: y% { 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 . B# v6 A7 s5 u* u+ P
1 e( F' p/ c s
4 n2 Y* L. V1 T b Y- w" m* b
开源的luasocket代码可以参考学习下
9 x- z3 y5 z$ d; a& n1 G
5 b) B% m' Y. l# E, v# ?2 y& P4 h8 s+ i- A
https://github.com/lunarmodules/luasocket
! s$ Y! {" B" r* U7 m$ J T" A1 w, \ ]
5 e" g# l/ z( K https://github.com/fengye/luasocket 7 y: h3 i" x# m- ^8 W) U% p( @9 R
& n4 O. `9 y! B- q! d M) p" o1 N
: g3 R( t s, p2 D+ _
) j( j7 u2 q5 K: m [3 H , W+ n+ G% v& i9 @* z$ m
2 \. j* h. u9 A/ T
" c( D, S6 K# c# w1 B
* b, k' E3 M- T. V: I$ b- K; M3 |1 H# S+ H8 Q
; h' h y4 P# D& X1 ~
# k$ j3 W3 {% f! F1 J: F& r
% |/ u) O) O' `0 t, Q 0 A, l: g# Z0 ~+ _. u
5 Q9 {* T3 k# H
4 r/ B0 }+ j4 _; n- S3 @, w: o 总结
$ X8 r% Q; \7 Y9 S2 e
& B; ~ O% N) a G
! S4 V# m N2 V6 ~2 g7 A% a! w 纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 9 d9 l( D0 f* _# i
# G4 _4 V! x" K, ^" n& ~
3 r# l* J4 c; B& V3 \1 k
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 0 L8 y$ ]- @* x; h& [9 x4 e' B
9 s7 ?5 s$ n6 c
5 l/ {! `1 z5 z$ M: y' i9 K 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 ; R; i( F2 w; d5 t! O5 [! {
O$ D+ F5 g5 X
/ C6 s0 `7 a6 F) I6 D! M
结束 2 u2 u5 F; j$ o( `8 V0 g1 O; b
# {* B4 t# O6 F, X9 w; X5 Z
/ x! a) s, k. ~, O" h 【推荐阅读】 7 P) K7 {" g0 f. o
8 T7 D5 T% O% ]/ q6 Z5 H: S
3 n& l# X' k/ h1 b, J6 m
对吃鸡APP的分析
; ^% N" i$ w# A' i: z V T , U: Z# e" F- W( e9 P. [
2 x' }0 T9 g; b1 D. k0 G
你需要了解的APP安全
, z: n) m# M, `+ ?
* s( x, J3 ?: R( B' I2 e, A2 [+ k* I% {9 ` I
你需要了解的APP安全 ; Q+ {8 F' g0 h: Q
1 e, n @; @, s! s& ?/ [* h
}% v3 z8 E" {2 `4 h* u
1 s0 }7 n) F1 O |