自学内容网 自学内容网

Electron的应用安全测试基础 | 安装与检测基于Electron的应用程序

 视频教程在我主页简介或专栏里 

 目录:

III. 说明

 3.1. 安装应用程序

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

 3.3 自动化方法

  3.3.1 macOS上Electron应用的自动检测

 3.3.2. 在Windows上自动检测基于Electron的应用程序

 3.3.3. 在Linux上自动检测基于Electron的应用程序

 

III. 说明

书接上回:Electron 应用安全测试基础 | 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 FilesAppData 或 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 自动化方法

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

3.3.1 macOS上Electron应用的自动检测

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

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

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

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

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

import osimport subprocess
def 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 None
def 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” 二进制文件来进行搜索。

图片

3.3.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 = $appName AppPath = $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 $directory if (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.3.3. 在Linux上自动检测基于Electron的应用程序

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

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

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

import os
def is_electron_app(directory): for file in os.listdir(directory): if file.endswith('.asar') or file == 'LICENSE.electron.txt': return True return False
def 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 格式中的文件,并强调这个过程的重要性。

 

 视频教程在我主页简介或专栏里

申明:本账号所分享内容仅用于网络安全技术讨论,切勿用于违法途径,所有渗透都需获取授权,违者后果自行承担,与本号及作者无关

原文地址:https://blog.csdn.net/2401_89294392/article/details/145159632

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!