前言

这次练习的靶机是vulnhub平台下的DC系列靶机第二台,下载地址为https://www.vulnhub.com/entry/dc-2,311/。该靶机的难度系数为简单,和DC1一样,总共有五个flag。这次虚拟机的配置采用更为简单的一种配置方法。

虚拟机配置

这次采用的网络连接模式依然是NAT模式,为了避免扫描到其他物理主机。在导入虚拟机后,右击DC-2靶机,然后选中配置。依次点击网络配置->NAT模式->高级->生成,然后确认即可。

在这里插入图片描述

收集信息

nmap -sn --min-parallelism 200 --min-hostgroup 256 192.168.119.0/24

-sn 代表存活主机扫描,不进行端口测探。

–min-parallelism 代表调整探测报文的并行度,也就是在扫描同一台主机时会发送很多个探测数据包,这个参数指定的数即nmap一次至少要发多少个数据包。

–min-hostgroup 代表调整并行扫描组的大小,也就是一次性同时对多少台主机进行扫描。

更详细内容可以参考:https://zhuanlan.zhihu.com/p/322244582,关于nmap的一些性能参数的学习。

在这里插入图片描述

通过nmap寻找到靶机的地址为192.168.119.127。下面就对靶机更加详细的扫描。

nmap -A -sV -p- --min-parallelism 200 192.168.119.127

-A 代表综合性扫描,能收集很多主要的信息

-sV 代表扫主要的服务信息

-p- 参数p是指定端口,后面的-代表所有端口。

在这里插入图片描述

扫描出了http服务与ssh服务,其中ssh服务的端口改成了7744

修改hosts文件

用浏览器打开网站,看看有什么web层面的漏洞没有。在浏览器地址栏输入 http://192.168.119.127

在这里插入图片描述

刚刚输入的是个IP,现在变成了域名,还有提示说不能建立到服务器dc-2的连接。这个应该在服务器上做了配置,将IP强制转换成域名,这种情况在实战中也会经常遇到,在一个服务器中有多个站点的情况下往往会禁止IP来访问服务器。这里无法访问网站的原因是DNS服务器无法解析这个域名,所以我们需要修改hosts文件内容,使域名dc-2对应IP 192.168.119.127

域名解析的流程是:

  1. 首先浏览器会读取缓存中是否有指定域名对应的IP,如果有则解析结束。
  2. 如果缓存中没有读到指定域名,则在hosts文件中寻找有无指定的域名信息,如果有则解析结束。
  3. 如果hosts中没有则访问DNS服务器,在DNS服务器中寻找域名对应的IP。

更详细的内容可以参考:https://blog.csdn.net/yanshuanche3765/article/details/82589210,详解DNS域名解析全过程

首先打开hosts文件:

vim /etc/hosts

然后写入:

192.168.119.127 dc-2

在这里插入图片描述

保存并退出,然后在器地址栏输入 http://dc-2即可打开网站了,注意是 http,不是 https

在这里插入图片描述

获取线索

点击导航栏上的flag即可获取到flag1,并且有提示说:平时常用的字典可能会不起作用,你须用到cewl。cewl是一款密码字典生成工具,它可以从指定的网站爬取到关键词来生成特定的密码字典。

在这里插入图片描述

下面我就就使用cewl爬取dc-2上的信息,生成一本密码字典。

cewl dc-2 -w wordlist.txt

在这里插入图片描述

生成字典成功,下面我们就获取该网站上的用户名。 通过网页底部的文字 Proudly powered by WordPress得知该网站是 WordPress搭建而成。有一款工具 wpscan是专门针对 WordPress的渗透工具,下面我们就用wpscan来获取该网站上的用户名信息。

 wpscan --url dc-2 -e u  

-e 代表枚举,也就是列出指定参数的一些信息,u代表用户名,这命令的意思就是枚举所有用户名。

在这里插入图片描述

