如何从内存提取LastPass中的账号密码

简介

首先必须要说,这并不是LastPass的exp或者漏洞,这仅仅是通过取证方法提取仍旧保留在内存中数据的方法。之前我阅读《内存取证的艺术》(The Art of Memory Forensics)时,其中有一章节就有讨论从浏览器提取密码的方法。当你使用标准的用户名/密码方式登录一个网页,通常会发送一个包含了你的用户名及密码的post请求,这些都是以明文方式发送(这里不过多讨论SSL,在SSL内部也是明文发送的)。

本文描述如何找到这些post请求并提取信息,当然如果你捕获到浏览器登录,这些方法就很实用。但是事与愿违,捕获到这类会话的概率很低。在我阅读这本书的时候,我看了看我的浏览器。发现我的Lastpass插件图标显示了一个1,它代表着在当前站点中我有保存一个凭证。

但大多数情况如果在选项卡中加载一个保存有凭证的网站,不论是什么页面插件图标都会进行提示。

设置

我想在内存中完成所有的事情,这也意味着我需要找到一个简单且可重复的方法来进行变化,着眼于内存来寻找数据。按照通常的做法就是每次创建一个mem dump,但我使用虚拟机来进行就显得异常的简单。当我需要做出变化时,所要做的就是每次创建一个快照。之后我还保留了一份在那个时间点的内存副本,用来与其他快照进行比较。剩下的操作就更简单了。安装浏览器,Chrome, IE以及Firefox,设置一个LastPass账户并填写几个站点登录使用的用户名密码。我们先从浏览器插件开始入手,把所有的设置都设置成默认方式,然后使用这个插件生成并储存不同长度的密码。所有密码仅使用大小写混合的字母数字。同时我也将这些密码保存在本机的一份文档中,以便我们之后更方便的进行验证。待所有的密码都存储到Lastpass,且本地副本保存好之后。将所有账户注销,清除所有的历史文件和临时文件,最后重启机器。

方法

一开始还是挺简单的,从寻找限制开始就变得很复杂了。基本上步骤如下:

  • 打开浏览器
  • 登录LastPass插件
  • 登录网站
  • 检测内存中明文密码的所在
  • 改变操作++ 关闭选项卡++ 重新打开选项卡++ 注销+重复实验

测试1

我知道所有的用户名和密码,我用临时账户登录了第一个站点Facebook。通过Facebook的导航我点开几个网页之后,保持浏览器选项卡打开状态,我创建了一个快照。第一次搜索很简单。

grep -a 03rRJaYNMuoXG7hs Win7x64-MemTesting-Snapshot3.vmem | strings > ~/Desktop/fb.txt

-a参数告知grep将mem二进制文件视为文本文件,并以字符串形式输出到文本文件中。最后得到的文本文件就可以清晰的看到这些信息

跟着我一起嘿嘿嘿

{"reqinfo":{"from":"fillfield_A","index":28,"time":1475875701411,"uniqid":85097549},"docid":0,"sharedsite":0,"automaticallyFill":1,"is_launch":false,"manualfill":false,"name":"pass","value":"O3rRJaYNMuoXG7hs","type":"password","checked":false,"otherfield":false,"doconfirm":1,"allowforce":0,"from_iframe":0,"humanize":false,"v2humanize":false,"delayquants":0,"force_fillbest":false,"originator":"FILL_F4","cmd":"fillfield","clearfilledfieldsonlogoff":0,"dontfillautocompleteoff":0,"realurl":"https://www.facebook.com/","aid":"607245038900433242","tabid":2,"custom_js":"","domains":"facebook.com,facebook.com,messenger.com","formname":"","topurl":"https://www.facebook.com/","urlprefix":"chrome-extension://hdokiejnpimakedhajhdlcegeplioahd/","lplanguage":""}

密码:

passO3rRJaYNMuoXG7hspassword

获得密码,网站名称,时间戳以及很多其他相关相关信息的JSON数据。这是表单字段自动填充造成的现象。第二个测试看起来不太合拍,但不管怎样多条路选择总是好的。

测试2

