百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 软件资讯 > 正文

「安全研究」从mimikatz学习万能密码——上

dezehang 2024-11-22 13:05 2 浏览

1.背景介绍

2015年1月2日,Dell Secureworks共享了一份关于利用专用域控制器(DC)恶意软件(名为“SkeletonKey”恶意软件)进行高级攻击活动的报告,SkeletonKey恶意软件修改了DC的身份验证流程,域用户仍然可以使用其用户名和密码登录,攻击者可以使用Skeleton Key密码作为任何域用户登录

【资料查看】

(http://www.secureworks.com/cyber-threat-intelligence/threats/skeleton-key-malware-analysis/),2015 年 1 月 17 日Benjamin Delpy更新了Mimikatz使其也能进行Skeleton Key攻击,我们今天分析的主要内容也就是mimikatz的misc::skeleton功能。

2.模块详细分析

misc::skeleton功能模块在kuhl_m_misc.c文件中,从该c文件开头可以看到作者定义了一个结构体数组用来存储当前misc模块中具体有哪些功能,该结构体有3个成员第一个是功能函数,第二个是启动该功能的参数,第三个是功能描述所以我们今天要分析的skeleton在这个kuhl_m_misc_skeleton函数中启动命令为misc::skeleton暂无描述,可以看到其他该misc模块是有很多功能是日常使用中也没有用上后续可以挖掘功能

所以我们在这个kuhl_m_misc_skeleton函数下个断点当我们执行misc::skeleton时就可以执行到这里开始调试,在该函数开始前还定义一个数组存储了一个字符串Kerberos-Newer-Keys,这是个很重要的字符串后续用到的时候详细解释

可以看到函数开始定义了很多变量,可以看到extensions结构体初始化了一些值,我们查看一下这个结构体可以发现该结构体成员有4个从名称大概可以猜出来分别为模块,功能,替换的值,指针,这样我们大概就可以这个结构体数组是什么了第一个结构体就是模块是kernel32.dll,localAlloc函数,替换的值为0X4a4a4a4a4a,指针为NULL,从现在来看这个结构体大部分内容是没意义的还有很多为NULL的

接下来又定义了一个结构体exforcb来存储extensions以及extensions的大小,判断当前Mimikatz的版本号是否小于vista系统的版本号这里我们的软件版本11是大于宏定义的visita系统5000的或者传入命令参数是否有letaes我们这里传入的是misc::skeleton所以两个判断都不为真onlyRC4Stuff为0 这样也才能进入下面的功能操作。接着利用RtlZeroMemory函数初始化orig结构体填充0

接下来用RtlInitUnicodeString函数计算出Kerberos-Newer-Keys字符串的长度并将该字符串以及长度保存在orig结构体中

接下来传入lsass.exe到kull_m_process_getProcessIdForName函数中用来获取lsass进程的pid,该函数主要通过NtQuerySystemInformationAPI函数来获取

接下来利用openprocess函数传入开始lsass进程的pid来获取lsass进程的句柄,然后将KULL_M_MEMORY_TYPE_PROCESS,lsass进程的句柄,&alsass.hmemory传入kull_m_memory_open函数中,alsass也是kuhl_m_misc_skeleton函数一开始定义的结构体里面有2个成员一个存储地址的指针,另一个成员又是一个结构体主要表示当前句柄的类型或者内存的属性

跟进这个函发现会根据传入的参数走KULL_M_MEMORY_TYPE_PROCESScase该函数主要就是给alsass.hmemory结构体赋值

接下来由于onlyRC4Stuff为0所以可以进入里面的流程我们看到kull_m_process_getVeryBasicModuleInformationsForName传入了3个参数开始的alsass.hmemory,kdscsvc.dll字符串,和另一个cryptinfos结构体的引用这个结构体主要是一个存储模块的基础信息成员有模块基地址,模块大小,时间戳,没有公开的函数

跟进函数其实该函数主要是通过kull_m_process_getVeryBasicModuleInformations函数获取kdscsvc.dll的详细信息,kull_m_process_callback_moduleForName是个回调函数主要是用结构体赋值的

进入函数主要是跟内存属性走不同case通过peb和ldr遍历进程的模块来获取kdscsvc.dll的详细信息

跟进kull_m_process_peb函数可以看到根据不同内存属性来走对应的case获取peb信息,这里是通过NtQueryInformationProcessAPI获取

由于VS是3环调试器无法读取到内核的信息,我们可以搭建双机调试使用windbg读取一下0x0000008f85514000PEB结构体信息

函数最开始有定义一个结构体来存储peb相关信息,使用kull_m_memory_copy函数根据不同的内存属性调用不同的内存拷贝函数这里调用的ReadProcessMemory函数

主要是利用PEB找到LDR以及双向链表InLoadOrderModuleList来遍历lsass进程模块找到kdcsvc.dll

可以看到确实获取到了kdcsvc.dll的模块信息并把信息存储在cryptInfos结构体中

跟进这个函数首先定义了一个跟参数search一样的结构体并把属性定义为了KULL_M_MEMORY_GLOBAL_OWN_HANDLE这个结构体存的是KULL_M_MEMORY_TYPE_OWN属性,这里因为下面流程根据参数里面的内存属性走了KULL_M_MEMORY_TYPE_PROCESScase然后作者就使用kull_m_memory_copy函数(里面跟进内存属性走对应的case这里使用了ReadProcessMemory函数拷贝)将search结构体内容都拷贝自己定义的sbuffer结构体中然后又再次调用kull_m_memory_search函数进入这个函数由于sbuffer结构体成员属性作者定义为了KULL_M_MEMORY_TYPE_OWN所以会走KULL_M_MEMORY_TYPE_OWN的case

进入KULL_M_MEMORY_TYPE_OWNcase后利用for循环从kdcsvc.dll的首地址2c28dde0080开始查找Kerberos-Newer-Keys字符串,由于最后匹配上之后继续执行了一次curentPtr++后续通过currentptr--调整回来指向kdcsvc.dll中Kerberos-Newer-Keys字符串的正确地址

由于search结构体中存储了kdcsvc.dll内容但是没办法直接在其内存中搜索字符串将其拷贝到sbuffer后然后在sbuffer中找到Kerberos-Newer-Keys字符串并计算其偏移再加上kdcsvc.dll真实的首地址就获得了该字符串的真实偏移通过windbg中查询数据可以看到

所以到这里kull_m_memory_search目的就是找Kerberos-Newer-Keys字符串在kdcsvc.dll中的位置。

kdcsvc.dll是windowsserver系统上才有的dll文件如果是域控服务器的话lsass进程会加载该dll作为kdc服务来颁发piao据

ntds.dit数据库文件有个补充凭证(supplementalCredentials)属性该属性中又包含了Kerberos-Newer-Keys属性存储了明文密码的加密hash,kerberos-Newer-Keys可以设置各种加密属性比如AES加密的话会涉及salt参加加密,但是RC4-HMAC加密就不涉及salt了。Kerberos新的加密类型(如AES)会要求将salt字符串(通常是用户名)添加到密钥派生函数中,要使不同用户的密码相同,需要创建不相同的加密密钥。如果攻击者要支持AES加密的话需要离线计算并存储所有域用户的密钥,这需要大量内存;或实时计算相关用户的密钥,这可能会导致DC的性能问题,但RC4-HMAC不涉及salt,所有用户的骨架RC4-HMAC密钥不变,所以攻击者一般会采取RC4-HMAC加密。

其中在WIN2008及其更新的版本中必须创建一个KERB_STORED_CREDENTIAL_NEW结构体。然后必须将此值 与属性名称“Primary:Kerberos-Newer-Keys”一起放置在USER_PROPERTY结构中才能放在补充凭据中使用,USER_PROPERTY如下图

由于USER_PROPERTY结构体中包含了Kerberos-Newer-Keys字符串所以接下来又通过kull_m_memory_search函数从kdcsvc.dll中搜索该结构体的位置

0x7ffa33072b60就存储了该USER_PROPERTY结构体,其中属性名称是7ffa33066a8指向Kerberos-Newer-Keys字符串

接下来通过rtlzeromemory函数将orig结构体置0然后通过kull_m_memory_copy函数将kdcsvc.dll中的USER_PROPERTY结构体也置0了

调用writeprocessmemory函数将7ffa33072b60地址处16字节的数据置0

数据拷贝后内存值可以看到Kerberos-Newer-Keys包没有了这样就可以保证没办法使用带salt的AES加密方法了

我们可以通过ida打开kdcsvc.dll查看具体的Kerberos-Newer-Keys包的使用细节发现是SamIRetrieveMultiplePrimaryCredentials函数调用的

由于SamIRetrieveMultiplePrimaryCredentials函数是samsrv.dll的导出函数所以想知道具体的返回值我在samsrv.dll中进行了分析SampExtRetrieveMultiplePrimaryCredentialsDs是其主要实现

我们跟进函数然后发现SampLoadDsExtensionDll函数继续跟进分析

发现该函数会查询注册表是否有DirectoryServiceExtPt值我的域控是2016地看了一下没有这个值

接下来会继续尝试加载该文件由于没有所以走下面的else返回0xc00000BB

通过微软官方文档查询报错值发现是不支持该请求类型的错误STATUS_NOT_SUPPORTED,keberos认证流程中客户端会在AS-REQ中声明自己支持的所有加密类型etype,域控会并检查客户端是否支持AES如果客户端支持则域控会在AS-REP的PA-ETYPE-INFO2中响应对应的加密方式。但如果客户端支持的加密类型中有AES,但DC并没有回应对应的AES加密类型,并且报错类型是STATUS_NOT_SUPPORTED很大可能受到了skeleton攻击

本篇文章将持续更新,关注我阅读更多精彩内容!!!

查看【网络安全学习资料·攻略

相关推荐

WIN10系统如何安装UG10.0

随着科技的不断进步与更新,现在有很多公司己经安装上了WIN10的系统以及使用UG10.0了,但很多人反映WIN10系统安装UG10.0不好装,以下详细介绍一下1如果WIN10系统没有自带有JAVA需...

自学UG编程的心得分享

为什么有的人3个月学会基本的UG建模画图编程,有的断断续续3——5年才学会,还有的人干了7年的加工中心还不会电脑画图编程。这是什么原因?1.顾虑太多,什么都想得到,什么都想一起抓,总是上班加班没时间,...

UG/NX 绘制一个捞笊(zhào)模型,或者也可以叫它漏勺?

今天我们来看看这个模型,起因是群里有小伙伴说要做一个捞笊的模型,看见这名字直接给我整懵了,然后他发了张家里漏勺的图片才知道原来这玩意还有个这种名字。这东西相信每个小伙伴家里都有吧,它的建模方法也比较...

再也不用为学UG编程发愁了!380集最新UG资料免费送

上期发的UG教程很多粉丝都领到了,收获越来越多的好评!有你们一直陪伴真的很高兴,谢谢各位粉丝!为了给大家提供更优质的资源,这两个月都在整理你们最关心的UG资源,都是多位编程工厂老师傅的工厂实战精华,真...

优胜原创UG_3-4-5轴后处理下载

反复上机调试,安全稳定可靠,请放心使用2020.11.21,修复YSUG4-5轴后处理锁轴输出...

青华模具学院-UG10.0安装文件说明

青华模具学院分享:今天我们来跟大家一起学习NX10.0版本的安装方法,网上有很多这个版本的安装视频以及方法图文,但到最终安装软件时仍有很多新手对安装仍然感到头痛,基于这样的情况,我们特别就NX10.0...

UGnx10安装说明

温馨提示,安装前,请退出杀毒软件,关闭防火墙,因为这些软件可能阻断NX主程序和许可程序间的通信,导致安装后,软件无法启动。1、解压下载后的压缩包,右键,选择‘’解压到UGNX10_64位正式版(csl...

正版UG软件,正版UG代理,正版软件和盗版软件的区别

大家都知道,UG软件是制造业必不可少的一款三维软件,广泛应用于:CAE(有限元分析),CAD(产品设计/模具设计),CAM(计算机辅助制造编程),那么有人不禁要问了,正版软件和盗版软件在使用上有明显区...

非常全面的UG加工模块中英对照(图标注释)

大家好,我是粥粥老师,听说很多同学都在学习UG但是没有学习资料和安装包,今天粥粥老师就全部打包好免费发放给你们,那么怎么获取全套资料图档安装包呢领取途径①关注②评论、点赞、转发③私信“UG或者...

腾讯自研Git客户端 UGit|Git 图形界面客户端

支持平台:#Windows#macOS腾讯推出的一款Git图形界面客户端,简化了Git的使用流程,特别适合处理大型项目和文件。支持直接提交和推送操作,避免在大规模项目中由于远程频繁变更而导致...

经典收藏:UG重用库的一些不为人知小技巧

免费领取UG产品编程、UG多轴UG模具编程、安装包安装教程图档资料关注私信我“领取资料”,即可免费领取完整版,感谢支持,爱你们哟,么么主题:UG后处理+仿真+外挂UG重用库的正确使用方法:首先有...

UG编程常用指令G、M代码,快收藏好

今天给大家分享数控编程常用的指令代码,希望对正在学习路上的你带来一丝丝帮助。最好的方法就是转发到自己空间,方便以后学习。对了,如果你还需要其他UG教程学习资料,CNC加工中心的一些参数,以及UG画图,...

UG NX7.0中文版从入门到精通

Unigraphics(简称UG)是一套功能强大的CAD/CAE/CAM应用软件,UGNX7是其最新版本。《UGNX7从入门到精通(中文版)》以UGNX7为平台,从工程应用的角度出发,通过基...

经典UG建模基础练习图纸

UG是目前工作中比较优秀拥有大量用户的一款机械模具产品行业三维设计软件,cam加工丶软件支持全中文汉化;能够带给用户更为非凡的设计与加工新体验。很多朋友私信小编问有没有UG建模练习图纸,今天给大家分享...

UG NC软件基础操作,如何设置UG草图精度

默认情况下我们绘制草图一般只保留一位小数,即使你输入多位小数软件也会自动四舍五入,这个你做一些国标的图还好,国标以毫米为单位,一般保留小数点后一位就够了,但如果你做的图是英制单位,那么保留一位小数肯定...