译文 | 使用 Markdown RCE 服务器
2022-3-8 09:0:0 Author: mp.weixin.qq.com(查看原文) 阅读量:32 收藏

开卷有益 · 不求甚解


背景

Hashnode 是一个面向开发人员的博客平台,您可以在其中使用自定义域免费托管您的博客。这包含许多功能,其中一项功能是“批量 Markdown 导入器”。

当我将我的博客从 Jekyll 迁移到 Hashnode 时,我正在寻找一个导入功能。幸运的是,Hashnode 有一个 markdown 导入器,允许批量导入 markdown 帖子,但需要采用某种特定格式。出于某种原因,我在导入帖子时不断出错。我无法弄清楚,因为 UI 上没有描述性错误。然后我查看了我的 Burp 中的响应,就在那时我注意到了导致我写这篇博客的错误。

这受到本地文件包含漏洞 (LFI) 的影响,该漏洞允许我们从服务器获取内部文件。我的伙伴Adhyayan通过查找 Cloudflare 背后服务器的实际 IP 将其升级为 RCE 。

以下是我们如何升级易受攻击的 Markdown 解析器中的错误以在服务器上执行代码。

漏洞利用

寻找 LFI

Markdown 有自己的怪癖和功能,允许在文件中引用图像。要在博客文章或任何 MD 文件中包含图像,以下是常用语法:

![image.png](https://image.url/image_file.png)

Hashnode 的 Bulk Importer 接受一个包含所有要发布的 Markdown 帖子的 ZIP 文件。这是他们的示例帖子格式的外观:

---
title: "Why I use Hashnode"
date: "2020-02-20T22:37:25.509Z"
slug: "why-i-use-hashnode"
image: "Insert Image URL Here"
---

Lorem ipsum dolor sit amet

需要将此.md文件压缩到存档中才能上传到平台。这是响应在 Burp Suite 中的样子。

没什么有趣的。这只是一个正常的 Markdown 解析帖子格式。这让我们想知道 Markdown 功能允许用户通过指定路径来插入图像:

![anotherimage.png](/images/blog.jpg)

在 Burp Suite 中观察时,令人惊讶的是,Hashnode 触发了一个ENOENT错误,指出它无法找到该文件,如下面的屏幕截图所示。

从这里开始,只需连接点以从服务器获取内部文件。我们决定给出一个实际文件的位置,而不是一个不存在的路径,就像/etc/passwd希望它能在响应中给我们文件内容一样。

这是我们用作最终有效负载的 Markdown 文件:

---
title: "Why I use Hashnode"
date: "2020-02-20T22:37:25.509Z"
slug: "why-i-use-hashnode"
image: "Insert Image URL Here"
---

![notimage.png](../../../../../etc/passwd)

这一次,应用程序尝试使用路径中指定的位置来获取图像,而不是直接使用 Markdown 正文中显示的图像。应用程序遍历目录并passwd为我们获取文件,但它没有将内容显示在响应中,而是将文件上传到 Hashnode CDN。

contentMarkdown参数为 CDN URL 提供了上传内部文件的路径。我们能够直接下载包含/etc/passwd. 整洁的。

由于我们已经从passwd文件中获得了用户的名称和他们的主目录的路径,因此我们考虑将其升级为进一步尝试 RCE。

创建 SSH 密钥时,它会存储在~/.ssh/id_rsa私有密钥和~/.ssh/id_rsa.pub公共密钥的默认位置。我们相应地修改了我们的有效负载以从服务器获取私钥并且很幸运。它也被上传到 CDN。

![notimage.png](../../../../../home/username/.ssh/id_rsa)

现在,我们进入服务器所需要做的就是找到 IP 地址,因为它隐藏在 Cloudflare 后面。

服务器 IP 和 SSH

我们开始寻找历史 DNS 记录以找到 IP 地址,但没有成功。这就是Adhyayan进来的地方,我们查看了文件/proc/net/tcp。这些 /proc 接口提供有关当前活动 TCP 连接的信息。这是它在我的服务器上的外观:

kernel.org文档很好地解释了该表。

我们感兴趣的列是本地地址。这些地址存储为反向 IP 地址的十进制表示法的十六进制值。这是我在互联网上找到的一个漂亮的单行代码,可以完成所有工作并以人类可读的格式返回 IP。

grep -v "rem_address" /proc/net/tcp | awk  '{x=strtonum("0x"substr($2,index($2,":")-2,2)); for (i=5; i>0; i-=2) x = x"."strtonum("0x"substr($2,i,2))}{print x":"strtonum("0x"substr($2,index($2,":")+1,4))}'

这有效地为我们提供了我们正在寻找的东西 - 服务器的 IP 地址以及端口 22。它的外观如下:

结论

谁会想到 Markdown 解析器可以导致服务器上的命令执行?当与其他漏洞链接时,即使是最小的低严重性问题也可能升级。在这里,描述性堆栈跟踪中的一个简单信息泄露错误帮助我们找出了 markdown 解析器的行为,这反过来又允许我们从服务器获取内部文件。

在代码中实现正确的错误处理和输入验证并在后端记录描述性错误始终是一个好主意。Hashnode 团队修复了 Markdown 解析器中的漏洞,并轮换了他们所有的私钥以修复该错误。

相信用户的输入总是一个坏主意!

参考链接

Adhyayan Panwar 的推特:twitter.com/nullvoiddeath

Kernel.org文档:kernel.org/doc/Documentation/networking/pro..

用于阅读/proc/net/tcp:gist.github.com/staaldraad/4c4c80800ce15b6b..

译文申明

  • 文章来源为近期阅读文章,质量尚可的,大部分较新,但也可能有老文章。
  • 开卷有益,不求甚解,不需面面俱到,能学到一个小技巧就赚了。
  • 译文仅供参考,具体内容表达以及含义, 以原文为准 (译文来自自动翻译)
  • 如英文不错的,尽量阅读原文。(点击原文跳转)
  • 每日早读基本自动化发布(不定期删除),这是一项测试

最新动态: Follow Me

微信/微博:red4blue

公众号/知乎:blueteams



文章来源: http://mp.weixin.qq.com/s?__biz=MzU0MDcyMTMxOQ==&mid=2247485898&idx=2&sn=5ef74e65709c3ac87f7eb0c43842788a&chksm=fb35a002cc422914813464b9dde279394851417e329f930f6dd1344977a7e81e07ac740108f8#rd
如有侵权请联系:admin#unsafe.sh