此前文章已经介绍了什么是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
传输文件
在目前的网络环境中,我们有非常多的传输工具,例如:FTP
、SCP
、SYNC
等等。所以,小弟在实际工作中,也从来没有使用Ncat
传输过文件,这里仅作为演示使用。
这里准备了一个main.py
文件,我们将此文件传输到客户端上。
我们首先需要确保当前路径下存在该文件,可以使用ls -l
来打印一下文件信息:
ls -l main.py
而后我们将需要发送的文件的机器,使用Ncat
开启一个服务器。
nc -v -l --send-only 0.0.0.0 8080 < main.py
上述命令表示开启一个tcp
的8080
,当客户端连接上qw来后,就将main.py
内容发送给客户端。使用--send-only
的意思是只用发送数据,忽略接收,且以EOF
结束。
执行后,结果如下:
作为接收方,我们连接到该Ncat
服务器后,将数据包中的数据重定向本地即可,例如:
nc -v 127.0.0.1 8080 > new_python_files
执行结果为:
上述结果可见文件已经同步过来了。
如上操作使用的比较少,还有一种操作使用的比较多,就是利用压缩软件,进行发送多个文件,这个命令非常有用,且涉及篇幅较长,所以先留一个坑,后续做补充。
使用Ncat
劫持shell
Ncat
作为运维最常用的软件之一,其功能强大,有利也有弊,本段落将介绍一下Ncat
如何略过ssh
认证,将终端给映射出去的。
这里做个小实验,将/bin/bash
命令通过udp
的22
端口给映射出去,而后再使用Ncat
客户端连接该udp
端口,实现略过linux
认证拿到权限。
映射命令:
nc -e "/bin/bash" -u -l 0.0.0.0 22 -k -v
如上命令,将对所有网卡开启一个udp
的22
端口,当有客户端连接上来后,会执行/bin/bash
,该命令是centos
的默认shell
。
连接服务器:
作为客户端,像使用其他nc
一样,连接该服务器udp
端口为22
套接字就好。
nc -uv 127.0.0.1 22
连接上服务器后,就可以操作任何事情了,例如:
如上,我们将/bin/bash
给劫持出去后,通过客户端直接可以连接上来,无需身份认证,我们分别执行了查询当前服务器22端口使用情况以及打印一下进程信息,只取前10个。
非常可怕对吧,那么作为普通程序员,如何避免此类情况发生呢,其实只要牢记运维三板斧就可以了,分别是 设置高强度密码 、最小化进程权限、最小化防火墙 就可以了。
所谓的三板斧,到底是什么意思呢:
- 高强度密码是为了避免服务被爆破。
- 最小化进程权限是为了避免黑客通过开源软件(例如
redis
)漏洞进入服务器后大肆破坏,所以可以新建一个用户,专门用以启动该服务,及时被攻击了,这样损失也是最少的。 - 最小化防火墙则是避免不必要的端口开出去以便给黑客提供可乘之机,例如,
ssh
服务仅需开放tcp
的22
就可以了,没必要将tcp/udp
都打开。
总结
该篇文章介绍了Ncat
这些小功能,简单介绍了使用Ncat
创建聊天室并且为其创建SSL
通道,使用Ncat
传输文件,最后介绍了使用Ncat
劫持shell
终端。Ncat
是非常好的工具,运维人员熟练使用它,知道其利弊,才可以让手上的工作得心应手。