9 L6 `5 w3 S6 m, l
在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 / @3 C9 b, H r: B- C. r- }5 N9 c
% U, _8 K" o" i9 z4 e4 \# s* ]; @9 B- ]% `& u- K
8 N$ ~4 [, y4 e% I
: L9 \$ m; F6 h5 T t" |
: W1 R# s& v' {3 c& B5 C
% Y- S0 a4 Y. y; F( E6 t) E * n3 ?2 W3 @" ?7 {8 B# [
% d2 b8 u' F* |( r" G
下面就以开发者角度进行解析下这个APP的功能的实现原理。 8 q" _& _' X$ Q$ `, ~! q' R
3 F5 ^7 P: }/ S& {, J# n& ]6 C
2 n9 m( a% I$ T/ {( _7 _# b' z
4 Z: v* U8 E: R- F1 u7 Q; K C& N+ s
. |* y- ^& r. N0 z+ [% G/ }6 _$ V4 t( s$ L
基础信息 ( B+ o$ z) w' d) h% V: ^
( H/ T( G2 j; b2 a( R
& a) O( T( T' X8 V% R' k 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。 8 K1 \$ X, R/ g0 F
, A: ~0 I8 |1 O! v! C4 s5 a: p
* i! F* H& _* B, k . f$ _' K6 \9 h6 f$ F+ |& f
% B3 q' R: j+ a, H' V, r& y; ^& _7 {# q1 e4 p
9 K) U; k2 d( a$ U' Z6 x 6 X& y, `0 Z6 v# D( U/ W2 k
J+ H9 N: x) U2 W: A! x* t8 ]
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 4 n5 S& m! M" o R" r1 K* C
' M7 B" ]5 z, E0 W/ ]% A) w" l% ?: x1 P& `. I; a9 i% M
# E3 p- D- a# k2 x3 `$ R( ^0 A: m
- r1 M6 ^/ B& ?! n! W$ x. W9 @( q. q: T4 ]6 e
. v3 \6 `1 p; T% \# L5 z
. }% k9 Q( S3 h* E
2 z0 j8 N) K% M, q0 ?
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。
+ v0 A% p& P x9 P" r: V
/ o) M n7 l0 j$ o8 }5 U: ^" S0 i+ o9 I
, M" U8 a& }$ w3 y ( t; h: K2 a6 h- O
U8 I% Q' f) H( b- r . X; ?9 ]- Y% X
7 u: f. K) z% Z' l. k7 b' D' I- {& r
6 m. a' W, `. f9 \; t' e6 f) C 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
. A0 e( J; z' p; S, u$ q3 ]0 |
2 e @( i6 \6 G O; V, G, b+ n6 B: L
' J' f& y0 K# h9 i" Q0 l
$ g, T) B0 q) H* _. Q/ R
& K* G+ E+ E0 y, q; ?' h6 Y+ }
8 i8 c1 H6 S X* [. Z
, `3 g0 a1 i" m& Q- R
" i, x; a& K" e* b" N 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 ) t( F" C" z8 O
* C1 Z0 p1 X7 b) ?5 S* H
) n" I1 ]( T5 X3 n X% F* a2 b " O2 Z$ u& N$ W y' i4 z$ e; k
- x) W. H- M8 N% V; P6 ^! K
: l! A% S% p: @* ]6 i$ c
, b* W4 v( }2 ^+ v* S5 _6 L% s
7 p$ n5 M d0 b8 ~$ U x7 S: f, n
0 u; \+ I" }6 ~5 L/ c% [! w% F / x7 x8 F/ L8 T: I; ^
W3 Y. F( {$ M, ~" e7 K+ D+ @7 I/ ]* P- Q3 l/ S g5 I
签名信息
$ J9 j! P8 ]7 S( |# r) Z- ^- U ; W: z2 s: y- t9 k' H5 z& n' d% s
9 t: e' g, B# {
通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。
! I$ T% G ]9 D5 E* K& f( ~# U
- {8 `- Z3 O0 ]2 ~6 G; Z0 @% |8 M% n5 V2 Y! k
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。 * M6 Q9 w; W# e4 d1 m( w
- {; w& p0 C2 W4 ]. h) O) ^" _) X, @( ~
在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。
* S# ^$ K: @6 n- z4 k
8 o& [+ z: s6 {+ X( b5 ?8 J+ E, _1 G) @& ?) @* m9 w
+ ?! X3 Q" U7 L- `8 b/ B% Y
2 u% I s0 J T% ]/ @
8 o6 R$ U, e, `! [
" s: c5 [+ z0 ~$ |+ r
7 U; ]% F* _! x8 X* ]5 `( E* e* m6 M1 g& L( p9 @9 l9 G
android签名的数字证书的一般都是采用 X.509的国际标准。
5 ]9 r A0 m/ m; T+ L, d
. @8 l) N; h( E- ^+ V) Y
1 C5 _: [. ^, H) p4 _8 _9 y 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
6 k: \4 t$ v6 A
6 f3 f7 f, I: o+ I0 N) [
# N9 w' \) ]+ u+ P: K9 O3 E 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 ; A) z$ }2 B5 b$ |5 p# Q# w
+ L( {1 h- y. A# d
& ?* S" W9 E; g0 R; A
/ A: _4 p1 Z. T8 s 1 |2 a9 \4 r1 J( b+ y
; J0 u6 i9 Y/ v: [& |
2 k( a; s! m0 u+ h2 q1 A# _
; e& n& R- ~% E& g7 A- T }" }: \' Z* X' h" ^6 W
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。 - p0 c5 }8 j2 I+ \' \! M+ d6 a
9 r# _1 r7 R4 @: k' g1 V% s$ ~3 h
w$ B$ z% Z' a' a* @, t) T ' d$ q7 k# L( w
4 C( T* c" Y) g- ?4 Q
0 x4 W" b; Q/ b) h1 Z 、 3 B" F* N n; ]0 t7 G$ K8 W& E
2 J: T0 C- h! v2 y0 y
/ d7 R+ U- @! @0 g1 b% Y ( S, _3 _3 r+ l
- S8 c5 h5 z, W8 J& u. n1 N- t$ j: ^4 v8 B8 F2 F2 R% H
权限信息
0 \# w7 u* @/ L1 D
6 ]) T* o2 j5 R, A: y' u+ @/ |
% v" t) c& A% ` 在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) " X, R* r; G! q! E
" c1 Z3 Q! i) [+ j) O4 ~
: `" n* j7 k, M) _) D7 m5 r; G3 c android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
: U F& H T5 Z
9 C6 Y+ X3 z. I& ^% `2 W# r( G
* y2 t1 i( E( P! W' ? 5 [9 [; E( k+ w+ {% N
: \2 B1 a& H% I" e6 Q) ?/ l5 ?0 f1 G3 W( F1 _, B& U
7 t2 i& w Q" T9 i$ H( [
2 ^0 S1 k C; v+ {" T; |6 g" y
E, F z7 q* ]2 M* f" Y
下面对这个APP的所有权限进行详解下:
& D1 M# P, g) w 6 T1 c3 z$ J3 O4 y9 z
0 _$ Q6 }- O v9 V; S, B. I3 f } android.permission.INTERNET :访问网络连接可能产生GPRS流量 " Q" m$ S7 P2 E d y
4 a4 O' t% a1 ]# p
9 N& q/ Z+ d8 P# q, d/ O) R android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
! k5 N1 D& V/ a 9 n9 L7 _% J% G v- u" Y% Z
; Q5 o9 q/ _1 d# y android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 " o6 Y' ~- D8 a4 T6 X1 i
3 h0 H/ R' W7 Y; y7 @) r% t+ I. Q: [8 [2 ]! E, I6 G3 a" {
android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件 3 d& A6 Q- g+ J8 e! H5 P
$ S; F, p: h7 J" O: u* E0 Q( x3 q0 @- P) |; t P0 y) a/ @/ g2 y ?
android.permission.WRITE_SMS:允许应用程序写短信内容
/ q& R% K3 D# U, }- ^$ X/ e
9 }0 p) I6 _* w7 h- W5 h" `; e
; V- C% q2 h' q5 P) ?% i android.permission.READ_SMS:允许应用程序读取短信内容 7 T" N0 v$ e( ?
2 p# p. J% ]4 M% I# p3 J5 T/ o
2 f1 p% D) L: G* }5 Z android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
8 j6 X& ^* c+ h3 k @$ L" Y9 N
- I* w( v4 u' ]' F( T% }( r+ |& ]& u' s$ z' n
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
7 F1 p3 a( _; [& r9 z7 |( W
1 p O; g& ] h
3 w% V4 N7 Q6 r" k android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
/ p7 n( m' w6 H; {3 d1 ^
5 X0 K$ N) ^9 o1 }/ ?7 h4 W H, J( q' z1 [. O) E6 t. F
android.permission.VIBRATE:允许振动 , p d/ r+ z# D/ B- E" O6 a
8 n* s) v- S9 g5 b1 S* l& r8 c; A) D0 |1 H9 Q+ m9 r
android.permission.READ_LOGS:允许程序读取系统底层日志 / V& y" n" v4 ]5 T6 a8 Z$ G
# [5 X1 |* ]9 y8 }; m0 _ E x
8 n1 z ?0 D) o android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
7 O6 z: l \& \( g ! |* _' o. h9 V
5 I- E+ [8 @9 T# X( Y0 f
( k. C ?1 X% F; _* W' C
9 E9 C3 v: T r$ \% u) N2 k2 W- L0 \) G6 T6 b' ~/ t) ]/ \
功能信息
6 q p3 W+ U+ L( i
3 H' z7 {8 ^# F- D. _1 g, W; e: e# n |# N3 k
\+ D0 t8 Y* s0 o# E# l9 { - J( _3 b" r) O+ |" D+ S. t `
1 }, c# X9 b% W' q# y 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
" p3 U, g N) \% N
- U t+ e/ ]& k4 [) z# o" a+ m$ ~, P& ~6 V, s/ @$ s9 k/ W6 Q- E7 `
Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
. ^6 `7 e5 }' ~# U 7 x$ I% U1 X/ s1 A, f
h# \) i$ U" h$ M$ P% m5 b5 V 1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
8 ?5 C+ Q6 g0 d) m" d3 [( ` i
! K( Z; R6 i' t, a i8 f& b6 w# P
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 3 p( }# @! T" c) l, l7 M8 y4 h
" E4 h$ f: u% Z% |1 H
. {- y7 y! z+ @, _% F& _7 O/ F" U! W
9 X+ |% F. \$ T- B " x6 ]! s- v: k- M7 q" e! @0 S7 k
' ?- N, e1 o4 U+ W. E
1 J5 B! \) n7 V
* h+ V c- T6 B5 R" E/ Y/ W. I& }4 A3 |+ C% G$ |
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
+ ?; A' n: W& _- p- j4 r6 h + H) N# @; P; k2 r, q' @5 U
2 x/ X& P/ X! V+ A
4 D$ W P2 e$ R/ @2 u
5 z3 D6 x3 f0 n" t6 `& y) N! ? G. F7 o/ M j# m) S; ]3 V
% ^ m3 U( i, i# `6 U0 H- i1 Z8 i: V 8 Y- q& }& u) {+ n0 B6 p" D" A4 x. H y
' u; {- v6 E+ A) P/ d
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
' I' {3 G7 j+ W: V! ]+ b/ `8 n
# k1 @2 ^7 ?4 k; Y1 V# P; O1 a- Q+ Z+ B; d: B4 M# r
3 v" Z/ g) { W9 m( |4 @
6 y6 A5 v9 i) ^! F2 `6 s- s+ |8 A8 @# A8 @, K E& L6 K
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 ; A; K z& A' R, E# I' `+ |' ^* X
4 E3 h q2 O% s# Z2 |, J& j5 f3 U. v, Q8 r0 {9 s
1 N+ |! J+ |; x2 h! Q: w: q$ Q
L: b+ K8 {6 b7 {
) l0 s, @& G) X" E1 O . @3 h- g: P) K& R; a u' r
1 Q" k8 u" Z; N# h2 C' ^
/ ]+ u7 H; d1 d
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 ; F( t" u4 M; L* G
- d* u7 v( D9 \2 J5 F D/ _+ U, s/ a- }) p, E# n
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 & z: v( e. b5 l. |# D
& w2 q! Z0 ~4 i1 V- h/ W8 c" _1 s3 ]% V3 K; ~4 j! Z# P# d
这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
/ k0 S1 t! X$ {1 q5 h 1 Y$ ]% M1 z& N" v* H) V/ x
7 S, Z/ I* a. v: E9 w% R2 D
开源的luasocket代码可以参考学习下
9 D' I1 l+ N& W" X/ I0 S ; E4 q- D# l& r2 @; B1 q
, [% R L* F: M9 I
https://github.com/lunarmodules/luasocket - @2 O9 P" G. p Z; p) f( r
& a+ q. e" m. b- |
( y( r$ e' W; \. c https://github.com/fengye/luasocket
: l- c# z7 R9 L5 i! d: ~, ~! ~
1 X; s5 C. ` S3 c
- [" P; `$ m! }% X! u* J- Y + F' e# c" ]- @- X% }" ]
6 A. f0 W/ X( j
' R! r9 b& t8 N
$ U7 U& a2 k% `0 D
! b- a) K- y5 e5 Y1 i9 ]8 r' @! Q3 x
9 e$ A, `* Y# e; T1 U7 b
7 @" K) _ U7 G }+ t& K1 [1 D8 ^8 ]6 }4 I0 J" F8 Q0 J
/ j# J1 f) G+ t. s: a$ O1 n
6 H: b/ ~: e$ y! C x3 r+ F2 S
& o' l2 Q2 E, V& |( j9 i3 } 总结 3 H& ]& `# t2 A
1 A4 I& f1 D& [. C# p- U' O
* [3 n3 j3 }/ r9 h4 D: g
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
4 f9 M4 X3 j2 r+ Y : U2 L0 s$ [: b: g4 L
. H% e o' S4 w
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
6 w0 w8 F( }) \/ k1 ^* h
3 c" m$ R7 D7 a# }5 v p# m+ G" {
5 r" c+ m! _ g4 s. s 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
+ ]( |* g m% u- D. d- v, H
0 ^+ w. e3 W% ?/ a# G9 e! w* ~% r9 |
1 D" N8 q0 g% e E9 v/ b. w. o 结束 + n" u' p/ N t+ i4 V, \8 ?
6 e0 r& Z! w! a% I+ m7 r( R5 J9 {1 |' v% O' ~
【推荐阅读】
* s+ |3 K; O. d0 g. J' R " q- E7 P D3 u* l2 t- s3 E
) O* S; y4 [& T. a( U
对吃鸡APP的分析
7 T+ i9 S {+ F( w8 t$ a 6 }! \$ x0 t, z3 K' Q& ?
- I. d2 [& i6 \" s" t" `4 h( w
你需要了解的APP安全
0 t) t; l/ |$ n1 Q , o- a/ C7 k ~$ n- G; W6 A
. x8 R* m$ C9 X/ C
你需要了解的APP安全 8 F0 E" J( z6 T' b$ E
! s# {# ^# k0 w/ k1 S+ {$ N' Q
/ y$ u# Y9 |4 m! u* @
7 J. P: l2 ?$ ?# s8 b |