/ T; N$ z( b& A
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 9 A! C4 l3 g' B) F
) {9 }' s) L( E3 ^3 D# R) P
! M0 Y4 t+ c' s0 S$ X/ y* K6 Z
& v- h: `/ K$ ~ S8 Q
3 K' S3 M l$ W' Z* j
4 x+ [# r2 x; `1 S; |0 @" h 2 j E9 f2 [' h* M, N
2 [( R( f: a' w6 ]+ d4 V$ ?
. V" Z/ G) m! X A# X 下面就以开发者角度进行解析下这个APP的功能的实现原理。 / }7 J4 K/ V/ l0 ]
7 ]% L7 i: E2 }1 N' [+ J. m
& `& {3 S3 v& S
6 k ?$ u$ \8 |, V }* g) T 6 \* m* j: A2 n( G
8 L) C) w' V4 J/ {. m
基础信息 + r" Y+ w$ o% K# {0 N. q- e/ v
( g: J( n/ y6 l w7 C0 _6 p9 I6 U
w6 t6 }7 \( ? 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
) K# E" U4 W5 m7 ?4 }5 N! B/ v. ^ ( I. b9 W2 s+ D. o4 ~* P
3 a- k3 ]$ B$ f7 _
: b9 R0 q& c' l9 B. U: I$ i) b& D
5 _1 W' R; A, H* V6 J$ D- R
4 L* v5 v8 r( `! y) { 9 h; g; f: e5 {& P
; {/ Y, [: ^$ W4 ?5 {, T7 M+ `+ y
0 |, O/ M8 f8 n; u1 k3 S, z7 B0 J 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 % Q8 ]# z: s Z8 Z
( D( b1 o I9 C8 P2 [0 n7 ]* J6 G% V3 u5 K
0 R4 J; L( u8 K: ^ q( ~7 w+ I# a9 N
0 P, S9 R2 ]4 m6 J$ c% C E% D
4 q) F8 F9 h& j* U, X- u5 Y / ]- A( M @, Z; [; `# {7 z
- H, ]8 x% o3 C5 F# e% p/ Y. ^( P: e
, X" l% H' V% W
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 , q2 m# _9 e3 [
1 H9 m2 R6 o! G! T1 t2 l) U
# c; K: ~3 \5 j+ R: D) D
9 \) L4 F" c- F( @/ \3 z8 T
L1 U( P" ?$ C6 Y' p2 k2 B Z2 Q
8 |. ~* l% I) W& b; Q- _. R6 s
4 G' M0 Y" c* t0 q* A) F% L7 C T! O
$ z& Z% V0 _/ G( W' V- t 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 " g; G e7 @& u& u" _% |
) p3 ?9 L( r2 Z2 }5 c+ B5 `/ z7 f- d+ K$ ~; H* g
! Y b7 k \$ ^3 _3 Q2 y
/ d: }+ `% d4 a+ r" E; X
" C9 B- L, d; M& D9 Y
, _' L! E7 x$ E% B* F- U* f) b . N6 ^1 E" X% L" y4 j
: ]9 j8 Z: {5 G( c
下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
, l0 |' o+ L7 S f( l , j; h* g0 l$ @
, q1 j. u' p5 a4 z3 x: X$ }+ n6 T $ }2 J m6 Y \6 C3 {. H' \/ |% ^
! C2 _- ~7 I, D' t# p: v
7 z- [# A+ w2 M, J# M; e f
" e, A0 R J4 R! j6 U
, v# C* b3 c2 s: e9 [( m
/ m/ T. w1 n, x- y2 X
, E3 |: m7 O4 B
$ Z! L# W. J1 I# ^- V: q
, O) R! s, P" D3 {4 j 签名信息
. F& Z5 F" V' u
. E/ u C- U/ b! Y6 E. ^) k% r" d2 f4 a1 d; y
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 , U9 D4 ~; f" ?7 S( T) S
. p( Q. o3 L8 p5 F" B2 R6 | _8 s& f9 K
! P9 s9 m: j* W' j: y$ ~8 P
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 $ p' q& q3 D, o5 @" O. m
& C! }- d; f) T3 K
1 |9 w9 y+ @3 j' }- z 在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
8 S* I# K, L' T
- h. w. H" V S
# V: d# Z/ R8 Y S, i! i
$ G( B$ s% T- h' l8 \" r 6 s) H+ N7 w4 x; K" I2 b6 B
; v9 u, W- W/ R, L" z0 } 7 v- c( m( c8 z/ ~
( |9 m- a$ K% Y6 s
- E z$ B) q" f& F
android签名的数字证书的一般都是采用 X.509的国际标准。
4 k& f! g, {* o8 p4 e% e
) |" k E' {3 y2 [/ J/ p
1 ?* l; x, w2 i& a6 R 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
' w. y& C3 C- O, O3 m" W 6 x% y: j9 x# h! c: {; l
0 t. d, e) ^9 Y: J! J7 U1 E 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
4 \7 Q$ ?2 w7 {% O6 z# g: V4 h 4 B) J- L6 Z0 W# ^' s' h
& z7 w5 C! l U; k! z0 Y
5 Q7 Y- H+ F9 {4 H; s1 h
" Y6 o! T a& v0 y5 C; Y- k
; L q# l9 W7 f q7 D : W7 I b* F s" \
_" l4 M1 Q8 R# o) S4 a8 j* c+ u) F; x& t2 `0 u
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
( R% B; O7 S8 r: A: @" D- {6 o
, H. u, O- [* s% ~8 c0 l$ h0 k2 H7 ^% B* S, d* @& |9 E- a
( y: E) k6 G( a7 o7 A
" M/ ^; p3 D# x/ e6 P1 X5 e- L3 B/ N" b6 }9 ?! k7 Y
、
$ j( M8 l; H0 a& U) [ - p) R) l' V! g q8 O1 ]9 X
# j0 j5 `) k! D7 i8 ~ ! y& |. K7 U7 s5 ~% V! q
# D* E6 W0 }5 U- s/ C$ T+ n- f' _* m. q$ E' G) a6 {
权限信息
1 x2 k' F: ~" R$ K, w4 d* M , [* k1 Q0 g$ D: c2 ?' }3 T
$ a! O4 `8 `. a i4 Q
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
: a2 G; E8 a- T6 b4 y/ B$ e# ^
9 U/ x; t4 {) N$ s0 V% j1 q$ }5 S! S# O
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 . B& x! C6 p* R; o4 y
8 q- q2 E! O0 O/ G) v# \* b* k4 j2 g4 z$ G' W
/ j1 a7 c5 t8 f- H
$ b% b, a, @/ Q) W
, I( S0 |5 Q; b* M7 M, L' z' o
* P4 ^& v0 v+ [/ G+ k0 Y
4 {3 x0 M" H' T7 V7 z9 T* f: _ G/ |3 E9 @
下面对这个APP的所有权限进行详解下: ! O* b3 v) Y) ]! R
( f. W5 D8 n* S3 R! c- E: M1 }
W9 k% X+ h7 Y% |: c3 A android.permission.INTERNET :访问网络连接可能产生GPRS流量 # K& S1 J+ c$ B7 h) q! X, Y
& m5 g% S% P( T& T9 J
2 ~" z3 g8 t5 C android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
/ W: {6 ^* @: [4 l4 g ; S* y6 _) M# J4 n1 c0 t' M3 l2 D
: d% A% l6 J, a3 O+ J android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
* H* M5 Q' c' u5 k/ ] 3 _; j! m6 U. U7 W/ j! N) P" p. W
, l" \- g7 H! A# e# ?
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
3 a2 q6 Z6 |. g; Q2 B
' z. y7 _. R% d# j% Q/ o: }/ D" H3 Y( k
android.permission.WRITE_SMS:允许应用程序写短信内容
1 I- f8 E# J2 r0 [/ X
9 j" U" W* I- n. w) }/ B0 c! D) e+ C4 H8 s0 M/ t
android.permission.READ_SMS:允许应用程序读取短信内容 8 G# m5 {1 {; {9 y$ c$ F
* G: I/ `, ^8 O V. b- G+ c6 X) O4 J3 a
; p4 P* M" a* z* q) [ android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
5 B4 O) x- W6 g. l 9 Q/ \% l6 w9 P/ O2 J) U4 S8 ^
* h0 q+ G( N$ w; z8 F% v' E
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 - H( s, w% w, T" Z$ ]
! |$ Y7 g. P6 r, D
2 t4 H. _# U8 L$ | android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 " i7 D1 k6 |7 \
2 L# `' n+ {% T& y' _3 J4 Y5 P9 [2 ]! k& }
android.permission.VIBRATE:允许振动
* e- ?7 S; r8 u% c% d. } ~
; |3 s" s7 o' u$ t* A- g [# i
! ^4 d8 X0 p( E H6 B, ^ android.permission.READ_LOGS:允许程序读取系统底层日志 * R3 r6 L6 U! r
2 W8 l, g n0 X3 W) F" O4 Q
1 w# j/ P0 Q- v3 O3 m$ Z8 m' H* P; o android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
% n5 P, c) }9 t% u
" v4 g0 k6 p& `7 p l$ N- z8 f- I# A$ u, t
0 S' Q/ X) n8 m% O( D. t/ D( y 4 I+ O2 [* I1 u9 H
# D& g* O9 e9 ?
功能信息
4 d4 R# L3 I9 B8 z) H3 F% N % a/ b0 g$ f- }
0 |- d6 i! V9 } 7 f- a c' ~0 S d5 R# b9 M
4 ~' X @8 S3 B1 R- J* \+ v
* @, i `" B: y7 z8 R 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。 + X: V0 y" d. C, ], I
5 C$ \) ^( E0 E, f) S; G
Z) W: t& l# _ Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 % z5 ~ ?. V. F/ o5 B/ a
# |" H, ]/ P9 C2 Z9 P- x S* @+ {; I4 M9 l4 m
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
+ g2 I5 p+ ]3 v3 w3 y
( E" t2 E; F T, g u
$ H& S6 Q6 i! p3 ?. E* ?. U 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 ; n/ f3 N6 O3 Z, m) _& p
: H4 d9 r& B1 e! s" i" l" e! s2 q! ~) n
' z3 L6 \% S3 C
) g/ W, Z; c+ w5 Y) K/ B+ @
, w1 e+ T4 b8 c. z ' w2 ]& x- B2 c7 I8 l. w1 _
6 \' b! Z8 `/ ^9 h0 }% {) i
& {+ H. }% J) @" w3 ]* [' p0 w
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 " L9 l! \7 Y" p8 f2 ^$ l
& {; T7 J# E- ]5 C! L5 @9 y3 v z5 F& Q, M
3 X: `" W. G- G& f# i ( x/ z: i p9 j5 A& L" x7 w$ j( B) V
6 P: w2 ~: l9 f- a. t! t
0 ~. E- a" F& A
3 |, q* i# V& E; B
0 A5 \8 x- [) m! H8 P/ ~
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
! ~+ x# U N3 u * G7 ?2 g% Q; P
" x- m4 {9 \# o) { , @8 b) b$ m6 s/ M5 Q$ O- h8 e
4 K+ |& `8 q' ]0 E" n! ^: M1 E: J# i
: F }+ Z5 Y6 }' j% Z 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 1 K+ i9 [0 _/ S& \; a% B
1 M! L K2 _6 E" ^! M( V8 y$ @0 f$ S; [* j9 ^! Y
" O" f" W) ~3 d$ F
$ [; b5 C7 Y9 i/ x1 B, P) s
l8 y+ b8 U, m0 V 8 b* J) [/ g: ^" i
6 D, k% j- N' W* B- c' L
* h. T1 Y {5 z4 V1 P( N 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 - Y: k2 x4 E/ B( [4 @
2 v4 \" w! Q7 D8 ?$ n9 V: d
+ S2 ?8 R* z# [1 }; Q. M' A$ R LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 . H' l. Y; ?' |% ?
0 o' s7 t, |6 q
O7 x! G6 I/ R
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 a& Q9 q2 X7 v
. Y- x: o+ s( s) |
4 P$ `) @) f$ Z2 g: b: N 开源的luasocket代码可以参考学习下
7 r+ A. y" d! @( c7 R" B: O9 @4 K
' M' L0 f7 |) r" \* k3 C- X' k8 q, n: e' I( ^3 j
https://github.com/lunarmodules/luasocket
" s: P) P( d2 g: R Y6 ?# P0 s ) `8 i/ k+ Z `8 h8 r5 O6 d
6 ?3 ]4 C: N0 w* g( @- \ https://github.com/fengye/luasocket 2 ?5 J0 C" x1 A8 y
7 e# Q9 Z" o% U8 s- a
( B! y( X: ]+ Y* [+ z2 K) m
. ~* J, P/ P3 \) `% D
2 Q- g# i7 S4 R* _) D/ Z& E4 S
4 e2 o4 N7 L' q) L9 Z 7 B5 I3 Q6 g9 D) k5 A
- G* N) l3 i+ g" E
, a2 [% A# U" X8 g \( }2 L
# f; A" Q: `9 c 5 G7 s1 {2 L& v3 w: |& r& |
4 V: ~/ P1 s2 s* {8 U! H6 H3 S
$ I1 T m2 b" ^ s( o. ?
5 J" x0 u: k0 F" s* g- n0 o) U$ Q3 Y$ i& k, s0 a
总结 * K: [: d) P4 p9 A/ n1 p
" v( F7 c3 s* \, ?4 K/ |% ^) T+ A. ~ f9 \8 D
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
& t0 F, b' p6 j5 e* I' }7 y
2 a& Y* |: V; m
2 U, v4 `- {/ R" V( }# t- } 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
* d3 S' z) a3 z# ]. @ 8 e/ ^+ C$ N, ^3 M( L4 J5 L/ V
) F8 S# ]$ u4 ~1 V+ W, N
对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 " j- }* g3 I/ V: b1 D
1 C/ g7 E( g9 M) B( C: h
, J# }' f7 w' [$ ]5 p 结束 ! _- _7 `" y. H2 F: M, W1 A
% r) ^3 h" f! D, Z/ l& }
8 ~; b' |, W7 @- h6 {
【推荐阅读】 - M1 N; S9 y; S- W
" K% G+ }* F2 _9 [9 Q* J" Q3 p \, ^4 q
对吃鸡APP的分析
. ~& [, X* u; n0 K/ m
' x+ _ P7 U- `3 H; Y" t" N
, ?6 c( M- s9 b0 P6 ] 你需要了解的APP安全 6 w; G6 T C1 Z7 k
/ a8 q# V% A. o3 B
4 T1 j4 h- U) @" [/ u; |4 l0 x 你需要了解的APP安全 + V0 g" h! X3 x( b; C- Y
! m; u* y' h2 y0 @# m3 R' y e. [ U- ~% ?9 g& V, ]+ a
# b+ g$ c% j, v/ c
|