Linux Privilege Escalation

从零开始学习AWS黑客技术,成为专家 htARTE(HackTricks AWS红队专家)

支持HackTricks的其他方式:

系统信息

操作系统信息

让我们开始获取运行的操作系统的一些信息。

(cat /proc/version || uname -a ) 2>/dev/null
lsb_release -a 2>/dev/null # old, not by default on many systems
cat /etc/os-release 2>/dev/null # universal on modern systems

路径

如果您PATH变量中的任何文件夹具有写权限,则可能能够劫持一些库或二进制文件:

echo $PATH

环境信息

环境变量中是否包含有密码、API密钥等敏感信息?

(env || set) 2>/dev/null

内核漏洞

检查内核版本,看是否存在可用于提升权限的漏洞。

您可以在以下位置找到一份良好的易受攻击内核列表以及一些已经编译好的利用程序https://github.com/lucyoa/kernel-exploitsexploitdb sploits。 其他一些可以找到编译好的利用程序的网站包括:https://github.com/bwbwbwbw/linux-exploit-binarieshttps://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack

要从该网站提取所有易受攻击的内核版本,您可以执行以下操作:

以下是一些可用于搜索内核漏洞利用的工具:

linux-exploit-suggester.sh linux-exploit-suggester2.pl linuxprivchecker.py(仅在受害者中执行,仅检查内核2.x的漏洞利用)

始终在Google中搜索内核版本,也许你的内核版本已经写在某个内核漏洞利用中,这样你就可以确保该漏洞利用是有效的。

CVE-2016-5195(DirtyCow)

Linux权限提升 - Linux内核 <= 3.19.0-73.8

Sudo版本

基于出现在以下漏洞sudo版本:

您可以使用以下grep命令检查sudo版本是否存在漏洞。

sudo < v1.28

来自 @sickrov

Dmesg签名验证失败

检查HTB的smasher2 box,了解如何利用此漏洞的示例

更多系统枚举

枚举可能的防御措施

AppArmor

Grsecurity

Grsecurity

PaX

PaX

Execshield

Execshield

SElinux

SElinux

ASLR

地址空间布局随机化

Docker逃逸

如果你在一个Docker容器内部,你可以尝试从中逃脱:

Docker Security

驱动器

检查已挂载和未挂载的内容,以及它们的位置和原因。如果有任何未挂载的内容,你可以尝试挂载它并检查是否包含私人信息。

有用的软件

列举有用的可执行文件

另外,检查是否已安装任何编译器。如果需要使用某些内核利用技术,这将非常有用,因为建议在要使用该技术的机器上(或类似的机器上)进行编译。

已安装的易受攻击软件

检查已安装软件包和服务的版本。也许有一些旧的 Nagios 版本(例如)可能被利用来提升权限... 建议手动检查更可疑的已安装软件的版本。

如果您可以访问机器的SSH,您还可以使用openVAS来检查机器内安装的过时和易受攻击的软件。

请注意,这些命令将显示大量大多数情况下无用的信息,因此建议使用一些类似OpenVAS的应用程序,以检查安装的软件版本是否容易受到已知漏洞的影响

进程

查看正在执行的进程,并检查是否有任何进程具有比应有的更多权限(也许是由root执行的tomcat?)

始终检查可能正在运行的electron/cef/chromium调试器,您可以滥用它来提升权限Linpeas通过检查进程的命令行中的--inspect参数来检测这些调试器。 还要检查您对进程二进制文件的权限,也许您可以覆盖某人的权限。

进程监控

您可以使用像pspy这样的工具来监控进程。这对于识别频繁执行的易受攻击的进程或在满足一组要求时非常有用。

进程内存

服务器的一些服务会在内存中以明文保存凭据。 通常,您需要root权限才能读取属于其他用户的进程的内存,因此当您已经是root并希望发现更多凭据时,这通常更有用。 但是,请记住作为普通用户,您可以读取自己拥有的进程的内存

GDB

如果您可以访问FTP服务的内存(例如),您可以获取Heap并在其中搜索凭据。

GDB 脚本

/proc/$pid/maps & /proc/$pid/mem

对于给定的进程ID,maps显示了该进程的虚拟地址空间内存是如何映射的;它还显示了每个映射区域的权限mem伪文件暴露了进程的内存本身。从maps文件中,我们知道哪些内存区域是可读的以及它们的偏移量。我们利用这些信息定位到mem文件并将所有可读区域转储到文件中

/dev/mem

