计算机内存取证之BitLocker恢复密钥提取还原

news2024/12/23 14:13:35

BitLocker是微软Windows自带的用于加密磁盘分卷的技术。

通常,解开后的加密卷通过Windows自带的命令工具“manage-bde”可以查看其恢复密钥串,如下图所示:

如图,这里的数字密码下面的一长串字符串即是下面要提取恢复密钥。

在计算机取证界,经常遇到嫌疑人的目标电脑的磁盘是经过BitLocker加密的,此时通常的做法是通过某种手段(WinPmem、DumpIt、DMA PCILeech,ColdBoot等)取得目标机内存镜像,同时对目标机的磁盘做一个磁盘镜像(WinFE,WinHex,FTKImage等)。

而后,对获取的内存镜像分析(MemProcFS、Volatility等工具)取得BitLocker的VMK密钥,然后通过VMK密钥解密目标磁盘镜像(取证大师等工具),进而获取磁盘中的文件。

这里讲的是通过VMK密钥 + 加密磁盘镜像获取明文恢复密钥串的方法,该方法国外的工具有Elcomsoft、Passware Kit等。

(文字的东西不想多说了,直接上代码,卷起来!)

关键参考代码如下:

//
// @Noema 2021-08-27
// 以下提取恢复密钥明文的方法通过逆向fveapi.dll得来
// 重点关注fveapi.dll中的CFveApiBase::GetAuthMethodInformation函数中的第一个FveDatumVmkQuerySavedKey函数
// 主要逻辑是通过VMK密钥解密Volume Master Key中的stretch key,从而得到恢复密钥的十六进制值,进而得到明文的恢复密钥
//

int libbde_volume_read_recovery_password(
	libbde_volume_t *volume,
	libbde_key_protector_t *key_protector,
	wchar_t *recovery_password_plain,
	uint32_t recovery_password_plain_length
)

{
	INT retn = -1;
	NTSTATUS ret;
	BCRYPT_ALG_HANDLE ba_handle = NULL;
	BCRYPT_KEY_HANDLE bk_handle = NULL;
	BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO paddinginfo = {0};
	BCRYPT_KEY_LENGTHS_STRUCT auth_tag_length_info = {0};
	UCHAR nonce[12] = {0};
	UCHAR tag[16] = {0};
	UCHAR data[1024] = {0};
	PUCHAR stretch_data = NULL;
	DWORD result = 0;
	DWORD object_length = 0;

	USHORT *recovery_data = NULL;
	WCHAR recovery_password[64] = {0};
	INT idx = 0;
	INT order = 0;

	uint8_t * volume_master_key = NULL;

	libbde_internal_volume_t *internal_volume = NULL;
	libbde_internal_key_protector_t *internal_key_protector = NULL;

	if (volume == NULL)
	{
		return -1;
	}
	if (key_protector == NULL)
	{
		return -1;
	}
	if (recovery_password_plain == NULL)
	{
		return -1;
	}

	internal_volume = (libbde_internal_volume_t *)volume;

	volume_master_key = internal_volume->io_handle->volume_master_key;

	internal_key_protector = (libbde_internal_key_protector_t *)key_protector;

	if (internal_key_protector->volume_master_key->protection_type != LIBBDE_KEY_PROTECTION_TYPE_RECOVERY_PASSWORD)
	{
		return -1;
	}

	do 
	{
		ret = BCryptOpenAlgorithmProvider(&ba_handle, L"AES", NULL, 0);
		if (ret != 0)
		{
			break;
		}

		ret = BCryptSetProperty(ba_handle, BCRYPT_CHAINING_MODE, (PUCHAR)BCRYPT_CHAIN_MODE_CCM, 0x20u, 0);
		if (ret != 0)
		{
			break;
		}

		ret = BCryptGetProperty(ba_handle, L"ObjectLength", (PUCHAR)&object_length, sizeof(object_length), &result, 0);
		if (ret != 0)
		{
			break;
		}

		ret = BCryptGetProperty(ba_handle, BCRYPT_AUTH_TAG_LENGTH, (PUCHAR)&auth_tag_length_info, sizeof(auth_tag_length_info), &result, 0);
		if (ret != 0)
		{
			break;
		}
		
		ret = BCryptGenerateSymmetricKey(ba_handle, &bk_handle, 0, 0, volume_master_key, 0x20, 0);
		if (ret != 0)
		{
			break;
		}

		stretch_data = internal_key_protector->volume_master_key->stretch_key->data;
		if (stretch_data == NULL)
		{
			break;
		}

		// nonce
		memcpy_s(nonce, 12, stretch_data + 8, 12);

		// auth tag
		memcpy_s(tag, 16, stretch_data + 8 + 12, 16);

		// encrypted data
		memcpy_s(data, sizeof(data), stretch_data + 8 + 12 + 16, 0x1C);

		// fill structure
		paddinginfo.cbSize = sizeof(paddinginfo);
		paddinginfo.dwInfoVersion = 1;
		paddinginfo.pbNonce = nonce;
		paddinginfo.cbNonce = 0x0c;
		paddinginfo.pbTag = tag;
		paddinginfo.cbTag = 0x10;

		// 解密
		ret = BCryptDecrypt(bk_handle, data, 0x1c, &paddinginfo, 0, 0, data, 0x1c, &result, 0);
		if (ret != 0)
		{
			break;
		}

		// 判断合法性
		if (*(PWORD)(data) < 0x0C || *(PWORD)(data) != 0x1C)
		{
			break;
		}
		if ( *(PWORD)(data + 8) != 0x1000)
		{
			break;
		}

		// 偏移到恢复密钥存储位置
		recovery_data = (USHORT *)(data + 0x0C);

		// 转换恢复密钥为字符串
		for ( ; idx<8; idx++, order += 7)
		{
			wsprintfW(&recovery_password[order], L"%06d-", recovery_data[idx] * 11);
		}
		recovery_password[wcslen(recovery_password) - 1] = L'\0';

		wcsncpy_s(recovery_password_plain, recovery_password_plain_length, recovery_password, _TRUNCATE);

		retn = 0;
	
	} while (0);

	if (bk_handle)
	{
		ret = BCryptDestroyKey(bk_handle);
	}
	if (ba_handle)
	{
		BCryptCloseAlgorithmProvider(ba_handle, 0);
	}
	
	return retn;

}

