vulnhub-DC1渗透测试


vulnhub靶场


DC-1


  • ps:经学长的介绍找到了这个求之不得的“梦中情场”,以开始渗透测试的学习之旅

配置靶机就不在这里展示了


flag1:


搭好的靶机开始是这样的,就是在这个登入界面:

开启kali用ifconfig查看本机ip:

namp常用命令:


nmap [目标IP]
这个命令会扫描目标IP地址,返回该地址上开放的所有端口以及对应的服务。
2. nmap -sS [目标IP]

使用TCP SYN扫描目标IP地址。这是一种半开扫描,不会完成TCP三次握手,因此相对较快且不易被目标主机发现。
3. nmap -sT [目标IP]

使用TCP connect()扫描目标IP地址。这是全连接扫描,完成了TCP三次握手,相对容易被目标主机发现。
4. nmap -sU [目标IP]

使用UDP扫描目标IP地址。用于确定目标主机的UDP端口状况。
5. nmap -O [目标IP]

进行操作系统指纹识别。nmap会尝试识别目标主机的操作系统类型和版本。
6. nmap -sV [目标IP]

进行服务版本检测。nmap会尝试确定目标主机上运行的服务的版本信息。
7. nmap -p [端口号] [目标IP]

扫描指定端口。可以一次扫描多个端口,例如“nmap -p 21,22,23,80 [目标IP]”。
8. nmap -sn [目标IP]/[子网掩码]

只进行主机发现,不进行端口扫描。用于确定网络中有哪些主机在线。
9. nmap --traceroute [目标IP]

追踪到目标IP的路由。会显示数据包从发送端到目标端经过的路由节点。
10. nmap -A [目标IP]

使用这个命令,nmap会执行操作系统检测、版本检测、脚本扫描和跟踪路由等功能。它提供了关于目标主机的详细信息,包括了开放的端口、服务、操作系统等。

11.nmap -sP [网段]

是一个用来判断目标主机是否存活的命令。这个命令会发送ICMP echo请求到目标IP地址,以确定该主机是否在线。如果主机响应了这个请求,那么就可以认为它是存活的。

用nmap命令进行探测网段192.168.201.0/24

本来是要检查每一个ip的,但这里偷个懒,可以通过比对DC1靶机的MAC地址来确定DC1靶机的ip地址,查看如下:

确认是192.168.201.152
接着用nmap -A 192.168.201.152查看靶机开放的端口号

先尝试查看80端口界面:(80端口默认是http协议)访问192.168.201.152和192.168.201.152:80是一样的

通过Wappalyzer插件发现是个Drupal cms管理系统

msfconsole工具


  • Metasploit Framework(MSF)是一款开源安全漏洞检测工具,附带数千个已知的软件漏洞,并保持持续更新。Metasploit可以用来信息收集、漏洞探测、漏洞利用等渗透测试的全流程,被安全社区冠以“可以黑掉整个宇宙”之名。刚开始的Metasploit是采用Perl语言编写的,但是再后来的新版中,改成了用Ruby语言编写的了。在kali中,自带了Metasploit工具。

开启msfconsole:

-p, –payload < payload> 指定需要使用的payload(攻击荷载)。也可以使用自定义payload,几乎是支持全平台的

-l, –list [module_type] 列出指定模块的所有可用资源. 模块类型包括: payloads, encoders, nops, all

-n, –nopsled < length> 为payload预先指定一个NOP滑动长度

-f, –format < format> 指定输出格式 (使用 –help-formats 来获取msf支持的输出格式列表)

-e, –encoder [encoder] 指定需要使用的encoder(编码器),指定需要使用的编码,如果既没用-e选项也没用-b选项,则输出raw payload

-a, –arch < architecture> 指定payload的目标架构,例如x86 | x64 | x86_64

–platform < platform> 指定payload的目标平台

-s, –space < length> 设定有效攻击荷载的最大长度,就是文件大小

-b, –bad-chars < list> 设定规避字符集,指定需要过滤的坏字符例如:不使用 '\x0f'、'\x00';

