免责声明:
⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。所有渗透都需获取授权!
三、说明
传送门:【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 Files
、AppData
或 WindowsApp
中找到。
而在基于 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 格式中的文件,并强调这个过程的重要性。
原创 白帽子左一