nc端口转发
ssooking Lv5

网络情况

主机 IP 类型
macOS 192.168.10.100 攻击机
kali 192.168.19.147 跳板机
Ubuntu 192.168.19.153 目标机

端口转发实验

ps: nc每次请求连接建立后都会关闭,即单次连接。每次连接过后,都需要重新执行一次nc转发命令。解决方法见后文。

且nc命令在第一个远程连接结束后会结束监听。如果需要保持运行,需要添加-k参数。

场景1:正向转发1

macOS能访问kali,但是不能访问Ubuntu。kali能访问Ubuntu任意端口。

目标:macOS想访问到Ubuntu的22端口。

思路:用kali做跳板机,把访问kali 8888端口的数据转发到Ubuntu的22端口

方法:在kali上执行一条nc转发命令即可

1
2
3
4
5
6
nc -l -p 8888 -c "nc 192.168.19.153 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

此时在macOS上用ssh连接kali的8888端口,或者直接在kali上ssh连接本地8888端口,即可登陆Ubuntu的22端口。

1
ssh -p 8888 username@192.168.19.147

场景1:正向转发2

macOS能访问kali,但是不能访问Ubuntu。Ubuntu防火墙有过滤,kali不能访问Ubuntu的22端口,但是可以访问其他端口如9999。

目标:macOS想访问到Ubuntu的22端口。

思路

  • 目标机器Ubuntu上用nc把22端口转发到9999端口
  • kali上监听8888端口,并使用nc把访问kali 8888端口的数据转发到Ubuntu的9999端口
  • macOS通过访问kali的8888端口,即可正向连接到ubuntu的22端口。

操作

目标Ubuntu:

1
2
3
4
5
6
nc -l -p 9999 -c "nc 127.0.0.1 22"

#如果没有-c参数
mkfifo /tmp/pipe && nc -l -p 9999 </tmp/pipe | nc 192.168.19.153 22 >/tmp/pipe
# or
mkfifo /tmp/pipe && nc -k -l 9999 0</tmp/pipe | nc localhost 22 | tee /tmp/pipe

跳板机kali:

1
2
3
4
5
6
nc -l -p 8888 -c "nc 192.168.19.153 9999"

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

攻击机:macOS:

1
ssh -p 8888 username@192.168.19.147

解决nc单次连接问题

常见nc版本

  • nc、ncat、netcat

  • nc -c netcat-traditional

nc

1
2
3
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

1
2
3
4
5
# 本地转发
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’强制服务器保持连接状态并继续侦听端口:

1
2
3
4
#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

1
2
3
4
5
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

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

常见nc端口转发命令:

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

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

OSX:

1
2
3
4
mkfifo a
mkfifo b
nc 127.0.0.1 8000 < b > a &
nc -l 8001 < a > b &

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

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

Linux:

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

Reference

  • Post title:nc端口转发
  • Post author:ssooking
  • Create time:2020-05-08 10:48:00
  • Post link:https://ssooking.github.io/2020/05/nc端口转发/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.