如何通过红日靶场七实现从外网入口到AD接管的全链路攻击利用?
摘要:本文复盘了一次典型的多阶段内网靶场渗透过程。攻击起点是外网可访问的 Redis 2.8 未授权服务,利用其持久化落盘能力写入 SSH 公钥,直接获取 Ubuntu 跳板机 root 权限;随后通过内网信息搜集发现双网卡结构、Laravel
一、靶场相关信息
二、信息搜集
TCP 端口扫描 + 指纹识别 + 操作系统识别:
sudo rustscan -a 192.168.111.20 -r 1-65535 -- -sV -O -Pn -n -oA TCP_PORTS_NAMP
输出(仅列举部分):
PORT STATE SERVICE REASON VERSION
22/tcp open ssh syn-ack ttl 63 OpenSSH 7.6p1 Ubuntu 4ubuntu0.4 (Ubuntu Linux; protocol 2.0)
80/tcp open http syn-ack ttl 63 nginx 1.14.0 (Ubuntu)
81/tcp open http syn-ack ttl 63 nginx 1.14.0 (Ubuntu)
6379/tcp open redis syn-ack ttl 63 Redis key-value store 2.8.17
关机信息:
OS:Ubuntu
6379 端口:年代久远,默认配置下极大概率存在未授权访问
UDP 端口扫描 + 指纹识别:
sudo nmap -sV -sU --top-ports 20 192.168.111.20 -Pn -n -oA UDP_TOP20_PORTS
从扫描结果上看,端口状态要么是 closed 要么是 open|filtered,并没有提供很大价值的信息。
思路:先处理 TCP 端口,若 TCP 端口没有突破,则回到 UDP 端口,用特定的工具进行扫描。
综合上述信息,目前最优先考虑的就是 6379 端口,其次是 80 和 81 这两个 http 服务。
三、Redis 未授权访问
Redis 在 2.8 这样的老版本里:
默认监听地址是 0.0.0.0(对所有网络接口开放)
没有设置密码(requirepass 为空)
protected-mode 这个保护机制是 3.2 版本以后才引入的,2.8 完全没有这个功能。
靶场环境通常不会额外加固防火墙或配置
protected-mode 是 Redis 从 3.2 版本开始引入的一个默认安全保护机制。简单说,它的作用是:当 Redis 没有设置密码(requirepass 为空),也没有明确绑定只允许本地访问(bind 127.0.0.1)的时候,就自动把外部网络的连接全部拒绝,只允许本机(localhost)连进来。
尝试无密码登入:
redis-cli -h 192.168.111.20 -p 6379
登入成功:
简单做一下信息搜集,使用了下述命令:
ping:用于测试是否是真的连接上了
info:Redis 版本、OS、内存、已连接客户端数等信息
client list:所有已连接客户端的 IP 和端口
config get dbfilename:当前 RDB 文件名
config get dir:当前 RDB 持久化目录
关键信息:
redis_version:2.8.17
os:Linux 5.4.0-66-generic x86_64
dbfilename dump.rdb
dir /root
rdb_last_save_time:1775801194
rdb_last_bgsave_status:ok
RDB 的持久化目录被设置成 /root,并且根据 rdb_last_save_time 和 rdb_last_bgsave_status 可以推断出它不仅指定了该目录,还成功写进去了。
而我们知道,/root 目录的权限是 700,即只有 root 用户才有写权限。
因此,我们可以确认,当前的 Redis 是 root 权限下运行的。
根据之前端口扫描看到的 22 端口开放,于是通过 redis 写入 ssh 公钥 $\to$ ssh 连接就是目前的首要目标。
