Linux Ncat 无用小功能

972 阅读6分钟

此前文章已经介绍了什么是Ncat、如果安装Ncat以及使用该工具探测TCP/UDP端口是否正常,如果你还没有看过该文章,这里推荐先查看该文章以便做到无缝连接。

Linux Ncat 探测tcp/udp端口:juejin.cn/post/724111…

本篇文章将继续介绍Ncat小工具,大概会以如下段落进行讲解:

  • 使用Ncat创建聊天室。
  • 为聊天室增加SSL认证。
  • 使用Ncat传输文件。
  • 使用Ncat劫持shell

使用Ncat创建聊天室

还记得刚参加工作的时候,经常和小伙伴通过对tty进行重定向来向对方发送消息,吐槽工作中的不快,转眼一瞧,以前和兄弟们并肩作战日子已经一去不复返了,本段落将重拾乐趣,使用Ncat创建一个聊天室,打造一个属于运维的小乐趣。

Ncat中,使用--chat可以开启一个聊天服务器,它必须和-l配合使用

nc --chat -vl 0.0.0.0 8080

上述命令开启一个聊天室,端口号为8080,监听网卡为全部网卡,且显示详细的日志。

如上命令执行后,日志会显示如下:

如上命令则证明服务器聊天室服务器开启完毕。

而后仅需在客户端连接该聊天室即可,例如:

nc -v 127.0.0.1 8080

如上,连接成功后,会为该链接分配一个用户Id,例如:

当多个客户端都连接上该服务器时候,就可以进行聊天了,例如:

由此可见,聊天室就已经建立成功了,是不是很有意思呢?快和小伙伴一起去试试吧。

为聊天室增加SSL通道

默认情况下,Ncat是通过明文进行数据发送的,这点可以通过抓包来分析,比如,使用tcpdump抓取下本地回环地址8080端口的数据包,命令为:

tcpdump -i lo -S -s 0 -A

其中上述命令,-i指定监听的网卡,这里为lo本地会换地址。-S表示将报文交互信息完整打印出来,不进行折叠,-s 0表示不进行数据分段,-A表示以ascii的形式显示数据。

这里可以先暂时关闭一个client窗口,用以启动tcpdump监听该端口。

这里来展示一下,tcpdump是如何抓取Ncat数据包的:

在最后,我们输入hello world时候,我们确实可以在tcpdump窗口看见改字符串,如:

由此可以证明,直接使用Ncat进行数据发送,走的是明文传输。如果此时恰好某位领导正在使用tcpdump监视你们的记录,那就太糟糕了。

介于此,Ncat为我们提供了ssl支持,仅需在启动服务 和 连接服务器 的时候指定--ssl即可。例如,我们启动8080,并且为此使用ssl仅需传输,可以使用如下命令来开启服务器:

nc --chat -vl 0.0.0.0 8080 --ssl

如上命令在启动服务的基础上,使用--ssl来让该链接使用ssl证书。

该命令执行成功后,会输出如下结果:

上述结果是Ncat自动生成的2048位的RSA秘钥。

作为客户端,也必须指定--ssl才能正常连接服务器,例如:

nc -v 127.0.0.1 8080 --ssl

执行结果如下:

上述命令会先进行证书秘钥交换、对称密码校验,校验成功后才能顺利连接上服务器。

如此这般,该通信通道便使用的是ssl加密的了,可以在此使用tcpdump来抓下包:

在进行ssl加密传输通道后,使用tcpdump抓包,就只能抓到加密后的消息,例如:

使用Ncat传输文件

在目前的网络环境中,我们有非常多的传输工具,例如:FTPSCPSYNC等等。所以,小弟在实际工作中,也从来没有使用Ncat传输过文件,这里仅作为演示使用。

这里准备了一个main.py文件,我们将此文件传输到客户端上。

我们首先需要确保当前路径下存在该文件,可以使用ls -l来打印一下文件信息:

ls -l main.py 

而后我们将需要发送的文件的机器,使用Ncat开启一个服务器。

 nc -v -l --send-only 0.0.0.0 8080 < main.py

上述命令表示开启一个tcp8080,当客户端连接上qw来后,就将main.py内容发送给客户端。使用--send-only的意思是只用发送数据,忽略接收,且以EOF结束。

执行后,结果如下:

作为接收方,我们连接到该Ncat服务器后,将数据包中的数据重定向本地即可,例如:

nc -v 127.0.0.1 8080 > new_python_files

执行结果为:

上述结果可见文件已经同步过来了。

如上操作使用的比较少,还有一种操作使用的比较多,就是利用压缩软件,进行发送多个文件,这个命令非常有用,且涉及篇幅较长,所以先留一个坑,后续做补充。

使用Ncat劫持shell

Ncat作为运维最常用的软件之一,其功能强大,有利也有弊,本段落将介绍一下Ncat如何略过ssh认证,将终端给映射出去的。

这里做个小实验,将/bin/bash命令通过udp22端口给映射出去,而后再使用Ncat客户端连接该udp端口,实现略过linux认证拿到权限。

映射命令:

nc -e "/bin/bash" -u -l 0.0.0.0 22 -k -v

如上命令,将对所有网卡开启一个udp22端口,当有客户端连接上来后,会执行/bin/bash,该命令是centos的默认shell

连接服务器:

作为客户端,像使用其他nc一样,连接该服务器udp端口为22套接字就好。

nc -uv 127.0.0.1 22 

连接上服务器后,就可以操作任何事情了,例如:

如上,我们将/bin/bash给劫持出去后,通过客户端直接可以连接上来,无需身份认证,我们分别执行了查询当前服务器22端口使用情况以及打印一下进程信息,只取前10个。

非常可怕对吧,那么作为普通程序员,如何避免此类情况发生呢,其实只要牢记运维三板斧就可以了,分别是 设置高强度密码 、最小化进程权限、最小化防火墙 就可以了。

所谓的三板斧,到底是什么意思呢:

  • 高强度密码是为了避免服务被爆破。
  • 最小化进程权限是为了避免黑客通过开源软件(例如redis)漏洞进入服务器后大肆破坏,所以可以新建一个用户,专门用以启动该服务,及时被攻击了,这样损失也是最少的。
  • 最小化防火墙则是避免不必要的端口开出去以便给黑客提供可乘之机,例如,ssh服务仅需开放tcp22就可以了,没必要将tcp/udp都打开。

总结

该篇文章介绍了Ncat这些小功能,简单介绍了使用Ncat创建聊天室并且为其创建SSL通道,使用Ncat传输文件,最后介绍了使用Ncat劫持shell终端。Ncat是非常好的工具,运维人员熟练使用它,知道其利弊,才可以让手上的工作得心应手。