wpsan一共获取了三个用户名,把这三个用户名写到文件user.txt中去,以准备暴力破解。

wpscan --url dc-2 -U user.txt -P wordlist.txt

-U 指定用户名文件

-P 指定密码字典文件

在这里插入图片描述

已经成功破解了 jerrytom的密码,分别为:adipiscingparturient。接下来就登陆网站的后台。WordPress的默认后台登陆页面为 /wp-login.php

登陆了tom没发现flag,最终在jerry的管理页面发现了flag2。

在这里插入图片描述

打开这个flag2的连接,看看里面说了什么。

在这里插入图片描述

提示的意思为:如果你不能利用WordPress走捷径,还有另一种方法,希望你发现另一个入口。利用WordPress走捷径的方法就是修改主题插件中的php文件,建立webshell,然后提权。这种方式在之前的靶机中有遇到过,这种方法可以参考我之前写的博文:https://blog.csdn.net/rpsate/article/details/119336355

这次我们就从另一条路径入手,另一条路径指定应该就是ssh了。

通过ssh连接靶机

用刚才获取的网站后台账号尝试登陆一下ssh,注意端口需要指定为7744(这个端口是前面用nmap扫描出来的)。

ssh tom@192.168.119.127 -p 7744

在这里插入图片描述

jerry这个账号没有登陆成功,经过尝试tom登陆成功了。登陆的目录下发现了flag3,但是cat命令用不了,经过测试可以使用vi读取该flag3。

在这里插入图片描述

绕过rbash

但是发现了tom使用的是rbash,也就是受限制的bash。rbash的功能非常少,所以我们要绕过rbash。这里绕过rbash有两种方法,下面分别介绍这两种方法的操作与原理。

利用vi绕过rbash
vi
:set shell=/bin/bash
:shell
export PATH=/bin:/usr/bin:$PATH

因为rbash中执行的命令不能带 /,所以不能直接执行 /bin/bash。刚好vi中有个命令shell可以调用bash,但是该系统中shell默认是指向rbash的,所以我们要通过set使其指向 /bin/bash,然后执行shell调用 /bin/bash,这样就绕过了rbash。

问:那如果vi不能用时,可不可以在rbash中用一个变量指向 /bin/bash,然后再执行这个变量呢?命令如下:
MY_SHELL=/bin/bash
$MY_SHELL

答:不可以,因为该命令还是通过rbash调用,即使是将 /藏在变量中,在执行的时候rbash还是会识别到 /。vi能绕过是因为执行 /bin/bash的是vi,而不是rbash。

问:命令export PATH=/bin:/usr/bin:$PATH的作用是什么

在调用bash后只能使用简单的内置命令,更多比较复杂的外部命令是在 /tmp/usr/tmp 这两个文件夹中的。指定 /tmp/usr/tmp 为环境变量后,bash就自动在这两个目录里中寻找外部命令,而不用将命令的绝对路径写出来。所以这条命令只是让你执行命令更方便一点,例如:我需要执行whoami命令,不设置环境变量需要输入 /usr/bin/whoami才能执行,设置环境变量后输入 whoami即可。

问:什么是内置命令,什么是外部命令?

内置命令是和bash是一体的,在系统启动是就调入内存。而外部命令是以单独的文件存储在指定的目录中,在需要执行外部命令时,bash会在环境变量的目录中去寻找,找到后调用这个文件。注意:有一些命令同时会是内置命令和外部命令,这种情况下内置命令只有有简单的功能,如果要用到更多参数执行更复杂的功能就要调用外部命令。可以用 type -a来查看是置命令还是外部命令。

更多详细内容可参考:https://blog.csdn.net/hidengxin/article/details/84708090,理解Linux内置命令与外部命令

问:外部命令通常存在哪些文件夹中,怎么分类存放的?