相关引用:

https://github.com/libyal/libbde

https://github.com/ufrisk/pcileech

https://github.com/ufrisk/pcileech-fpga

https://github.com/ufrisk/MemProcFS

https://github.com/volatilityfoundation/volatility

https://github.com/volatilityfoundation/volatility3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/600462.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python编程教程之抽签程序

Python编程教程之抽签程序 介绍 对于喜欢玩抽签、体育彩票等游戏的人来说&#xff0c;抽签程序是一款非常有用的小工具。抽签程序可以用来随机抽取一定数量的幸运儿&#xff0c;而且运行速度快&#xff0c;结果随机性高&#xff0c;不需要人工干预。 那么&#xff0c;Python…

Spring Boot 3.1 中如何整合Spring Security和Keycloak

在今年2月14日的时候&#xff0c;Keycloak 团队宣布他们正在弃用大多数 Keycloak 适配器。其中包括Spring Security和Spring Boot的适配器&#xff0c;这意味着今后Keycloak团队将不再提供针对Spring Security和Spring Boot的集成方案。 但是&#xff0c;如此强大的Keycloak&am…

一文搞懂Android动画

这里写目录标题 前言一、视图动画1. 补间动画---Animation抽象类动画1.1 AlphaAnimation&#xff1a;控制一个对象透明度的动画。1.1.1 xml实现示例1.1.2 java实现示例 1.2 RotateAnimation&#xff1a;控制一个对象旋转的动画。1.1.1 xml实现示例1.1.2 java实现示例 1.3 Scale…

Linux中查看端口被哪个进程占用、进程调用的配置文件、目录等

1.查看被占用的端口的进程&#xff0c;netstat/ss -antulp | grep :端口号 2.通过上面的命令就可以列出&#xff0c;这个端口被哪些应用程序所占用&#xff0c;然后找到对应的进程PID 3.根据PID查询进程。如果想详细查看这个进程&#xff0c;PID具体是哪一个进程&#xff0c;可…

Qt6.5.1+WebRTC学习笔记(八)开发环境搭建(win10+vs2019)

一、准备 1.操作系统win10 64位 2.合理的上网方式&#xff0c;需要正常访问google,最好有20G以上流量 3.安装VS2019&#xff0c;笔者使用的是社区版&#xff0c;并选中C相关&#xff0c;笔者设置如下 注意&#xff0c;win10的sdk需要是10.0.20348.1&#xff0c;其他版本可能…

JavaWeb17(过滤器监听器)

目录 1.过滤器/拦截器-Filter. 1.1过滤器介绍. 1.2过滤器使用步骤. 1.2.1创建过滤器. 1.2.2映射配置. 1.3案例1-编码设置. 1.4案例2-登陆状态验证. 1.4过滤链-略带. 2.监听器-Listener. 2.1监听器介绍. 2.2案例演示1-统计在线人数. 2.3案例演示2-统计历史在线人数.…

太好玩了!用Python做音乐节奏可视化!

大家注意&#xff1a;因为微信最近又改了推送机制&#xff0c;经常有小伙伴说错过了之前被删的文章&#xff0c;比如前阵子冒着风险写的爬虫&#xff0c;再比如一些限时福利&#xff0c;错过了就是错过了。 所以建议大家加个星标&#xff0c;就能第一时间收到推送。&#x1f44…

【Python C扩展】零基础也能轻松掌握的学习路线与参考资料

Python C扩展是将Python语言与C语言相结合&#xff0c;最大限度地利用C语言的高性能和Python语言的灵活性&#xff0c;使Python程序获得更高的运行效率。Python C扩展的学习路线涵盖了C语言基础、Python语言、Python C API等多个方面。下面将详细介绍Python C扩展的学习路线&am…

