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攻击

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

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

【安全研究】从mimikatz学习万能密码——上相关推荐

  1. 从mimikatz抓取密码学习攻防

    前不久在使用mimikatz抓取hash的时候遇到了报错,本着追根溯源的原则去查看了mimikatz抓取密码的原理.在学习的过程中发现了mimikatz的每种报错都有不同的原因,本文就从mimikat ...

  2. 【安全】从mimikatz学习Windows安全之访问控制模型

    前言 上次的文章分析了mimikatz的token模块,并简单介绍了windows访问控制模型的概念.在本篇文章中,主要介绍sid相关的概念,并介绍mimikatz的sid模块,着重分析sid::pa ...

  3. 万能密码:‘or 1=1-- 实战SQL注入,秒破后台

    主要是没有对登录密码的字符串进行参数化和过滤,所以导致网站可以直接用"万能密码"进行突破登录 仅供学习交流 这是某同学做的网站,今天无聊打开了,并帮他进行测试一下 看到这个后台,感 ...

  4. 从mimikatz学习Windows安全之访问控制模型(一)

    从mimikatz学习Windows安全之访问控制模型(一) 从mimikatz学习Windows安全之访问控制模型(一)0x00 前言0x01 访问控制模型简介1. 访问令牌(Access Toke ...

  5. 域内权限维持:Skeleton Key(万能密码)

     01.简介 Skeleton Key(万能密码),是一种可以对域内权限进行持久化的操作,通过将Skeleton Key注入到lsass进程,无需重启域控即可生效,而且能够在不影响当前域用户正常登录的 ...

  6. 谷歌大脑新研究:强化学习如何学会用声音来观察?

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 编译 | 王晔 校对 | 维克多 人类已经证明,大脑中的神经系统拥有 ...

  7. 理解卷积神经网络的利器:9篇重要的深度学习论文(上)

    摘要: 为了更好地帮助你理解卷积神经网络,在这里,我总结了计算机视觉和卷积神经网络领域内许多新的重要进步及有关论文. 手把手教你理解卷积神经网络(一) 手把手教你理解卷积神经网络(二) 本文将介绍过去 ...

  8. 台达s1变频器参数表_各大品牌变频器万能密码汇总

    西门子品牌 6SE70书本型变频器:设定密码打不开时,将P358和P359中数据改为相同即可. ABB品牌 ACS600变频器:在16.03参数中输入密码"23032",102.0 ...

  9. SQL注入闭合方式及万能密码

    由万能公式想到的... 请求方式 GET请求 POST请求 SQL注入闭合方式 数字型 字符型 再看sqli-labs实验 万能密码 请求方式 两种 HTTP 请求方法:GET 和 POST 在客户机 ...

最新文章

  1. BGA封装芯片手工焊接攻略
  2. 清华医工结合项目及三创项目与天津市27家重点医院对接
  3. 预训练是 AI 未来所需要的全部吗?
  4. 计算机word做课程表实验报告,word制作课程表.doc
  5. 不能装载文档控件。请在检查浏览器的选项中检查浏览器的安全设置_Excel基础—文件菜单之设置信息...
  6. 裁剪左上角x左上角y填什么_少了立体裁剪,你的服装设计生涯还完整吗?
  7. 2020,国产 AI 开源框架“剑指”TensorFlow、PyTorch
  8. PowerEdge r730xd 安装centos 6.7
  9. ASP.NET AJAX 首部曲 - 迈向解密之路
  10. java容器类---概述
  11. 特征选择和共线性问题
  12. 5.Django 数据库多表查询
  13. 如何安装数据库和数据库安装不了如何解决
  14. python数学符号读法大全_数学符号读法大全
  15. 天空的颜色 363
  16. 【杂谈】真相揭开有点吃惊:杨利伟出舱时
  17. 阿里企业邮箱收费版与免费版有哪些规格和功能上的区别?
  18. oblog商业版本4.6注射漏洞,直接拿管理员
  19. 这个世界没有想象中的那么好,但似乎 ...... 也没那么糟
  20. C++新特性:override

热门文章

  1. 成功解决mod = importlib.util.module_from_spec(spec)ImportError: DLL load failed: 找不到指定的程序。
  2. Python:pmml格式文件的简介、安装、使用方法(利用python将机器学习模型转为Java常用的pmml格式文件)之详细攻略
  3. 成功解决AttributeError: ‘str‘ object has no attribute ‘decode‘
  4. Python封装发送信息到钉钉群
  5. Windows Defender还原误删文件
  6. 24、Cocos2dx 3.0游戏开发找小三之网格动作:高炫酷的3D动作
  7. 3月25日 JavaScript
  8. web开发中常见的安全漏洞及避免方法
  9. iOS Storyboard unwind segues使用小结
  10. Ganglia的配置,用于监测系统和Hadoop性能