-i, –iterations < count> 指定payload的编码次数

-c, –add-code < path> 指定一个附加的win32 shellcode文件

-x, –template < path> 指定一个自定义的可执行文件作为模板,并将payload嵌入其中

-k, –keep 保护模板程序的动作,注入的payload作为一个新的进程运行

–payload-options 列举payload的标准选项

-o, –out < path> 指定创建好的payload的存放位置

-v, –var-name < name> 指定一个自定义的变量,以确定输出格式

–shellest 最小化生成payload

-h, –help 查看帮助选项

–help-formats 查看msf支持的输出格式列表

查找Drupal框架的漏洞payload

这里跟着教程选择了drupal_drupalgeddon2这个漏洞,可以看到它的rank是优秀,选择它并且show出它的设置选项:

这里我们只需设置好rhost(靶机ip)就行:

接着run运行脚本,进入shell模式,第一次我们输入whoami测试一下,发现我们已经拿到了靶机的低级用户,在其终端输入python -c ‘import pty;pty.spawn(“/bin/sh”)’这是固定格式,开启交互模式

-c 						选项允许你直接在命令行中传递Python代码并执行。
import pty 				导入了Python的pty模块,这个模块伪终端处理。
pty.spawn("/bin/sh") 	使用pty模块的spawn函数启动了一个新的/bin/sh进程。
						这段代码通常在想要开启一个更交互式的shell时使用


ls列出当前目录,成功拿到第一个flag1.txt文件,并获得内容提示每个好的CMS都需要一个配置文件:

flag2:


去网上搜索Drupal的配置文件在哪个目录:Drupal的配置文件名为settings.php,它位于sites/default目录下。使用more命令进行读取,可以获得它的数据库信息:包括数据库的用户以及它的密码

flag3:


第一种做法:


mysql的常用命令:


连接和断开数据库连接:

mysql -u username -p:使用指定用户名连接到MySQL数据库,并提示输入密码。
exit或quit:断开与MySQL数据库的连接。
数据库操作:

SHOW DATABASES;:显示所有可用的数据库。
USE database_name;:选择要使用的数据库。
CREATE DATABASE database_name;:创建一个新的数据库。
DROP DATABASE database_name;:删除一个数据库。
表操作:

SHOW TABLES;:显示当前数据库中的所有表。
DESCRIBE table_name;或SHOW COLUMNS FROM table_name;:显示表的列信息。
CREATE TABLE table_name (column1 datatype, column2 datatype, ...);:创建一个新表。
DROP TABLE table_name;:删除一个表。
ALTER TABLE table_name ADD column_name datatype;:向表中添加列。
ALTER TABLE table_name DROP COLUMN column_name;:从表中删除列。
数据操作:

SELECT * FROM table_name;:查询表中的所有数据。
INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...);:向表中插入数据。
UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE condition;:更新表中的数据。
DELETE FROM table_name WHERE condition;:删除表中的数据。
用户权限管理:

GRANT privileges ON database_name.table_name TO 'username'@'localhost';:授予用户对数据库或表的权限。
REVOKE privileges ON database_name.table_name FROM 'username'@'localhost';:撤销用户对数据库或表的权限。
FLUSH PRIVILEGES;:刷新权限使更改生效。

通过这个我们可以登入靶机的MySQL数据库:

输入show database获取库名:

切换库获取表信息,发现flag3的线索:

UID权限是指用户标识符(UID)在系统中对应的权限。每个用户都有一个唯一的UID,它确定了用户在系统中的身份和访问权限。
对于Drupal来说,UID为1的用户通常是不受Drupal权限管制的,具有最高权限。这是因为UID为1的用户通常是系统管理员,需要拥有对系统的完全控制权,以便进行管理和维护工作。Drupal对数据库有加密方法加密脚本位于网站目录下的scripts,使用加密脚本进行加密新的密码123456,生成加密密文


再次进入数据库将管理员密码进行更新,换成我们的123456的加密密文

