1 ?! a; P& d; O& M/ s; z% \5 i 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
1 `/ j u7 ?) o0 j# h4 ? : l& r! l) a( Y
5 j8 B3 H- i- W6 B! z2 A# R; f
$ T% H* [) j3 P6 o7 \: P$ S2 b
, V5 k2 I5 F) S" |2 p! X/ \
8 j3 R$ j; D+ I8 }
7 w- t3 r2 L% j' i- V ; ]+ c0 i1 N6 c3 H! b9 I2 }
# A1 t3 B# V" F$ g! ?) x% F 下面就以开发者角度进行解析下这个APP的功能的实现原理。 * Y' e- w7 z5 Z; Q2 i! L* v
- r7 G+ l- z$ Q# u: T
4 t; y; Z: Z r
- o9 M1 q8 }4 C/ @
2 J' x) i; ]% X( L
! D3 m8 R" C5 ^ R& ^( _8 w
基础信息
$ v/ J) @- N/ L5 s1 A6 y
7 N& V& Q8 j! U" t9 _- Z4 f. K( n: `/ z' p) N6 W4 Y
拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
m2 h$ i7 R3 w3 o* n- Y4 ]; k. v
- }7 Y0 s+ N7 m& _# P/ c; a( y+ U! t8 S9 B) B
% e6 H! |8 T5 |$ \) |& E
9 B% r# q' x( O7 t( U
* ~( Q$ \9 E2 H; E7 T6 \. K, R
" G# b: ^- i3 ~# @6 b
+ |- B8 i# D. D; H+ e1 \( \" Y0 _3 u2 D
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。
: |" N( m" {( D& x; b
3 t. `" _6 |" _" s3 ]+ I
1 Q! s Q. Y: ~6 c $ D* u! l* c" E
. w/ _$ ?- L! Y$ w/ c( _4 b
# F2 }7 |( f0 `8 y " x2 ?7 X& j7 { q3 i; ^: F7 ?+ L
6 a5 V( W: @0 m: C
% d& l, ~0 m/ h1 a
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 8 m. d+ E6 H1 P- B; J* {1 C& z
( X/ U; d) v6 W. l/ E% I
6 s& S" l/ P6 H/ [4 t- `7 A5 n
{/ s: k- E/ i- e
* M: g' E# p2 n1 l$ y& T
$ ? E p/ w; I
! H" _ w, m0 U" p* F/ L
% {) \4 A& N; x" W1 G# ]% m1 `- |9 p6 G7 U9 l' g1 K
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 ( S; y' w* t( v8 l
, w; b# z% h1 X" d: H, T: [1 X# E, V& k* M( Z% u
% S0 }6 g/ B& G+ R: U) F# g ) z$ d" ]$ e# _+ ~, F& p5 m
% f* M0 g* T L8 N, G* F
+ L3 L; B) e$ l7 X2 D8 U
& k& |# m+ K% W2 O) R; p
3 ^: E7 r, [$ t! j6 }1 a 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
$ P' e- Q3 }# C1 Z/ Y
8 Q; Q- E! M/ M) `+ H6 Q6 U
: j5 D% ]6 b3 A" w) _ 6 ~+ W! H: l2 K5 c- B
/ C& X9 M$ H0 f" i! g
l2 @) X7 w' }: b* \4 ?9 s; f, n% t
3 |: U4 l! E+ U3 J w % {8 a1 D& h9 R$ w$ d
% C: d# W4 a9 I
3 A: [7 x B0 r) ]: w
' A- \8 U+ _, u+ `3 d$ i; Z o4 {! g* G1 q, W1 L& |; Q7 b( m
签名信息 " y7 ]' q) B/ `
8 T7 {* J: L& E, [
: j4 l# P& j' S8 f7 j; f5 [ 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 / w2 |! Z7 T8 t; }7 f+ C @
7 x- K" e2 [# _( o$ P6 `
% m3 B3 ^3 o P 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
3 `# G! ~) ]2 r( U" U/ K3 z 1 I' I r' J/ t. |& ^1 a
$ M( c* `5 W& b5 Z. P
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
: `) S) [$ W/ J; y2 K
( x) O2 C X% B& V) u; s7 D% d( F5 b# V E& B# Y
, y9 Q; L' t7 t4 I& w% D, r
( c, d6 J1 P3 l$ p. P Q9 F H
, B; l! X+ X0 |
" }/ `: i! N2 F& p2 j3 P0 u , h! _/ K; I% w/ g% h! U4 j$ e
. D' `% ~: q' E, _. q
android签名的数字证书的一般都是采用 X.509的国际标准。 % t3 u F& r" \( B
# u8 S1 ~8 E5 ?
3 e7 \9 S- Q7 e6 B8 ]3 y 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 5 H6 ~) y7 X/ P! ~7 i/ _
, V% Z; H W( t
" j; h) H3 _1 \7 V
下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
0 u& W6 h+ A1 l# g1 z. ? X7 k
# B: w; D1 a, E- `2 G! T3 q1 ^8 l1 H
. h& Q3 O/ }0 O! l3 N4 g T
" ^' \# t/ f- F1 V( c$ J8 _; r
$ f+ L) |3 z+ k
# v1 h; q2 t) y& O% q, a8 c; @* d+ T
% y3 v' T8 M0 w2 N8 E' F. o5 w6 m8 X; z) c7 `) `0 Y2 e
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 , r) g% f* D; w, ^4 A y% R1 M' `( n
' z. Q/ f {0 Y2 X( u8 L" y
+ G3 G D9 W2 g. ?4 ^- N
# |0 q5 g o. S: n" o* L , [" X9 l: H/ Z
& N# o8 u1 x# n1 e8 p w 、 4 y' y7 d3 ]# p( S
% g1 E* \/ Q$ ^( O4 J1 b
, b7 \0 F* `1 a7 l9 S+ Z) n 2 I& d) Q% Z4 T6 h) `* s/ M: j
; p+ Z: r+ I( J$ J1 _0 E
|5 K# z) E% P8 E' p
权限信息
! L3 W: m4 T5 K# M7 Y % L2 I4 ~9 ~+ k
; g+ a, F/ v5 w4 `6 K 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
5 p: L8 r3 f) C; a) ~0 `1 b9 _ ! x# ]9 A* R% p4 P( Q: n0 Q
+ M6 [" s! u1 Y. w8 E
android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
; [5 d4 t4 ^4 G# q! x+ k5 g + O. [4 e! k* F" W
4 f# A3 k3 i. S& r# I5 T% h
7 k0 b+ d, D) _0 Y
. b/ O4 \! ?2 S$ Q" R! y4 E3 c) O- S: s; _" I6 G. B5 u
* k p( a3 Z: q5 [, U# `4 r
4 S. S7 Y( }- `7 s) j6 e
% C' C# t, g6 p: v2 a8 { 下面对这个APP的所有权限进行详解下: 9 c' h% u' Z: o
' F* u5 i/ m7 x8 m6 n
: i& u( H- K; O6 D5 k android.permission.INTERNET :访问网络连接可能产生GPRS流量 5 L4 F- O! Y5 \
; F9 T& H( f& Y: h- s# S; \/ x9 p( Q& `1 U1 \
android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
6 l" [+ @9 \1 B4 u7 J! U2 h! ]( I : P7 m2 \! b; r) E9 `% `
. R0 A# r4 x! o! a android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 # J; o0 H! \' p$ C2 R: { A
' n' ^8 M; n7 K' n& J
6 f: M6 m7 r7 n" D7 z
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 6 o) n, f! M; Y
# C; X$ b2 O5 M# Q
. B5 B- s2 a3 m& l+ H android.permission.WRITE_SMS:允许应用程序写短信内容 0 o5 s8 M8 c, u; [, p1 W
5 c. `$ \, R/ q9 N. ^7 F
- z& d: g0 \) [# N3 S/ G* r0 U android.permission.READ_SMS:允许应用程序读取短信内容
) a# L4 u% H( a6 k 0 W/ X4 T) g$ W8 f
5 X) h1 e5 [; ?' }" `8 `2 D9 O
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
. V6 U- a8 [: c2 C/ |- }& o ! J9 ^4 V5 a5 L. E% W; h
4 j3 `3 X# J+ q0 C) r* ]3 K! Z android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
4 V9 u5 L* p( I5 [# \ / a; ^% ]' H3 y0 E: n
$ r- Z, w; X+ `' A android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
: i; [5 h) R4 l2 r
9 a$ f- C3 h6 P, o7 q3 F* v$ P" j
5 I1 S3 j- o1 v* _1 v& }' k android.permission.VIBRATE:允许振动 5 i, M; G% { R+ {4 I
8 ^9 A: _0 N9 V2 l, V" ?( D
6 c( m i" u7 M4 U# R A! q3 v! G
android.permission.READ_LOGS:允许程序读取系统底层日志
I( h- F" \+ {, L, q* B
& j6 N3 Z$ y. {
# f# `% R4 d/ P5 `$ X8 ?, U9 b android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
0 O/ i+ n5 B; m/ k
! u0 |4 ~+ I5 n; `) _0 |# R! M0 M' [& P
' M, q2 f& s# I ( T# v1 r3 {* L
0 R( [* |& `# G, U 功能信息
% V9 ^- I# }! |- k- D- e+ O
$ Z5 d, L2 j" n# Y- m3 O( L
2 V8 R- w. d4 G' F' ~ N) i
) n s) K/ Q2 ^; [) \) [
, H; a* J @: V" o% \* y2 u* a3 w$ P% t( u/ \5 ~* x
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
C: I6 a4 d" r' A! C% o3 }4 |
, w# J3 v2 D1 `* L' K$ h0 s) n4 L, n. y Q0 R0 m- k0 D
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 2 F; R7 }1 Q: w j5 q/ E D' I
; b+ {$ b8 c( W% p( u$ I3 C: D' I7 u: \
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
/ M# |7 ]) d; P% |+ d# ? ' k# y, y9 n- Z: Q' F# N
7 J5 m$ [* _! e8 v
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
7 i$ V+ J( i) L* |, E( T% }9 H - J( C4 }8 Z X7 H2 q
2 Q" Q) A" r5 x/ N( K9 p * A- g5 n. r$ e0 d, F6 E( A/ [
3 o0 u9 i" H! K
. M& {, H/ v* w: \3 r: t. s
$ J9 L: W# q( A
$ X' l" f) b' N9 n* g
6 W* D9 k( J( L2 G# i! s' ?0 ?
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
; z4 f! r0 I5 p! K8 H$ w( R
" A# V, c% w2 d2 L
% f# E' E! G7 p$ h! G4 [ z$ x
" z1 ^* |8 s! T. w
3 j& M5 O, I# j% e% y
; }' Q4 y8 H- @+ n' J & [& V1 [2 I) _) A
a# O4 `4 \0 }5 O! L! N0 o+ x/ L8 ^' \+ [
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
) ]1 T3 e9 f9 H
* G' a6 i) m; [1 i$ h
4 Q% `4 M# o& }$ p8 n1 Y N$ } l6 f% c( A$ h. j# X" v, N' E- [
; K5 O+ F; I$ i+ C' p4 w$ G
) e- m$ n( f% }9 m: x8 a' q+ m 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
+ m) ]/ G2 ^; K; D1 ~2 u1 j 5 i; f& W- k$ E' N
( k1 [. ?6 O2 i- r% O , ]5 N% F- f" B! O0 G
( M/ j0 `4 O; }5 X8 c$ C4 z/ q
, s3 t! H" G9 q/ T$ k0 q - R# o1 E& g8 A& f% Q2 ~% Z
2 b5 `7 F& e" a8 p4 ~1 o& v# N/ O+ |5 E8 [4 \: w
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
5 _! d2 V/ \3 H2 V- v2 s & a9 U; K5 S+ ~2 o* y
2 [4 `* u/ L* L, r( q6 v1 T LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。
' n* L% V8 U' o& x ( U2 N6 g7 ~# y+ ]
' c+ |" Y! _( A8 ^6 d; G) J 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 6 l4 ] d& {/ K3 a) P! ~
% B R2 I) L" V5 ]1 |
! v2 n% ^7 @2 N 开源的luasocket代码可以参考学习下 " `7 }* e) O& A7 w
7 O# X9 q: M: B$ m, x+ t3 z. m
5 S2 b( l- y' n3 v; Y8 G7 {
https://github.com/lunarmodules/luasocket " t3 W1 ~$ S7 ~" d) f4 R* A& {
" G# c) s9 S1 C A3 P. h4 K/ A
T% X5 ]9 \* F4 o https://github.com/fengye/luasocket A0 j0 X% T1 }4 {$ c8 b/ R: [& t
u9 |& r' {' E' i
, j2 L4 S& U+ l
! H- E/ q6 v/ f
4 m5 _$ L/ v- S, J
4 ^8 q, @& y' ]6 u- e) A
1 r, K* n( v, ^" B
8 W7 [' J, z; a! U7 B0 y2 r
0 b! E* ]5 u' c* s2 C * n; @9 F5 D5 A, Y
% n8 y l7 _" {# |& o$ f [+ J @2 m$ \/ l$ z% @8 B5 k1 n6 z( p
. Y+ m9 R' @. b/ w4 Q 7 q! J* @5 `1 k3 E" j: ~8 G
7 q; c1 k" l( m0 c, C, U* ^8 p 总结
) M9 z9 b& i0 W / v8 E M& N: H6 Q! n# }
" J. b4 | `: o4 k( Z! U
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
5 F+ j4 X2 q$ K0 x) t. o( ]. m 1 q9 @+ j ]" r; q( m+ W
4 A4 S) r1 N' q; w8 `. C
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
& N* A0 w- w, _( b$ l- u; ^ 5 K% Y% ^! B- C$ Y, W, E8 k
/ P* Y1 q) g# D3 {6 L! d 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 . }1 H4 Z! U: C% W7 q2 U- ?+ R( o
1 O* g E% y* T' ~, i! m7 p
. d" T+ j0 _% j4 m0 k
结束
1 M1 t& L6 _% k. v0 i) B# \ ; P' [' S" S2 b' N- }. ]
, K% Q+ r- L$ \ 【推荐阅读】
6 y& K4 c* m8 o3 v6 h* o 7 h; u& ^3 w) c6 O; S+ j
6 p; g& \" ^* S! B
对吃鸡APP的分析
$ |! e9 F% V. y- d: h& h* K! p + S/ c. u5 Q9 s/ \3 h- p
9 y5 w6 V; u, e" ]: J+ `! R4 n
你需要了解的APP安全
3 b# N5 } }: a- L * {) y8 h5 c7 d, F, \
, f& r- J' @' p3 a) s* o1 ? U" t
你需要了解的APP安全
; u; }6 \: t& j' Y* ?
5 ~) r& p% E) l% a0 e; Z7 o* T
z0 ~0 g! o; l; x2 D x* y " P- @0 Z2 s* g5 U& ?& x1 D1 j
|