前言
这次练习的靶机是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
。
域名解析的流程是:
- 首先浏览器会读取缓存中是否有指定域名对应的IP,如果有则解析结束。
- 如果缓存中没有读到指定域名,则在hosts文件中寻找有无指定的域名信息,如果有则解析结束。
- 如果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 指定密码字典文件
已经成功破解了 jerry
和 tom
的密码,分别为:adipiscing
,parturient
。接下来就登陆网站的后台。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发现其中没有 /
,所以就会顺利的执行。
同理我们也可以指定 ls
,whoami
等系统命令。当你执行 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/null
和 sudo -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域名解析全过程