0x00 前言
带着问题去学习,我们为什么需要降权?
在渗透测试中,常常会遇到需要改变程序启动权限(分为提权和降权)的情况。
提权:是从普通用户权限到管理员权限和从管理员权限到system权限降权通常是指从system权限:降到普通用户权限(从管理员权限降到普通用户权限比较简单,方法很多),往往是为了操作当前用户的文件内容(如捕获桌面、操作注册表等)
本文将会介绍具体的降权方法(从system权限降到普通用户权限),理清其中的重点,并且开源一个小工具,用于判断进程
0x01 简介
学习四个点:
1、为什么要降权?
2、从管理员权限降到普通用户权限的方法?
3、从system权限降到普通用户的方法?
4、利用SelectMyParent实现提权和降权。
0x02 为什么要降权
使用system权限的进程可能会遇到以下问题:
1、无法获得当前用户的文件内容
例如无法捕获用户的屏幕
2、环境变量有差异
如以下环境变量:
- APPDATA
- Temp
- USERDOMAIN
- USERNAMW
- USERPROFILE
cmd下可通过echo查看环境变量,例如查看环境变量APPDATA的命令为:
echo %appdata%
system权限下去查询,查询到的环境变量APPDATA为:
注:正常无法以system权限去启动cmd,我们这里通过psexec方式来
微软官网下载地址:http://download.sysinternals.com/files/PSTools.zip
下载完成后,我们打开压缩包,将里面的psexec.exe复制到System32文件夹下(64位用户请将psexec64.exe复制到SysWOW64文件夹下),然后以管理员身份运行命令提示符切换到psexec的目录下,输入"psexec -i -d -s cmd.exe"(64位用户类似),等待1~2秒后,就会出现以system权限运行的命令提示符了。在被启动的命令提示符里输入命令"whoami"并回车,会发现返回一条信息为"nt authority\system",说明此命令提示符已以本地系统的身份运行了。在任务管理器里查看,便会发现此进程的用户名是SYSTEM。
C:\Windows\system32\config\systemprofile\AppData\Roaming
管理员权限下去查询,查询到的环境变量APPDATA为:
C:\Users\Michael\AppData\Roaming
也可以通过API SHGetSpecialFolderPath 获取指定的系统路径,如APPDATA,也能发现权限不同导致的区别
c++代码如下:
#include <windows.h> #include <Shlobj.h> #include <iostream> bool IsSystemPrivilegeCmp() { static bool isSystemPrivilege = false; char* flag = "C:\\Windows"; if (isSystemPrivilege) { return isSystemPrivilege; } char szPath[MAX_PATH] = { 0 }; if (SHGetSpecialFolderPathA(NULL, szPath, CSIDL_APPDATA, TRUE)) { printf("APPDATA Path:%s\n", szPath); if (memcmp(szPath, flag, strlen(flag)) == 0) printf("[+]I'm System Privilege\n"); else printf("[-]Not System Privilege\n"); } return isSystemPrivilege; } int main(int argc, CHAR* argv[]) { IsSystemPrivilegeCmp(); return 0; }
管理员权限执行:
system权限执行: