渗透基础-rcube_webmail版本探测
简介
本文介绍了开源产品RoundCube webmail邮件系统的版本探测思路,并用go语言实现工具化、自动化探测。
正文
0x01 探测思路研究
探测系统版本,最理想的方法就是系统主页html代码中有特定的字符串,比如特定版本对应的hash在主页的html代码中等等。
对于rcube mail,我们先查看它的主页html代码

稍作分析,发现上面html正文中,?s后面的字符串可能符合要求
?s=1716107237
这里有个验证的小技巧,可以用 1716107237 作为fofa的语句搜索(body="1716107237"),看是否有足够多的资产的html代码中都有这串字符串,如果结果足够多,那很可能就可以依次判断。不过也只是可能,具体是否可以以此为依据还得从代码中看 1716107237 是如何生成的
比如下图,资产足够多,起码能排除是随机生成的可能

0x02 探测思路判断
由于rcube mail是个开源软件。我们即可直接从源代码中分析 ?s= 后的值是如何得到的
全局搜索 ?s= 后,很快定位到下面的函数

\rcmail_output_html::file_mod
参考代码可知,?s=1716107237 -> filemtime()函数(如下图) -> 这串数字即是文件的最后修改时间。

理论上静态文件可能修改较少无法作为判断的依据,因为修改可能较少
实际测试发现rcube mail每个版本的文件最后修改时间都不同。可能是使用了Jenkins这种构建工具,每次重新生成代码导致每个发布版本的文件都会新建,导致即使文件内容不变动,文件的最后修改时间还是会变。
我们即可依据此作为判断
0x03 实现细节
依据上面的思路,我们要实现版本检测,大致步骤如下
- 下载全部版本的rcubemail
- 计算 jquery.min.js 或其他静态资源文件的最后修改时间
- 建立rcube mail版本和文件最后修改时间的映射
- go语言实现发送请求从目标html代码中取得
?s=后的字符串,以此判断
实现过程中下载全部版本的rcubemail较为麻烦,截至文章发布日最新版本是 v1.6.9,大致估略版本不少于70个,
肯定不能手动下载。
解决办法:
这里用了github的REST api,从下面api地址获取rcubemail的全部版本
https://api.github.com/repos/roundcube/roundcubemail/releases
解析api返回的json数据,提取对应版本压缩包地址然后下载即可,关键代码如下
// github releases API URLurl := "https://api.github.com/repos/roundcube/roundcubemail/releases"if SocksProxy != "" {CustomhttpClient = httputils.NewHttpClient(httputils.WithSocks5Proxy(SocksProxy),)} else {CustomhttpClient = httputils.NewHttpClient()}JsonResp, err := httputils.HttpWithSocks(url, CustomhttpClient)if err != nil {fmt.Println("Error making request:", err)return}defer JsonResp.Body.Close()body, err := io.ReadAll(JsonResp.Body)if err != nil {fmt.Println("Error reading response body:", err)return}var releases []struct {Assets []Asset `json:"assets"`}if err := json.Unmarshal(body, &releases); err != nil {fmt.Println("Error parsing JSON:", err)return}gologger.Info().Msgf("Matching download URLs:")var wg sync.WaitGroupfor _, release := range releases {for _, asset := range release.Assets {if !strings.Contains(asset.BrowserDownloadURL, "asc") && !strings.Contains(asset.BrowserDownloadURL, "framework") {wg.Add(1)go func(urlDownload, filename string) {defer wg.Done()fmt.Printf("Downloading %s...\n", filename)if err := downloadFile(filename, urlDownload); err != nil {fmt.Printf("Error downloading %s: %v\n", filename, err)} else {fmt.Printf("Downloaded %s successfully.\n", filename)}}(asset.BrowserDownloadURL, asset.BrowserDownloadURL[strings.LastIndex(asset.BrowserDownloadURL, "/")+1:])}}}wg.Wait()
然后从下载的源代码压缩包中导出每个版本的jquery.min.js文件,文件名带上rcube mail版本方便下一步使用。
关键代码如下
dir := "D:\\SEC_Note\\rcube_versions"files, err := os.ReadDir(dir)if err != nil {fmt.Println(err)return}for _, file := range files {if file.IsDir() {continue//fmt.Println("Folder: ", file.Name())} else {absPath, err := filepath.Abs(filepath.Join(dir, file.Name()))if err != nil {fmt.Println(err)continue}fmt.Println("File: ", absPath)mainDo(absPath)}}
最后用php计算文件的最后修改时间
<?php
$directory = '.';
$files = scandir($directory);foreach ($files as $file) {if ($file != "." && $file != "..") {$filePath = $directory . DIRECTORY_SEPARATOR . $file;if (is_file($filePath)) {$fileMTime = filemtime($filePath);echo $file . ' + ' . $fileMTime . PHP_EOL;}}
}?>
建立映射,即可得到如下版本映射。然后用go实现请求目标获得html代码,匹配 ?s={{num}} 即可
// Define version mapversionMap := map[string]string{"1636751527": "roundcubemail-1.3.17-complete.tar.gz","1636751547": "roundcubemail-1.3.17.tar.gz","1612812581": "roundcubemail-1.4.11-complete.tar.gz","1612812601": "roundcubemail-1.4.11.tar.gz","1636753154": "roundcubemail-1.4.12-complete.tar.gz","1636753175": "roundcubemail-1.4.12.tar.gz","1640818035": "roundcubemail-1.4.13-complete.tar.gz","1640818057": "roundcubemail-1.4.13.tar.gz","1694896977": "roundcubemail-1.4.14-complete.tar.gz","1694897047": "roundcubemail-1.4.14.tar.gz","1697461030": "roundcubemail-1.4.15-complete.tar.gz","1697461064": "roundcubemail-1.4.15.tar.gz","1614281846": "roundcubemail-1.5-beta-complete.tar.gz","1614281870": "roundcubemail-1.5-beta.tar.gz","1625341161": "roundcubemail-1.5-rc-complete.tar.gz","1625341187": "roundcubemail-1.5-rc.tar.gz","1634503084": "roundcubemail-1.5.0-complete.tar.gz","1634503112": "roundcubemail-1.5.0.tar.gz","1637615532": "roundcubemail-1.5.1-complete.tar.gz","1637615555": "roundcubemail-1.5.1.tar.gz","1640816963": "roundcubemail-1.5.2-complete.tar.gz","1640817081": "roundcubemail-1.5.2.tar.gz","1656275218": "roundcubemail-1.5.3-complete.tar.gz","1656275241": "roundcubemail-1.5.3.tar.gz","1695024809": "roundcubemail-1.5.4-complete.tar.gz","1695024837": "roundcubemail-1.5.4.tar.gz","1697451371": "roundcubemail-1.5.5-complete.tar.gz","1697451403": "roundcubemail-1.5.5.tar.gz","1699175465": "roundcubemail-1.5.6-complete.tar.gz","1699175495": "roundcubemail-1.5.6.tar.gz","1716112649": "roundcubemail-1.5.7-complete.tar.gz","1716112666": "roundcubemail-1.5.7.tar.gz","1722763434": "roundcubemail-1.5.8-complete.tar.gz","1722763449": "roundcubemail-1.5.8.tar.gz","1725175135": "roundcubemail-1.5.9-complete.tar.gz","1725175151": "roundcubemail-1.5.9.tar.gz","1646598729": "roundcubemail-1.6-beta-complete.tar.gz","1646598754": "roundcubemail-1.6-beta.tar.gz","1655027980": "roundcubemail-1.6-rc-complete.tar.gz","1655025289": "roundcubemail-1.6-rc.tar.gz","1658607434": "roundcubemail-1.6.0-complete.tar.gz","1658607455": "roundcubemail-1.6.0.tar.gz","1674504194": "roundcubemail-1.6.1-complete.tar.gz","1674504217": "roundcubemail-1.6.1.tar.gz","1688210976": "roundcubemail-1.6.2-complete.tar.gz","1688211001": "roundcubemail-1.6.2.tar.gz","1694765308": "roundcubemail-1.6.3-complete.tar.gz","1694765330": "roundcubemail-1.6.3.tar.gz","1697448186": "roundcubemail-1.6.4-complete.tar.gz","1697448209": "roundcubemail-1.6.4.tar.gz","1699174738": "roundcubemail-1.6.5-complete.tar.gz","1699174760": "roundcubemail-1.6.5.tar.gz","1705745704": "roundcubemail-1.6.6-complete.tar.gz","1705745675": "roundcubemail-1.6.6.tar.gz","1716107237": "roundcubemail-1.6.7-complete.tar.gz","1716107254": "roundcubemail-1.6.7.tar.gz","1722764714": "roundcubemail-1.6.8-complete.tar.gz","1722764729": "roundcubemail-1.6.8.tar.gz","1725175896": "roundcubemail-1.6.9-complete.tar.gz","1725175911": "roundcubemail-1.6.9.tar.gz",}
然后就是工具实现过程
0x04 工具实现和开源代码
工具最终的效果,相关代码随后开源在我的github地址
https://github.com/P001water
P1rcubemail.exe getver -u http://192.168.110.142/roundcubemail-1.6.7/

小结
本文实现了rcube webmail的版本探测的go语言工具化,但是后续还有优化的空间,比如
后来发现从github api接口拿到的并不是全部版本,只是到v1.3.17,后面还可以加上前面的版本
rcube mail系统访问很多情况需要挂代理,需要加上代理访问
后续随着使用需求更新
相关文章:
渗透基础-rcube_webmail版本探测
简介 本文介绍了开源产品RoundCube webmail邮件系统的版本探测思路,并用go语言实现工具化、自动化探测。 正文 0x01 探测思路研究 探测系统版本,最理想的方法就是系统主页html代码中有特定的字符串,比如特定版本对应的hash在主页的html代…...
linux下编译鸿蒙版boost库
我在上一篇文章中介绍了curl和openssl的编译方式(linux下编译鸿蒙版curl、openssl-CSDN博客),这篇再介绍一下boost库的编译。 未经许可,请勿转载! 一.环境准备 1.鸿蒙NDK 下载安装方式可以参考上篇文章,…...
滚雪球学Redis[6.3讲]:Redis分布式锁的实战指南:从基础到Redlock算法
全文目录: 🎉前言🚦Redis分布式锁的概念与应用场景🍃1.1 什么是分布式锁?🍂1.2 应用场景 ⚙️使用Redis实现分布式锁🌼2.1 基本思路🌻2.2 示例代码🥀2.3 代码解析 &#…...
springboot二手汽车交易平台-计算机毕业设计源码82053
目录 1 绪论 1.1研究背景 1.2研究意义 1.3国内外研究现状 2 二手汽车交易平台系统分析 2.1 可行性分析 2.2 系统流程分析 2.3 功能需求分析 2.4 性能需求分析 3 二手汽车交易平台概要设计 3.1 系统体系结构设计 3.2总体功设计 3.3子模块设计设计 3.4 数据库设计 …...
typescript 中的类型推断
在 TypeScript 中,类型推断(Type Inference)是一种编译器自动确定变量或表达式类型的能力。这大大减少了需要显式声明类型的代码量,使得代码更加简洁和易读。TypeScript 的类型推断机制非常强大,可以在很多情况下自动推…...
linux 隐藏文件
在Linux中,隐藏文件以点(.)开头的文件或文件夹被认为是隐藏文件。隐藏文件通常用于存储系统配置文件或敏感文件。 以下是几种不同的方法来隐藏文件或文件夹: 方法1:在文件或文件夹名字前面加上点(.&#…...
【网络协议栈】Tcp协议(上)结构的解析 和 Tcp中的滑动窗口(32位确认序号、32位序号、4位首部长度、6位标记位、16为窗口大小、16位紧急指针)
绪论 “没有那么多天赋异禀,优秀的人总是努力翻山越岭。”本章主要讲到了再五层网络协议从上到下的第二层传输层中使用非常广泛的Tcp协议他的协议字段结构,通过这些字段去认识其Tcp协议运行的原理底层逻辑和基础。后面将会再写一篇Tcp到底是通过什么调…...
手表玻璃盖板视觉贴合
在手表生产过程中,贴合加工是一个至关重要的环节,它涉及将手表的盖板与LCM模组或各种功能片进行精准贴合。这一过程不仅要求高度的精度,还追求效率与稳定性,以满足现代可穿戴设备日益增长的市场需求。然而,当前行业在这…...
电信和互联网行业数据安全评估师CCRC-DSA人才强基计划
“电信和互联网行业数据安全人才强基计划”(以下简称“强基计划”)自 2022 年 4 月启动伊始,始终秉持以人才需求为导向,以体系化能力建设为重点,扎实铸就数据安全人才培养品牌,力促行业数据安全人才培养工作…...
MQTTnet 4.3.7.1207 (最新版)使用体验,做成在线客服聊天功能,实现Cefsharp的物联的功能(如远程打开新网址)
一、MQTTnet 4.3.x版本客户端 将客户端集成到 cefsharp 定制浏览器中,实现物联网功能 网上很多代码是3.x版本代码,和4.x版本差异性较大,介绍较为简单或不系统 二、部分代码说明 初始化,初始化》连接服务端》发布上线信息(遗嘱)ConnectAsync等 订阅主题:SubscribeAsync 接…...
将java项目jar包打包成exe服务
1.结构展示 2.注意事项 前提: 环境准备:jdk8 和 .net支持 { 1.控制面板》程序和功能》启用和关闭windows功能》.net的勾选》2.jdk8自行百度安装环境3.其他项目必须的软件环境安装等(数据库...) }第一次准备: 1.将打包好的jar包放到premiumServices.exe…...
Django请求响应对象
在 Django 中,请求(request)和响应(response)对象是处理 HTTP 请求和返回 HTTP 响应的核心。它们分别由 Django 的 HttpRequest 和 HttpResponse 类表示。 HttpRequest 对象 HttpRequest 对象包含了客户端发送的所有…...
DevExpress中文教程 - 如何在静态SSR模式下使用Blazor Drawer组件?
Microsoft的 .NET 8 UI框架引入了静态服务器端呈现模式(静态SSR)——组件在服务器端呈现,然后返回到客户端,没有任何交互,DevExpress Blazor Drawer组件需要交互式呈现模式来动态地改变其IsOpen状态。 在本文中&#…...
商汤科技十周年公布新战略,将无缝集成算力、模型及应用
10月18日,恰逢商汤科技十周年庆典,“2024商汤十周年国际论坛:迈向AI 2.0共融新时代”在香港科学园成功举办。 据「TMT星球」了解,来自全球的行业领袖、政府代表、AI专家共聚于此,共同探讨AI行业的未来。 活动上&…...
【如何获取股票数据07】Python、Java等多种主流语言实例演示获取股票行情api接口之沪深A股历史分时MA数据获取实例演示及接口API说明文档
最最近一两年内,股票量化分析逐渐成为热门话题。而从事这一领域工作的第一步,就是获取全面且准确的股票数据。因为无论是实时交易数据、历史交易记录、财务数据还是基本面信息,这些数据都是我们进行量化分析时不可或缺的宝贵资源。我们的主要…...
Rust语法基础
注释 所有的开发者都在努力使他们的代码容易理解,但有时需要额外的解释。在这种情况下,开发者在他们的源码中留下注释,编译器将会忽略掉这些内容,但阅读源码的人可能会发现有用。 和大多数的编程语言一样,主要有一下两种: 单行注释 // 多行注释 /* */ 基本数据类型 Ru…...
AWS WAF实现API安全防护
在当今的互联网环境中,API安全防护变得越来越重要。本文将介绍如何使用AWS WAF(Web Application Firewall)来实现有效的API安全防护策略。 背景 我们有一个API服务,其URL模式如下: https://dev.example.com/bff-app/sec/v1/module-a/feature-a/sub-feature-a我们需要使用AWS…...
vue将table转换为pdf导出
安装依赖: 首先,你需要安装 jspdf 和 html2canvas 这两个库。 npm install jspdf html2canvas创建Vue组件: 创建一个Vue组件,用于显示表格并提供导出PDF的功能。 <template> <div> <div id"table-contain…...
20240818 字节跳动 笔试
文章目录 1、编程题1.11.21.31.4岗位:BSP驱动开发工程师-OS 题型:4 道编程题 1、编程题 1.1 小红的三消游戏: 小红在玩一个三消游戏,游戏中 n 个球排成一排,每个球都有一个颜色。若有 3 个颜色相同的球连在一起,则消除这 3 个球,然后剩下的球会重新连在一起。在没有 …...
在Debian上安装向日葵
说明: 因为之前服务器上安装了 PVE (Proxmox VE),之前是用 Proxmox VE 进行服务器资源管理的。出于某些原因,现在不再通过 PVE构建的虚拟机来使用计算资源,而是通过 PVE 自带的 Debian 系统直接使用虚拟机资源(因为积…...
终极Web-Check备份恢复指南:数据安全保障策略详解
终极Web-Check备份恢复指南:数据安全保障策略详解 【免费下载链接】web-check 🕵️♂️ 用于分析任何网站的一体化 OSINT 工具 项目地址: https://gitcode.com/GitHub_Trending/we/web-check Web-Check是一款功能强大的开源OSINT工具࿰…...
SFML终极指南:5步掌握跨平台多媒体开发
SFML终极指南:5步掌握跨平台多媒体开发 【免费下载链接】SFML Simple and Fast Multimedia Library 项目地址: https://gitcode.com/gh_mirrors/sf/SFML SFML(Simple and Fast Multimedia Library)是一个简单、快速、跨平台的多媒体AP…...
OpenClaw配置加密:GLM-4.7-Flash模型凭证的安全存储方案
OpenClaw配置加密:GLM-4.7-Flash模型凭证的安全存储方案 1. 为什么需要保护模型凭证? 上周我在调试OpenClaw对接GLM-4-7-Flash模型时,不小心把包含API Key的配置文件上传到了GitHub。虽然及时发现并撤销,但这个教训让我意识到&a…...
OpenClaw常见错误排查:nanobot连接问题解决方案
OpenClaw常见错误排查:nanobot连接问题解决方案 1. 问题背景与排查思路 上周我在本地部署OpenClaw对接nanobot镜像时,遇到了几个典型的连接问题。作为一个开源自动化框架,OpenClaw在实际使用中经常会遇到各种"水土不服"的情况。特…...
开源阅读鸿蒙版:打造完全自定义的鸿蒙电子书阅读器终极指南
开源阅读鸿蒙版:打造完全自定义的鸿蒙电子书阅读器终极指南 【免费下载链接】legado-Harmony 开源阅读鸿蒙版仓库 项目地址: https://gitcode.com/gh_mirrors/le/legado-Harmony 开源阅读鸿蒙版是一款专为HarmonyOS系统设计的免费开源电子书阅读器应用&#…...
Source Han Serif TTF:企业级中文排版战略选择与规模化部署指南
Source Han Serif TTF:企业级中文排版战略选择与规模化部署指南 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 思源宋体TTF作为Adobe与Google联合开发的开源中文字体解决方…...
Windows 11三指拖拽功能完全配置指南:从驱动安装到手势优化
Windows 11三指拖拽功能完全配置指南:从驱动安装到手势优化 【免费下载链接】ThreeFingersDragOnWindows Enables macOS-style three-finger dragging functionality on Windows Precision touchpads. 项目地址: https://gitcode.com/gh_mirrors/th/ThreeFingersD…...
告别静态贴图!用Cesium自定义材质打造会‘呼吸’的3D导航线
告别静态贴图!用Cesium自定义材质打造会“呼吸”的3D导航线 在无人机航线规划或车辆轨迹可视化项目中,传统静态贴图导航线常面临一个尴尬问题:当地图缩放时,箭头密度要么拥挤不堪,要么稀疏失真。这就像给动态场景穿上了…...
OBS Multi RTMP插件:终极多平台直播同步推流解决方案
OBS Multi RTMP插件:终极多平台直播同步推流解决方案 【免费下载链接】obs-multi-rtmp OBS複数サイト同時配信プラグイン 项目地址: https://gitcode.com/gh_mirrors/ob/obs-multi-rtmp 在当今直播行业快速发展的时代,如何同时在多个平台进行高效…...
从序列到功能:如何用MEME+MAST发现蛋白基序的隐藏规律(含UniProt验证技巧)
从序列到功能:如何用MEMEMAST发现蛋白基序的隐藏规律(含UniProt验证技巧) 在蛋白质组学研究中,保守基序(motif)往往承载着关键的功能密码。当我们在MEME中完成初步预测后,如何从这些序列模式中挖…...
