在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。 R# m. g) p& l) T
( Q6 h: j7 a( O, V: L
% S- M6 ^% H. x7 k, z2 r5 d" E
6 {6 J# @4 u8 T# w
下面就以开发者角度进行解析下这个APP的功能的实现原理。 : r+ g% R0 T+ P- ^( C# L# g
( F2 j H$ p- ?5 Y/ E( h y. b 基础信息 9 T* A: k- E2 _# w0 l F' X
! Z: L5 b* q, p, w/ ]" ^, ~9 p拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
9 I9 v2 v0 q4 q8 e2 K
" ?0 ~ Q9 Q% h+ ]' M9 {5 D: U$ v - ~& s G& u! j- |3 D
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 " N! s* d; G% E u9 x
2 |/ s! U3 K( c. Q0 V
^2 D) l% \- B+ q+ o" H7 M N
# W; y. x" G" o( ?! m 通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 8 T, D0 m' b, a6 L) p2 g1 q6 ~
3 j% H& Y$ E* Q( \ D. K
|/ y: X) }& }8 K, v8 i / @$ O' ^8 a" `
# W0 r3 z( b' y. W, E启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。 ( m6 Z" d: |' g S
% ?) i! g8 O1 v6 |. H# x& |- C( z6 u5 i8 |1 |! h, ?& [/ K
7 O- M( Q- g+ Z8 x) f2 @7 c 0 R+ `. A4 t, m v% w2 F& k9 a
# x9 k( p3 S* Y# i8 r+ h 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
2 T' x1 i4 w0 o A, f( U+ g0 h" q4 a5 ~
/ g8 @4 W* b7 _* Z' _8 P% A# t- Y
" L% n R* N# O+ R% |5 s) q , A0 Y! g5 [) o* F
( E5 `( S- C' q& [9 G6 p& x7 D% [ 签名信息 A) K3 X- b- y$ x. z
# _: Z1 p7 v/ c& K7 J3 n# `0 N8 y 通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 ( c4 S7 @& o' n) n/ e
$ W) `: J' S1 }* v& M6 Y% {# n- k1 i3 N1 T3 j 目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
* m0 m* B" g5 Z8 l; r在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 2 `) H+ s' ]" w$ m& k" y9 E3 x3 N
E [) g! E) N$ i( N* \- R6 T5 Y! X6 s0 B- T! S! j& j3 G3 k1 ^: w
$ T( a" [4 d+ L
; V) E; G, b! O+ Q+ k2 K
/ }' M1 V1 W$ M# X" |" Xandroid签名的数字证书的一般都是采用 X.509的国际标准。 , A+ Z" Y2 p6 D; V# [, Z0 r# G2 f0 ?
2 I$ D5 S A0 k因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。
; X v9 v' o( K# I9 C8 z 下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。 0 K9 T0 [# _. h, ^5 f& u3 W
( W N8 ~' F! A7 k
- e+ ^1 m2 N5 a
) N2 w5 B X( w$ X! V5 ?$ P" o0 ]: x9 z' @* l; z/ k! `8 ^0 l n 同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
8 A- p& E9 @ P( O0 v) s; g) r. }/ \. Q# R9 n7 o
, u& }7 m0 h; L: c& Z# B6 P# r 、
+ G* l0 R D3 L( i / X7 I! |+ p" d, {+ Y4 O& G
权限信息
: d; w+ @& c2 |4 s1 {, Y! I- r在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等)
* d2 m" b I* a$ F; b+ E5 k0 q2 v+ i8 r: Y android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。 : v) n g1 u ?- ~& R, b
7 g# d& D d5 q+ [) l: \6 E- Q
9 s0 G5 b+ ~5 Y8 A$ }7 r6 k
) q8 B0 j3 {* T& ]
8 x* J) h, @5 Q% x- k下面对这个APP的所有权限进行详解下: - [7 D1 R& H0 b* F4 L4 E& v; A
" j) P( i2 k& z- M" _/ p/ A+ `- {0 M5 \# W, i1 a: L; _! w8 t# g android.permission.INTERNET :访问网络连接可能产生GPRS流量
7 [. c- W) e6 p) Nandroid.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
* q+ t2 U9 V h( o+ q$ mandroid.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息 2 w% C3 g& i4 T8 p W3 P$ Y
6 g+ B! Z% r" N: z1 Y( w% D/ y; Y- B: z: y$ f* u3 z1 h. y android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
9 j% W% N2 ^3 l S' l% k; k: a# y- p4 O Q' s: C android.permission.WRITE_SMS:允许应用程序写短信内容
android.permission.READ_SMS:允许应用程序读取短信内容 ( P# `+ p- T. A! Y4 }3 [# ]1 H
8 ?6 N0 t" X* Z( ^/ G: iandroid.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
" x: c Y# P4 j4 _android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存
7 j' ~% h. i* W" s1 x; E0 O$ ^2 ]1 \2 h- _' W android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备 . _0 g+ M( Y$ Y5 I1 _: Y2 r& S
android.permission.VIBRATE:允许振动
% X! u, C! p5 D' i. j/ A: Bandroid.permission.READ_LOGS:允许程序读取系统底层日志 * r+ q1 S/ ], {' J+ Z0 Y1 u
8 n% ~5 B( `: U) M; s android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图 * {7 x) w9 L# \5 U i
) S+ a) e; g: Y# r6 L( i( e8 s" s
7 t9 ]1 _4 G/ ?# w2 ?功能信息
, i7 D. h2 h0 \/ I" T, a( D% l0 a7 \; U4 `! M 4 j2 l$ m. a6 x# \2 N" m2 W, L& H
' {4 d9 o0 X( i( ~ 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
3 f9 s6 }& m# q- F4 c. E. ELua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。 2 A0 R2 v( p& ]+ _( z
1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 + |4 L: L8 @- [7 a( m5 m1 b
2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。
' [ ^% q0 X, o, k' Y- \# U+ q+ R& \$ G( d$ W" p! z
' N# K; T, m& h8 z8 |
输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 7 @. N% a1 U/ G) \% m
+ S* m% A4 ]% B' r* z- C2 C u& @6 w+ t" E1 ~$ y
& E. G. Q1 H* R* W1 h& @- v2 y
: ]- W t) u, ^# ?' K$ [- _
0 w+ \9 ?1 h8 v; Q在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。 : E0 o& v0 e7 U/ {
% R7 V$ |* o: m' ?) K5 f
1 v' c, R0 v5 ?$ h l' D* c
& v5 ] D- e B. G. G 下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。 1 [# F* ~ _2 K/ w
4 M5 u' p! c! q+ k; a0 }2 {) t, i
, D, p/ T u4 y; H: t4 K
1 c7 |# a- N7 i: _/ i
通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本
0 J2 J; _( F8 D0 w7 I c& I2 ILuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 ! z; E/ F1 e% d, Z7 q
5 t- |. P2 s+ `( Q5 [. x1 Y9 i& z! m5 p2 w 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。 5 v; Z* h, c- }3 e6 a+ s
$ m. ~* P/ Q! ]$ x' M' C/ T+ a, |% b s$ a' U3 ?! M3 N5 Z# [ 开源的luasocket代码可以参考学习下 ( Q9 q& R0 O, w& f
* M$ x' ^$ a: G6 l! U- l5 ?3 p1 v. v* c- _ https://github.com/lunarmodules/luasocket
https://github.com/fengye/luasocket
8 C! b$ h3 V5 |0 o- e4 Y : l8 m9 @: k. b" Q I5 v8 {
1 F( q0 `/ L; j& y* H6 W
4 _2 @4 [. k4 L) z
3 A9 s7 J5 V8 Q5 a7 c
" L# p' }! O0 z) i0 B, og! H* {. a1 Y; J' }
1 L7 F% r) E2 E. Z! ?& R7 p( ~5 Q2 P* F3 O7 e( H 总结
' ~, o/ o- h- ?+ i4 i纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。 ( w& W7 D, t! J& {0 r( C: H! h9 O
`& i0 ^) ?7 U6 X/ [% @ 感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 * u5 |" Z& t0 y4 u3 k
~; C! r3 @0 A; ?/ W( {, L# w+ p- H& ^# h3 F- v, P! F* C6 k( \ 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
" i5 p G3 h& g! b& [ 结束 & s3 J+ U2 S5 Y& X
/ t) n8 }% d; T, t$ b6 a! n1 ~' ^" F 【推荐阅读】 / l# P* L2 ?9 l* y, e; K
8 E, R0 B8 X. r% k8 N, t; u( o- c& w& D% h5 K) k( R$ l 对吃鸡APP的分析
/ }& j6 G. x$ O: N7 k1 |4 \5 u 你需要了解的APP安全
你需要了解的APP安全 * Q' \4 }1 ?. ^$ X/ v2 q$ r
| 欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/) | Powered by Discuz! X3.2 |