第二个快照是几个已经登录完成的网站,且选项卡保持开启。遵循之前的操作在关闭之前注销所有账户然后再启动虚拟机。再次确认内存清理干净,此外还得确认浏览器本身没有保存这些数据,所以我将历史数据全部删了。

从下面这张截图中你可以看到,除了QNAP站点之外其他的站点都已加载完毕并且登录。回到主页你可以看到LastPass插件提示存在一个匹配的凭证,但是我还没有加载一个含有表单字段的页面,所以也就没有出现“自动填充”了。

保存好快照之后,对所有加载的网页使用之前的grep命令所有已经登录的网页在内存中都有相同的数据结构:

{"reqinfo":{"from":"fillfield_A","index":157,"time":1475878291419,"uniqid":65765520},"docid":0,"sharedsite":0,"automaticallyFill":1,"is_launch":false,"manualfill":false,"name":"ca414a13646af9ceb5293a5eeded1704","value":"5DAhhkOvZDTC0MYA14","type":"password","checked":false,"otherfield":false,"doconfirm":1,"allowforce":0,"from_iframe":0,"humanize":false,"v2humanize":false,"delayquants":0,"force_fillbest":false,"originator":"FILL_F4","cmd":"fillfield","clearfilledfieldsonlogoff":0,"dontfillautocompleteoff":0,"realurl":"http://androidforums.com/login/login/register","aid":"5988558277865511241","tabid":14,"custom_js":"","domains":"androidforums.com","formname":"","topurl":"http://androidforums.com/","urlprefix":"chrome-extension://hdokiejnpimakedhajhdlcegeplioahd/","lplanguage":""}

同时我也注意到一些其它的数据结构:

{"cmd":"save","url":"https://www.phpbb.com/community/ucp.php?mode=login","formdata":"login\tusername\tpeters.lastpass%40gmail.com\ttext\tseen\nlogin\tpassword\tSG5P2GRgqYeL4nvzi8C1XnZs\tpassword\tseen\nlogin\tautologin\ton-0\tcheckbox\tseen\nlogin\tviewonline\ton-0\tcheckbox\tseen\nlogin\tredirect\t.%2Fucp.php%3Fmode%3Dlogin\thidden\tnotseen\nlogin\tsid\t32ff2e6ecf53aaac43b88f123ad86b04\thidden\tnotseen\nlogin\tredirect\tindex.php\thidden\tnotseen\n0\taction\thttps%3A%2F%2Fwww.phpbb.com%2Fcommunity%2Fucp.php%3Fmode%3Dlogin\taction\n0\tmethod\tpost\tmethod\n","current_pw_field_name":"","docnum":0,"timestamp":1475878195546,"username":"peters.lastpass@gmail.com","password":"SG5P2GRgqYeL4nvzi8C1XnZs","tld":"phpbb.com"}

这一个可以获得用户名,密码,网站名的明文数据。QNAP站点虽然被加载但是没有填充到表单中所以内存中没有数据。然而我通过内存进行搜索尝试分析其他数据时,我发现了一条有趣的信息。

这是一条被称为LastPassPrivateKey的数据,是否我们可以用这个来获取主密码或是解密库文件,或许我们可以在磁盘或者内存中找到它。正当我在考虑如何才能使用这个PrivateKey时,脑中浮现出一幅场景。如果主密码本身就在内存中,为何到现在都还没有发现呢?我假设它只是被清除了,在此之前密码就已经被解密了。

事实上使用grep我的确发现了以明文方式出现的用户名及密码,但是这个场景也只在一个快照中出现过。

接下来我进行了一连串的变化。打开选项卡,关闭选项卡,恢复选项卡。我得出的结论是如果选项卡中打开的网页已经完成登录,在大多数情况下能够获取到凭证。当恢复选项卡时打开其他的网页,想要找到完整的数据结构就变得很困难了。这些信息依旧在内存中,当然如果你知道其中的值,相对来说要比无头苍蝇乱撞要科学一点点。此时此刻,我有足够的数据可以开始通过使用Volatility插件从内存映像中自动化提取这些凭证。

早在几年前,Brian Baskin就发布了一款Volatility插件,其使用yara规则用来搜索进程内存并从中提取数据的插件。这完全符合我的需求啊,原文链接

