Ncat 网络工具

Ncat 网络工具

简介

  • 官网地址:
  • 功能描述
    • 读、写网络数据的命令行工具
    • 重新实现了 Netcat 的功能,并做了增强
    • Ncat 本身是为 Nmap 而写的(nmap 是一款用于网络发现和安全审计的开源工具)
  • 下载安装
  • 注意
    • Windows 使用时,不要用 PowerShell,用 CMD
    • 下面的操作主要参考官方文档做了下介绍,ncat 还有更多结合其他命令产生的神奇功能 😄 ,推荐可以看看官方文档教程的后面一点的讲解

基础说明

  • ncat 的工作模式
    • connect mode: 连接其他正在监听消息的地方,例如发送请求到服务器
    • listen mode: 监听本地进入的消息,例如监听某个端口的 TCP 请求
  • 示例
    • connect modencat <host> [<port>]
      • 不指定 --listen-l,那就是 connect mode
    • listen modencat -l [<host>] [<port>]
      • -l--listen的简写,指定为 listen mode
      • 如果不指定 host,那么会监听本地所有网卡(每个网卡一个 host 或 IP)
      • 如果不指定 port,那么默认监听 31337 端口
      • 监听模式下,收到一次数据后就会退出,可以使用--keep-open-k选项,一直保持监听
  • 默认使用 TCP 协议,手动指定
    • --udp or -u 指定 UDP
    • --sctp 指定 SCTP
  • 默认同时监听 IPv4 和 IPv6,手动指定
    • -6 强制只使用 IPv6
    • -4 强制只使用 IPv4

使用示例

基础示例

两个 ncat 互相连接
  • 先在一边启动 listen mode $ ncat -l localhost 8080
  • 再另一边启动 connect mode $ ncat localhost 8080
  • 连上后,输入内容,再按回车,就可以相互发送数据(其实随便先启动哪一边都可以)
  • 示例如下

image.png

  • 最后,一方断开后,另一方也会马上结束进程
访问 WEB 网站
  • 命令 $ ncat -C www.baidu.com 80
    • -C 可以自动替换每行的换行符为 CRLF,因为多数协议(包括 HTTP)都是把 CRLF 作为换行符
    • 必须写端口
  • 执行命令后,输入要访问路径和协议(如这里的 GET / HTTP/1.0),再按2次回车键,即可发送请求
  • 得到响应后,按 Ctrl + C 退出
C:\Users\alion\workspace\ncat>ncat -C www.baidu.com 80
GET / HTTP/1.0

HTTP/1.0 200 OK
Accept-Ranges: bytes
Cache-Control: no-cache
Content-Length: 9508
Content-Type: text/html
Date: Sun, 23 Jun 2024 12:59:41 GMT
P3p: CP=" OTI DSP COR IVA OUR IND COM "
P3p: CP=" OTI DSP COR IVA OUR IND COM "
Pragma: no-cache
Server: BWS/1.1
Set-Cookie: BAIDUID=0419D8A04450F96B63F75A6B6B42C149:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BIDUPSID=0419D8A04450F96B63F75A6B6B42C149; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: PSTM=1719145660; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BAIDUID=0419D8A04450F96BCBB75D0529D373F1:FG=1; max-age=31536000; expires=Mon, 23-Jun-25 12:27:40 GMT; domain=.baidu.com; path=/; version=1; comment=bd
Traceid: 1719145660267156378611114487503947244332
Vary: Accept-Encoding
X-Ua-Compatible: IE=Edge,chrome=1
X-Xss-Protection: 1;mode=block

<!DOCTYPE html><html>省略内容...</html>

^C
PS C:\Users\alion>
  • 因为部分网络上 IP 会自动转发多个域名,所以 IP 服务器接收参数时需要接收请求头中的 Host 参数
  • 而 ncat 发送请求时,是访问的域名的 IP ,不会像浏览器一样自动为请求头添加 Host,所以需要手动添加(顺着 GET 那一行再换行,输入标准的 HTTP 协议头即可)
  • 下面是2个例子
C:\Users\alion>ncat -C www.example.com 80
GET / HTTP/1.0