查询数据库,可以发现已经修改成功了:

然后在网页登入admin 123456即可,且在content中发现了flag3的信息:

第二种做法:


先查看靶机的版本:cat includes/bootstrap.inclgrep VERSION

看到网站有登入框,继续去搜索相关脚本:searchsploit Drupal

"searchsploit Drupal":这个命令是用于搜索与Drupal相关的漏洞信息。它会在MSFConsole的漏洞数据库(如SearchSploit)中查找与Drupal有关的漏洞条目,以便安全研究人员或渗透测试人员了解和使用这些漏洞。这个命令的目的是帮助用户发现和利用Drupal的潜在安全漏洞。
"search Drupal":这个命令是在MSFConsole中搜索包含"Drupal"关键字的条目。它可以搜索与Drupal相关的模块、插件、攻击向量、漏洞利用代码等。这个命令的目的是帮助用户找到与Drupal相关的各种信息和工具,不仅仅局限于漏洞信息。


通过运行可以添加admin账户,但记住要用python2来运行要不然会报以下错误,本来python应该是可以的,我好像改过配置将python指向了python3:

正确图解:

在登入框中输入依然可以得到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.

flag4:


根据以上提示在passwd中,联想到了/etc/passwd目录

  • /etc/passwd文件存储了系统中所有用户的基本信息。这些信息包括用户名、用户ID(UID)、组ID(GID)、用户全名或描述、用户主目录和默认使用的Shell等。请注意,虽然该文件曾经用于存储加密密码,但现代系统通常将加密密码存储在/etc/shadow文件中,而/etc/passwd文件中的密码字段现在通常用x或其他占位符代替。


看到了flag4的信息,以及它的目录:

找到了flag4.txt:

theFinalflag:


suid提权


flag4提示说flag5在root里,想要进入root文件夹就得有root权限,最终目的就是提权,这里学习一个提权方式:suid提权

  • SUID是Linux的一种权限机制,具有这种权限的文件会在其执行时,使调用者暂时获得该文件拥有者的权限。如果拥有SUID权限,那么就可以利用系统中的二进制文件和工具来进行root提权。

已知的可用来提权的linux可行性的文件列表如下:

  • Nmap
  • Vim
  • find
  • Bash
  • More
  • Less
  • Nano
  • cp
find / -user root -perm -4000 -print 2>/dev/null
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -exec ls -ldb {} \;

对第一条命令解释:

  • find / :从根目录开始搜索。
  • -perm -u=s:查找所有设置了SUID位的文件。这里的-u=s表示查找所有用户位(user bit)设置为s(setuid)的文件。
  • -type f:仅搜索文件,不包括目录。
  • 2>/dev/null:将错误消息重定向到/dev/null,即忽略错误消息。这里的2>表示标准错误输出。

因此,find / -perm -u=s -type f 2>/dev/null 这个命令会查找整个文件系统,寻找所有具有SUID权限的文件,并忽略所有的错误消息,例如“权限拒绝”等。最终,命令将返回系统中所有具有SUID权限的文件的列表。

即find命令有suid权限,使用find命令就相当于root权限在执行find命令
find ./ aaa -exec '/bin/sh' \;
解释:

  • find ./:从当前目录开始进行查找。
  • aaa:查找名为”aaa”的文件或目录。
  • -exec ‘/bin/sh’ ;:对每一个找到的文件或目录执行/bin/sh命令。

这个命令会遍历指定目录下的所有文件。如果找不到名为aaa的文件,它仍会继续遍历其它文件。而且,由于命令中使用了-exec ‘/bin/sh’ ;,每一个遍历到的文件都会被当作参数传递给/bin/sh尝试执行,所以基本所有文件都被赋予了/bin/sh如果有system文件,就相当于执行了比如system(“/bin/sh”)提升了root权限这并不是由find命令和/bin/sh直接造成的,而是由于恶意代码的存在和SUID权限的滥用导致的


进入root文件,拿到flag:


文章作者: 矢坕
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 矢坕 !
  目录