A16.WEB主机-CVE漏洞提权与系统用户密码破解
WEB主机-CVE漏洞提权与系统用户密码破解
利用CVE-2018-8120漏洞进行提权
在Windows系统中,搭建的PHP网站,基本上都是以管理员身份运行的,获得Webshell以后就有了管理员权限,不需要提权。这是因为在Windows系统中,将第三方的Web服务软件设置成能够以普通用户运行的步骤不仅比较繁琐,而且没有权威的、确凿的说法。而使用Windows自带的IIS搭建ASP、Asp.net的网站时,默认就是以一个低权限的用户身份在运行,这样有了Webshell以后还需要提升权限,才能执行进一步的安全测试。这也是本实验选择ASP网站的原因。
2018年5月8日,微软通告了CVE-2018-8120漏洞,漏洞成因是Win32k.Sys组件的Ntusersetimeinfoex()系统服务函数内部未验证内核对象中的空指针对象,普通应用程序可利用这个空指针漏洞以内核权限执行任意代码。
以前微软的漏洞编号以“MS+年份”开头,如MS17-010。从MS17-023之后,微软放弃了这种编号,使用了CVE编号。微软公司针对系统安全漏洞提供的修补程序或者解决方案,一般会按月发布在微软安全响应中心(http://msrc.microsoft.com/update-guide),例如: http://msrc.microsoft.com/update-guide/vulnerability/CVE-2018-8120 ,通过点击“安全更新程序”中相应产品的“Security Update”链接可以下载到修复这个安全漏洞的补丁更新。对于没有补丁更新的情况,可以在临时解决方案、常见问题解答或缓解中找到应对方案。
CVE-2018-8120对应的补丁编号是KB4103712。我们需要先使用命令查看WEB机是否修复了这个漏洞:通过Webshell管理工具的虚拟终端执行命令:systeminfo,如下图可见是没有安装任何修补程序的。由此判断WEB机是可以利用此漏洞进行权限提升的。此外,还得知了这台电脑的计算机名为Web,并且是加入了域,域名是sun.com。

CVE-2018-8120漏洞利用程序GitHub项目地址:https://github.com/unamer/CVE-2018-8120
使用任意Webshell管理工具上传CVE-2018-8120漏洞利用程序CVE-2018-8120.exe,进行权限提升测试。先在虚拟终端中使用命令:CVE-2018-8120.exe "whoami",查看权限等级。查看到的等级为nt authority\system,即系统权限,也就是说,使用该漏洞利用程序执行的命令都是以System的身份执行的。

那么如果目标系统上打了一部分补丁的情况下应该如何处理?这种情况可以借助一些自动化的工具,如WES-NG( Windows Exploit Suggester - Next Generation),来检测系统上是否有缺失的补丁。此外,还有其它一些具有类似功能的工具,Windows系统版本、内置的服务程序都很多,有的工具的漏洞信息已经几年没有更新了,有的虽然在更新但检测效果也不是很理想,包括WES-NG在内,目前都有检测不准确的情况。
添加管理员用户
使用命令:CVE-2018-8120.exe "net user gg p@ssw0rd /add"添加名为gg,密码为p@ssw0rd的用户。

然后再使用命令CVE-2018-8120.exe "net localgroup administrators gg /add",将gg用户加入到Administrators用户组。

步骤概述:使用任意Webshell管理工具连接并上传CVE-2018-8120漏洞利用程序,注意上传利用程序时,要选对版本,这里应该上传X64版本的利用程序,如果上传了错误的版本就无法正常使用。上传后用其虚拟终端功能执行用户添加和归属管理员组命令,以获得管理员权限用户。
开启RDP功能
使用以下命令开启远程功能,让攻击机的“远程桌面连接”连接WEB机,达到获取其图形化控制的目的。
使用任意Webshell管理工具创建一个bat文件,写入以下两句命令:
reg add "hklm\system\currentcontrolset\control\terminal server" /v fdenytsconnections /t reg_dword /d 0 /f
netsh advfirewall firewall add rule name="remote desktop" protocol=tcp dir=in localport=3389 action=allow
以上第一句命令是通过操作注册表的方式来开启RDP功能,第二句是设置防火墙允许3389端口通过。在Shell中无法直接使用漏洞利用程序执行以上命令,因为引号的原因,并且无法使用转义执行。只能将以上两句命令保存为3389.bat文件后,使用虚拟终端执行命令:CVE-2018-8120.exe "3389.bat",通过漏洞利用提权程序使用System身份运行bat文件实现开启RDP功能。

执行完成会有回显提示成功,使用攻击机的“远程桌面连接”进行连接,输入相关账号与密码进行连接。
注意:上一节通过查看systeminfo命令的信息,得知这台电脑是加了域的,因此使用登录需要输入本地计算机名或域名。由于添加的gg用户只是本地用户,不是域用户,所以登录时用户名应该输入gg。如果无法登录,则使用用户名web\gg进行登录。

拿到RDP权限后,就可以更方便对WEB机进行攻击操作,例如增加一个影子用户,投放木马,维持权限等。
Windows系统用户密码破解
添加了另一个管理员用户之后,可以通过以下手段获得本机管理员Administrator和其它用户的密码。
Mimikatz在线抓取用户密码
Mimikatz 是一款功能强大的轻量级调试神器,通过它可以提升进程权限注入进程读取进程内存,mimikatz可以从内存中提取明文密码、哈希、PIN 码和 kerberos 票据。mimikatz 还可以执行哈希传递、票证传递或构建黄金票据。因此这款工具成为为内网渗透中的一个利器。作者一直在更新这个项目,最近一次的更新时间是2022年9月19日,项目地址:https://github.com/gentilkiwi/mimikatz/。
在未打补丁的Windows 2008上,如果用户登录以后计算机没有重启,就能抓到内存中保存的明文密码。但在Windows Server 2012及以上的系统就无法直接在内存中提取明文密码了,需要通过修改注册表的方式来抓取明文密码,并且在2014年5月左右发布了KB2871997补丁,修复了在内存中抓取明文密码的漏洞。修复之后只能拿到密码的HASH。本实验的机器没有打这个补丁,所以可以抓到。
在攻击机运行“远程桌面连接”,使用添加的管理员用户gg连接WEB机,将Mimikatz整个文件夹传输到WEB机任意目录中。右键“以管理员身份运行”运行cmd.exe,在cmd里切换到Mimikatz.exe所在的目录;或者找到Mimikatz.exe,右键“以管理员身份运行”,进入mimikatz的界面。
首先熟悉一下Mimikatz支持的命令。输入“::”可以查看到mimikatz支持的模块名,输入“模块名::”可以查看到某个模块支持的子命令。

然后依次执行以下命令,获取系统中的用户凭证。
mimikatz # log
mimikatz # privilege::debug
mimikatz # sekurlsa::logonpasswords
mimikatz # log的意思为开启日志记录,之后输入的任何指令与回显结果都会以TXT文本文档保存在Mimikatz.exe的同级目录中;
Privilege::debug的功能是请求调试权限,大部分的mimikatz功能都需要有调试权限才能正常运行;
sekurlsa::logonpasswords,SEKURLSA模块与受保护的内存交互。该模块从lsass(Local Security Authority Subsystem Service)进程的内存中提取密码、密钥、PIN码、票证。

由于内容较多,只截取关键部分图片。如下图,是leo用户的信息。

Windows加密过的密码口令,我们称之为hash(中文:哈希),Windows的系统密码hash默认情况下一般由两部分组成:第一部分是LM-hash,第二部分是NTLM-hash,是对同一个密码的两种不同的加密方式。因为LM Hash加密方案中存在一些安全弱点,微软后来引入了NTLM协议代替LM Hash。
将抓取的有效用户信息统计成一个表,方便查阅。
用户名 |
密码 |
SID |
NTLM |
Administrator |
Abc1234 |
S-1-5-21-4130613548-2113950923-398814044-500 |
aa3afe73b6e0c2d87b3a428bf696ae71 |
leo |
1234Abc |
S-1-5-21-3142012437-1197691209-3386785366-1104 |
4c205bd291cf5ad109fdd9f4f6eb8f70 |
从抓取的信息中发现,除了本地管理员以外,还有一个用户leo,是域用户。因为leo用户在WEB机启动后登录过,所以可以拿到明文密码,而用户Administrator(本地管理员)重启后,没有登录过,就只能拿到NTLM值。不过这里因为Administrator用户的密码不够复杂,所以使用Administrator用户的NTLM值,可以通过在线解密网站解出密码。
注意,如果没有抓取到leo域用户的密码,可能是leo用户在WEB机重启后没有登录过,请在WEB机在使用leo用户登录一次然后再进行抓取。
问题:Mimikatz为什么能够从系统中抓出密码来?
Lsass.exe(Local Security Authority Subsystem Service)是一个Windows系统中的安全机制进程,它用于本地安全和登录策略。在它的进程空间中,储存着计算机的域、本地用户名和密码等重要信息。
通常我们在登录系统时输入密码之后,密码便会储存在lsass进程的内存中。如果获取了本地系统权限,用户便可以访问LSASS进程内存,从而可以导出内部数据(password),用于横向移动和权限提升。mimikatz正是通过“privilege::debug”获取了调试权限,访问lsass.exe进程,获取到了明文密码(未安装补丁前)。也因为是储存在内存中的,所以重启电脑就抓取不到明文密码了。
离线破解Windows用户密码
以上的抓取密码的方式需要通过攻击机远程连接到WEB机,且还要上传Mimikatz到WEB机中,这样动静未免较大,如果WEB机有杀毒软件的话还可能会引起杀毒软件报警。所以我们还可以使用另外一种方法——使用注册表命令导出Sam与System文件,在攻击机本地抓取HASH。
导出注册表方式抓HASH
使用任意Webshell管理工具执行以下命令,将sam与system导出来,注意如果没权限还需要使用CVE-2018-8120漏洞利用程序以System身份执行命令。
CVE-2018-8120.exe "reg save hklm\sam sam.hive"
CVE-2018-8120.exe "reg save hklm\system system.hive"
执行以上的两行命令后,将在执行命令时的目录生成sam.hive和system.hive两个文件,然后将这两个文件下载到攻击机本地Mimikatz.exe同级目录内。
在攻击机中运行Mimikatz.exe,使用命令:lsadump::sam /sam:sam.hive /system:system.hive,即可将WEB机用户的HASH抓取出来,但是无法抓取域leo用户的HASH。

将抓取的Administrator用户HASH值aa3afe73b6e0c2d87b3a428bf696ae71记录一下,在搜索引擎中搜索相关破解网站,即可将明文密码解密出来。
彩虹表破解HASH
如果抓到了HASH值,但通过在线网站没有查到明文密码的时候,可以在本地使用彩虹表进行破解。
Rainbowcrack是一款跨平台破解哈希算法密码工具,主要可以破解MD5、NTLM等多种密码。它并非针对某种哈希算法的漏洞进行攻击,而是类似暴力破解,对于任何哈希算法都有效。彩虹表相当于是一个数量巨大、预先计算好的HASH值的集合,一般密码越复杂所需要的彩虹表就越大,目前根据Rainbowcrack官网列出的彩虹表,NTLM类型一定条件的HASH彩虹表最小是65GB,最大是690GB。
Rainbowcrack官网地址:http://project-rainbowcrack.com/。下载并使用Rainbowcrack官网最新版本1.8,解压在攻击机任意目录中,Rainbowcrack有可视化操作版本Rcrack_Gui.exe,运行Rcrack_Gui.exe,在菜单栏中依次点击“File”→“Add Hashes…”可以添加一个或多个HASH值,一行为一条,我们将NTLM值32ed87bdb5fdc5e9cba88547376818d4填写进去,点击“OK”按钮完成添加。
接下来,使用CMD进入Rainbowcrack根目录,用Rtgen生成NTLM这类HASH的彩虹表,其格式如下:
Rtgen.exe 哈希类型 字符范围 最小位数 最大位数 表索引 链长度 链数量 索引块
哈希类型有常见的HTLM、MD5、SHA1、SHA256、LM等,我们现在涉及到的是HTLM。
字符范围填写对应字符集名称。下表是彩虹表中所有的字符集名称与对应包含内容。
字符集名称 |
包含内容 |
Numeric |
0123456789 |
Alpha |
ABCDEFGHIJKLMNOPQRSTUVWXYZ |
Alpha-Numeric |
ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 |
Loweralpha |
abcdefghijklmnopqrstuvwxyz |
Loweralpha-Numeric |
abcdefghijklmnopqrstuvwxyz0123456789 |
Mixalpha |
abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz |
Mixalpha-Numeric |
abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789 |
Ascii-32-95 |
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_` abcdefghijklmnopqrstuvwxyz{|}~ |
Ascii-32-65-123-4 |
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`{|}~ |
Alpha-Numeric-Symbol32-Space |
ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_+=~`[]{}|:;”‘<>,.?/ |
因为我们已经知道了该明文密码实际上只是数字,所以我们选择最简单的Numeric字符集即可。但是在实际实验中可能就需要选择比较复杂的字符集了。
最小位数与最大位数的选择会决定彩虹表生成的内容的多少。在实验中,我们拿到Windows服务器是可以查看服务器密码策略中密码最短位数的,具体步骤是“远程桌面连接”连接到WEB机中,点击“开始菜单”→“管理工具”→“本地安全策略”,在弹出的“本地安全策略”窗口中,展开“账户策略”后,选中“密码策略”,就可以看到WEB机中的密码要求。如下图可见,密码长度最小值为7个字符,拿到这个点后就可以将生成彩虹表的最小位数设置为7,为避免浪费过多时间将最大位数也设置为7。但是在这里我们知道123456是6位数,为了便于实验的理解所以我们设置最小、最大位数都为6即可。

表索引我们设置为0;链长度是指单文件密码串长度,最小为16,我们也设置为16;链数量是指数量越大密码就越多,经过多次测试设置为68500是可以快速生成彩虹表且占用硬盘空间最低的有效数值;索引块是彩虹表的标识,我们设置为0,例如有许多单文件,靠这个标识来判断是否属于同一个彩虹表。由于本实验的实际情况,需要生成的彩虹表比较大,占用系统资源较多,所以这个步骤就拿123456这种简单密码作为彩虹表这项技术的了解。
还可以根据官方文档: http://project-rainbowcrack.com/generate.htm ,确定最终命令所需要的参数。
最后结合每一项获取的信息,拼凑出我们需要使用到的命令是:
rtgen.exe ntlm numeric 6 6 0 16 68500 0
使用CMD在Rainbowcrack根目录执行以上命令后,就会在根目录中生成一个以.rt结尾的文件,里面就是生成的彩虹表。

创建完彩虹表后,还需要对其进行排序,注意不要中断排序,不然彩虹表可能会被损坏,注意命令后有一点:
Rtsort.exe .

最后打开Rcrack_Gui.exe,点击菜单栏中的“Rainbow Table”→“Search Rainbow Tables…”选用刚刚创建的彩虹表,然后就会快速破解匹配出密码。
问题:为什么从导出的SAM文件可以将用户的密码HASH抓取出来?
这需要了解NTLM本地认证过程。用户的密码存储在本地计算机的SAM文件里,其路径为%SystemRoot%\system32\config\SAM。当用户在 Windows 本地登录时,输入密码后,用户输入的密码将为被转化为 NTLM Hash,然后与SAM中的NTLM Hash进行比较。当用户注销、重启、锁屏后,操作系统会调用winlogon.exe进程显示登录界面(用户名和密码的输入框)。当winlogon.exe进程接收到用户输入的密码后,会将密码交给lsass进程。lsass.exe 是一个系统进程,用于微软Windows系统的安全机制。它用于本地安全和登录策略,lsass.exe进程将明文密码加密成 NTLM Hash,对SAM数据库比较认证。
在学习中,需要理解工具能够实现其功能的内部原理,而不仅仅是停留在工具的使用上。

浙公网安备 33010602011771号