【Node.js渗透】安装与检测基于Electron的应用程序

news/2025/1/15 21:51:22/文章来源:https://www.cnblogs.com/o-O-oO/p/18673774

免责声明:

⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。所有渗透都需获取授权!

三、说明

传送门:【Node.js开发】Electron 框架介绍,我们已经了解了创建简单Electron应用程序的过程。

本文将概述安装Electron应用程序的过程,并介绍检测操作系统中已安装Electron应用程序的基本步骤。

3.1 安装应用程序

与在任何操作系统上安装应用程序类似,我们需要的是现有应用程序的可执行文件。在本节中,我们的重点是macOS。不过需要注意的是,安装过程在其他操作系统(如Windows或Linux)上并没有显著差异。

当我们点击之前生成的.dmg文件时,会弹出一个简单的窗口,其中显示的应用程序名称与在构建过程中package.json文件中“productName”参数所指定的名称完全一致。

此外,在窗口的标题栏中,我们还可以看到应用程序的版本号,该版本号与我们在同一文件中“version”参数中输入的值一致。

假设我们已经安装了该应用程序,那么通常可以在系统的应用程序目录中找到它(例如,macOS的/Applications目录或Windows操作系统中的Program Files目录)。

需要注意的是,与Windows环境不同,Windows允许用户直接在Program Files中查看安装包的内容,而在macOS中,我们需要选择“显示包内容”才能查看已安装应用程序目录中的内容。

3.2 手动检测已安装的基于 Electron 的应用程序

正如我们所知,每个操作系统都有其特定的目录结构,用于存储新安装的应用程序。例如:

macOS中,通常位于 /Applications /Users/用户名/Applications 目录下。

Windows 中,可以在 Program FilesAppDataWindowsApp 中找到。

而在基于 Linux 的系统中,通常位于 /opt/usr/share目录下。

那么,当我们找到应用程序目录后,如何识别其中是否存在基于 Electron 框架的应用程序呢?简单来说,Electron 框架构建的应用程序具有一个独特的特征,即存在.asar格式的文件。

【图】Sample of .asar File on macOS

【图】Sample of.asar File on Windows

【图】Sample of.asar File on Linux-Based System (For Example: Ubuntu)

简而言之,.asar 文件是一个归档文件,其中包含了基于 Electron 的应用程序所需的所有 JavaScript、HTML、CSS、图像以及其他资源。本质上,它将运行应用程序所需的所有文件打包在一起(引用自 Electron 官方文档,这种格式还能缓解 Windows 上的长路径名问题,加快 require 操作,并在一定程度上隐藏源码以防止被简单查看)。

除此之外,还有其他格式可以帮助我们在操作系统中识别基于 Electron 的应用程序吗?确实有。其中包括:

macOS 系统中,“Frameworks” 目录内的 “Electron Framework.framework” 文件夹。

macOS 系统中,通常位于 “Resources” 目录内的 “electron.icns”(图标资源)文件。

在某些基于 Linux 的系统中,通常存在的 “LICENSE.electron.txt” 文件。

“package.json” 文件(不过,我们可能需要先检查其内容)。

特定关键词搜索,可唯一表征Electron构建的应用程序中的配置,例如 “contextIsolation” 和 “nodeIntegration”。

3.3 自动化方法

鉴于需要搜索的变量众多,并且单个主机内可能存在许多应用程序,因此在基本识别过程中可以采取的初步步骤是执行一些自动化操作。
1、macOS上Electron应用的自动检测

众所周知,macOS有以 .app 命名规则命名的目录(尽管不能严格称其为扩展名)。本质上,这些目录包含运行应用程序所需的所有文件和资源。

尽管这些是目录,但点击时操作系统会执行其中包含的程序。正如第3.1节所述,这些目录的内容也可以进一步探查。

由于macOS应用的资源通常位于 .app 目录中,因此我们可以使用 mdfind 命令来进行密集搜索以确定文件的存在。

mdfind 是macOS中的一个搜索命令,利用Spotlight搜索索引系统根据文件的元数据和内容来查找文件和目录。例如,如果我们想查找所有扩展名为 .png 的文件,可以在终端中运行命令 mdfind '.png',输出结果将显示系统上所有 .png 文件。

以下是一个简单的示例脚本,可以帮助用户在macOS上识别Electron应用程序:

import os
import subprocessdef get_app_name(app_path):return os.path.basename(app_path)def get_electron_version(filename):try:output = subprocess.check_output(f"strings '{filename}' | grep 'Chrome/' | grep -i Electron | grep -v '%s' | sort -u | cut -f 3 -d '/'", shell=True)return output.decode().strip()except subprocess.CalledProcessError:return Nonedef generate_github_link(version):return f"https://github.com/electron/electron/releases/tag/v{version}"def format_row(app_name, electron_version, filename):return f"{app_name:30s} {electron_version:20s} {filename}"def find_electron_apps():try:apps = subprocess.check_output("mdfind 'kind:app'", shell=True).decode().splitlines()apps = sorted(set(apps))print("_" * 100)print(format_row("App Name", "Electron Version", "File Name"))print("=" * 100)for app in apps:filename = os.path.join(app, "Contents/Frameworks/Electron Framework.framework/Electron Framework")if os.path.isfile(filename):app_name = get_app_name(app)electron_version = get_electron_version(filename)print(format_row(app_name, electron_version, filename))print("\n")print("=" * 60)print("App Name" + " " * 24 + "GitHub Link")print("=" * 60)for app in apps:filename = os.path.join(app, "Contents/Frameworks/Electron Framework.framework/Electron Framework")if os.path.isfile(filename):app_name = get_app_name(app)electron_version = get_electron_version(filename)github_link = generate_github_link(electron_version) if electron_version else "Not Found"print(f"{app_name:30s} {github_link}")except Exception as e:print(f"Error: {e}")if __name__ == "__main__":find_electron_apps()# As a note, this script is a simple port to Python (with additional information) from a bash script that made and improved by @CubicleApril. The original script can be seen at: https://gist.github.com/april/3da7c3720b0d9f3ee7dc9a95f623578d.
# Note: In the final output section, there is a small addition regarding a link containing updated information about using Electron.
# Repo: https://github.com/yokokho/Find-Electron-Apps-on-macOS

那么,这个脚本基本上是做什么的呢?简而言之,在获取macOS上已安装的应用程序列表后,该脚本将尝试定位 “Electron Framework.framework” 的存在。而对于用于构建该应用的Electron版本,脚本通过检查 “Electron Framework” 二进制文件来进行搜索。

2、 在Windows上自动检测基于Electron的应用程序

与我们在macOS部分的解释类似,Windows上也有特定的目录,通常用于安装应用程序,这些目录包含运行应用程序所需的文件和资源。这些目录的例子包括 Program Files、AppData(包括诸如“Programs”这样的子目录)和 WindowApp。在某些情况下,应用程序也可能位于用户的目录中,例如 Downloads 或 Documents 目录,因为该应用程序可能是便携版应用程序。

需要强调的是,WindowApp 目录默认受到Windows的安全措施的限制,无法直接访问。要查看 WindowApp 内的目录列表,需要配置特定的权限。

鉴于这种情况,以下是一个简单的PowerShell脚本示例,旨在帮助用户识别在Windows上安装的基于Electron的应用程序:

function Is-ElectronApp {param($directory)Get-ChildItem -Path $directory -Filter "*.asar" -Recurse -ErrorAction SilentlyContinue |ForEach-Object {$appName = if ($_.FullName -like "*\Program Files*\*") {$splitPath = (Split-Path -Path $_.Directory).Split('\')$splitPath[2..($splitPath.Length - 3)] -join '\'} elseif ($_.FullName -like "*\AppData\Local\Programs\*" -or $_.FullName -like "*\AppData\LocalLow\Programs\*" -or $_.FullName -like "*\AppData\Roaming\Programs\*") {(Split-Path -Path $_.Directory).Split('\')[6]} elseif ($_.FullName -like "*\AppData\Local\*" -or $_.FullName -like "*\AppData\LocalLow\*" -or $_.FullName -like "*\AppData\Roaming\*") {(Split-Path -Path $_.Directory).Split('\')[5]} elseif ($_.FullName -like "*\Users\$env:USERNAME\Desktop\*" -or $_.FullName -like "*\Users\$env:USERNAME\Downloads\*" -or $_.FullName -like "*\Users\$env:USERNAME\Documents\*") {(Split-Path -Path $_.Directory).Split('\')[4]} else {Split-Path -Path $_.Directory}$appPath = $_.Directory[PSCustomObject]@{AppName = $appNameAppPath = $appPath}}
}$drives = Get-PSDrive -PSProvider 'FileSystem'
$directoriesToSearch = @("\Program Files", "\Program Files (x86)", "\Users\$env:USERNAME\AppData\Local", "\Users\$env:USERNAME\AppData\LocalLow", "\Users\$env:USERNAME\AppData\Roaming", "\Users\$env:USERNAME\Desktop", "\Users\$env:USERNAME\Downloads", "\Users\$env:USERNAME\Documents")$electronApps = foreach ($drive in $drives) {foreach ($directory in $directoriesToSearch) {$fullPath = Join-Path -Path $drive.Root -ChildPath $directoryif (Test-Path -Path $fullPath) {Is-ElectronApp -directory $fullPath}}
}if ($electronApps) {$electronApps | Format-Table -AutoSize
} else {Write-Output " "Electron-based applications not found."
}# Repo: https://github.com/yokokho/Find-Electron-Apps-on-Windows

总之,该脚本尝试定位Windows上的驱动器字母,然后继续搜索通常可以找到应用程序的常见路径(如 Program Files、AppData,以及一些用户目录,如 Desktop、Downloads 和 Documents)。

与macOS使用mdfind功能不同,在Windows中(根据我有限的知识),我们需要在脚本中手动定义特定的路径。虽然可能还有其他潜在路径,比如 WindowApp,但至少这可以作为识别Windows OS中基于Electron的应用程序存在的初步步骤。

需要注意的是,我们可能会在输出中遇到重复的信息。这是因为我们使用了“.asar”作为搜索关键字,而在某个目录中可能存在多个“.asar”文件。此外,应用程序名称(AppName)的检索仍然基于目录名称,当用户使用与应用程序名称不同的目录名称时,这可能导致输出不准确。
3、在Linux上自动检测基于Electron的应用程序

接下来,我们将进入自动检测话题的最后部分。基于Linux的系统也有专门的目录用于存储已安装的应用程序,如 /usr/share 或 /opt 目录。此外,用户还可能选择将应用程序安装在 /home 目录下(例如,在 Documents 目录中)。

从技术上讲,我们可以使用 locate 命令快速定位 .asar 文件或与Electron相关的其他文件。然而,需要注意的是,如果我们尚未更新 updatedb 数据库,结果可能不会是最优的。由于我们的目标是在低权限用户下执行脚本,因此我们选择不使用locate命令。

考虑到这种情况,我们尝试创建了一个简单的Python脚本,其流程大致与我们为Windows开发的脚本相同:

import osdef is_electron_app(directory):for file in os.listdir(directory):if file.endswith('.asar') or file == 'LICENSE.electron.txt':return Truereturn Falsedef get_app_name(directory):split_directory = directory.split('/')if directory.startswith('/usr/share/'):if len(split_directory) > 3:return split_directory[3]elif directory.startswith('/opt/'):if len(split_directory) > 2:return split_directory[2]elif directory.startswith('/home/'):if len(split_directory) > 4:return split_directory[4]else:return os.path.basename(directory)def find_electron_apps():directories_to_search = ['/opt', '/usr/share', '/home']electron_apps = []for directory in directories_to_search:for root, dirs, files in os.walk(directory):if is_electron_app(root):app_name = get_app_name(root)electron_apps.append((app_name, root))dirs[:] = []if electron_apps:print("_" * 100)print(f"{'App Name':30s} {'Location'}")print("=" * 100)for app_name, location in electron_apps:print(f"{app_name:30s} {location}")else:print("Electron-based applications not found.")if __name__ == "__main__":find_electron_apps()# Repo: https://github.com/yokokho/Find-Electron-Apps-on-Linux

总的来说,这个脚本搜索了常见的应用程序安装目录,如 /usr/share 或 /opt 以及用户可能选择安装应用程序的 /home 目录。基本上,这个脚本采用了与之前的 PowerShell 脚本类似的方法,通过遍历常见的目录来定位与 Electron 相关的文件。虽然它可能没有涵盖所有潜在的路径,但至少可以为在 Linux 环境中识别基于 Electron 的应用程序提供一个初步的步骤。

作为说明,应用程序名称(App Name)的确定仍然依赖于目录名称,如果用户使用与应用程序名称不同的目录名称,可能会导致不准确的输出。

好了,我们快接近这一部分的结束了。希望读者现在对基于 Electron 的应用程序有了基本的了解,包括安装过程和跨不同操作系统的检测方法。在下一部分,我们将尝试探索如何提取存储在 .asar 格式中的文件,并强调这个过程的重要性。

原创 白帽子左一

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

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

相关文章

器件选型---晶振

如何选型晶振,有那些选型注意事项器件选型---晶振 晶振的种类和区别 晶振大体可分为无源晶振和有源晶振两类,其区别如下:无源晶振(crystal,谐振器):内部是两侧贴着金属极板的石英晶体,必须要依赖外部电路才能进行稳定的震动;无源晶振一般会采取下面的接法来与MCU内部的…

Windows自定义变量打开文件或文件夹

前言全局说明Windows 系统自带很多变量,方便使用。 参照系统设置,我们可以自定义一些变量,快速打开文件或文件夹。 例如: 在运行或文件夹地址栏输入 %TEMP% 就能打开对应文件夹一、说明 1.1 环境: Windows 11 家庭版 23H2 22631.37371.2 环境变量位置 用户变量:自定义的文…

鼠标双击连击解决方案

前言 手里的这是第二个才用1年多就出现双击现象的G102了,太不耐操。我算是信了那群广告狗的邪,才又选了这个鼠标。 鼠标双击解决方法主要有以下几种:玄学方法:朝鼠标里哈一口气; 使用软件忽视短暂间隔内的点击行为; 拆鼠标,调整微动; 重买,选光微动+光手轮USB有线鼠标…

2024.1.15闲话

我抄,原!可能是不知道什么学习笔记捏 阶 使得 \(a^x\equiv 1\pmod m\) 的最小正整数 \(x\) 被称为 \(a\) 模 \(m\) 的阶,记作 \(\delta_m(a)\)。由欧拉定理可知, \(a\perp m\) 是 \(\delta_m(a)\) 存在的充要条件。证明 充分性:若 \(a\perp m\),根据欧拉定理,\(x=\varph…

2024中国网络安全产业势能榜优能企业「运营商行业」典型案例展示

运营商作为通信和网络服务的提供者,其安全性直接影响到全球范围内的信息流通与互联网基础设施的稳定。随着5G、云计算等新兴技术的普及,运营商面临着更高的安全压力。本期将展示运营商在加强网络防护、提升数据安全等方面的创新实践,以保障全球信息传输的安全性。 PS:典型案…

2024.1.15 鲜花

挖掘机技术哪家强 题解挖掘机技术哪家强 题解Bad Apple!! 流れてく 時の中ででも 気だるさが ほらグルグル廻って 私から 離れる心も 見えないわ そう知らない? 自分から 動くこともなく 時の隙間に 流され続けて 知らないわ 周りのことなど 私は私 それだけ 夢見てる? 何も見…

创建虚拟机VMware

创建虚拟机 ZF3R0-FHED2-M80TY-8QYGC-NPKYF YF390-0HF8P-M81RQ-2DXQE-M2UT6 ZF71R-DMX85-08DQY-8YMNC-PPHV81.创建虚拟机(典型更快)创建虚拟机选择“典型”方式避免自动安装,选择稍后安装系统选择虚拟中的系统设置虚拟机名字与位置(注意:不推荐放到C盘,会有权限问题)设置…

后缀自动机 (SAM) 学习笔记

\(\text{后缀自动机 (SAM) 学习笔记}\) 一、定义 字符串 \(s\) 的 SAM 是一个接受 \(s\) 的所有后缀的最小 DFA (确定性有限自动机或确定性有限状态自动机),也就是说:SAM 是一张有向无环图。它的结点是图中的状态,边是状态之间的转移。 SAM 有源点 \(t_0\),且其它各结点均可…

JS-39 Math 对象

Math是JavaScript的原生对象,提供各种数学功能。 Math.abs() 1、Math.abs方法返回参数值的绝对值 Math.abs(1)//1 Math.abs(-1)//1 2、Math.max(),Math.min() Math.max方法返回参数之中最大的那个值,Math.min返回最小的那个值。如果参数为空,Math.min返回Infinity,Math.max返…

单独变量操作数据库使用@Param

@Param// 单独变量传递过去的时候需要和数据库字段进行对照,哪怕命名相同也需要@Param@Update("update admingoin set admingoinpict = #{admingoinpict} where admingoinuid = #{admingoinuid}")void aaaaa(@Param("admingoinuid")String admingoinui…

2025.1.14——1200

2025.1.14——1200Q1. 1200 You have \(n\) sticks, numbered from \(1\) to \(n\). The length of the \(i\)-th stick is \(2^{a_i}\). You want to choose exactly \(3\) sticks out of the given \(n\) sticks, and form a non-degenerate triangle out of them, using the…

【前端】前端需要知道的缓存知识总结

引言📇 HTTP缓存是一种用于提高网站性能和减少带宽使用的技术。当用户访问一个网页时,浏览器会下载页面上的所有资源(如HTML、CSS、JavaScript等),这些资源会占用大量的带宽和时间。为了减少这些资源的加载时间,HTTP缓存机制被引入。 缓存分为强缓存和协商缓存两种,强缓…