HTTP/1.0 404 Not Found
Content-Type: text/html
Date: Sun, 23 Jun 2024 12:45:05 GMT
Server: ECAcc (sac/2533)
Content-Length: 345
Connection: close

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
        <head>
                <title>404 - Not Found</title>
        </head>
        <body>
                <h1>404 - Not Found</h1>
        </body>
</html>

^C
C:\Users\alion>
C:\Users\alion>ncat -C www.example.com 80
GET / HTTP/1.0
Host: www.example.com

HTTP/1.0 200 OK
Age: 492171
Cache-Control: max-age=604800
Content-Type: text/html; charset=UTF-8
Date: Sun, 23 Jun 2024 12:40:44 GMT
Etag: "3147526947+ident"
Expires: Sun, 30 Jun 2024 12:40:44 GMT
Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT
Server: ECAcc (sac/2533)
Vary: Accept-Encoding
X-Cache: HIT
Content-Length: 1256
Connection: close

<!doctype html>
<html>
<head>
    <title>Example Domain</title>

    <meta charset="utf-8" />
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <style type="text/css">
    body {
        background-color: #f0f0f2;
        margin: 0;
        padding: 0;
        font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;

    }
    div {
        width: 600px;
        margin: 5em auto;
        padding: 2em;
        background-color: #fdfdff;
        border-radius: 0.5em;
        box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);
    }
    a:link, a:visited {
        color: #38488f;
        text-decoration: none;
    }
    @media (max-width: 700px) {
        div {
            margin: 0 auto;
            width: auto;
        }
    }
    </style>
</head>

<body>
<div>
    <h1>Example Domain</h1>
    <p>This domain is for use in illustrative examples in documents. You may use this
    domain in literature without prior coordination or asking for permission.</p>
    <p><a href="https://www.iana.org/domains/example">More information...</a></p>
</div>
</body>
</html>


^C
C:\Users\alion>
充当 WEB 服务器
  • 先创建一个 hello.http 文件,如下
HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8

<html>
  <body>
    <h1>Hello, world!</h1>
  </body>
</html>
  • 这是一个标准的 HTTP 协议的响应内容(包括响应首行、响应头、响应空行、响应体)
  • 执行命令 $ ncat -l localhost 8080 < hello.http
    • -l--listen,表示执行 listen mode,当前监听 localhost 的 8080 端口
    • < 用于指定响应内容的文件,即后面的 hello.http
  • 启动示例如下
C:\Users\alion\workspace\ncat>ncat -l localhost 8080 < hello.html

image.png

  • 注意:再次刷新浏览器页面,将得不到响应,因为 ncat 已经发送完数据了,不会重复发送(可以利用其他参数解决)
  • 同时,命令行也会显示出浏览器发送的 HTTP 请求
C:\Users\alion\workspace\ncat>ncat -l localhost 8080 < hello.html
GET / HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Cache-Control: max-age=0
sec-ch-ua: "Not/A)Brand";v="8", "Chromium";v="126", "Microsoft Edge";v="126"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cookie: username-localhost-8888="2|1:0|10:1718619189|23:username-localhost-8888|200:eyJ1c2VybmFtZSI6ICI4Y2Q5OWY2MzQ2Mzk0Yjc2OWVmMDVlMjY4ZDkzN2Q1MCIsICJuYW1lIjogIkFub255bW91cyBPcnRob3NpZSIsICJkaXNwbGF5X25hbWUiOiAiQW5vbnltb3VzIE9ydGhvc2llIiwgImluaXRpYWxzIjogIkFPIiwgImNvbG9yIjogbnVsbH0=|c94abe7443d4e6fc36f00046b59c5f2dc0e4d5db71bd3300ec789e1414ead560"; _xsrf=2|fe53bd8b|241c80727519e3c685add3990190138c|1718619189; JSESSIONID=C5276CB24F9D15A1F82BDDAFC98985AE


C:\Users\alion\workspace\ncat>
  • 当然,你也可以用另一个 ncat 直接访问,如 ncat -C localhost 8080,可以直接拿到 hello.http 的内容。

文件传输与 Broker