至此就剩下像正则表达式这样简单的事,以及对最后获得的数据进行整理了。

运行之后你应该可以获得类似的结果:

localadmin@tech-server:~$ vol.py --plugins=/home/localadmin/github/volatility_plugins/lastpass --profile=Win7SP1x86 -f /home/localadmin/Desktop/lastpass-mem.vmem lastpass Volatility Foundation Volatility Framework 2.5 Searching for LastPass Signatures Found pattern in Process: chrome.exe (3400) Found pattern in Process: chrome.exe (3400) Found pattern in Process: chrome.exe (3400) Found pattern in Process: chrome.exe (3400) Found pattern in Process: chrome.exe (3400) Found pattern in Process: chrome.exe (3400) Found pattern in Process: chrome.exe (3400) Found pattern in Process: chrome.exe (3400) Found pattern in Process: chrome.exe (3400) Found pattern in Process: chrome.exe (3400) Found pattern in Process: chrome.exe (3400) Found pattern in Process: chrome.exe (3400) Found pattern in Process: chrome.exe (3840) Found pattern in Process: chrome.exe (3840) Found pattern in Process: chrome.exe (3840) Found pattern in Process: chrome.exe (3840) Found pattern in Process: chrome.exe (3912) Found pattern in Process: chrome.exe (3912) Found pattern in Process: chrome.exe (3912) Found pattern in Process: chrome.exe (3912) Found pattern in Process: chrome.exe (3912) Found pattern in Process: chrome.exe (3912) Found pattern in Process: chrome.exe (4092) Found pattern in Process: chrome.exe (4092) Found pattern in Process: chrome.exe (4092) Found pattern in Process: chrome.exe (4092) Found pattern in Process: chrome.exe (2036) Found pattern in Process: chrome.exe (2036) Found pattern in Process: chrome.exe (2036) Found LastPass Entry for hackforums.net UserName: peters.lastpass Pasword: jRvTpQoTHS4OTcl Found LastPass Entry for facebook.com UserName: peters.lastpass@gmail.com Pasword: Unknown Found LastPass Entry for sainsburys.co.uk UserName: peters.lastpass@gmail.com Pasword: mt5JwaPctWFzBj Found LastPass Entry for leakforums.net UserName: peterslastpass Pasword: rmH61HSabrVJ9a2 Found LastPass Entry for facebook.com,facebook.com,messenger.com UserName: Unknown Pasword: O3rRJaYNMuoXG7hs Found Private Key LastPassPrivateKey<308204BD020100300D06092A864886F70D0101010500048204A7308204A30201000282010100D0D534BEA030F199144DD4B1B0A69D6462BC13CF074B77CDEC0B4C06D3773B39F0D3353D58732D35809E2A45C9A70B94C366DE4E8B591178F5366A4328C96A82A51E8B1573A9546F859EA6C13EB1E08F1F69749598429244B96AFCAE0787CFC4CC19311D80F90679CE4C395FDBF22F9201381E0AEC345C724E1E61CE8EEE0A37EE38B04D5EEA1AB2562D815242E4D6379D23940ACD800921853787F0F1B37F249DE284780CE1D1FFF10FFCE778CD03A442C7A487C47A27D4F11EE98CF5E8B2AA8A7DEE0710B9C2D430CB33EC747E37298E16103493C6DF8A539F4893F30CCFA74D84E5FC40E1ED39316EA038D16748F58AE873704DD61B028940ECB083E7F1790940D4BD2A01C73DBA4AC26A2BB98CE7A2CDF02011102820100624636F04B62539354D955085321324102818100D05799FCC7514DBFC0DEC6E06E2A8715E9E46911DBBFCC59F1569A82930FDBD195A685C1BF13EABB75B46CC8484EB3771E102E76CE3D3756CEF13666C6581861EE23EC11ABB658BA2F815EF2D406FDD85830F6B599443004CEA4B1A79DAAAAEE86755FE354498C770EF3BE2077DD19EE3E7E53A9935FC0D76BD90D3B887F50575FA01A617A43F5D2C44815098207299381229DDA8F91713B7012D8F29A087A3918A2F76A222BA4202E8A0997D63D1EEF02F246DC0A5C0AC869191B9231DCD6D657FB4E6591DDFAF3026522F84E2D1EF2D5C05289EFF9D7E2F2A722374E0204C8FAA326024DF520B97505146AFB1AF7469B862977B1152430911BFA112E76A51C352D7F1B2C39669B4CF102818100FCFCA8B2F2074C1FB357A859AA583651D5DC9EA0446E0B33A7B41D9B7C9955832BEFB4E2151D17DDB851A1F46B16E26ECC6515BCB1C802DD73DA4ACD89083168E2678DE363EF1B45BAA1BA40F845D8396AFC269503F9A4F04D39271F02819A665D47036F0CA3628D78987102818100CEFC910EF956B3590A9A0907F59EB44CD25FF10032DAFE48C359057F75FBA5AF1CC1C6E11E37CF4F825D0E1540B5DA77FF6777FEE55621C1D0EF85D3C12702150D542A90CC8021FA132EF383835DA4358A0781E168897C779F2DA6A834DA20DBFDA4F643738B4DF6BBDD768947D9EC577466E18100D351EC8A77C7582E0A78C5ACA9D86068BB82D721B0841962F959A25A01FA80FFB765DE228798>LastPassPrivateKey Found Private Key LastPassPrivateKey<\x00\xb2\x88\x10\x02N;$\x02&\x00\x00\x00>LastPassPrivateKey localadmin@tech-server:~$

