8 ]2 {$ s' _6 e# s$ x, r 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 ' L* Q& w K* }6 O/ [
u! \ o+ f2 d) A* ~9 y
9 K/ b- E0 q9 D# T+ n4 V' F/ ~5 W 3 V* A. M% y8 @, B2 A
5 ~! a G) n2 j) P9 b
5 S7 p( ^8 x' \, N$ e* d- Q8 r # p: n9 u$ K1 o% d& L
8 G* J& G/ _6 U p% _, }6 s* o4 K! l, w' O/ H* P$ t( I) G5 |
下面就以开发者角度进行解析下这个APP的功能的实现原理。 + G4 r- F3 R9 x8 F
, |( s N2 {$ Q# W2 r7 q6 r, M$ e
. O1 Z, G. s* U$ n
7 p, u4 b$ c/ [+ B( o
0 v6 b2 C4 i4 r$ H- M 基础信息 8 {4 l' z2 ^3 b
/ B" i4 [( x; }; g' |
$ M: }. o& j+ @$ U5 l; C4 j 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
; r3 X3 x- ?( j* c4 @+ G: l! U ! _+ [: l; p; l2 N% z
1 [2 O. F2 E( M+ o* E
' f! \4 p) o8 B 3 t7 a! Q9 u" Q- `
, e, ], G. q" G5 Y2 W+ i - X. `' q8 A9 v/ N
o$ s: h2 u* E4 h+ b6 b7 {7 q
! g/ J8 E" D2 z% ]( a 通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 6 l4 W* h" m4 o* U8 ^" ^
5 N$ M a2 ~! u& @8 a8 o& c* x# ]5 |! q0 p( v- d- O$ u
9 s( ]) I H. G5 R! e' A
! R( m8 W8 X4 r3 u2 u7 U$ ]' e i$ j& v: c' K8 Q: E; ?: z& b* T
4 V4 S ?: C7 W, D
2 s5 n: u4 n) |4 p( { I6 M ~" i+ ]3 A; g$ x
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 6 a# M. Y/ f2 k" \+ K) {1 w. f
. D# M( Q; `# \" X& K
5 ~# F; G% O& |. [" q+ T/ T2 a 6 `% L7 x. i, I& P$ \
_/ B4 o+ \' U. K3 C) n- D, a: e) o% G( v* r5 B9 q6 c0 [, u
8 o: B2 f& z; R4 q% {6 `0 K9 d
% G) r9 c6 S/ }. j6 R
/ z% I- C' D. l: T. z! u 启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 " s5 s. u9 F2 g3 Z q" f
# f9 q/ R( E" f4 }6 Y& i* f0 x
# H2 H8 C7 t3 W4 h3 k6 A( G$ \
: ?& H3 S- k* y% j; J* i 7 Y1 D5 @8 A$ g: G' u
! w! z% m1 a! F
4 u O2 D) X# X+ W6 j/ d% D4 G
" H& V+ v9 i: V f# I! t2 w) h
' E0 N4 m ~" Y+ U( r 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。 . v* B, R/ M5 e, _- x
! A1 x0 K4 c; n( h8 ^% _( l$ k' l' {2 X. w, q
: v0 t7 g4 n# F8 ]2 U & L9 f" k/ q( d! S1 c7 f3 e/ k6 x
: Z3 p* ^4 M. R) |6 x ; o0 `6 D, L* F; X% T9 p
+ Y; L/ h7 y/ x' n. ~
% B" w4 W, Y& ~/ G
* Q! k# ~2 C" r" k7 d! ~$ _. {! a$ C , P( Q+ V5 I9 M* ]- ^" g
2 e, C- @6 N' a2 T% K9 w 签名信息
! y6 o! K1 U" B' M% v5 M 3 u) ?' i5 l, Q
/ }, o6 l ^1 } 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 s6 L) I5 P" h2 U l
% h- v% @/ v8 a8 C* ? l& k3 {
. Z9 N7 u$ B' B" n
目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
2 p2 d L% l* } w$ D- l3 v6 m" u, P( U 6 _/ v. d4 B5 {4 x: P# n5 n
$ q, [% ~" g: ]4 V! O; x 在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 4 R5 E( `( h/ C: [7 @5 V% c
. W! S. g/ [0 B1 I3 r2 Z) e# U" |
- u* z% }0 r+ Q$ H% y( W. o, Y4 |# S. H
" M# ]' Y* \# x7 V& i9 w
- n# J+ h1 _6 s2 t( f
5 `4 r/ h/ n$ B0 J* X! [ & C& y2 `3 Y$ k a/ T2 J
) V) k: Z# k1 B
* x" H+ S7 l: e* `) E android签名的数字证书的一般都是采用 X.509的国际标准。
3 o' v- e/ s' G2 E& m
/ x) u* H! [- A- ?6 V) |( g; l! H# R! B$ P
因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
; [ q/ `" u1 @ ) x% r7 o0 Z1 A% }
+ d' O% a. p* L4 }8 N* M# N: Q
下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 5 }/ g7 E( `, @7 \
3 p4 H% {5 G3 {
" w# g: x( V# n& K5 ~6 k8 Q+ `" a4 |
0 J0 k5 @" \) S. A+ @' x* V
" u3 m4 y3 o3 n- K o
' j$ d* s# L3 A! E% f
* }6 I7 a% |) c/ S O( {1 [; x$ i! B
& B. ]/ j$ d3 ?! W( u+ c# ~4 _2 R. \, H
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
5 i6 m( S! y$ X, t3 L" G
8 d* z1 ^4 T# J+ g) S; x; \; n- V/ L3 h" N: R. l' h2 r9 P
) A8 O% T# b$ E P, g% V/ c
, Q! q: ]& |1 }$ I3 ]4 ?6 [1 u/ j& c3 s) |7 e
、
2 {% N- V, |9 S + o* ~+ x6 j. {! Z; Z& P! }* E
0 Z% B! t9 Z2 ^" P5 } . A$ l& g ], X/ C! s
5 l( ^! a8 s# i Y T7 T4 P
" U+ }4 e% W3 e
权限信息
[" d. e) k( k4 u7 E) H5 g' e , F% X+ Z1 t4 g1 W
" }; M1 E4 u9 w8 H/ O$ c% i
在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
; _+ P) c! z) N7 Q
+ ~+ j; }$ g. y' T S( E
, W% R3 Q7 e( G( i! X1 W' ]6 B android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
& \2 a' u6 B: ?& D; t1 m* H
6 S7 _7 p: s! c5 F2 \1 y9 u: ]$ n! N
1 J* U" ~5 `# @( q% W1 f- _ k1 n
) n* P. W3 T- Y
/ W4 [+ Z, t1 h8 I1 u O* x- J
) x- a0 f) Q4 D' q # v" h {* j7 V# B5 L3 ?" u
' I3 ]+ o7 A% L9 r; H% Y) \
下面对这个APP的所有权限进行详解下:
7 s# V8 M( `0 e c, i8 E 1 Q$ u$ f) G* m; l. S
3 @& x% O; D% _( r# A" h6 g android.permission.INTERNET :访问网络连接可能产生GPRS流量 , U, |, l5 M/ J3 @% i! B
! `+ q" @) l) M( C# d
( `5 {6 u! E4 a" T android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
" y( K7 Q3 f) ^5 B ?* q c + \8 o/ _/ T( u5 G8 L2 Q
. x4 O1 S* \3 ~6 ]
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 " i5 { G* {6 ~' m
$ `7 s/ y; o7 ~* h% d! M
" b2 N) X& e5 I0 L* l A android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
0 M" i" \6 \$ g% w& Q) R
) V# }4 o8 U! Q: X* r6 p# {' |9 A' F4 J+ {, n
android.permission.WRITE_SMS:允许应用程序写短信内容 ( u8 Z, W8 U2 b/ s* {
$ r: `$ A$ U8 {- o2 m* g
( y- i9 N% @8 E1 z7 L
android.permission.READ_SMS:允许应用程序读取短信内容 5 G; y0 j2 c: p; N+ H
0 t% f6 T1 P( y1 w" v3 B9 m* ^6 ]0 b. E
android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置 " q4 Q: P7 z2 o5 _6 c% y5 k+ q5 c: W
, o9 b$ a4 H2 _& }8 ~
! E' H& a3 b2 b- J8 O5 f android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
6 V, P# B" [0 Q
9 X: ~9 u! Y* L' E5 r
2 Z2 o1 Q" t& I6 h7 `8 r android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 , O2 m8 J1 F: u2 O4 B. ?
/ K* l) v0 S5 b, q8 F
8 W6 m% P. W% [" s android.permission.VIBRATE:允许振动 1 X v$ _* j1 I2 B/ T# x) B% \
, C4 G$ w: Z- F; {" h2 @0 v [; b6 w$ Z/ e& P* H& X7 U6 @
android.permission.READ_LOGS:允许程序读取系统底层日志
/ y/ q1 J+ S: h/ Q9 f, u6 M: J. C $ l8 |7 X9 a b' t# y9 D# V
7 C5 i) E2 x5 |
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 ( x- a$ O j4 c/ D: m
0 Z8 \! E' q3 d; J7 ?4 E, t6 b' }$ F9 F
3 u* g, G8 b- z: M+ F5 W9 w7 @" q , y! F9 u& S$ X; e$ Y b
# g! J6 m* T' j
6 [- m, w- L/ H. i 功能信息 ; i: s& @9 r& i3 `( b1 A @9 m
. l2 i1 v7 i/ n$ Y* d6 ~: H+ K$ L
( m$ _0 Q1 ]) Y& k0 M3 R: I
7 }2 F' o& s2 H8 _; d# O3 Z " A" C5 @: |. k6 \& v
% z/ [7 H6 l2 s
这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
2 M2 u+ m* ?+ \; h B5 K* i" l, O3 ?0 | D0 J
$ @% N+ A+ l8 w4 z8 i Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 / ^2 j( y# m3 m; D
+ i) Q+ d- v" g" Y- a
( N g& V0 ^! h# ~+ y& e
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。
! m6 H+ s+ x( m 3 I- Y0 ?+ L6 ~- ^! i( w' G
E1 I) h. n0 v6 W# l2 d
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
3 t* J {& W! z o7 E - t2 S: H3 }' S; Y
$ X2 E7 j' \* m& c: f5 i
8 q; x1 T# P$ d1 N
; I" A2 W' T3 z! ]9 d1 z; b
! M4 k" l+ G% ~& V `) ]' ^# `* r 0 t$ R4 @3 S6 x, _2 ]( z4 q$ q
/ ~; y, ?, _& Y. i. j0 T3 s: H, o- ?& |$ f
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。
e; v0 j5 ~$ x- I# p$ M " O7 j4 n( } {- ~
5 h( k; n- [3 \0 f
5 g7 F2 O5 U s' Q& ]# K 0 x( }# o4 ?" v+ F' S$ w: }
& S; @. `- b. v
/ ?, u: F) S. q' k5 V - o+ a6 V- T+ L
% H& }! B& Q7 K' b, Y# L 在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
! d" V F+ m q% c 5 a y/ Z3 W- m6 [* L' r4 O- q$ `9 C8 U
$ v( K- f4 l$ `. F , e. g5 E/ b8 o- v9 x2 q* W
" W- [# m; t- I# Z, H) n" h
0 D- Z9 {, z0 I; w
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 1 V0 a3 y& q; }0 G
; B" X1 c0 i! W5 s7 Z6 _" x
: t" G& g! _! i $ W: Y* f5 W% S
7 v5 m% Y5 O, T, S$ b' D6 j+ x6 U- X; G: K) |$ i3 z d8 j
! f3 G/ y: @ d: \4 h# V& I
; s- l1 v+ N) s; Q! {: Z. B
' \ t! ` b& N" \! C' r 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
. e* Y+ p% Z/ M; G. J
8 Z# O" m/ x9 P O9 O9 W: n1 i+ I0 U, p9 ?# H$ C; n% `
LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 2 h" s, H* V Z" U' A3 t$ G
& t8 T, e0 E& _! x
% V' h/ k/ D3 V/ k% }8 y 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
5 t- n$ a4 x/ p. `& N3 t6 D6 Z" s9 a 3 Y4 j: [* S; e# U& G
7 p7 Z- c: l3 s 开源的luasocket代码可以参考学习下 8 K+ i/ M! H" c9 n, V' B$ _, D9 U: |
: u3 Y- }1 i- g! F1 ?, w
& e6 D7 `; f* N: i$ Z( E% y! P _ https://github.com/lunarmodules/luasocket
2 N1 G+ R/ I: E% v
2 |( Q( I) g+ T( M9 f5 j
& f: n: V) j) s4 L5 D https://github.com/fengye/luasocket
! i# f& W) N- o3 |9 h3 a
8 S3 H( X+ i- J" D# b- m& e @$ _1 _' h. E0 w+ O z1 e4 `' j7 p
3 Q' k% R/ I/ A: H1 Q' L6 u! D / u' d9 z# J; \
! c3 W9 |& S P' [+ d# ` \
0 q+ C; C' Y9 _$ ^7 N" n; \) q, [6 D # i7 o: V; Y5 Y8 C! y
2 c* d8 r: i5 T! x, P ' f! e: T7 x+ g2 u
; l, y# R2 u0 u q
0 ?7 d9 i) ^( v8 }. N' t ) S! n* H' e! d6 Z: `& G+ f
, O% R2 m6 Y# R3 [
# u0 |' L, Q+ n
总结
3 N/ E Q9 S$ V: I5 T( B
. O1 a% y/ _6 A0 V7 |* Z# r1 `8 L/ ]4 _2 B- f2 w" W
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 9 e5 I1 V# \4 R K: x6 ~
% \# C$ X+ C( R* {% O& ]4 ~+ j, E2 f7 Z" O. H
感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。
* \3 R7 Q2 s) j
$ i s1 F. `8 L$ G- I0 n$ N- s
4 W# V3 Y# Z9 a* `: Y& l 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。 ; j5 f; {' _3 u
- s2 K. b/ ?7 G/ Z& ~
3 R1 ~! e) Q1 L% e! j, X0 ?4 Q( | 结束 # W/ U4 i0 G6 g; ~3 Z5 f7 f6 o2 Y: C
+ t, H' A- G9 k/ q( X$ S
8 A: B$ {. l/ }' h# ?7 ]' ?6 O, L: U 【推荐阅读】
3 e+ ?+ L* i" a
7 S. O! h' ^) e4 `- k/ y
3 ^8 H; U0 p& E) T Q3 i 对吃鸡APP的分析
! U& c/ y3 [; v' U' L% f. d
- x6 ~; B2 r: t+ t; S/ w) Y/ |3 R, }
你需要了解的APP安全 4 k9 G. U8 ~0 ] {
8 F! y& C# d2 v( m3 g- m; ]! |
7 J6 N9 i1 B+ w3 |
你需要了解的APP安全 . R- N6 I1 H$ }8 _; }' C$ d
9 q/ ^9 A7 L( r8 R. N7 g
- D! e( Q( [ Y- }
/ N# N+ N, ^$ `! S9 Z |