/dev/mem 提供对系统的物理内存的访问,而不是虚拟内存。内核的虚拟地址空间可以使用/dev/kmem来访问。通常,/dev/mem 只能被rootkmem组读取。

ProcDump for Linux

ProcDump是Sysinternals工具套件中经典ProcDump工具的Linux重新设计版本。在https://github.com/Sysinternals/ProcDump-for-Linux获取。

工具

要转储进程内存,您可以使用:

从进程内存中获取凭据

手动示例

如果您发现认证进程正在运行:

您可以转储进程(查看前面的部分以找到转储进程内存的不同方法),并在内存中搜索凭据:

mimipenguin

该工具https://github.com/huntergregal/mimipenguin将从内存和一些知名文件窃取明文凭证。它需要root权限才能正常工作。

功能
进程名称

GDM密码(Kali桌面,Debian桌面)

gdm-password

Gnome Keyring(Ubuntu桌面,ArchLinux桌面)

gnome-keyring-daemon

LightDM(Ubuntu桌面)

lightdm

VSFTPd(活动FTP连接)

vsftpd

Apache2(活动HTTP基本认证会话)

apache2

OpenSSH(活动SSH会话 - Sudo使用)

sshd:

Search Regexes/truffleproc

定时任务/Cron 作业

检查是否有任何可被利用的定时任务。也许你可以利用由 root 执行的脚本(通配符漏洞?可以修改 root 使用的文件?使用符号链接?在 root 使用的目录中创建特定文件?)。

Cron路径

例如,在_/etc/crontab_文件中,您可以找到路径:PATH=/home/user:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

请注意用户"user"对/home/user具有写入权限

如果在这个crontab中,root用户尝试执行一些命令或脚本而没有设置路径。例如:* * * * root overwrite.sh 然后,您可以通过以下方式获取root shell:

使用带通配符的脚本的 Cron 作业(通配符注入)

如果由 root 执行的脚本中的命令中包含“*”,您可以利用这一点执行意外操作(如权限提升)。示例:

如果通配符前面有路径,比如 /some/path/* ,它就不会有漏洞(即使 ./* 也不会有漏洞)。

阅读以下页面了解更多通配符利用技巧:

Wildcards Spare tricks

Cron脚本覆盖和符号链接

如果你可以修改由root执行的cron脚本,你可以非常容易地获得一个shell:

如果由root执行的脚本使用了你拥有完全访问权限的目录,也许删除该文件夹并创建一个符号链接文件夹到另一个文件夹,以便运行你控制的脚本可能会很有用。

频繁的 cron 作业

您可以监视进程,以搜索每隔 1、2 或 5 分钟执行一次的进程。也许您可以利用这一点来提升权限。

例如,要在 1 分钟内每 0.1 秒监视按最少执行命令排序并删除已执行最多次的命令,您可以执行:

您也可以使用 pspy (这将监视并列出每个启动的进程)。

隐形的定时任务

可以通过在注释后面插入一个回车符(没有换行符)来创建一个定时任务,这样定时任务将会生效。示例(请注意回车符):

服务

可写的 .service 文件

检查是否可以写入任何 .service 文件,如果可以,您可以修改它以便在服务启动重新启动停止执行您的后门(也许您需要等到机器重新启动)。 例如,在 .service 文件中创建您的后门,使用**ExecStart=/tmp/script.sh**

可写的服务二进制文件

请记住,如果您对服务执行的二进制文件具有写权限,您可以将它们更改为后门,这样当服务被重新执行时,后门将被执行。

systemd 路径 - 相对路径

您可以查看systemd使用的路径:

如果发现您可以在路径中的任何文件夹中写入,则可能能够提升权限。您需要搜索服务配置文件中使用的相对路径,例如:

然后,在您可以编写的systemd PATH文件夹中创建一个与相对路径二进制文件同名的可执行文件,当服务被要求执行易受攻击的操作(启动停止重新加载)时,您的后门将被执行(通常非特权用户无法启动/停止服务,但请检查是否可以使用 sudo -l)。

了解有关服务的更多信息,请使用 man systemd.service

定时器

定时器是以**.timer**结尾的systemd单元文件,用于控制**.service**文件或事件。定时器可用作cron的替代方案,因为它们内置支持日历时间事件和单调时间事件,并且可以异步运行。

您可以使用以下命令枚举所有定时器:

可写的定时器

如果您可以修改一个定时器,您可以让它执行一些 systemd.unit 中已存在的内容(比如 .service.target)。

在文档中,您可以阅读有关 Unit 的内容:

当此计时器到期时要激活的单元。参数是一个单元名称,其后缀不是 ".timer"。如果未指定,则此值默认为具有与计时器单元相同名称的服务,除了后缀。(见上文。)建议激活的单元名称和计时器单元的单元名称相同,除了后缀。

因此,要滥用此权限,您需要:

  • 找到一些 systemd 单元(如 .service),其中执行可写二进制文件

  • 找到一些 systemd 单元,其中执行相对路径,并且您对systemd 路径具有可写权限(以冒充该可执行文件)

通过 man systemd.timer 了解更多关于计时器的信息。

启用计时器

要启用计时器,您需要 root 权限并执行:

注意计时器是通过在/etc/systemd/system/<WantedBy_section>.wants/<name>.timer上创建符号链接来激活的。

套接字

Unix域套接字(UDS)在客户端-服务器模型中允许在同一台或不同机器上进行进程通信。它们利用标准的Unix描述符文件进行计算机间通信,并通过.socket文件进行设置。

套接字可以使用.socket文件进行配置。

通过man systemd.socket了解更多关于套接字的信息。 在这个文件中,可以配置几个有趣的参数:

  • ListenStreamListenDatagramListenSequentialPacketListenFIFOListenSpecialListenNetlinkListenMessageQueueListenUSBFunction:这些选项不同,但总结起来用于指示它将在哪里监听套接字(AF_UNIX套接字文件的路径,要监听的IPv4/6和/或端口号等)。

  • Accept:接受一个布尔参数。如果为true,则为每个传入连接生成一个服务实例,并且只传递连接套接字给它。如果为false,则所有监听套接字本身都会传递给启动的服务单元,并且只为所有连接生成一个服务单元。对于数据报套接字和FIFO,在那里一个服务单元无条件地处理所有传入流量,此值将被忽略。默认为false。出于性能原因,建议仅以适合Accept=no的方式编写新的守护程序。

  • ExecStartPreExecStartPost:接受一个或多个命令行,这些命令行在创建和绑定监听套接字/FIFO之前或之后执行。命令行的第一个标记必须是绝对文件名,然后是进程的参数。

  • ExecStopPreExecStopPost:额外的命令,在关闭和移除监听套接字/FIFO之前或之后执行

  • Service:指定在传入流量激活服务单元名称。此设置仅允许用于Accept=no的套接字。默认为与套接字同名的服务(后缀替换)。在大多数情况下,不应该需要使用此选项。

可写的.socket文件

如果找到一个可写.socket文件,你可以在[Socket]部分的开头添加类似于:ExecStartPre=/home/kali/sys/backdoor,那么在创建套接字之前将执行后门。因此,你可能需要等待机器重新启动。 请注意系统必须使用该套接字文件配置,否则后门将不会被执行

可写套接字

如果你识别出任何可写套接字(现在我们谈论的是Unix套接字,而不是配置.socket文件),那么你可以与该套接字通信,也许利用一个漏洞。

枚举Unix套接字

原始连接

利用示例:

Socket Command Injection

HTTP sockets

请注意,可能有一些监听HTTP请求的套接字我不是在说.socket文件,而是充当Unix套接字的文件)。您可以使用以下命令检查:

可写的Docker套接字

Docker套接字通常位于/var/run/docker.sock,是一个关键文件,应该得到保护。默认情况下,它可被root用户和docker组的成员写入。拥有对此套接字的写入访问权限可能导致特权升级。以下是如何执行此操作的详细步骤,以及在无法使用Docker CLI时的替代方法。

使用Docker CLI进行特权升级

如果您对Docker套接字具有写入访问权限,则可以使用以下命令升级特权:

这些命令允许您以根级访问主机文件系统来运行容器。

直接使用 Docker API

在没有 Docker CLI 的情况下,仍然可以使用 Docker API 和 curl 命令来操作 Docker 套接字。

  1. 列出 Docker 镜像: 检索可用镜像列表。

  1. 创建容器: 发送请求以创建一个容器,该容器挂载主机系统的根目录。

启动新创建的容器:

  1. 附加到容器: 使用 socat 建立与容器的连接,从而在其中启用命令执行。

建立 socat 连接后,您可以直接在容器中执行命令,以根级访问主机文件系统。

其他

请注意,如果您对 Docker 套接字具有写权限,因为您docker 组内,您有更多提升权限的方法。如果docker API 在某个端口上监听,您也可能能够对其进行妥协

在以下位置检查更多从 Docker 中突破或滥用以提升权限的方法

Docker Security

Containerd (ctr) 特权升级

如果您发现可以使用**ctr命令,请阅读以下页面,因为您可能能够滥用它来提升权限**:

Containerd (ctr) Privilege Escalation

RunC 特权升级

如果您发现可以使用**runc命令,请阅读以下页面,因为您可能能够滥用它来提升权限**:

RunC Privilege Escalation

D-Bus

D-Bus 是一种复杂的进程间通信(IPC)系统,使应用程序能够高效地交互和共享数据。设计时考虑到现代 Linux 系统,它为不同形式的应用程序通信提供了强大的框架。

该系统功能强大,支持增强数据交换的基本 IPC,类似于增强的 UNIX 域套接字。此外,它有助于广播事件或信号,促进系统组件之间的无缝集成。例如,蓝牙守护程序发出有电话呼入的信号可能会提示音乐播放器静音,增强用户体验。此外,D-Bus 支持远程对象系统,简化了应用程序之间的服务请求和方法调用,简化了传统上复杂的流程。

D-Bus 采用允许/拒绝模型,根据匹配策略规则的累积效果管理消息权限(方法调用、信号发射等)。这些策略指定与总线的交互,可能通过利用这些权限的漏洞来提升权限。

/etc/dbus-1/system.d/wpa_supplicant.conf 中提供了一个示例策略,详细说明了允许根用户拥有、发送到和接收来自 fi.w1.wpa_supplicant1 的消息的权限。

未指定用户或组的策略适用于所有情况,而“default”上下文策略适用于所有未被其他特定策略覆盖的情况。

学习如何枚举和利用 D-Bus 通信:

D-Bus Enumeration & Command Injection Privilege Escalation

网络

枚举网络并确定机器位置总是很有趣。

通用枚举

开放端口

在访问之前,始终检查在机器上运行的网络服务,这些服务可能是您无法与之交互的。

嗅探

检查是否可以嗅探流量。如果可以的话,你可能能够获取一些凭证。

用户

通用枚举

检查您是,拥有哪些特权,系统中有哪些用户,哪些用户可以登录,哪些用户具有root特权

大 UID

一些Linux版本受到一个bug的影响,允许具有UID > INT_MAX的用户提升权限。更多信息: here, herehere. 利用方法:使用 systemd-run -t /bin/bash

检查是否是某个组的成员,该组可能授予您root权限:

Interesting Groups - Linux Privesc

剪贴板

检查剪贴板中是否有任何有趣的内容(如果可能)

密码策略

已知密码

如果你知道环境中的任何密码,尝试使用密码以每个用户身份登录

Su Brute

如果不介意制造很多噪音且计算机上存在sutimeout二进制文件,你可以尝试使用su-bruteforce来暴力破解用户。 Linpeas带有-a参数也可以尝试暴力破解用户。

可写的 PATH 滥用

$PATH

如果你发现你可以在$PATH的某个文件夹中写入,你可能可以通过在可写文件夹中创建一个后门,命名为将由不同用户(最好是root)执行的某个命令,且该命令不是从$PATH中位于你可写文件夹之前的文件夹加载

SUDO 和 SUID

你可能被允许使用sudo执行某些命令,或者它们可能具有suid位。使用以下命令进行检查:

一些意外的命令允许您读取和/或写入文件,甚至执行命令。 例如:

NOPASSWD

Sudo配置可能允许用户在不知道密码的情况下以另一个用户的权限执行某些命令。

在这个例子中,用户demo可以作为root运行vim,现在可以通过将一个ssh密钥添加到root目录中或调用sh来轻松获得一个shell。

SETENV

该指令允许用户在执行某些操作时设置环境变量

这个例子,基于HTB机器Admirer,存在PYTHONPATH劫持漏洞,可以在以root权限执行脚本时加载任意的Python库:

绕过路径执行Sudo

跳转到其他文件或使用符号链接。例如,在sudoers文件中:hacker10 ALL= (root) /bin/less /var/log/*

如果使用通配符(*),那就更容易了:

对策https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/

没有指定命令路径的Sudo命令/SUID二进制文件

如果给予sudo权限给单个命令而没有指定路径hacker10 ALL= (root) less,您可以通过更改PATH变量来利用它。

这种技术也可以用于suid二进制文件执行另一个命令而没有指定路径(始终使用 strings **检查奇怪的SUID二进制文件的内容)。

执行的有效载荷示例。

具有命令路径的SUID二进制文件

如果suid二进制文件执行另一个指定路径的命令,那么您可以尝试导出一个函数,命名为suid文件调用的命令。

例如,如果一个suid二进制文件调用 /usr/sbin/service apache2 start,您必须尝试创建并导出该函数:

LD_PRELOAD & LD_LIBRARY_PATH

LD_PRELOAD环境变量用于指定要在加载器加载所有其他库之前加载的一个或多个共享库(.so文件)。这个过程被称为预加载库。

然而,为了维护系统安全并防止这个功能被滥用,特别是对于suid/sgid可执行文件,系统强制执行一些条件:

  • 加载器对于真实用户ID(ruid)与有效用户ID(euid)不匹配的可执行文件忽略LD_PRELOAD

  • 对于suid/sgid的可执行文件,只有标准路径中也是suid/sgid的库会被预加载。

如果你有执行带有sudo的命令的能力,并且sudo -l的输出包含语句env_keep+=LD_PRELOAD,特权升级可能会发生。这个配置允许LD_PRELOAD环境变量持久存在并在使用sudo运行命令时被识别,可能导致以提升的权限执行任意代码。

保存为 /tmp/pe.c

然后使用以下命令编译它:

最后,提升权限运行

SUID二进制文件 - .so注入

当遇到具有SUID权限且看起来不寻常的二进制文件时,最好验证它是否正确加载**.so**文件。可以通过运行以下命令来检查:

例如,遇到类似 "open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)" 的错误表明存在潜在的利用可能。

要利用这个问题,可以通过创建一个名为 "/path/to/.config/libcalc.c" 的 C 文件,其中包含以下代码:

这段代码一旦编译并执行,旨在通过操纵文件权限并以提升的权限执行shell来提升权限。

使用以下命令将上述C文件编译为共享对象(.so)文件:

共享对象劫持

最后,运行受影响的SUID二进制文件应该触发漏洞利用,从而可能导致系统受损。

现在我们已经找到一个SUID二进制文件,它从一个我们可以写入的文件夹加载库,请在该文件夹中创建具有必要名称的库文件:

如果你遇到类似以下错误:

这意味着你生成的库需要有一个名为a_function_name的函数。

GTFOBins

GTFOBins是一个经过筛选的Unix二进制文件列表,攻击者可以利用其中的函数来绕过本地安全限制。GTFOArgs是类似的,但适用于只能在命令中注入参数的情况。

该项目收集了Unix二进制文件的合法功能,可被滥用以突破受限制的shell、提升或保持提升的特权、传输文件、生成绑定和反向shell,并促进其他后渗透任务。

gdb -nx -ex '!sh' -ex quit sudo mysql -e '! /bin/sh' strace -o /dev/null /bin/sh sudo awk 'BEGIN {system("/bin/sh")}'

FallOfSudo

如果你可以访问sudo -l,你可以使用工具FallOfSudo来检查是否找到了如何利用任何sudo规则的方法。

重用Sudo令牌

在你拥有sudo访问权限但没有密码的情况下,你可以通过等待sudo命令执行然后劫持会话令牌来提升特权。

提升特权的要求:

  • 你已经作为用户"sampleuser"拥有一个shell

  • "sampleuser"已经使用sudo在最近15分钟内执行了某些操作(默认情况下,这是允许我们使用sudo而无需输入任何密码的sudo令牌的持续时间)

  • cat /proc/sys/kernel/yama/ptrace_scope为0

  • 可以访问gdb(你可以上传它)

(你可以使用echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope临时启用ptrace_scope,或者永久修改/etc/sysctl.d/10-ptrace.conf并设置kernel.yama.ptrace_scope = 0

如果所有这些要求都满足,你可以使用以下方式提升特权: https://github.com/nongiach/sudo_inject

  • 第一个利用exploit.sh)将在_tmp_中创建二进制文件activate_sudo_token。你可以使用它来激活你会话中的sudo令牌(你不会自动获得root shell,请执行sudo su):

  • 第二个漏洞 (exploit_v2.sh) 将在 /tmp 目录中创建一个由 root 拥有并设置了 setuid 的 sh shell

  • 第三个漏洞利用 (exploit_v3.sh) 将创建一个 sudoers 文件,使 sudo 令牌永久有效,并允许所有用户使用 sudo

/var/run/sudo/ts/<用户名>

如果您对该文件夹或文件夹中创建的任何文件具有写权限,则可以使用二进制文件write_sudo_token 为用户和PID创建sudo令牌。 例如,如果您可以覆盖文件 /var/run/sudo/ts/sampleuser,并且您以该用户的PID 1234拥有一个shell,您可以执行以下操作获取sudo特权,而无需知道密码:

/etc/sudoers, /etc/sudoers.d

文件/etc/sudoers/etc/sudoers.d目录中的文件配置了谁可以使用sudo以及如何使用。这些文件默认情况下只能被root用户和root组读取如果你能读取这个文件,你可能能够获取一些有趣的信息,如果你能写入任何文件,你将能够提升权限

如果你可以写入,你可以滥用这个权限

另一种滥用这些权限的方法:

DOAS

有一些替代sudo二进制文件的选择,比如OpenBSD的doas,记得检查其配置在/etc/doas.conf中。

Sudo劫持

如果你知道一个用户通常连接到一台机器并使用 sudo 来提升权限,而你已经在该用户上下文中获得了一个shell,你可以创建一个新的sudo可执行文件,该文件将以root权限执行你的代码,然后执行用户的命令。然后,修改用户上下文中的$PATH(例如在 .bash_profile 中添加新路径),这样当用户执行sudo时,将执行你的sudo可执行文件。

请注意,如果用户使用不同的shell(不是bash),你将需要修改其他文件以添加新路径。例如 sudo-piggyback 修改了 ~/.bashrc~/.zshrc~/.bash_profile。你可以在bashdoor.py中找到另一个示例。

或者运行类似以下内容:

共享库

ld.so

文件/etc/ld.so.conf指示加载的配置文件来源。通常,此文件包含以下路径:include /etc/ld.so.conf.d/*.conf

这意味着将读取/etc/ld.so.conf.d/*.conf中的配置文件。这些配置文件指向其他文件夹,其中将搜索库。例如,/etc/ld.so.conf.d/libc.conf的内容是/usr/local/lib这意味着系统将在/usr/local/lib内搜索库

如果由于某种原因用户对所指示的任何路径/etc/ld.so.conf/etc/ld.so.conf.d//etc/ld.so.conf.d/内的任何文件或/etc/ld.so.conf.d/*.conf内的任何文件夹具有写权限,他可能能够升级权限。 查看如何在以下页面利用此错误配置

ld.so privesc exploit example

RPATH

通过将lib复制到/var/tmp/flag15/中,程序将在此位置使用它,如RPATH变量中指定的那样。

然后在/var/tmp中使用gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6创建一个恶意库。

能力

Linux 能力为进程提供了一部分可用的 root 特权。这有效地将 root 特权分割为更小且独特的单元。然后可以独立地将这些单元授予进程。这样,特权的完整集合被减少,降低了利用风险。 阅读以下页面以了解更多关于能力以及如何滥用它们

Linux Capabilities

目录权限

在目录中,"执行" 位意味着受影响的用户可以进入文件夹。 "读取" 位意味着用户可以列出文件,而**"写入"** 位意味着用户可以删除创建新的文件

ACLs

访问控制列表(ACL)代表了可覆盖传统 ugo/rwx 权限的次级自由权限层。这些权限通过允许或拒绝对不是所有者或组成员的特定用户的权限,增强了对文件或目录访问的控制。这种粒度确保了更精确的访问管理。更多详细信息可以在这里找到。

授予用户"kali"对文件的读取和写入权限:

获取系统中具有特定ACL的文件:

打开shell会话

在旧版本中,您可能会劫持不同用户(root)的某些shell会话。 在最新版本中,您只能连接到自己用户的screen会话。但是,您可能会在会话中找到有趣的信息。

screen会话劫持

列出screen会话

附加到会话

To attach to a session, you can use tools like screen, tmux, or byobu. These tools allow you to connect to an existing terminal session, which can be useful for maintaining access to a target system even if the original SSH session is terminated.

tmux会话劫持

这是旧版tmux版本的一个问题。我无法劫持由root创建的tmux会话(v2.1)作为非特权用户。

列出tmux会话

附加到会话

查看HTB的情人节盒子作为一个例子。

SSH

Debian OpenSSL可预测PRNG - CVE-2008-0166

在基于Debian的系统(如Ubuntu,Kubuntu等)上生成的所有SSL和SSH密钥在2006年9月至2008年5月13日之间可能受到此漏洞的影响。 当在这些操作系统上创建新的ssh密钥时,会出现此漏洞,因为只有32,768种变化是可能的。这意味着所有可能性都可以被计算出来,拥有ssh公钥后,您可以搜索相应的私钥。您可以在这里找到计算出的可能性:https://github.com/g0tmi1k/debian-ssh

SSH有趣的配置值

  • PasswordAuthentication: 指定是否允许密码身份验证。默认值为 no

  • PubkeyAuthentication: 指定是否允许公钥身份验证。默认值为 yes

  • PermitEmptyPasswords: 当允许密码身份验证时,指定服务器是否允许登录到具有空密码字符串的帐户。默认值为 no

PermitRootLogin

指定是否允许root使用ssh登录,默认为 no。可能的值:

  • yes: root可以使用密码和私钥登录

  • without-passwordprohibit-password: root只能使用私钥登录

  • forced-commands-only: root只能使用私钥登录,如果指定了命令选项

  • no : 否

AuthorizedKeysFile

指定包含可用于用户身份验证的公钥的文件。它可以包含诸如%h这样的令牌,该令牌将被主目录替换。您可以指定绝对路径(从/开始)或相对于用户主目录的相对路径。例如:

那个配置将指示,如果您尝试使用用户“testusername”的私钥登录,ssh将会将您的密钥的公钥与位于/home/testusername/.ssh/authorized_keys/home/testusername/access中的公钥进行比较。

ForwardAgent/AllowAgentForwarding

SSH代理转发允许您使用本地SSH密钥,而不是让密钥(没有密码!)保留在服务器上。因此,您将能够通过ssh跳转到一个主机,然后从那里使用位于您初始主机上的密钥****跳转到另一个主机。

您需要在$HOME/.ssh.config中设置此选项,如下所示:

注意,如果Host*,每次用户跳转到另一台机器时,该主机将能够访问密钥(这是一个安全问题)。

文件/etc/ssh_config可以覆盖这个选项,允许或拒绝这个配置。 文件/etc/sshd_config可以允许拒绝ssh-agent转发,关键字是AllowAgentForwarding(默认是允许)。

如果发现在一个环境中配置了转发代理,请阅读以下页面,您可能可以利用它来提升权限

SSH Forward Agent exploitation

有趣的文件

配置文件

文件/etc/profile/etc/profile.d/目录下的文件是用户运行新shell时执行的脚本。因此,如果您可以编写或修改其中任何一个,您就可以提升权限

如果发现任何奇怪的配置文件,应检查其中是否包含敏感信息

Passwd/Shadow Files

根据操作系统的不同,/etc/passwd/etc/shadow 文件的名称可能不同,或者可能有备份文件。因此建议找到所有这些文件,并检查是否可以读取这些文件,以查看文件中是否包含哈希值

在某些情况下,您可以在 /etc/passwd(或等效文件)中找到密码哈希值

可写的 /etc/passwd

首先,使用以下命令之一生成密码。

然后添加用户 hacker 并添加生成的密码。

例如:hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash

您现在可以使用su命令与hacker:hacker一起使用

或者,您可以使用以下行添加一个没有密码的虚拟用户。 警告:这可能会降低机器当前的安全性。

注意:在BSD平台上,/etc/passwd 位于 /etc/pwd.db/etc/master.passwd/etc/shadow 被重命名为 /etc/spwd.db

你应该检查是否可以写入一些敏感文件。例如,你能写入一些服务配置文件吗?

例如,如果机器正在运行一个tomcat服务器,并且你可以修改位于 /etc/systemd/ 内的 Tomcat 服务配置文件,那么你可以修改以下行:

检查文件夹

以下文件夹可能包含备份或有趣的信息:/tmp/var/tmp/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root(可能无法读取最后一个,但尝试一下)

奇怪的位置/被拥有的文件

最近几分钟内修改的文件

Sqlite数据库文件

*_history, .sudo_as_admin_successful, profile, bashrc, httpd.conf, .plan, .htpasswd, .git-credentials, .rhosts, hosts.equiv, Dockerfile, docker-compose.yml 文件

隐藏文件

路径中的脚本/可执行文件

Web文件

备份

已知包含密码的文件

阅读 linPEAS 的代码,它搜索可能包含密码的多个文件。 另一个有趣的工具是:LaZagne,它是一个开源应用程序,用于检索存储在Windows、Linux和Mac本地计算机上的许多密码。

日志

如果你能读取日志,可能会发现其中包含有趣/机密信息。日志越奇怪,可能就越有趣。 此外,一些“不好的”配置(后门?)的审计日志可能允许你在审计日志中记录密码,如本文所述:https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/

为了读取日志组 adm 将非常有帮助。

Shell 文件

通用凭证搜索/正则表达式

您还应检查包含单词“password”在其名称或内容中的文件,并在日志中检查IP和电子邮件,或哈希正则表达式。 我不会在这里列出如何执行所有这些操作,但如果您感兴趣,可以查看linpeas执行的最后检查。

可写文件

Python库劫持

如果您知道一个Python脚本将从哪里执行,并且您可以在该文件夹中写入或者您可以修改Python库,您可以修改OS库并在其中设置后门(如果您可以在Python脚本将要执行的位置写入,请复制并粘贴os.py库)。

设置库后门,只需在os.py库的末尾添加以下行(更改IP和端口):

Logrotate利用

logrotate中的一个漏洞允许具有对日志文件或其父目录的写权限的用户可能获得提升的特权。这是因为logrotate通常以root身份运行,可以被操纵以执行任意文件,特别是在_/etc/bash_completion.d/_等目录中。重要的是要检查权限不仅在_var/log_中,还要在应用日志轮换的任何目录中。

此漏洞影响logrotate版本3.18.0及更旧版本

有关漏洞的更详细信息可以在此页面找到:https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition

您可以利用logrotten这个漏洞。

此漏洞与CVE-2016-1247 **(nginx日志)**非常相似,因此每当发现可以更改日志时,请检查谁正在管理这些日志,并检查是否可以通过符号链接替换日志以提升特权。

/etc/sysconfig/network-scripts/ (Centos/Redhat)

漏洞参考: https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f

如果出于任何原因,用户能够写入一个ifcf-<whatever>脚本到_/etc/sysconfig/network-scripts_ 可以调整现有脚本,那么您的系统已被入侵

网络脚本,例如_ifcg-eth0_用于网络连接。它们看起来像.INI文件。但是,在Linux上,它们是通过Network Manager(dispatcher.d)~源~的。

在我的情况下,这些网络脚本中的NAME=属性未被正确处理。如果名称中有空格,系统会尝试执行空格后面的部分。这意味着第一个空格后的所有内容都将以root身份执行

例如:/etc/sysconfig/network-scripts/ifcfg-1337

init、init.d、systemd 和 rc.d

目录 /etc/init.d 存放着 System V init(SysVinit)的脚本,这是经典的 Linux 服务管理系统。它包括用于 startstoprestart 以及有时 reload 服务的脚本。这些脚本可以直接执行,也可以通过在 /etc/rc?.d/ 中找到的符号链接执行。在 Redhat 系统中的另一条路径是 /etc/rc.d/init.d

另一方面,/etc/initUpstart 相关联,这是由 Ubuntu 引入的较新的服务管理,使用配置文件来执行服务管理任务。尽管过渡到 Upstart,由于 Upstart 中的兼容性层,SysVinit 脚本仍然与 Upstart 配置一起使用。

systemd 是一种现代化的初始化和服务管理器,提供高级功能,如按需启动守护进程、自动挂载管理和系统状态快照。它将文件组织到 /usr/lib/systemd/ 用于分发软件包,以及 /etc/systemd/system/ 用于管理员修改,简化了系统管理过程。

其他技巧

NFS 特权升级

NFS no_root_squash/no_all_squash misconfiguration PE

从受限制的 Shell 中逃逸

Escaping from Jails

Cisco - vmanage

Cisco - vmanage

内核安全保护

更多帮助

静态impacket二进制文件

Linux/Unix 特权升级工具

查找 Linux 本地特权升级向量的最佳工具: LinPEAS

LinEnum: https://github.com/rebootuser/LinEnum(-t 选项) Enumy: https://github.com/luke-goddard/enumy Unix Privesc Check: http://pentestmonkey.net/tools/audit/unix-privesc-check Linux Priv Checker: www.securitysift.com/download/linuxprivchecker.py BeeRoot: https://github.com/AlessandroZ/BeRoot/tree/master/Linux Kernelpop: 枚举 Linux 和 MAC 中的内核漏洞 https://github.com/spencerdodd/kernelpop Mestaploit: multi/recon/local_exploit_suggester Linux Exploit Suggester: https://github.com/mzet-/linux-exploit-suggester EvilAbigail (物理访问): https://github.com/GDSSecurity/EvilAbigail 更多脚本的汇编: https://github.com/1N3/PrivEsc

参考资料

从零开始学习 AWS 黑客技能,成为专家 htARTE(HackTricks AWS 红队专家)

支持 HackTricks 的其他方式:

最后更新于