) @9 Q0 [. `) O- x9 l 在网络上意外看到一款叫小绵羊的轰炸机APP,经过下载安装(这种未知风险的APP建议都在模拟器上去安装验证和分析功能,有安全风险问题模拟器删除即可)后确认,只要在APP界面的编辑框中输入手机号码,就可以进行对指定手机号码进行短信狂轰炸的效果的(已用自己测试号码验证过效果)。
5 O# w6 c2 e/ [/ l* T8 z/ R7 Q/ R
下面就以开发者角度进行解析下这个APP的功能的实现原理。
- p, F ^: g6 }" R u) S$ C2 s1 a3 G5 w
1 i. W) | f, I5 `- i k7 \0 X 基础信息 * O4 K I. Q0 _! z: o+ } F. H
' {' S$ A8 S6 v& g 拿到APP的一般做法,就是先对这个APP进行查壳分析确认,决定是否删除卸载APP还是继续分析APP,还好通过查壳工具(通过识别APP中是否包含市面上的加固产品的特有的so文件特征)一分析这个小绵羊APP是没有加固保护的,这样对APP的分析门槛一下子就降低了。
! D R$ N7 r- k& d8 m8 k5 c C& @1 u$ Z5 P$ }9 j; ]) u* _
通过使用jadx进行查看APP的整个组成结构和重点查看java功能代码,通过工具可以查看app主要有java代码 C++代码(so文件),资源数据,lua数据,签名信息组成的。 % u8 B, q8 \. |$ i5 F6 u0 h
) @2 C; L; x& b7 D
; k7 k# L1 E) V% l- G( t
通过jadx工具查看,该APP的Java层部分代码采用android studio自带的proguard插件,进行对个别的类名函数名称进行做混淆保护,虽然这种混淆强度并不强,但是还是有很多APP采用这种方式进行对java层保护。只因这种保护成本低,只需简单的进行配置下就可以达到混淆效果。 ) L, Z. r. j/ z5 y
* [, a2 X( ]0 K! R
5 ~/ I T( c3 B& B$ B; J2 W
启动APP后,通过uiautomatorviewer(SDK中自带的分析控件的工具)工具进行分析该APP的界面控件信息,通过分析可以看到该APP的界面主要由1个EditText和3个Button控件组成的,也就是下面的截图信息。
( A/ V _/ e$ z1 z- z" h2 P
1 n; ]4 Q+ C: T& b- u7 \
( R- w! K7 w# L0 m/ O
8 W0 b- _) O6 D6 i: B; m7 l 下面是这个轰炸APP的界面背景颜色的设置,这个实现功能主要是以lua脚本方式进行实现的。
7 b- J) C/ j1 E1 A6 q# a
+ C, B/ f; t1 N) [% i
; B# N) H# I) m/ z7 t/ r! S
4 P G& Z/ a2 m |7 k# N 4 X% K p* R* W, q
. N h% g! \. y0 [& M4 G签名信息
( ]0 q2 Y: z' |" Q+ d通过这jadx工具,可以看到这个APP采用的是V1的签名方式,我们知道V1签名是android最早的数字证书签名,为了提高验证速度和覆盖度在android7.0的系统中引入V2的签名,为了实现密钥的轮转载android 9.0系统中引入V3的签名。 ' H$ k$ B6 h; V% e3 E
: V' G& ?9 \; R目前APP中大部分都是通过V1和V2签名相结合的。并且这个在签名过程中要保证按照V1到V2在到V3的签名顺序,因为V1签名的改动会修改到ZIP三大部分的内容,先使用V2签名再V1签名会破坏V2签名的完整性。
, c4 }3 i9 [% ?" T _在android的app开发过程中,必须对app进行签名,不然过不了系统验证也就无法进行对app安装。 ( M: {5 p9 d5 p+ ]/ Q
4 J1 [ S9 p" u
" g9 q, L: ^9 {3 c
# I* B+ ]- [5 [5 F0 D+ q
* ^7 J; E9 x* ?1 R* landroid签名的数字证书的一般都是采用 X.509的国际标准。
- x6 ?/ ?" @4 V4 w' P/ p/ r 因X.509内容为第三方可信机构CA对公钥实施数字签名,故也叫公钥证书,数字证书在PKI体系中是一个表明身份的载体,除了用户的公钥,还包含用户公开的基本信息,如用户名、组织、邮箱等。 " f$ E5 n' D3 z9 ?( [1 n
4 g: h; h( `' M" \' }/ ^; z: q下图是android studio工具中可以自己创建用于对APP签名的证书,可以看到它包含密码信息、用户名称、组织名称、地区名称、国家信息、省份信息、城市信息。
/ N" n; S6 o J$ H, L5 _8 b7 b/ R
D4 F* w) }7 t1 m
同样也可以通过jadx工具,在META-INF目录下的CERT.SF文件中去查看确认签名信息,V1签名的主要关键字Created-By:, V2签名的X-Android-APK-Signed的关键字。
' Z, e( }7 `( q6 s
% K+ c! P6 K5 Z: a0 s( m% S9 X. s 、
/ p3 O/ J+ \7 o0 Q% L; d' e' ~# Q }8 y' X+ s0 O( V. [/ P
0 b1 ~. r8 n0 F1 s- n% C$ J权限信息
8 @4 x d% E$ C) E& V* V在这个AndroidManifest.xml文件中主要包含app中所需要的权限,四大组件信息,app包的相关信息(包名称、sdk目标版本、sdk最低版本等等) & A: ^8 n9 D @; Z3 L* P3 f
% m' [4 N" P( h" I6 H" @ ~; v& V6 S/ c0 q$ C' u- Q android的机制下想要读取相关的信息,都需要向用户申请权限,这个不仅符合android的安全机制,也符合目前国内的安全合规,同样也可以通过申请的权限信息了解APP的功能需求。
9 b+ S6 e' y$ \* E: T
% }7 A4 {, z. \, ^2 {
4 K" H# g9 v8 G( h9 t" c
- v) l) u$ `4 y5 |6 U+ \下面对这个APP的所有权限进行详解下:
1 O+ p6 ^1 c$ s( O- G* G1 D: Randroid.permission.INTERNET :访问网络连接可能产生GPRS流量
$ c8 U; d. W+ c R$ I/ f( i* ^! w) D9 l9 ]; R7 k. S7 }' d android.permission.ACCESS_NETWORK_STATE:获取网络信息状态,如当前的网络连接是否有效
android.permission.ACCESS_WIFI_STATE:获取当前WiFi接入的状态以及WLAN热点的信息
* T* |8 j# o. o* D3 T android.permission.WRITE_EXTERNAL_STORAGE:允许程序写入外部存储,如SD卡上写文件
android.permission.WRITE_SMS:允许应用程序写短信内容 5 ?! u }5 p' Q! x( _6 M: \3 n0 w
android.permission.READ_SMS:允许应用程序读取短信内容
3 Z. [4 x% Z9 A2 Z; | android.permission.WRITE_SETTINGS:允许应用程序读取或写入系统设置
android.permission.CLEAR_APP_CACHE:允许程序清除应用缓存 4 D2 A. g1 R( P7 ]
5 Q4 }8 k0 A8 N5 c. Z3 M! D1 }% C5 P- H. f4 j: D android.permission.BLUETOOTH:允许程序连接配对过的蓝牙设备
* d( W- r2 C0 V+ ^ android.permission.VIBRATE:允许振动 ) L8 i. Z" o3 F9 O
android.permission.READ_LOGS:允许程序读取系统底层日志 : i2 r% w3 z# o$ w
android.permission.READ_FRAME_BUFFER:允许程序读取帧缓存用于屏幕截图
1 r" X) ~' v& F7 p- q0 w* H6 x% D; U# u
2 N r4 R- _% W3 X* v4 S: L7 Y% }% d8 S% R$ K) ~8 z7 x/ S, f, B 功能信息 # x/ f2 @/ }3 ~2 w, e- j0 i
) e' W& A7 a1 `" C$ r
4 z6 _7 b: x- @: f7 s- L: o/ E' a, D3 S$ m5 P- B 这个APP的主要功能都是在lua上实现的,从界面到轰炸功能都集成到lua上。
9 r( o/ y. H6 \- N4 i' ^ Lua是一门用标准C编写的动态脚本语言,如果希望在android上使用,则需要解决2个问题。
2 s8 D* D/ l) \- _1、需要用JNI为Lua的C库进行封装,这样才可能在Java中使用。 " \: z% F9 f- [3 z
4 r; @+ K! V V2、由于Android系统开发所特有的系统环境限制,Lua三方库的动态加载机制和lua脚本模块的导入机制将不能正常运行,需要进行特殊处理。 , E* q0 h+ k5 s( S
4 v% Z+ w! L2 `7 s
4 i! W8 a. P2 p, |7 Z( y' S4 \4 O
; z! T4 T. m' O: ` P
6 |; z+ I/ |: y; F& Q. \输入好手机号码后(不过这个输入都没做验证,随便输入数据都进行执行一遍功能),通过charles抓包工具进行抓取数据吧,可以很清晰的看到,点击轰炸后,马上执行发送406个网络数据包,这些数据主要集中在作者收集的406个各种类型网站进行发网络账号注册验证码信息的轰炸。 ' ]6 h+ O: A& w! f; ]. M2 Q% `
5 g3 m* r- o& \
. A$ e! l$ f! K V! y$ l9 Q$ K1 W; ?
在lua功能中,有对vpn的判断,通过简单判断获取当前网络状态,并且判断网络状态是否属于vpn的状态,如果属于vpn状态,那么就往storage的目录下写入时间点设定,并且强制关闭APP,当在启动APP的时候会先判断文件是否有写入判断禁入的信息,如果有就不让启动APP。其实破解这个验证很简单,直接将文件的禁入信息清空即可。
, u \' P) b6 M5 J8 e/ q# [
- ?& l% |. h' x6 v: N5 A) |
下图的这几个so是网络上lua和socket通用的so文件,并没有什么可研究价值。
A' M0 G; ?) V5 I. \( T ]
% u. {1 n2 g' ?/ i, W) B 通过分析libsocket.so这个so文件,可以确认采用的是luaSocket 3.0版本 5 E6 i# |9 m" ~
4 ~ t* p: A, s8 }$ v$ o9 E1 G LuaSocket 它是 Lua 的网络模块库,它很方便地提供 TCP、UDP、DNS、FTP、HTTP、SMTP、MIME 等多种网络协议的访问操作。 0 g3 R; t* `1 ^ `& J
7 t! Q% T0 o g1 F& ~5 j9 E: e" e9 d m 这个luasocke一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。
开源的luasocket代码可以参考学习下 ; u2 _8 Z% u; c) a) f* I
https://github.com/lunarmodules/luasocket ) j6 w6 R! i/ t1 Z, \
( k" O y9 t! t; u. p; p4 m$ O( ]" d0 g1 `" M) @8 v https://github.com/fengye/luasocket ) T0 R9 N/ y D0 o! B
! t) V9 Q2 n5 G& ~& R* Z3 ` " _1 u+ ^. Z! E+ _' n6 u6 `
3 Y% [7 t: }) N! |0 \/ Q" z6 d7 [ S1 ], W) J# y8 U# b
7 c3 H0 z% T7 `9 C0 K+ m
% E/ W- t! S: @# o6 P/ n% ~( `3 l# F# J3 Y
- z# x* S+ G! o( a, m. m 总结 9 Y! v8 |# S& K4 |
纵观整个轰炸APP的功能,分析这个APP都没有采取任何保护(加壳、反调试)就没有门槛了,基本也不需要涉及到脱壳、hook和动态调试这些操作,只要用几个(jadx、charles、ida、uiautomatorviewer)工具就可以将功能全部分析清楚。
# ^& t; Q$ ~' u: p# w感叹这个作者确实很用心的去做这个轰炸的功能,去收集了406个的各类型的网站进行手机注册功能。 ' o' T0 [+ i3 `7 i; _
' z4 c) M. A* g: `. g- d4 T g0 o- f; Z& \. Y 对于这种具有攻击性的APP还是要慎重下,免费APP功能的前提往往会有给APP植入后门或者病毒的存在。
4 d! s, D5 V5 j6 i5 A o- ]9 x$ L* Z结束
【推荐阅读】 ! J/ S2 L1 H6 a. \$ V7 c, R
& h; D+ I# E5 y) R 对吃鸡APP的分析 , C: b3 j$ v4 H: _1 D& x0 Q* N) |
) Y8 ^; | I# X0 _ w; l. |- U你需要了解的APP安全 ( t$ j, G! B4 X
6 D2 r* O+ [4 n* X# L, Q) A7 p& s2 g8 M1 B& G G- A
| 欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/) | Powered by Discuz! X3.2 |