Python+Yolov5人脸表情特征识别

程序示例精选 PythonYolov5人脸表情特征识别 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<PythonYolov5人脸表情特征识别>>编写代码&#xff0c;代码整洁&#xff0c;规则&am…

【微服务架构】专家组:在过去十年的微服务中,我们学到了什么?

瓦特&#xff08;Watt&#xff09;&#xff1a;这是微服务专家组。Chris早些时候谈到了最小化微服务中的设计时耦合。他是microservices.io的创建者&#xff0c;《微服务模式》一书的作者。他也是Java冠军&#xff0c;在微服务领域非常有经验。我期待着与你们一起深入研究其中的…

区间预测 | MATLAB实现基于QRCNN-BiLSTM-Multihead-Attention卷积神经网络结合双向长短期记忆神经网络多变量时间序列区间预测

区间预测 | MATLAB实现QRCNN-BiLSTM-Multihead-Attention卷积神经网络结合双向长短期记忆神经网络多变量时间序列区间预测 目录 区间预测 | MATLAB实现QRCNN-BiLSTM-Multihead-Attention卷积神经网络结合双向长短期记忆神经网络多变量时间序列区间预测效果一览基本介绍模型描述…

chatgpt赋能python:Python冒泡排序:理解流程图

Python冒泡排序&#xff1a;理解流程图 当涉及到排序算法时&#xff0c;Python中最流行的算法之一就是冒泡排序。它是一种简单而有效的排列方法&#xff0c;旨在让列表中的元素按升序或降序排列。在此文章中&#xff0c;我们将讨论冒泡排序的流程图&#xff0c;并重点介绍每个…

JavaWeb18(文件上传富文本编辑器)

目录 一、富文本编辑器 1.1 什么是富文本编辑器? 1.2 CKEditor 1.3 CKEditor 4的使用步骤【参考官方文档】 1.4 优化商品增加、查看、修改功能 1.5 尝试课外扩展其他富文本编辑器 二、文件上传 2.1 到底客户端的文件是上传到哪里? 2.2 SmartUpload是什么? 2.3 Sma…

聚观早报 |ChatGPT之父称AI可能灭绝人类;Kindle本月关闭电子书店

今日要闻&#xff1a;马斯克到访特斯拉上海超级工厂&#xff1b;ChatGPT之父称AI可能灭绝人类&#xff1b;Kindle本月关闭电子书店&#xff1b;FF91将进入交付阶段&#xff1b;iPhone14最高降1900元 马斯克到访特斯拉上海超级工厂 6 月 1 日消息&#xff0c;据航班APP信息显示…

记录--面试官:“你知道什么情况下 HTTPS 不安全么”

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 面试官&#xff1a;“HTTPS的加密过程你知道么&#xff1f;” 我&#xff1a;“那肯定知道啊。” 面试官&#xff1a;“那你知道什么情况下 HTTPS 不安全么” 我&#xff1a;“这....” 越面觉得自己越…

LEAP模型(能源环境发展、碳排放建模预测及不确定性分析)

在国家“3060”碳达峰碳中和的政策背景下&#xff0c;如何寻求经济-能源-环境的平衡有效发展是国家、省份、城市及园区等不同级别经济体的重要课题。根据国家政策、当地能源结构、能源技术发展水平以及相关碳排放指标制定合理有效的低碳能源发展规划需要以科学准确的能源环境发…

在金融数据里挖呀挖,GaussDB开出了花

北京是首都&#xff0c;上海是魔都&#xff0c;那深圳是什么&#xff1f;如果在网上问这个问题&#xff0c;网友会告诉你&#xff0c;深圳是“搞钱之都”。 金融在深圳扮演着关键角色&#xff0c;金融产业的配套数字化基础设施地位也自然也非常重要。深圳的银行、券商等金融机构…

(2)NUC980 Uboot制作

目录&#xff1a; (1)NUC980 编译环境搭建 (2)NUC980 Uboot制作 (3)NUC 980 kenerl编译 u-boot&#xff1a; &#xff08;1&#xff09;下载u-boot: A:下载连接&#xff1a; 下载地址&#xff1a;https://gitee.com/OpenNuvoton/NUC970_U-Boot_v2016.11 文件&#xff1a;NUC97…

分布式存储ceph

ceph架构&#xff0c;三个默认接口&#xff08;块存储RBD&#xff0c;文件存储cephFS&#xff0c;对象存储RGW&#xff09; LibRADOS对象访问接口 RADOS基础存储系统&#xff08;统一存储池&#xff09; #最底层 ceph架构 osd&#xff0c;负责存储数据&#xff0c;一般一个…

27.hadoop系列之50G数据清洗入库秒查询实践

1. 项目背景 目前本地有50G的企业年报csv数据, 需要清洗出通信地址&#xff0c;并需要与原有的亿条数据合并以供业务查询最新的企业通信地址 2. 技术选型 Hadoop ClickHouse 3. Hadoop数据清洗 我们50G的数据无须上传至集群处理&#xff0c;上传目前带宽2M/S, 巨慢&#x…