外部命令通常存放在 /sbin/bin/usr/bin/usr/sbin这几个目录中。其中/sbin存放的是超级用户指令,通常是系统管理必备的命令,通常只有root才能执行。/bin存放系统常用指令,一般用户也能执行。/usr/bin存放的是一些后期安装的运行脚本,/usr/sbin存放的是用户安装的一些系统管理命令。

更多详细内容可参考:https://blog.csdn.net/qq_28702545/article/details/52577796,/bin、/sbin、/usr/bin和/usr/sbin的简单区别

利用BASH_CMDS绕过rbash
BASH_CMDS[A]=/bin/bash
A
export PATH=/bin:/usr/bin:$PATH

我在网上看了很多经验贴都有提到这几条命令就可绕过rbash的限制,但是没有看到有那个贴讲了原理。于是我在国外某个网站上查到了以下内容:

在这里插入图片描述

在bash的内部有一个bash表,这个bash表中有 命令->命令文件路径这样的键值对。BASH_CMDS是bash的一个内置数组,该数组下标对应命令对应命令文件路径。当我们将/bin/bash赋值给BASH_CMDS[A]是,那么 A就是一条命令,执行A命令就等于执行了 /bin/bash。所以当你执行A命令是,rbash发现其中没有 /,所以就会顺利的执行。

同理我们也可以指定 lswhoami等系统命令。当你执行 BASH_CMDS[ls]=/usr/bin/whoami是,你再执行 ls,你会惊奇的发现命令行出现的是用户名,而不是陈列出目录。但是要注意的是BASH_CMDS只能改变外部命令的对应关系,对内置命令是无能为力的。

只使用rbash是用容易绕过的,如果与 chroot命令结合使用就会有比较强的限制作用,更多内容可以参考: https://blog.csdn.net/guodongsoft/article/details/52549573

提权

通过find命令寻找具有s权限的文件,没有找到。用 sudo -l查看可以用root权限执行的命令,发现sudo不能用。也根据flag3的提示转换到jerry用户试试,用之前在web中跑出来的密码尝试登陆该账号。

su jerry

很顺利的切换到了jerry账号,也发现了 /home/jerry目录下的flag4,提示git

在这里插入图片描述

还是尝试一下 find -perm -u=s -type f -exec ls -la {} \; 2>/dev/nullsudo -l,这两条命令在前面的靶机中几乎每次都用到,前面讲解得很详细,这里就不做解释了。

最终通过 sudo -l发现了可以用root权限执行git

在这里插入图片描述

那我们可是使用git提权,因为在git中可以执行shell命令。我们用root权限执行git,然后用git调用 /bin/bash即可获取一个拥有root权限的shell。

sudo git help config

这条命令是查看关于配置文件的帮助文档,在查看文档的时候可以执行shell命令,用法与vi,more,less等命令类似。

!/bin/bash

!表示调用bash来执行shell命令。

在这里插入图片描述

提权成功!获取最终flag。

cd /root
cat final-flag.txt

在这里插入图片描述

总结

该文章重点讲解了绕过rbash的方法与原理。

简述了dns的流程与hosts文件的作用。

了解的cewl与wpscan的基本用法。

大家可以自己尝试一下通过WordPress的后台直接获取webshell,方法可以参考我之前的文章:https://blog.csdn.net/rpsate/article/details/119336355

参考文献

[1] https://blog.csdn.net/hidengxin/article/details/84708090,理解Linux内置命令与外部命令

[2] https://blog.csdn.net/guodongsoft/article/details/52549573,chroot命令

[3] https://blog.csdn.net/qq_28702545/article/details/52577796,/bin、/sbin、/usr/bin和/usr/sbin的简单区别

[4] https://blog.csdn.net/weixin_44288604/article/details/108032112,vulnhub之DC2靶机

[5] https://www.gnu.org/software/bash/manual/html_node/Bash-Variables.html,Bash Variables

[6] https://blog.csdn.net/yanshuanche3765/article/details/82589210,详解DNS域名解析全过程

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