文件传输
  • https://nmap.org/ncat/guide/ncat-file-transfer.html
  • 方式一
    • 开启监听,并将接收到的数据保存 $ ncat -l --recv-only localhost 8080 -o hello.txt
    • 发送数据 $ ncat --send-only localhost 8080 < hello.html
  • 方式二(类似于文件服务器的方式)
    • 开启监听,准备好要发送出去的文件 $ ncat -l --send-only localhost 8080 < hello.html
    • 发送请求,获取文件 $ ncat --recv-only localhost 8080 -o hello.txt
  • 不用 -o的话,也可以尝试操作系统支持的写入符 >
作为 Broker ,广播消息
  • https://nmap.org/ncat/guide/ncat-broker.html
  • 在 listen mode 下指定 --broker,可以启动 ncat 作为网络数据交换中心
  • 当多个客户端连接它时,它会将任一客户端发送的消息转发给每个已经连接上的客户端
  • 命令
    • server $ ncat -l --broker localhost 8080
    • client 1 $ ncat -C server 8080
    • client 2 $ ncat -C server 8080
    • client 3 $ ncat -C server 8080

image.png

作为 Broker,成为文件传输中介
  • 有时候两台服务器不能互相直接访问,传输文件比较麻烦
  • 可以找它们都能访问的一台中间服务器,开启 broker 模式
  • 两台服务器再连接上这个 broker,再发送文件,即可
# 在 host3 服务器开启 broker
host3$ ncat -l --broker

# host2 服务连接上 host3 的 broker,准备将接收到的数据写入 outputfile
host2$ ncat host3 > outputfile

# host1 连上 host3 直接发送文件
host1$ ncat --send-only host3 < inputfile

# 接着 host2 就会收到数据

多人聊天室

image.png

  • 加入时,会显示自己的用户 ID,以及已经进入的的用户 ID
  • 对话时,会显示不是自己的每个人的临时用户 ID

使用 SSL,提高传输安全性

  • https://nmap.org/ncat/guide/ncat-ssl.html
  • 先生成 SSL 证书 $ openssl req -new -x509 -keyout test-key.pem -out test-cert.pem
  • listen 端启动,使用指定的证书做验证 $ ncat -l --ssl --ssl-cert test-cert.pem --ssl-key test-key.pem
  • connect 端启动,指定证书 $ ncat --ssl-verify --ssl-trustfile test-cert.pem
    • 需要先将 test-cert.pem文件提前给 connect 端

执行命令行

  • https://nmap.org/ncat/guide/ncat-exec.html
  • connect mode 和 listen mode 都可用
  • Command Execution 在接收到连接后执行命令
    • 网络连接接收到的数据,作为命令的标准输入
    • 命令执行的标准输出,作为发送的网络数据
  • 支持 3 种命令方式
    • --exec 直接执行,不带 SHELL 解释
    • --sh-exec 等价于
      • /bin/sh -c on Unix ,如 $ ncat -lk -p 8080 --sh-exec "echo -e 'HTTP/1.1 200 OK\r\n'; cat index.html"
      • cmd.exe /C on Windows,如 $ ncat -lk -p 8080 --sh-exec "echo HTTP/1.1 200 OK& echo(&type index.html"
    • --lua-exec 执行 Lua 脚本,ncat 内建有 Lua 解释器
  • exec 的示例
# listen 端
ncat -l -k --sh-exec "echo Hello." 8080

