如何使用 Proxychains / 端口转发






4.67/5 (2投票s)
使用 Proxychains 通过路由器和其他多宿主设备进行枢纽操作
介绍
Proxychains 是一个极其有用的工具,但文档却极其糟糕。在本教程中,我们将介绍如何使用 proxychains 和 SSH 连接到支持 SSH 的多宿主设备(如路由器),并利用该设备将一台机器上的流量从一个网络转发到另一个网络,通过 SSH 机器进行中转。
背景
我们将以下网络作为示例:
SOCKS 代理 - 您需要了解的部分
SOCKS 是一种代理互联网协议。它最常见的用途之一是作为规避工具,允许流量绕过互联网过滤以访问其他方式被阻止的内容。在我们的场景中,我们将使用 SOCKS 在攻击机和路由器之间创建一个专用隧道。通过该隧道,我们可以推送任何流量,这些流量将出现在路由器另一侧,位于路由器的内部网络,就好像这些流量来自路由器本身一样。假设路由器阻止了端口 445,但您想针对内部服务器 11.0.0.32 上易受攻击的端口 445。SOCKS 隧道将允许您这样做。
您不能做什么:SOCKS 是一个第 5 层协议。这意味着它不关心 OSI 模型中该层以下的任何内容!这意味着您不能使用它来隧道传输在第 5 层以下运行的协议。这包括 ping、ARP 等。从攻击者的角度来看,也很有帮助的是,如果您使用 NMAP 等工具进行基于半开放连接的扫描,它将无法让您执行扫描,因为所有这些功能都发生在第 5 层以下。
您可以做什么:通过隧道运行 metasploit 的 msfconsole、HTTP、SMTP 或任何其他应用程序层(第 7 层)协议。
我们将如何使用 SOCKS:在我们的示例中,我们假设我们拥有上述路由器中的凭据。使用这些凭据,我们将在攻击机上设置一个 SOCKS 代理服务器,该服务器通过 SOCKS 隧道连接到路由器。我们将把感兴趣的应用程序(在本例中为 msfconsole)的流量通过 SOCKS 隧道,然后进入路由器,并从路由器的内部接口发出,就好像流量来自路由器本身一样。
Proxychains - 它的作用
大多数人认为代理需要是一个单独的主机,您连接到它,它会代表您转发您的流量。然而,有可能将您本地计算机上的某个应用程序的流量通过您本地计算机上的另一个应用程序进行代理。这就是 proxychains 所做的。
Proxychains 允许我们与 SOCKS 隧道进行交互。我们可以将 proxychains 配置为将应用程序通常通过正常方式直接发送到网络的全部数据,通过 proxychains 管道传输,进入我们的 SOCKS 隧道,并通过路由器的内部接口发出。
创建 SOCKS 隧道并使用 Proxychains
步骤 1 - 使用 SSH 设置 SOCKS 服务器和 SOCKS 隧道
我们首先需要做的是设置我们的 SOCKS 服务器和到路由器的 SOCKS 隧道。这将为您的流量提供一条路径。要做到这一点,您可以使用以下命令
root@whatever: ssh -NfD <local_listening_port> <username>@<router_ip>
在我们的场景中,这看起来是这样的:
root@bt: ssh -NfD 9050 root@10.0.0.1
选项说明
-N 不执行远程命令。即:不打开 SSH 通常会打开的命令 shell。
-f 在输入凭据后将 SSH 置于后台。
-D 创建一个动态的应用程序级端口转发隧道。这是实际创建 SOCKS 服务器的部分。它会在您指定的端口(-D 之后)在您本地计算机(在我们的例子中是攻击机)上打开。通过此端口发送到您本地计算机的任何流量都将通过 SOCKS 隧道转发到路由器。
如果操作正确,路由器应该会提示您输入凭据,在您输入凭据后,SSH 将立即在后台运行。如果您在 Linux 上运行 netstat -antpu 或在 Windows 上运行 netstat -ano,您应该会在您的计算机上看到端口 9050 的监听端口。
步骤 2 - 使用 Proxychains
现在您已经设置好了 SOCKS 服务器。剩下要做的就是使用 proxychains。在 Linux 上,proxychains 配置文件存储在 /etc/proxychains.conf。它看起来应该像这样
# proxychains.conf VER 3.1
#
# HTTP, SOCKS4, SOCKS5 tunneling proxifier with DNS.
#
# The option below identifies how the ProxyList is treated.
# only one option should be uncommented at time,
# otherwise the last appearing option will be accepted
#
#dynamic_chain
#
# Dynamic - Each connection will be done via chained proxies
# all proxies chained in the order as they appear in the list
# at least one proxy must be online to play in chain
# (dead proxies are skipped)
# otherwise EINTR is returned to the app
#
strict_chain
#
# Strict - Each connection will be done via chained proxies
# all proxies chained in the order as they appear in the list
# all proxies must be online to play in chain
# otherwise EINTR is returned to the app
#
#random_chain
#
# Random - Each connection will be done via random proxy
# (or proxy chain, see chain_len) from the list.
# this option is good to test your IDS :)
# Make sense only if random_chain
#chain_len = 2
# Quiet mode (no output from library)
#quiet_mode
# Proxy DNS requests - no leak for DNS data
proxy_dns
# Some timeouts in milliseconds
tcp_read_time_out 15000
tcp_connect_time_out 8000
# ProxyList format
# type host port [user pass]
# (values separated by 'tab' or 'blank')
#
#
# Examples:
#
# socks5 192.168.67.78 1080 lamer secret
# http 192.168.89.3 8080 justu hidden
# socks4 192.168.1.49 1080
# http 192.168.39.93 8080
#
#
# 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
我知道这很长,可能令人望而生畏。就我们的目的而言,我们只关心最后一行。除非您将端口从 9050 更改为其他端口,否则您实际上不需要更改任何内容!如果您想使用其他端口,您需要将端口从 9050 更改为您在 -D 之后使用的任何端口。此外,proxychains 始终会先检查您当前目录中的配置文件,然后才会使用 /etc/proxychains.conf 中的默认配置文件。从这里使用 proxychains 非常简单
root@whatever: proxychains <name_of_application>
例如,您可以这样做
root@whatever: proxychains msfconsole
您在 msfconsole 中进行的任何操作现在都将首先通过端口 9050(或您选择的任何端口)被推送,通过您的 SOCKS 隧道,通过路由器,然后进入目标内部网络。
观察到的异常行为
在我使用 proxychains 的过程中,它有时会以奇怪的方式出现故障。例如,我尝试用
proxychains firefox
打开 Firefox,但出于某种原因不起作用。如果您在使用 proxychains 之前不关闭所有其他 Firefox 实例,它将不起作用。Proxychains 有时也会因为各种其他原因(我无法解释)而出现故障,但这并不意味着您做错了。您可能只需要重置一切并重试。