为安全学习python,遇到su问题

时间:2014-01-17 06:29:14

标签: python linux security

前言:我完全清楚,如果没有在测试机器上,这可能是非法的。我这样做是为了学习安全和渗透测试python的学习练习。这只能在我拥有并完全控制的Linux机器上完成。

我正在学习python作为我的第一个脚本语言,希望能够在安全位置使用。在询问脚本的想法以帮助自学时,有人建议我为用户枚举创建一个。想法很简单,从没有sudo权限的帐户中删除/ etc / passwd中的用户名并尝试'su '使用我拥有的一个密码进入这些帐户。一种反向蛮力,而不是一个具有密码列表的用户,我使用一个密码和一个用户列表。

我的问题是,无论我如何处理此问题,脚本都会在“密码:”提示符处挂起或停止。我尝试了多种方法,从使用os.system并回显密码,将其作为变量传递,并使用pexpect模块。似乎没什么用。

当我谷歌时,所有的建议都指向使用sudo,在这种情况下,sudo不是一个有效的选项,因为我有权访问的用户,没有sudo权限。

我对此非常绝望,只是为了完成挑战。我已经在IRC和我的所有编程向导朋友中询问了reddit,并且超出了回显“密码”| sudo -S su,由于用户不在sudoers文件中而无法工作,我很快就会出现问题。当我用echo“password”|尝试同样的事情时我得到su:必须从终端运行。这是#和$提示符。

这甚至可能吗?

2 个答案:

答案 0 :(得分:2)

问题是su和朋友直接从控制终端为进程读取密码,而不是从stdin读取密码。解决这个问题的方法是启动你自己的“伪终端”(pty)。在python中,您可以使用the pty module执行此操作。试试看。

编辑: python的pty模块的文档并没有真正解释任何内容,所以这里有一些来自pty设备的Unix手册页的上下文:< / p>

  

伪终端是一对字符设备,即主设备        设备和从设备。从设备提供给进程a        界面与tty(4)中描述的界面相同。然而,尽管如此        提供tty(4)中描述的接口的其他设备具有        在它们后面的某种硬件设备,相反,从设备        另一个进程通过伪的主半部操纵它        终奌站。也就是说,在主设备上写入的任何内容都会被赋予        从设备作为输入,从设备上写入的任何内容都作为主设备上的输入显示。 [强调我的]

让你的pty工作的最简单方法是使用pty.fork(),你可以像普通的分叉一样使用它。这是一个简单的(真正极小的)例子。请注意,如果您读取的字符多于可用字符,则您的进程将死锁:它将尝试从打开的管道读取,但是另一端的进程生成输出的唯一方法是if this 进程发送一些东西!

pid, fd = pty.fork()
if pid == 0:
    # We're the child process: Switch to running a command
    os.execl("/bin/cat", "cat", "-n")
    print "Exec failed!!!!"
else:
    # We're the parent process

    # Send something to the child process
    os.write(fd, "Hello, world!\n")

    # Read the terminal's echo of what we typed
    print os.read(fd, 14) ,
    # Read command output
    print os.read(fd, 22)

如果一切顺利,你应该看到:

Hello, world!

     1  Hello, world!

由于这是一个学习练习,这里是我建议的阅读列表:man forkman execl和python的subprocessos模块(因为你已经运行子进程,你可能已经知道了一些)。请记住,在Unix和python中,文件描述符(只是一个数字)和file对象之间存在差异,这是一个带有方法的python对象(在C中它是结构等)。玩得开心!

答案 1 :(得分:-1)

如果你只是想这样做学习,你可以使用自己伪造的passwd文件轻松构建一个假环境。您可以使用一些内置的python加密方法来生成密码。这有利于正确的测试用例,你知道你在寻找什么以及你应该在哪里成功或失败。