# connect 端
ncat -C localhost 8080
  • lua 示例

    • 先写一个 lua 脚本
    print("Hello, world!")
    
    • 在 listen 端执行 ncat -l --lua-exec hello-luaexec.lua
    • 在 connect 端执行 ncat -C localhost 8080
    • 接着就会触发 Lua 脚本,在 connect 端得到 Hello, world!
    • 还可以编写持续多次交互的 Lua 脚本,如下 conditional.lua
    --This is another --lua-exec demo. It displays a menu to a user, waits for her
    --input and makes a decision according to what the user entered. All happens
    --in an infinite loop.
    
    --This function reads a line of at most 8096 bytes (or whatever the first
    --parameter says) from standard input. Returns the string and a boolean value
    --that is true if we hit the newline (defined as "\n") or false if the line had
    --to be truncated. This is here because io.stdin:read("*line") could lead to
    --memory exhaustion if we received gigabytes of characters with no newline.
    function read_line(max_len)
        local ret = ""
        for i = 1, (max_len or 8096) do
            local chr = io.read(1)
            if chr == "\n" then
                return ret, true
            end
            ret = ret .. chr
        end
    
        return ret, false
    end
    
    while true do
    
      print "Here's a menu for you: "
      print "1. Repeat the menu."
      print "0. Exit."
    
      io.write "Please enter your choice: "
      io.flush(io.stdout)
      i = read_line()
    
      --WARNING! Without this line, the script will go into an infinite loop
      --that keeps consuming system resources when the connection gets broken.
      --Ncat's subprocesses are NOT killed in this case!
      if i == nil then
        break
      end
    
      print("You wrote: ", i, ".")
    
      if i == "0" then
        break
      elseif i == "1" then
        print "As you wish."
      else
        print "No idea what you meant. Please try again."
      end
    
      print() --print a newline
    end
    
    • 使用该脚本,可以一直交互输入、输出,直到 Lua 脚本执行完
    • 用 Lua 脚本做类似 apache httpd 的服务,见脚本 httpd.lua
      • 在需要作为资源服务的目录下执行命令 $ ncat -l 8080 --keep-open --lua-exec C:\Users\xxx\app\ncat\scripts\lua\httpd.lua
      • 使用浏览器访问 http://localhost:8080/ ,默认会读取该目录下的 index.html
      • 可以自己指定具体的文件名,如 http://localhost:8080/test.txt

访问控制

# 只允许某一个能访问,其他的不能访问
ncat -l --allow 192.168.0.125
ncat -l --allow 2001:db8::7d
ncat -l --allow trusted.example.com

# 只拒绝某一个的请求,允许其他所有的
ncat -l --deny 192.168.0.200
ncat -l --deny 2001:db8::c8

# 按范围限定
ncat -l --allow 192.168.0.0/24
ncat -l --allow 192.168.0.0-255
ncat -l --allow 2001:db8::/32

# 从文件指定
ncat -l --allowfile trusted-hosts.txt
ncat -l --denyfile external-hosts.txt
  • 限定最大连接数 --max-conns-m,默认为 100,windows 默认为 60
    • 示例$ ncat -l --max-conns 5

实现代理

  • https://nmap.org/ncat/guide/ncat-proxy.html
  • 支持 SOCKS 4、SOCKS 5、HTTP
  • 语法样例
    • ncat --proxy <proxyhost>[:<proxyport>] --proxy-type { http | socks4 | socks5 } <host> [<port>]
  • 参数
    • --proxy-type 指定代理类(http/socks4/socks5),默认是 http
    • 如果有认证,需要指定 auth 配置
      • HTTP/SOCKS5 用--proxy-auth <username>:<password>
      • SOCKS4 用 --proxy-auth <username>
    • 不指定 proxyport 的话,默认是 31337
  • 方式一
    • 将监听本地端的请求,将请求转发到某个代理服务,再由代理服务器发出请求(和常用的本地代理软件一样)
  • 方式二(只支持 http)
    • 启动监听,将自己作为代理服务器
ncat -l 3128 --proxy-type http

ncat -l 3128 --proxy-type http --proxy-auth <user>:<pass>
  • 27
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Ubuntu 18.04上安装Ncat,可以按照以下步骤进行操作: 1. 打开终端并输入以下命令以更新系统软件包列表: ``` sudo apt update ``` 2. 输入以下命令以安装Ncat: ``` sudo apt install ncat ``` 3. 输入系统管理员密码并确认安装。 4. 安装完成后,您可以通过在终端中输入以下命令来验证Ncat是否成功安装: ``` ncat --version ``` 这将显示Ncat的版本信息。 请注意,以上步骤是在Ubuntu 18.04上安装Ncat的常规方法。如果您使用的是其他Linux发行版,请参考该发行版的官方文档或相关资源以获取正确的安装步骤。 <span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Ubuntu 18.04及其他版本Linux 下 Nmap 网络扫描工具的安装与使用](https://blog.csdn.net/weixin_42502345/article/details/116833875)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [ansible-role-netcat:安装Netcat的Ansible角色](https://download.csdn.net/download/weixin_42134878/16604473)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值