我们的正反向 socks,都是为了搭建上图中的 host → proxy
的这一步,这样是为了使用已控机器代理进目标网络。所以 socks 服务器一定是搭建在被控目标机器上的,因为我们要使用它的流量代理进内网。而一定不可能搭建在 C2 机器上,因为 C2 机器本身不在目标内网中。
具体来说,被控目标机器必须运行一个程序,用于处理 socks5,必须要有这个服务。因为被控目标机器作为代理,其作用就是转发。如果没有 socks5 服务,它用什么做转发呢(公网流量转发进内网)?
在本文中,介绍了正向 socks 代理
和 反向 socks 代理
。之所以有这两种方向的 socks 代理,是因为作为 socks sever 的那一台被控目标机器(必须出网),可能有公网 IP,也可能没有。如果没有公网 IP,那么搭建好 socks 服务之后,可能无法直接用其作为 socks 代理,这种情况下,我们就需要借助 C2 的公网 IP。
- 正向 socks
正向代理(Forward Proxy) Lhost → proxy → Rhost Lhost 为了访问到 Rhost,向 proxy 发送了一个请求并且指定目标是 Rhost,然后 proxy 向 Rhost 转交请求并将获得的内容返回给 Lhost,简单来说正向代理就是 proxy 代替了我们去访问 Rhost。
正向的 socks 也就是以目标网络中的已控失陷机器作为 socks 服务器(也就是正向代理中的 proxy)。
往往是让此机器监听本机的一个端口,这个端口提供 socks5 服务,比如:直接在已控目标机器上开个 gost -L socks5a://:1080,那失陷目标机器就直接监听 1080 了(在这一步可能需要 C2 去执行 gost 这个开启 socks 服务器的命令)。
然后就可以使用此 socks 代理了,使用任何攻击机器去连到这个 socks 代理,就可以使用此机器的流量进入目标网络。
适用情况:
正向 socks 适用于你可以连接到目标上的情况,比如目标有公网 ip,如果目标在内网,这种就没意义了,因为你在外面,他就算监听本机的端口,你也连不上。
- 反向 socks
反向代理(reverse proxy) Lhost<--->proxy<--->firewall<--->Rhost 和正向代理相反(废话),Lhost 只向 proxy 发送普通的请求,具体让他转到哪里,proxy 自己判断,然后将返回的数据递交回来,这样的好处就是在某些防火墙只允许 proxy 数据进出的时候可以有效的进行穿透。
反向 socks 代理就是为了解决上面这种情况: 目标在内网,攻击机器无法直接连接,但是通外网。
这时候没法用正向socks5,就需要反向的,反向原理上其实就是个端口转发。
比如:
C2 监听两个端口(1000 和 2000)
- 1000 用来被攻击机器连接
- 2000 用来跟目标机器进行通信
这样通过此 1000 → 2000 的端口转发,socks 代理就可以使用 C2 的公网 IP。
目标机器运行某个 exe,连接到 C2 的 1000,这样 C2 和目标就建立了 tcp 通道(这里也说明了要想搭建 socks 隧道,目标机器可以没有公网 IP,但必须出网)。
使用的时候攻击机器配置代理连接到 C2 的 2000 端口。流量是这样走的:
攻击机器访问某个内网 URL → socks5 封包发送到 C2 的 2000 端口,C2 的 exe 把这个 2000 端口收到的流量,通过 socket 直接转发给目标机(因为和目标机已经建立了 TCP),然后目标机收到 socks5 流量,转发进内网,再把请求结果发给 C2,C2 再发给攻击机器的浏览器。
其中,2000 端口就起到一个端口转发的目的,把 socks 包转发给目标机器提供的 socks5 服务程序。
CS 的 rportfwd(反向端口转发)和 reverse socks5 原理一样,使用团队服务器监听端口给攻击机器提供 socks 服务,并中继流量转发到目标机器。
感谢我的好朋友 @undefined 教我~~