- H5 J9 }& B7 `8 r8 Z5 Y 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
5 j# l. x/ H; A0 u' W & p# E8 B5 ^ P& C$ S
- B4 ]( s( ~7 N5 H
i. C$ l! M+ C
+ u. a: S5 R/ {4 A5 O9 B* f; L- M7 e$ ]( J
5 w8 X2 [( ?5 b4 d# _) e* I& Z) | @ 9 d. S/ V7 {7 l" J7 L" A
- t8 `$ w# {: R D) ~
下面就以开发者角度进行解析下这个APP的功能的实现原理。
3 T1 @5 y; U1 b % [6 p% f5 x7 i' B% N4 M
m. q8 `% v( S* g$ f. z. X3 a" \ + u% B0 Z# Y/ \& [! n
6 \6 |+ i# x* @3 J' e" e- b* V3 r
4 ^ E8 W6 O- a7 V% l' y 基础信息 8 R; P: `3 b1 U6 i+ S* ]% @
8 C/ |" f: G7 V& s# P
% ?. i7 S( \* e9 }) R% V
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
" l7 `% s/ q0 ~# i y& I9 K * X. F( f. }; c; o% T
0 d* e( r" n) s1 y& c
7 d: k4 e$ Z* o3 m/ S
3 m; W% f7 o- r* y2 h; R! S9 b3 U, p1 m8 p5 Q& g8 L5 f# E
4 [. u) C) \/ v. O% }; G X4 L {
) \- H2 p' o" Z
3 A: ]& E2 x" M! w: m+ r j 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 $ Z4 ^5 x9 t3 h" J
6 Z4 @6 Y0 C% I( |1 Y
1 M7 S6 _; @+ Z2 `$ y) f / Z9 @, Q/ [" _0 F) E/ ?4 i
* J! D% ]( j; ?: Y( _8 [: ]
, F5 I8 |( L2 {% a ' E7 X) I2 r3 p
% N1 [* E1 N) u; B# i
4 ]: J( H2 ^9 S1 C- G* u/ u 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
6 r+ @: X; ?; l( P$ T4 d7 S0 E5 D* F : R% e4 I2 D, p2 f( Z
' X0 |6 ]. _* p% k; u
. t' V% T a+ F; @% U2 e
' m6 Q# u% G4 I
( F9 W4 Y( y* n( x1 ~8 X 6 b8 H; U' R! y5 h9 F" E
5 @$ ?' R7 q8 O5 `0 p/ @5 a
5 ?( U5 f7 D" V; U* e( E! N0 G 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
& Y' c3 S6 A* u/ Q8 r; r # n' ~7 L( @' i; D: c) Z
0 _7 m ~( o4 X$ N7 L& X4 P3 h, I/ z
- Z# d3 D0 `+ X% Z; e. X7 L- L6 s, F
! ^) {! K9 x( H% d" i
8 ^% N4 |/ S1 ? J5 I3 z. l$ t: I
* }3 Q4 C. C, W0 b9 k
1 V8 S' W5 B- B2 _8 Z! V
# u: T" V3 a. n( @7 ?9 D+ u 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
% m* ~& |" G6 T0 J9 R! [$ z3 U2 Y
Y2 v. h0 H3 T4 e
0 @/ G" v m! ?9 k6 R 6 p% ], T) q7 h
; _/ Y" w2 Z. U8 @, u( c
8 ]8 [# R* A5 x9 O& v$ _ ) T4 _# b# Q7 l% {: `
* h; \9 f: g, ]3 c' X
2 j5 @2 u% I* \( t( ]7 a' F # w4 q i, K7 W
3 i0 O% g( F) C+ W/ a- [0 P W% L5 n1 o
签名信息
) ]* Y/ Y) r& ?* S% D% T* D
; U5 ?; \; F+ e) ~2 v/ z
9 Z `! \9 ^% H8 A* q+ W1 M1 f 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 5 t$ j! j/ g1 y+ y; T6 U% F
% U+ b* C* K# x/ m' g0 k: \9 R
1 V3 ~0 [% h7 d8 f
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 0 `. L# \( c2 M* R9 P% X
% R, n# L8 J% n+ D; k) r4 d' y( S
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 7 D" ?6 P( ]& N) i2 ?0 o
- S4 ?3 Q( r5 P( j9 {% ]
% i* ~% k! r. F2 o; x! @
/ V1 W2 k2 I. i* y) I6 v
- {( L) z/ }& X. A" u
: m, T% ?) I) Q( l 1 W' P7 j. J8 D+ b; o0 x
0 D% k/ _" ^& {- j& W. `' F: J, Z
6 t" V1 S: V) o9 f" h$ w, _; {( D
android签名的数字证书的一般都是采用 X.509的国际标准。 9 V- x) [2 b4 m7 q5 f4 f1 L7 N5 N
4 Q, z2 c% q, V; j9 W! A+ C9 C
0 g0 n& g/ H/ f6 @ n$ E 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 7 o% c5 @5 J1 F( D7 q
t8 ]; J' u* @' S, t( x, {. m$ n
9 V/ y+ ^' k2 Z; A1 r8 @9 C M1 h
下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
& S$ d& ~. N; ~. M
, M% \- \$ M9 I4 g+ E$ g* f2 F* N7 @
6 g& P* q( L; A8 X, _& X7 w
2 T% @/ Y9 F$ v0 W9 ?9 y# E( y
) f: D, s8 g& O' C& b
3 p }2 e' i4 L% b
9 y8 f: ]6 D( I" o: N) o8 ]! j, Q6 L
7 z* }7 l: n+ m5 c" n3 D7 O 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
( s0 q' Y2 Z- P! k
% z+ l: j# A; [7 T: J
0 z ?/ a8 O. n7 Q' m ) y- k$ e1 t: |% c2 ~1 @
" f- Y+ n: q8 n- \. \, T- q
7 t1 Y# d& E; E, k7 c8 T 、
8 L. [, u3 q+ x* [5 l
% h* q# `: G- ^! i& V/ s
! @. |9 T( l: d- u; g 4 f8 o' @. ~. P
5 f/ ~2 H+ e t4 Y' ~# w9 m N. A% w1 h3 x5 Z8 ~
权限信息
' w* P; [7 z9 } e) L8 A
, ^2 ?5 f( g4 o$ s h k4 K7 ~
6 S0 {. O5 I1 A" t* u3 L 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
0 N. A: t' m2 y4 l+ G 8 t* l0 r I' v0 u, Z3 B8 {8 U
% G- g1 _" c; h$ t: }- L android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 # n& x* L8 h8 e0 Z; U
9 u/ a' i. x# \: ? ~5 \, V- t M, [+ `, w2 C" @* `# c
8 { H+ w+ d0 Z X
; y, F6 O: m' q. \- A. r: B
5 F/ m4 U: S6 e5 p0 d
( U, k+ L% J4 b: @4 ?8 H1 F
* ~; ^- w/ r. K* N9 f, ^+ w5 w" q( [1 O% r
下面对这个APP的所有权限进行详解下: 7 I8 W' _) T* w: X+ H9 d( b
z4 n$ ?8 y9 }( L
6 f$ ^; M x4 ?. e
android.permission.INTERNET :访问网络连接可能产生GPRS流量 5 B$ p& I6 ?. K
3 ]$ g3 L% U0 z& n
( r i8 A1 v$ W android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效 % c# q+ S c5 `. ?
- }% D2 F& j! n' o I, x1 n0 ?& W; p: k* t9 r* D' Q- k6 y& r, i8 p$ y4 a$ w4 s- l
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
7 u. R" R: H' A3 X ' U! t; G" d: M
4 \4 E3 N; B3 ]0 y
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
6 Y% u; q, r) w& x 8 D* z. {. T1 M* ]/ N# D4 W
5 \5 K y8 a* n0 b3 z: i/ G* t android.permission.WRITE_SMS:允许应用程序写短信内容
( d- J0 Y. ], }7 _ w5 v 9 o- n" G* I1 I0 T+ l7 O
8 r# _1 G* A" E# j* t% O3 u android.permission.READ_SMS:允许应用程序读取短信内容
7 L5 B" x, J. t0 Y# ~5 t1 Z. o/ S
' T0 P* h6 S u u
" K9 X: W$ ?: q8 U* v0 [2 a android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 . e5 y* W* c) I3 ^& B
% f- g/ r2 M5 s+ B
( w5 t+ L+ B' b a1 f9 F# f android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 ) ]0 P# h& i6 X, r; R" t
4 o+ W& E2 |7 D @" t
, e8 t2 D! P5 e1 P. x2 z6 p
android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
- `" \% J3 n) {# A4 Q) _' { : M* b# ]9 e% Q9 _
3 S+ m5 L) @6 Z6 K- K2 U* R. C
android.permission.VIBRATE:允许振动
9 E8 A% K/ M) W" x $ m+ \2 M$ I5 A% @$ s3 m1 i
) ~- n. q, ? }, `% v r0 E0 B android.permission.READ_LOGS:允许程序读取系统底层日志
; f' g: z( }3 v( ~4 T4 D6 o + h$ Y( C6 D# m5 g+ f4 R
& s+ A2 f2 c2 o k android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 - g- b g2 @) n1 X; K
- d2 _9 s2 F M" k$ P
0 O! \2 N7 [5 b8 ?) \; C/ t 4 o& I+ T! s# w3 D6 o4 s
9 K0 K q& H& @, a* I3 N
" u" ]; }3 I/ B% E$ U# m 功能信息
; w$ E \0 r- b- X3 ~( N; m3 f
4 x1 }! _ b: a% g
, q: H$ G9 I6 H5 O& u% y8 O
. t4 U: i6 l+ ^3 L6 B! t) G4 a
, R! G( B$ r) L# L. ?& V; I
- n* b! T* T1 {! K 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
5 o! ^3 r7 V% L% A$ w
3 ^8 }! i: N8 i$ {+ O* @. d7 T1 W
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 6 u3 V2 y9 R: V2 Z
4 {( y. L# z7 _/ K1 H8 J1 N5 w5 D/ U! o) @4 z
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 2 y3 J0 b M9 Q k
$ X5 _5 x3 b8 i4 K# F
4 A% J8 f8 |% w& V/ Y 2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 6 `) P$ t' Z+ \ F
6 [. ~# K5 b* Y4 e- D5 }
! p1 I( W+ H& e, n& d6 n2 Y9 W - e+ h. O$ i! b" F9 ~
' z: d& t* K ?, Y% V/ [9 T
l6 W& w/ g0 j! m
4 E0 P, P' ~* s3 H) ?4 h+ ^9 F P) r' p/ x9 d5 c+ O' ~
$ Z T+ e6 b* m4 ?' ~ | 输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
" ]1 _( P9 x* X/ O6 G 0 a0 @3 S. `4 |6 F6 y: O
7 n: e2 M; a# o7 o+ f3 z: Z $ }( J9 I7 i4 j/ G
8 i0 ^6 G x* n7 ~
: A" C& w+ s6 y8 K' [/ X
9 x+ E, M8 f% Y( R3 `& s- t * H3 b$ w6 G+ Z p# S% x2 r
- b& P: z" d( B0 x9 N
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 ( x. h( `3 ]5 r
3 |' E9 G2 U2 E& i5 j8 h4 m1 ?% g+ H
' ^5 N, O7 ?" @9 s+ L6 W : F0 P1 a/ k* ~2 P
& k% D" D+ e0 _+ D: F 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 * y' R1 y# l* }- u8 t
* c8 }7 S3 [! [* n0 Z- v; H Y
% M6 F; u. s2 G& I! w" k ' ?. |. W1 f& C1 |6 Z$ `9 M
8 r- u+ L8 z3 m8 I n7 U2 D
4 J, J- @) l3 ]5 V- ~ # S5 V( N+ F, \' ]
5 u7 @4 \3 p& j, s2 O
9 U% i- Q6 `) y+ ]% A
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
7 G( H* ]6 i/ Z$ |4 ^# m
/ R% |6 g" D5 X' o7 w# |
; A6 P' v1 ] Y' k$ P" A LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
0 T0 {" Y+ G0 E6 G
# o0 w. } A% j) J0 L' j9 D
! g. `% S0 M& ~ 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 ) G, @0 j# g, w; ?
1 O" E! n! @6 j: U( h3 r
8 O5 Q+ \1 b/ E7 r; d 开源的luasocket代码可以参考学习下
" @( d4 O9 w" H% u: k" O" H) B# d' q 2 O b! J* c0 d- p: |& e7 H
9 Q, w. m, u; @ c
https://github.com/lunarmodules/luasocket 9 V, K K; u1 a) U$ L* Z/ k3 |2 u
# s a2 Z3 K8 G& T* D5 K$ u
6 K/ h% b' c8 I! ?3 ]/ L8 T https://github.com/fengye/luasocket g |! c1 Z" u* a4 \4 y4 ^* @ C
7 s% e% d% R) s( Q
" B9 o/ ~: C' Q
$ z) ?; y# ]1 u; w$ a
2 l: |! z; C1 H# I* V/ t
0 Q n6 r1 [0 z& e9 w$ @
% b# d5 j& B6 I* ^! B6 v
* d8 ]0 ]+ S0 f% l, w3 [) v, x0 ^3 k4 m8 b* e
1 [# H- K. ?6 d
6 F* I0 `& J. Z8 Q7 U
3 }$ {3 Y# Z& v( I7 e& A+ e& V
6 {2 v a7 f* q1 f7 W" k0 K6 @ 9 b1 }5 [( r r3 V1 ]* S
- V" t6 u3 e) g b D/ a 总结
/ V6 R$ h/ n8 h! d7 C 6 p) ^3 R1 l/ v4 } B; P
; ?" k Z; z1 C- i! n1 N D7 ~2 ~
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
{9 C) I. J2 g' z- e9 |0 \* }' J' _ ; \1 `) V! c1 k
; b5 J0 j! T; U7 d 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 ) c" t0 S7 U% c8 J6 p7 p" H
7 I v# u& a% C+ D) T! f% j7 _# ~! M, E) _5 G. k
对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 3 k$ J( c& X6 C2 s
U/ b: q$ W: w7 l
$ U Q3 t! h' i* U, b 结束 / O3 M, |* k! \* V2 W' x
" x' P6 `3 Q2 e/ K* k+ j
/ I8 B" W# u3 n 【推荐阅读】
4 ~+ e' f- j% d6 H" K+ h
. w0 v5 L/ @! r& j- w/ Q/ R! z" b
对吃鸡APP的分析 ' @8 z8 j5 I) @# A- T7 Z3 V" J
# q4 W4 ]. v: Q7 c7 m: [0 Z' W
* a( c2 V5 T* V; W% o$ U/ D+ ] 你需要了解的APP安全 0 m" c. T; `* ]2 E! `/ j' Z) K
) f) P2 A' k% B* |: }* @% E: J
5 }5 B P) f7 v& M# X2 d 你需要了解的APP安全 , f& o2 _% H: M$ l7 J
* ^# {" P& [8 H3 c- D5 c
: G3 M+ n" }0 e; K5 n A
9 ^+ Y4 H$ n1 T0 ^ t
|