如何从内存提取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":"[email protected]","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: [email protected]
Pasword: Unknown
Found LastPass Entry for sainsburys.co.uk
UserName: [email protected]
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)