一、netcat
1.安装netcat(nc)
yum install nmap-ncat -y
在debian(kali linux)下安装的话使用:
apt install ncat -y
但安装nmap时都会自动安装nc。
2.nc的基本使用
1)使用nc连接端口
nc -vn 104.192.80.196 80 nc -v pop3.163.com 110
其中-v表示显示详细信息,-n表示不使用DNS解析(后面跟IP地址)。
2)使用nc发送http请求
root@kali:~# echo -e "GET / HTTP/1.0\r\nHost: 104.192.80.196\r\n\r\n" | nc 104.192.80.196 80 HTTP/1.1 200 OK Date: Fri, 17 Apr 2020 03:53:02 GMT Server: Apache/2.4.6 (CentOS) Last-Modified: Tue, 14 Apr 2020 23:49:50 GMT ETag: "11-5a348daf78e58" Accept-Ranges: bytes Content-Length: 17 Connection: close Content-Type: text/html; charset=UTF-8 <h1>Test...</h1>
注意空行,否则会失败。
请求百度首页:
echo -e "GET / HTTP/1.0\r\nHost: www.baidu.com\r\n\r\n" | nc www.baidu.com 80
3)交互式请求
root@kali:~# nc -C -v 104.192.80.196 80 Ncat: Version 7.80 ( https://nmap.org/ncat ) Ncat: Connected to 104.192.80.196:80. GET / HTTP/1.0 Host: 104.192.80.196 HTTP/1.1 200 OK Date: Fri, 17 Apr 2020 04:46:32 GMT Server: Apache/2.4.6 (CentOS) Last-Modified: Tue, 14 Apr 2020 23:49:50 GMT ETag: "11-5a348daf78e58" Accept-Ranges: bytes Content-Length: 17 Connection: close Content-Type: text/html; charset=UTF-8 <h1>Test...</h1>
-C表示换行时使用"\r\n"。
3.使用nc进行socket连接(数据传输)
1)实验
A机器执行:
nc -l -p 4444
创建一个socket服务,监听4444端口。
B机器执行:
[root@centos7-devel ~]# nc -nv 192.168.4.146 4444 Ncat: Version 7.50 ( https://nmap.org/ncat ) Ncat: Connected to 192.168.4.146:4444. hello
192.168.4.146是A机器的IP,这里用B机器连接4444端口建立TCP连接,然后发送hello给A机器。
可以看到A机器的结果:
root@kali:~# nc -l -p 4444 hello
A机器已经接收到了B机器发送的"hello"信息。
反过来,从B机器发送信息给A机器,A机器也能正确接收。相当于AB之间建立了一个socket连接。
2)基于nc的数据传输有什么用
可以用于电子取证,我们要进行电子取证的时候,应该尽可能的不要在被审计的机器上保存数据(避免覆盖硬盘上的证据数据)。
这时,我们可以将取证到的数据通过nc直接发送给远程服务器。
例如在A机器上监听了4444端口:
nc -l -p 4444
在B机器上将获取的数据传递给A:
ls -l | nc -nv 192.168.4.146 4444
这里假设ls -l是获取到的取证数据。
实例:
收集B机器当前的所有进程信息,传递给A机器,并保存下来。
# A机器(接收方) nc -l -p 4444 > ps.txt
# B机器(发送方) ps -ef | nc -nv 192.168.4.146 4444
收集B机器的lsof信息(已打开文件信息):
# B机器 lsof | nc -nv 192.168.4.146 4444
3)将nc作为文件传输工具
# A机器(接收方) nc -lp 4444 > 1.mp4
# B机器(发送方) nc -nv 192.168.4.146 4444 < 1.mp4
可以实现类似scp等工具的文件传输功能。
或者,反向从A传输给B:
# A机器(发送方) nc -q 1 -lp 4444 < 2.mp4 # B机器(接收方) nc -nv 192.168.4.146 4444 > 2.mp4
传递目录(通过压缩包传输):
# A机器(发送方),将目录打包成文件交给nc tar -cvf - music/ | nc -lp 4444
# B机器(接收方),将接收的文件交给tar解包 nc -nv 192.168.4.146 4444 | tar -xvf -
4)远程克隆硬盘
# A机器(接收方),将接收的数据全部写到分区中 nc -lp 4444 | dd of=/dev/sdb1
# B机器(发送方),将某个设备的数据全部发送到A机器 dd if=/dev/sda | nc -nv 192.168.4.146 4444
这样就可以实现硬盘数据的远程备份,可以保证电子取证的数据安全。
4.nc进行端口扫描
nc -nvz 104.192.80.196 80
特别注意,这里的-z是只报告连接信息(端口是否开启)。
注意,这里使用的nc版本如下:
[root@centos7-test ~]# nc --version Ncat: Version 7.50 ( https://nmap.org/ncat )
这个版本的nc不支持端口范围扫描,所以可能需要通过shell脚本来实现多端口扫描。
二、socat
socat全程为Socket Cat,可以看成是netcat的加强版。
参考资料:https://www.hi-linux.com/posts/61543.html
1.socat进行tcp连接
[root@centos7-test ~]# echo -e "GET / HTTP/1.0\r\nHost: 104.192.80.196\r\n\r\n" | socat - TCP:104.192.80.196:80 HTTP/1.1 200 OK Date: Fri, 17 Apr 2020 06:37:19 GMT Server: Apache/2.4.6 (CentOS) Last-Modified: Tue, 14 Apr 2020 23:49:50 GMT ETag: "11-5a348daf78e58" Accept-Ranges: bytes Content-Length: 17 Connection: close Content-Type: text/html; charset=UTF-8
2.使用socat进行数据传输
和nc很类似:
# A机器 root@kali:~# socat TCP-LISTEN:7000 -
# B机器 [root@centos7-test ~]# socat - TCP:192.168.4.146:7000 hello
B机器发送"hello",A机器可以正确收到hello。
3.通过socat实现NAT,内外网端口映射
假设A机器连接公网和内网。B机器只有内网。
如果我们想将B机器的某个端口映射到公网上,则可以进行如下配置:
# A机器 socat tcp-listen:1234 tcp-listen:3389
# B机器 socat tcp:192.168.4.55:1234 tcp:192.168.1.34:3389
假设A机器内网地址为192.168.4.55,B机器内网地址为192.168.4.34。
这样配置,相当于如下图所示:
可以看到,A主机的socat监听了3389和1234两个端口,而B主机的socat连接了A主机的1234端口和自己的3389端口。访问A主机的3389端口的数据(公网)会被转发到B主机的3389端口(内网)。而从B主机3389端口(内网)发出的数据,也会转发到A主机的3389端口(公网)。
通过以上过程,就实现了一个简单的端口映射(内网穿透)。但还是推荐使用专业的内网穿透工具FRP(https://mp.weixin.qq.com/s/8HeeDC5x5xozElN8GzQLLw)。
===