一、前言:
今天是我们的第三个靶场实战,靶场的下载地址为:DC: 2 ~ VulnHub,废话不多说,现在就开始我们的靶场实战吧。
二、开始动手
老样子还是用我们的老工具nmap,输入以下命令
nmap -sn --min-parallelism 200 --min-hostgroup 256 192.168.79.0/24
-sn 代表存活主机扫描,不进行端口测探。
–min-parallelism 代表调整探测报文的并行度,也就是在扫描同一台主机时会发送很多个探测数据包,这个参数指定的数即nmap一次至少要发多少个数据包。
–min-hostgroup 代表调整并行扫描组的大小,也就是一次性同时对多少台主机进行扫描。
更详细内容可以参考:https://zhuanlan.zhihu.com/p/322244582,关于nmap的一些性能参数的学习。
可以知道我们这边的存活主机是192.168.79.144
此时继续用我们的nmap进行探测
输入以下命令
nmap -A -sV -p- --min-parallelism 200 192.168.119.127
-A 代表综合性扫描,能收集很多主要的信息
-sV 代表扫主要的服务信息
-p- 参数p是指定端口,后面的
-
代表所有端口。
可以知道开通了http服务,以及ssh服务,并且端口改成了7744
输入我们靶机对应的ip地址,看看页面能否给我们一些信息
此时页面提示无法访问,并且输入的ip地址转化成了域名,还有提示说不能建立到服务器dc-2的连接。这个应该在服务器上做了配置,将IP强制转换成域名,这种情况在实战中也会经常遇到,在一个服务器中有多个站点的情况下往往会禁止IP来访问服务器。这里无法访问网站的原因是DNS服务器无法解析这个域名,所以我们需要修改hosts文件内容,使域名dc-2对应IP 192.168.119.127
域名解析的流程是:
首先浏览器会读取缓存中是否有指定域名对应的IP,如果有则解析结束。
如果缓存中没有读到指定域名,则在hosts文件中寻找有无指定的域名信息,如果有则解析结束。
如果hosts中没有则访问DNS服务器,在DNS服务器中寻找域名对应的IP。
更详细的内容可以参考:https://blog.csdn.net/yanshuanche3765/article/details/82589210,详解DNS域名解析全过程
如果我们使用的是windows系统,在C:\Windows\System32\drivers\etc下,Linux的host文件就在/etc/hosts,打开hosts文件,把“目标网址 dc-2”加上就可以正常访问了,这里我使用的是windows系统
打开我们的hosts文件,写入以下命令
此时就将我们的域名与ip地址相对应起来了
继续输入我们我们的IP地址,就可以得到正确的页面信息
点开页面上的flag,此时的到如下信息
1.flag1
得到了我们的第一个flag,将下面英文进行翻译后的中文意思是:平时常用的字典可能会不起作用,你须用到cewl。cewl是一款密码字典生成工具,它可以从指定的网站爬取到关键词来生成特定的密码字典。
根据提示信息,我们输入以下命令来生成一本密码字典
cewl dc-2 -w wordlist.txt
此时得到了许多数据
生成字典成功,下面我们就获取该网站上的用户名。 通过网页底部的文字 Proudly powered by WordPress得知该网站是 WordPress搭建而成。有一款工具 wpscan是专门针对 WordPress的渗透工具,下面我们就用wpscan来获取该网站上的用户名信息。
输入以下命令
wpsan --url dc-2 -e u
-e 代表枚举,也就是列出指定参数的一些信息,u代表用户名,这命令的意思就是枚举所有用户名。
此时获取到了3个用户名,将这三个用户名写到user.txt中,用来进行暴力破解
在桌面上新建一个user.txt的文档,存入这三个名字
wpscan --url dc-2 -U user.txt -P wordlist.txt
-U 指定用户名文件
-P 指定密码字典文件
可以看出tom和jerry的成功了,此时我们接下来就登陆网站的后台。WordPress的默认后台登陆页面为
/wp-login.php
tom这里并没有找到些有用的东西,输入jerry用户
最终在jerry用户这里找到了我们所需的flag2,点开这个flag2看看里面说了什么
2.flag2
这里的中文意思是:如果你不能利用WordPress走捷径,还有另一种方法,希望你发现另一个入口
,我这里查了一下WordPress的捷径应该是修改主题插件中的php文件,建立webshell,然后提权,这个我不是特别懂,只能用第二个路口了,应该就是我们先前发现的ssh
此时尝试进行ssh登录,输入tom以及密码,此时成功进入
在这个目录下找到了flag3,但是cat命令用不了,并且发现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存放的是用户安装的一些系统管理命令。
更多详细内容可参考:/bin、/sbin、/usr/bin和/usr/sbin的简单区别_李过饰非的博客-CSDN博客,/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发现其中没有 /,所以就会顺利的执行。
同理我们也可以指定 ls,whoami等系统命令。当你执行 BASH_CMDS[ls]=/usr/bin/whoami是,你再执行 ls,你会惊奇的发现命令行出现的是用户名,而不是陈列出目录。但是要注意的是BASH_CMDS只能改变外部命令的对应关系,对内置命令是无能为力的。
3.flag3
此时输入我们的第二种方法,发现cat命令可以用了,并且也成功得到了flag3
提权
通过find命令寻找具有s权限的文件,没有找到。用 sudo -l
查看可以用root权限执行的命令,发现sudo
不能用。也根据flag3的提示转换到jerry
用户试试,用之前在web中跑出来的密码尝试登陆该账号。
输入以下命令
su jerry
此时我们成功切换到了jerry用户
4.flag4
很好,我们已经找到了我们的flag4
最后一步,我们就差flag5了,根据先前的经验还是用我们的suid进行提权,原理就不多阐述了,大家可以翻看我先前的博客
输入以下命令
find -perm -u=s -type f -exec ls -la {} \; 2>/dev/null
发现并没有可以提权的命令可以使用
尝试使用sudo -l
这边提示我们可以使用git进行一个提权,因为在git中可以执行shell命令。我们用root权限执行git,然后用git调用 /bin/bash
即可获取一个拥有root权限的shell。
sudo git help config
这条命令是查看关于配置文件的帮助文档,在查看文档的时候可以执行shell命令,用法与vi,more,less等命令类似
!/bin/bash
!表示调用bash来执行shell命令
终于提权成功了!!
获取我们最后一个flag
5.the-finalflag.txt
三、总结
哇,这个靶场相比与dc-1难度又高了很多,但是也学到了好多新知识,我们最重要的是在这个里面看看有没有一些新的收获,还要感谢我的小伙伴,阿波,真的大佬,加油网安人!!!