0x00 前言
在Windows系统中,使用net use命令能够实现远程连接网络中其他计算机的共享资源,连接建立后会创建一个net session。 在渗透测试中,如果我们获得了一台Windows主机的权限,在上面发现了net session,就可以利用这个net session,使用net session的token创建进程。0x01 简介
本文将要介绍以下内容:· 查看net session的方法· net session的利用· net session的清除· 利用思路· 防御建议0x02 测试环境
COMPUTER01:· Win7 x64· 域内一台主机· 192.168.10.2· 使用帐号test1登录DC:· Server2008 R2x64· 域控服务器· 192.168.10.1
在DC上使用域管理员帐号Administrator通过net use远程连接COMPUTER01,如下图:
![36cb57bf4c21ba49deee69222f5c64a5.png](https://i-blog.csdnimg.cn/blog_migrate/6cb36ee49b1a7b616879f6b60a297585.jpeg)
0x03 查看net session的方法1、cmd命令
net session
如下图:
![2ed0cefc289f36a13a2e392d57fe57e7.png](https://i-blog.csdnimg.cn/blog_migrate/1ba06d10672c96002f2a5785f44c7b35.jpeg)
2、LogonSessions
下载地址:https://docs.microsoft.com/en-us/sysinternals/downloads/logonsessions
如下图:
![4e9e41b03a7bb468b120d4ca2182a08f.png](https://i-blog.csdnimg.cn/blog_migrate/28986cab7046579f3b2d101c09515aab.jpeg)
可以发现,net session的Logon type为Network。3、c++实现
首先通过Windows API LsaEnumerateLogonSessions()枚举当前的Logon Session。
接着使用LsaGetLogonSessionData()获得每个Logon Session的具体信息。
在程序编写上需要注意无法直接显示sid和时间,需要对格式进行转换。
开源代码地址:https://github.com/3gstudent/Homework-of-C-Language/blob/master/ListLogonSessions.cpp
代码按照LogonSessions的格式输出结果。4、mimikatz
privilege::debug token::list
如下图:
![9d1325af3e94729bd2addac001e0962b.png](https://i-blog.csdnimg.cn/blog_migrate/4764e58777d48429cd1ed8b11134ff25.jpeg)
TESTAdministrator对应的ID为6919466。补充mimikatz的命令
查看当前token:
token::whoami
恢复进程token:
token::revert
假冒成system:
token::elevate
假冒成domain admin:
token::elevate /domainadmin
假冒成enterprise admin:
token::elevate /enterpriseadmin
假冒成admin:
token::elevate /admin
假冒成id为123456的token:
token::elevate /id:1234560x04 net session的利用
net session的token保存在lsass进程中,如下图:
![c77af1e7e7a99c43b90c806ee203de2e.png](https://i-blog.csdnimg.cn/blog_migrate/532c36f255223d693c1836019f984534.jpeg)
在利用上,net session等同于对其token的利用。1、mimikatz
假冒成id为6919466的token:
token::elevate /id:6919466
如下图:
![3f89ef0a669c410349644d5939f16c1f.png](https://i-blog.csdnimg.cn/blog_migrate/875d559c0041eb29bfb0851bd80ef4a9.jpeg)
注:· 上述操作只改变了Thread Token。· Windows下有两种token:Primary Token和Impersonation Token。· Primary Token对应Process Token,每个进程都有唯一的Primary Token。· Impersonation Token对应Thread Token,可以被修改。
接下来,使用该token创建进程cmd.exe:
process::start cmd.exe
但是该命令不会使用新的Thread Token,也就是说进程cmd.exe并没有以TESTAdministrator启动。原因如下:https://github.com/gentilkiwi/mimikatz/blob/110a831ebe7b529c5dd3010f9e7fced0d3e3a46c/mimikatz/modules/kuhl_m_process.c#L38
如下图:
![8d73d7f026eac5417978d9722042d61e.png](https://i-blog.csdnimg.cn/blog_migrate/d183a26e6aa0bfb8dfea7d83ecf6d98e.jpeg)
https://github.com/gentilkiwi/mimikatz/blob/110a831ebe7b529c5dd3010f9e7fced0d3e3a46c/modules/kull_m_process.c#L490
如下图:
![bfa34e4e67beb54d87b1501f5f4328d6.png](https://i-blog.csdnimg.cn/blog_migrate/33163c4c6571915e810f96406d583b14.jpeg)
mimikatz在执行process::start命令时,使用CreateProcess创建进程,并没有传入token。解决方法:· 修改mimikatz的源码,使用CreateProcessAsUser()创建进程,能够传入Token。· 当然,我们还可以使用其他工具来实现这个过程。2、使用incognito
源代码开源地址:https://github.com/fdiskyou/incognito2
注:· 在之前的文章《渗透技巧——Token窃取与利用》曾介绍过incognito的用法· 列出当前token:
incognito.exe list_tokens -u
以"TESTAdministrator"启动cmd.exe:
incognito.exe execute -c "TESTAdministrator" cmd.exe
如下图:
![f347a3def10784d21f9e73e3f06857c8.png](https://i-blog.csdnimg.cn/blog_migrate/0d63dec82b391223f8c21b3543ca5d1f.jpeg)
net session利用成功,以用户"TESTAdministrator"启动进程cmd.exe,如下图:
![c3673695c01612aa40ac06b5a8646a37.png](https://i-blog.csdnimg.cn/blog_migrate/2cf3750cf1c85f3a8a5bc2bb37b70037.jpeg)
0x05 net session的清除1、cmd命令
net session /delete /y2、删除net use连接
net use的发起方删除连接:
net use * /del /y0x06 利用思路1、本地提权
如果尚未获得本地管理员权限,但获得了SeImpersonate或者SeAssignPrimaryToken权限,就能利用net session中的token创建新进程,实现提权。
注:
之前的文章《Windows本地提权工具Juicy Potato测试分析》和《渗透技巧——Windows Token九种权限的利用》提到过这个方法。2、域内渗透
取决于net session的权限,新创建的进程能够继承net session的token0x07 防御建议
1、域环境内限制用户权限,尽量避免使用域管理员帐户远程连接。
2、使用net use远程连接后记得及时清除。0x08 小结
本文介绍了利用net session的token创建进程的方法,分析利用思路,给出防御建议。
本文为 3gstudent 原创稿件,授权嘶吼独家发布,如若转载,请注明原文地址: http://www. 4hou.com/technology/155 18.html 更多内容请关注“嘶吼专业版”——Pro4hou