介绍

在VMware中搭建环境,网络选择NAT或者桥接,确保攻击机和靶机在同一网络下即可,我这里选择的NAT。

靶机:192.168.254.130(DC-2

攻击机:192.168.254.128(Kali)

物理机:192.168.254.1(Windows10)

信息搜集

网络扫描

先扫描靶机IP及开启的服务

$ nmap -sn 192.168.254.1/24

进一步扫描靶机开启的服务

$ nmap -sV -p- 192.168.254.130

目标靶机80端口存在httpd服务,ssh服务的端口改到了7744。

查看网站相关信息

尝试打开站点,失败。

可以看到IP被成功解析成域名,但无法建立连接,由此可以得出是域名解析出了问题,域名没有被DNS服务器成功解析。

域名解析的流程是:

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

因此可以手动解析,在hosts文件中加入dc-2对应的IP地址。

$ vim /etc/hosts

再次刷新页面就可以正常打开了。

漏洞扫描

使用 cewl 爬取信息。

用 wpscan 来获取该网站上的用户名信息。

漏洞利用

成功登录后台!

flag

flag1

打开网站,在主页拿到flag1

Your usual wordlists probably won’t work, so instead, maybe you just need to be cewl.

More passwords is always better, but sometimes you just can’t win them all.

Log in as one to see the next flag.

If you can’t find it, log in as another.

提示使用cewl爬取信息。

flag2

$ cewl http://dc-2/ -m 3 -d 3 -e -v -w wppass.txt

-m 最小单词长度
-d:爬网深度
-e:收集包含email地址信息
-v:Verbose模式,该模式下,Cewl会导出目标网站的详细数据
-w:保存字典文件

生成字典成功,下面我们就获取该网站上的用户名。 通过网页底部的文字 Proudly powered by WordPress得知该网站是 WordPress搭建而成。

有一款工具 wpscan 是专门针对 WordPress的渗透工具,下面我们就用wpscan来获取该网站上的用户名信息。

$ wpscan --url dc-2 -e u -P wppass.txt

-e: 枚举 u表示枚举用户
-P: 爆破密码字典路径

得到两个账户

Username: jerry, Password: adipiscing
Username: tom, Password: parturient

使用jerry账户成功登录后台,拿到flag2

If you can’t exploit WordPress and take a shortcut, there is another way.

Hope you found another entry point.

翻译:如果你不能利用WordPress走捷径,还有另一种方法,希望你发现另一个入口

结合之前扫到的ssh服务,可以联想到尝试ssh登录getshell。

flag3

利用tom账户成功连接shell。

$ ssh tom@dc-2 -p 7744

在目录下发现flag4.txt,但是rbash没有读取文件的命令,经尝试可以使用vi编辑器打开。

Poor old Tom is always running after Jerry. Perhaps he should su for all the stress he causes.

翻译:可怜的老汤姆总是在追逐杰瑞。也许他应该为他造成的所有压力而起诉。

没啥用。。。

flag4

尝试登录另一个账户jerry,结果权限不够。

看来要从tom账户入手,提权。

第一步就是绕过rbash,因为 rbash 是受限制的 bash ,这个 shell 会在某些功能上受限制:

  • 不能使用cd命令(意味着不能更改目录)
  • 不能设置或取消环境变量:SHELL, PATH, ENV, BASH_ENV
  • 导入功能受限
  • 指定包含参数’/‘或’-‘的文件名(即命名中不能包含 ‘/ ‘ 或’-‘)
  • 不能使用使用 >,>|, <>, >&, &>, >> 等重定向操作符
  • 不能使用’set + r’或’set + o’关闭

因为rbash中执行的命令不能带 /,所以不能直接执行 /bin/bash。

  1. rbash逃逸-方法一

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

    进入vi,命令模式中输入:

    :set shell=/bin/bash
    :shell

    成功切换bash!

  2. 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只能改变外部命令的对应关系,对内置命令是无能为力的。

    输入以下命令:

    $ BASH_CMDS[a]=/bin/bash
    $ a

    成功切换bash!

但是,在调用bash后只能使用简单的内置命令,更多比较复杂的外部命令是在 /tmp和 /usr/tmp 这两个文件夹中的。

此时需要指定环境变量。

$ export PATH=/bin:/usr/bin:$PATH

指定 /tmp和 /usr/tmp 为环境变量后,bash就自动在这两个目录里中寻找外部命令,而不用将命令的绝对路径写出来。

例如:我需要执行whoami命令,不设置环境变量需要输入 /usr/bin/whoami才能执行,设置环境变量后输入 whoami即可。

所以这条命令只是让执行命令更方便一点。

成功切换jerry用户,在目录下发现flag4

Good to see that you’ve made it this far - but you’re not home yet.

You still need to get the final flag (the only flag that really counts!!!).

No hints here - you’re on your own now. :-)

Go on - git outta here!!!!

翻译:很高兴看到你已经做到了这一点 - 但你还不在home。您仍然需要获得最终标志(唯一真正重要的标志!!!)。 这里没有提示 - 你现在独自一人。 :-)继续 - git outta在这里!!!!

提示git

flag5

最后一步应该是提权到root了,先查看可以以root执行的命令。

$ find / -perm -u=s -type f 2>/dev/null

查看当前账户的权限。

$ sudo -l

可以看到当前用户(jerry)以 root 权限使用git时免密。

$ sudo git help config

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

!/bin/bash

成功切换到root用户!

在root目录下拿到最后的flag

总结

学到的知识

  1. 修改hosts文件。
  2. cewl 爬取应用所使用的单词列表。
  3. wpscan 扫描网站后台。
  4. rbash 逃逸
  5. linux 中的内置命令和外部命令
  6. git 提权。

参考

vulnhub DC2 靶场练习

VulnHub-DC-2靶场练习