最后安利一波,你可以在Github找到这个插件<点击阅读原文查看下载链接>。

*参考来源:Techanarchy,FB小编鸢尾编译,转载请注明来自FreeBuf(FreeBuf.COM)

原文发布于微信公众号 - FreeBuf(freebuf)

原文发表时间:2016-10-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏乐百川的学习频道

Spring学习笔记 Spring Roo 简介

一直以来,Java/Spring开发被认为是笨重的代表,无法快速生成项目原型和骨架。所以,Spring推出了Spring Roo这个项目,帮助我们快速生成项目原...

31370
来自专栏Linyb极客之路

使用Spring Boot实现模块化

55620
来自专栏风中追风

分布式环境下的解决方案——分布式锁

锁是一个抽象的概念,锁的实现,需要依存于一个可以存储锁的空间。在多线程中是内存,在多进程中是内存或者磁盘。更重要的是,这个空间是可以被访问到的。多线程中,不同的...

37880
来自专栏程序员宝库

Spring MVC工作原理

Dispatcher Servlet分发器 Handler Mapping 处理器映射 Controller 控制器 ModelAndView 模型和视图对象 ...

36980
来自专栏SpringBoot 核心技术

第四十三章: 基于SpringBoot & RabbitMQ完成TopicExchange分布式消息消费

428150
来自专栏数据之美

python 日志模块 logging 详解

Java 中最通用的日志模块莫过于 Log4j 了,在 python 中,也自带了 logging 模块,该模块的用法其实和 Log4j 类似。 Python ...

55570
来自专栏NetCore

AppFuse项目笔记(1)

AppFuse项目笔记(1) 一、Appfuse简介 Appfuse是Matt Raible 开发的一个指导性的入门级J2EE框架,它对如何集成流行的Sprin...

34450
来自专栏杨建荣的学习笔记

最近的几个技术问题总结和答疑 (r8笔记第19天)

笔记写了不少,有时候有的朋友问我几个关键字,我就会从脑海里进行搜索,凡是写过的,搜索一下总能找到,帮助了别人,提高了自己,何乐而不为。 但是笔记写了很多...

33560
来自专栏精讲JAVA

一文理解Netty模型架构

本文基于Netty4.1展开介绍相关理论模型,使用场景,基本组件、整体架构,知其然且知其所以然,希望给读者提供学习实践参考。

19520
来自专栏IMWeb前端团队

pm2模块编写入门

本文作者:IMWeb zzbozheng 原文出处:IMWeb社区 未经同意,禁止转载 PM2 模块 PM2模块是通过PM2来安装和管理,代码可以托管...

23160

扫码关注云+社区

领取腾讯云代金券