HackTheBox - Medium - Linux - Format

Format

Format 是一种中等难度的 Linux 机器,它突出显示了由解决方案的结构方式引起的安全问题。立足点涉及PHP源代码审查,发现和利用本地文件读/写漏洞,并利用Nginx中的错误配置在Redis Unix套接字上执行命令。横向移动包括浏览 Redis 数据库以发现用户密码,而权限提升则围绕以 root 权限运行的 Python 脚本展开,该脚本容易受到代码注入的影响。


外部信息收集

端口扫描

循例nmap

file

Web枚举

80端口 - app.microblog.htb

file

3000端口 - microblog.htb

file

Foldhold

和我预想的一样,gitea包含了app子域的源码,毕竟遇到这种情况的次数也不少了

file

我们首先在app子域创建一个账号并登录

file

这里有一个最显眼的功能也是唯一一个功能就是创建新博客,我们可以指定子域域名,我们在源码里面定位到那个功能的代码

一开始我把目光放到了addsite函数上

addSite($_POST['new-blog-name']);function addSite($site_name) {if(isset($_SESSION['username'])) {...$tmp_dir = "/tmp/" . generateRandomString(7);system("mkdir -m 0700 " . $tmp_dir);system("cp -r /var/www/microblog-template/* " . $tmp_dir);system("chmod 500 " . $tmp_dir);system("chmod +w /var/www/microblog");system("cp -rp " . $tmp_dir . " /var/www/microblog/" . $site_name);...

我们应该可以尝试控制$_POST[‘new-blog-name’]来尝试执行系统命令,但是我发现后端对new-blog-name进行了严格的过滤,只允许26个字母,所以使我打消了这个念头

if (isset($_SESSION['username']) && isset($_POST['new-blog-name'])) {if(!preg_match('/^[a-z]+$/', $_POST['new-blog-name']) || strlen($_POST['new-blog-name']) > 50) {print_r("Invalid blog name");

我创建了一个test子域

在gitea中我看到一个sunny子域,我猜那个应该是由app子域创建的,所以我刚刚创建的test子域应该与sunny子域有同样的代码结构

file

在edit/index.php中,我发现了任意文件读写

//add header
if (isset($_POST['header']) && isset($_POST['id'])) {chdir(getcwd() . "/../content");$html = "<div class = \"blog-h1 blue-fill\"><b>{$_POST['header']}</b></div>";$post_file = fopen("{$_POST['id']}", "w");fwrite($post_file, $html);fclose($post_file);$order_file = fopen("order.txt", "a");fwrite($order_file, $_POST['id'] . "\n");  fclose($order_file);header("Location: /edit?message=Section added!&status=success");
}//add text
if (isset($_POST['txt']) && isset($_POST['id'])) {chdir(getcwd() . "/../content");$txt_nl = nl2br($_POST['txt']);$html = "<div class = \"blog-text\">{$txt_nl}</div>";$post_file = fopen("{$_POST['id']}", "w");fwrite($post_file, $html);fclose($post_file);$order_file = fopen("order.txt", "a");fwrite($order_file, $_POST['id'] . "\n");  fclose($order_file);header("Location: /edit?message=Section added!&status=success");
}

尝试读取passwd

file

我尝试着在web目录下写入webshell,但很不幸的是应该是没有权限和解析php

Nginx配置错误

读/etc/nginx/sites-available/default

...
location ~ /static/(.*)/(.*) {resolver 127.0.0.1;proxy_pass http://$1.microbucket.htb/$2;
...

这篇文章讲述了nginx的proxy_pass支持将请求代理到本地unix套接字

现在我们可以控制$1,我们看到register.php设置的字段

file

通过nginx的proxy_pass来对redis进行操作

将自己的账户的pro字段设置为true

file

刷新一下

file

function provisionProUser() {if(isPro() === "true") {$blogName = trim(urldecode(getBlogName()));system("chmod +w /var/www/microblog/" . $blogName);system("chmod +w /var/www/microblog/" . $blogName . "/edit");system("cp /var/www/pro-files/bulletproof.php /var/www/microblog/" . $blogName . "/edit/");system("mkdir /var/www/microblog/" . $blogName . "/uploads && chmod 700 /var/www/microblog/" . $blogName . "/uploads");system("chmod -w /var/www/microblog/" . $blogName . "/edit && chmod -w /var/www/microblog/" . $blogName);}return;
}

现在我们是pro,上面这些命令会使我们能够对uploads/目录写入文件,借此来getshell

file

然后通过rce来使用祖传python3 payload

file

本地横向移动 -> cooper

在redis发现了一个系统用户名的key

file

读一下发现了他的密码

hgetall cooper.dooper

file

直接登ssh

file

本地权限提升

sudo -l

file

这是一个python脚本

我们主要关注脆弱点

    username = r.hget(args.provision, "username").decode()firstlast = r.hget(args.provision, "first-name").decode() + r.hget(args.provision, "last-name").decode()license_key = (prefix + username + "{license.license}" + firstlast).format(license=l)

这里的license_key由几个变量拼接进来然后format,应该存在模板注入,而username这些都是在redis读取的,我们可以控制redis来触发模板注入

secret = [line.strip() for line in open("/root/license/secret")][0]
secret_encoded = secret.encode()
salt = b'microblogsalt123'
kdf = PBKDF2HMAC(algorithm=hashes.SHA256(),length=32,salt=salt,iterations=100000,backend=default_backend())

通过模板注入来获取secret,设置username

file

再次运行

file

root flag还在老地方

file

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/296371.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

饥荒Mod 开发(二一):超大便携背包,超大物品栏,永久保鲜

饥荒Mod 开发(二十)&#xff1a;显示打怪伤害值 源码 游戏中的物品栏容量实在太小了&#xff0c;虽然可以放在箱子里面但是真的很不方便&#xff0c;外出一趟不容易看到东西都不能捡。实在是虐心。 游戏中的食物还有变质机制&#xff0c;时间长了就不能吃了&#xff0c;玩这个游…

L1-060:心理阴影面积

题目描述 这是一幅心理阴影面积图。我们都以为自己可以匀速前进&#xff08;图中蓝色直线&#xff09;&#xff0c;而拖延症晚期的我们往往执行的是最后时刻的疯狂赶工&#xff08;图中的红色折线&#xff09;。由红、蓝线围出的面积&#xff0c;就是我们在做作业时的心理阴影面…

基于 Editor.js 开发富文本编辑器库

开始 Editor.js 提供了简单而直观的用户界面&#xff0c;根据需求可以灵活添加自定义的编辑工具&#xff0c;通过插件扩展功能 Editorjs 使用 js 开发&#xff0c;脱离框架依赖&#xff0c;因此可以基于它封装富文本编辑器&#xff0c;用于 Vue 和 React 项目 editor-js-com…

计算机网络复习-OSI TCP/IP 物理层

我膨胀了&#xff0c;挂我啊~ 作者简介&#xff1a; 每年都吐槽吉师网安奇怪的课程安排、全校正经学网络安全不超20人情景以及割韭菜企业合作的FW&#xff0c;今年是第一年。。 TCP/IP模型 先做两道题&#xff1a; TCP/IP协议模型由高层到低层分为哪几层&#xff1a; 这题…

【数据库系统概论】第2章-关系数据库

复习记录 2.1 关系数据结构及形式化定义2.1.1 关系2.1.2 关系模式2.1.3 关系数据库 2.2 关系操作2.3 关系的完整性2.4 关系代数题目 2.1 关系数据结构及形式化定义 2.1.1 关系 一些概念 关系 R ( D 1 , D 2 , . . . , D n ) R(D_1,D_2,...,D_n) R(D1​,D2​,...,Dn​) D i…

深度学习入门(python)考试速成均方误差

均方误差 表示神经网络的输出&#xff0c;表示监督数据&#xff0c;表示数据的维度。 这里神经网络的输出y是softmax函数的输出 数组元素的索引从第一个开始依次对应数组“0”&#xff0c;“1”&#xff0c;“2”&#xff0c;...... 由于softmax函数的输出可理解为概率 由此…

css radial-gradient 径向渐变基本语法与使用

在之前的文章《深入理解Css linear-gradient线性渐变》我们了解了CSS中的线性渐变&#xff0c;本文将介绍CSS中的另一种渐变———径向渐变&#xff08;Radial Gradient&#xff09;&#xff1a; CSS中的径向渐变&#xff08;Radial Gradient&#xff09;允许你创建从一个颜色…

【计数DP】牛客小白月赛19

登录—专业IT笔试面试备考平台_牛客网 题意 思路 首先做法一定是计数 dp 然后状态设计&#xff0c;先设 dp[i] 然后看影响决策的因素&#xff1a;两边的火焰情况&#xff0c;那就 dp[i][0/1][0/1]表示 前 i 个&#xff0c;该位有无火焰&#xff0c;该位右边有无火焰的方案数…

redis基本用法学习(C#调用CSRedisCore操作redis)

除了NRedisStack包&#xff0c;csredis也是常用的redis操作模块&#xff08;从EasyCaching提供的常用redis操作包来看&#xff0c;CSRedis、freeredis、StackExchange.Redis应该都属于常用redis操作模块&#xff09;&#xff0c;本文学习使用C#调用CSRedis包操作redis的基本方式…

ElasticSearch入门介绍和实战

目录 1.ElasticSearch简介 1.1 ElasticSearch&#xff08;简称ES&#xff09; 1.2 ElasticSearch与Lucene的关系 1.3 哪些公司在使用Elasticsearch 1.4 ES vs Solr比较 1.4.1 ES vs Solr 检索速度 2. Lucene全文检索框架 2.1 什么是全文检索 2.2 分词原理之倒排索引…

MySQL 数据库系列课程 05:MySQL命令行工具的配置

一、Windows启动命令行工具 &#xff08;1&#xff09;打开 Windows 的开始菜单&#xff0c;找到安装好的 MySQL&#xff0c;点击MySQL 8.0 Command Line Client - Unicode&#xff0c;这个带有 Unicode 的&#xff0c;是支持中文的&#xff0c;允许在命令行中敲中文。 &…

【数据结构入门精讲 | 第十一篇】一文讲清树

在上一篇中我们进行了排序算法的专项练习&#xff0c;现在让我们开始树的知识点讲解。 目录 树二叉搜索树二叉排序树哈夫曼树折半查找判定树kruskal算法、prim算法、最小生成树完全二叉树 树 树是一种非线性的数据结构&#xff0c;也是一种表示一对多关系的数据结构&#xff0…