VulnHub | DC-2 入门靶机初探
环境
- VMware Workstation 15
- 靶机 DC-2
- 攻击机 Parrot
- 网段 192.168.136.0/24
信息收集
大佬一点开文章就看到本渣在用nmap
扫描局域网
sudo nmap -sS -Pn -A 192.168.136.0/24
好的,发现一个IP,根据nmap收集到以下信息
- 80端口
- Apache 2.4.10
- Debian 系统
访问Web
当打开192.168.136.132时,发现地址栏变成http://dc-2/,找不到IP
回过头看一下nmap反馈的信息,我遗漏了一个信息,就是当我们访问web时会重定向到http://dc-2
问题找到了,我们可以在修改/etc/hosts
,添加一行
192.168.136.132 dc-2
保存退出,重新访问一次即可
很明显,这是一个WordPress
搭建的博客,根据Wappalyzer
插件这插件我吹爆可以得出相关服务版本信息,并且发现了一个Flag页面,浏览一下
反手复制打开translate.google.com粘贴,
Flag1:
您惯用的字词列表可能无法使用,因此,也许您只需要cewl。
密码越多越好,但有时您根本无法赢得所有密码。
以一个身份登录以查看下一个标志。
如果找不到,请以其他身份登录。
提示可能需要爆破用户名和密码,好的,先使用WPScan
工具扫一下有没有其他可以利用的漏洞
WPScan是很多安全系统默认自带的一款漏洞扫描工具,它采用Ruby编写,能够扫描WordPress网站中的多种安全漏洞,其中包括主题漏洞、插件漏洞和WordPress本身的漏洞。最新版本WPScan的数据库中包含超过18000种插件漏洞和2600种主题漏洞,并且支持最新版本的WordPress。值得注意的是,它不仅能够扫描类似robots.txt这样的敏感文件,而且还能够检测当前已启用的插件和其他功能。
如果没有可到Github下载,安装过程不演示了
WPScan扫描
# 先来更新一下数据库
wpscan --update
# 因为我们已经在hosts文件添加了一条解析,所以我这里直接用dc-2 先不添加可选参数试试
wpscan --url dc-2
WPScan不添加可选参数默认会扫描了一些版本信息,插件,配置文件备份等等,这里扫描到了xml-rpc接口,该接口可以管理WordPress,比如发布文章等,也可以用来爆破用户密码,所以感觉没有特殊情况关闭为好
xml rpc是使用http协议做为传输协议的rpc机制,使用xml文本的方式传输命令和数据。
看一下WPScan常用的参数
- --url URL
-e, --enumerate [OPTS] 枚举
- vp 枚举有漏洞的插件
- ap 枚举所有插件
- p 枚举所有插件
- vt 枚举有漏洞的主题
- at 枚举所有主题
- t 枚举流行的主题
- tt 枚举缩略图
- cb 枚举备份配置文件
- dbe 导出数据库
- u 枚举用户
- m 枚举媒体
- -t, --max-threads VALUE 最大线程数,默认为5
-U, --usernames LIST 枚举用户
- --password-attack ATTACK 指定用户爆破密码
- -P, --passwords FILE_PATH 爆破密码,当没有指定用户时候,会默认使用
-e u
枚举出来的用户进行爆破
枚举WP用户
wpscan --url dc-2 -e u
很快枚举出了三个用户admin
、jerry
、tom
,接下根据Flag1提示进行爆破,但是我使用Github找到字典爆破了一个多小时都没爆出来,感觉方向错了,不妙,然后涉及知识盲区,无奈之下瞄了一眼WriteUp,发现Flag1中我又遗漏了一个重要信息,就是cewl
,这个cewl
翻译出来是鼠标,只怪自己知识面太窄了,不知道这玩意,然后根据writeup提示,这是一个字典生成工具,原来Flag1的提示叫我们用cewl
生成字典爆破,难怪他会说我们的字典需要足够强大
Cewl
此处关于Cewl
用法转载自Freebuf
Cewl是一款采用Ruby开发的应用程序,你可以给它的爬虫指定URL地址和爬取深度,还可以添额外的外部链接,接下来Cewl会给你返回一个字典文件,你可以把字典用到类似John the Ripper这样的密码破解工具中。除此之外,Cewl还提供了命令行工具。一般安全系统都会自带,例如Kali、Parrot
默认用法
以下命令爬虫会根据指定的URL和深度进行爬取,然后打印出可用于密码破解的字典
cewl http://dc-2
保存字典
cewl可将打印出来的字段存储为文件,使用-w
参数将密码字典存储为txt
文件
cewl http://dc-2 -w dict.txt
生成指定长度的字典
使用-m
参数设置长度,例如生成长度至少9位的密码
cewl http://dc-2 -m 9
从网站中获取Email
使用-e
选项来启用Email参数,并配合-n
选项来隐藏工具在爬取网站过程中生成的字典
cewl http://dc-2 -n -e
计算网站字典中重复的单词数量
计算目标网站中某个词重复出现的次数,使用-c
参数
cewl http://dc-2 -c
增加爬取深度
使用-d
参数指定爬取深度,默认深度为2
cewl http://dc-2 -d 3
生成包含数字和字符的字典
生成包含数字和字符的字典文件,可以使用--with-numbers
参数
cewl http://dc-2 --with-numbers
更多用法参考FreeBuf
爆破密码
好了,回到DC-2靶机,我使用了cewl
简单生成了一个名为dict.txt
字典文件,使用WPScan
爆破,设置50线程,跑快一点
wpscan --url dc-2 -e u -t 50 -P dict.txt
很快就跑出了两个用户的密码
jerry:adipiscing
tom:parturient
登录后台
既然已经拿到了两个用户的密码,就登录一下看看有没有可以GetShell的可能时长两年半的渗透实习生未曾Get过Shell,毕竟根据Flag1提示说登录以下找到下一个Flag,如果一个用户找不到就切换用户
首先登录一下jerry:adipiscing
,好的问题来了,登录地址搁哪呢?好吧,我们可以使用各种网站目录扫描工具扫描一下,尝试扫出登录地址,例如御剑、dirseach、dirmap等等,或者在网上查询一下WordPress的默认后台地址,这里使用各种目录扫描工具均能扫描出后台http://dc-2/wp-admin
运气很好,我在jerry
后台页面的Pages选项找到了Flag2页面
内容为
Flag 2:
If you can't exploit WordPress and take a shortcut, there is another way.
Hope you found another entry point.
随后我就尝试根据WordPress版本在网上找各种与该版本有关漏洞的信息,也上exploit-db.com寻找了一翻,大多都关于修改主题文件、添加主题等等操作进行写入WebShell,但是我验证了tom
账号,两个账号都是普通账号,没有这些权限,又找到了一篇关于媒体ID的SQL注入
漏洞,但我在上传的时候发现没有该目录写入权限,然后就陷入了沉思,我到底遗漏了哪里?再一次,我又无解了,再一次瞄了一下writeup,惊讶的发现还有一个ssh端口,我没扫出来,因为ssh更换了端口,而我一开始使用nmap
扫的时候是默认扫描Top1000。
然后我又使用nmap
扫了一遍
SSH端口
nmap -SS -Pn -A -p- 192.168.136.132
Not shown: 65533 closed ports
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.10 ((Debian))
|_http-generator: WordPress 4.7.10
|_http-server-header: Apache/2.4.10 (Debian)
|_http-title: DC-2 – Just another WordPress site
|_https-redirect: ERROR: Script execution failed (use -d to debug)
7744/tcp open ssh OpenSSH 6.7p1 Debian 5+deb8u7 (protocol 2.0)
| ssh-hostkey:
| 1024 52:51:7b:6e:70:a4:33:7a:d2:4b:e1:0b:5a:0f:9e:d7 (DSA)
| 2048 59:11:d8:af:38:51:8f:41:a7:44:b3:28:03:80:99:42 (RSA)
| 256 df:18:1d:74:26:ce:c1:4f:6f:2f:c1:26:54:31:51:91 (ECDSA)
|_ 256 d9:38:5f:99:7c:0d:64:7e:1d:46:f6:e9:7c:c6:37:17 (ED25519)
MAC Address: 00:0C:29:6A:EB:1F (VMware)
Device type: general purpose
Running: Linux 3.X|4.X
OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4
OS details: Linux 3.2 - 4.9
Network Distance: 1 hop
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
知道了SSH端口,尝试使用爆破出来的两个账号密码登录
登录SSH
尝试使用jerry
用户登录SSH,发现登录失败
# -p 指定端口
ssh jerry@dc-2 -p 7744
尝试使用tom
用户登录SSH,登录成功
ssh tom@dc-2 -p 7744
登录成功后,反手一个ls
看一下,发现一个flag3.txt
,赶紧cat
查看以下内容,但是报错了,说找不到cat
这个命令,顿时陷入沉思...
没办法,只怪自己知识储备不够,只能把报错丢上Google了,经查阅得知原来rbash
全称Restricted Shell
,是一个受限的shell
,也被称为“阉割”shell
,即是被管理员限制了用户的命令,管理员指定了你能使用什么命令就只能使用什么命令。与此相似的还有rsh
、rksh
、Python(lshell)
一旦使用了rbash
,它将有以下限制:
- 使用
cd
来改变路径 - 设置或取消SHELL,PATH,ENV或BASH_ENV变量的值
- 指定的命令里包好
/
- 指定包含
/
的文件名作为传递参数给内建命令的参数 - 指定包含斜杠(slash)的文件名作为-p选项的参数,传递给hash内建命令
- 启动时从shell环境中导入函数定义
- 启动时解释shell环境中SHELLOPTS的值
- 使用
>
,>|
,<>
,>&
,&>
,>>
等重定向操作符重定向输出 - 使用
exec
内建命令来意另一个命令替换shell - 使用
enable
内建命令的 -f 和 -d 选项来增加和内建命令 - 使用
enable
内建命令来允许和禁止shell内建命令 - 指定command内建命令的 -p 选项
- 使用
set +r
或set +o restricted
来关闭受限模式
知道这么一回事之后,让我们来康康我们能使用什么命令
先看一下当前的环境变量
echo $PATH
/home/tom/usr/bin
但是我们不能cd
切换目录,但是我们能使用ls
命令,使用ls
命令查看目录文件就行了
ls usr/bin
发现几个命令
欸,有less
和vi
,可以用这里个命令来编辑flag3.txt
可怜的老汤姆总是追随杰瑞. 也许他应该承受自己所造成的所有压力
嗯,这句话愣是没看懂,再使用ls
查看其他目录看看
经过一番ls
,在jerry
的家目录找到了flag4.txt
,使用less
看一下内容
很高兴看到您已经做到了这一点 , 但您还没回到家.
您仍然需要获得最终的Flag(唯一真正重要的Flag)
这里没有提示 您现在就一个人了
继续 git outta here !!
根据第四个flag知道还有一个flag,很明显就是root
权限了,估计在/root/
目录下,但是没有权限,只能提权了
但是只有限制的shell这几个命令不足以提权,所以首先需要绕过限制的shell才能进一步提权,那么如何绕过这种shell呢?又是一顿搜索,找到了不少文章,在FreeBuf找到一些关于man
, less
, vi/vim
等等一些命令的绕过方式,刚好这里可以使用vi
和less
,但是一顿尝试之后发现不行,在Google找到了一篇关于受限的shell和一些绕过的文章写的很好很全面,但是还是绕过不了。
绕过Restricted Shell
最后终于找到了绕过方式
BASH_CMDS[a]=/bin/sh;a # 把/bin/sh赋值给BASH_CMDS[a]变量
/bin/bash
echo $0 # 查看脚本本身的名字
echo $? # 命令执行结果反馈,0代表成功,其余表示失败
export PATH=$PATH:/bin/ # 将/bin作为PATH环境变量导出
export PATH=$PATH:/bin/bash # 将/bin/bash作为PATH环境变量导出
执行完上面命令(可以不执行之后就可以执行所有命令了echo
那两句)
提权
由于自己没接触过提权,根本不知道从何下手,只知道SUID提权,当时就使用find
命令查找有没有 S
标志位的可以利用的可执行文件
已知可用来提权的Linux可行文件:
nmap
vim
find
bash
more
less
nano
cp
查找系统上运行的所有SUID
可执行文件的命令
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -print 2>/dev/null
find / -user root -perm -4000 -exec ls -ldb {} \;
执行完三条查询都没找到一个可以利用的,再次陷入沉思..
然后想到了很牛*脏牛
提权,之前就想玩一下了,一直拖,趁现在赶紧试试
根据网上的教程试了一下,提权不了,这里就不详细写了,网上太多这样的文章了或者迟些写一篇简单复现使用 留个坑Dirty Cow
提权
无奈之下,又瞄了一眼writeup,原来flag4
已经提示是git
提权了,只是我自己一开始不懂什么意思罢了,好的,知道可以用git
进行提权,又来到了搜索引擎,搜到了提权方法
sudo git help config
!/bin/bash 或者 !'sh' 完成提权
sudo git -p help
!/bin/bash
当我兴致勃勃的敲上命令时,惊奇发现,tom
用户没有找到sudo
命令,我猜测可能是因为在绕过限制shell的时候导出的环境变量不完整还是咋的,回过头来看,在绕过shell,配置环境变量的时候,知道除了/bin/
和/bin/bash
,没有导出/bin/sh
,于是我导出一遍/bin/sh
export PATH=$PATH:/bin/sh
然后我再执行一遍sudo
,发现还是不行,然后我在执行su
,惊喜发现可以用,于是尝试切换到jerry
用户,密码用爆破出来的试试,成功登录上,但是之前使用ssh登录不上,可能是限制了jerry
用户使用ssh登录
在jerry
用户尝试使用sudo
命令,成功执行
于是就在jerry
用户尝试使用git
提权
成功提权,切换到/root
目录下
果不其然,真在里面
DC-2靶机到此完结
自我总结
这个总结是必须要写的,经过这次初探vulnhub入门级靶机,发现了自己很多的不足。第一,知识储备不足,整个流程几乎都是基于搜索引擎,还要瞄了几次writeup,真是太**了;第二,不够细心,急于求成,错过很多重要信息,错过了7744 SSH端口,不知道cewl
,没看懂flag4提示的git
提权,当中还有很多很多,深感自己不足,不过收获还是很大的,不得不说实战的确学到很多,很多东西必须是自己亲自动手去整、去试才是真正学到东西,看别人的writeup不动手去试,很快就会遗忘。
写得很棒,当中有不会的,就来看你的了(笑哭)。已经转了你其中的部分内容,有引用注明出处。
PS:笑哭这个好像不能当评论打进去,不然jquery会出错。
哈哈哈哈