为了安全学习python,遇到了麻烦

前言:我完全知道,如果不是在testing机器上,这可能是非法的。 我正在做这个学习python安全和渗透testing的学习练习。 这只会在我拥有的Linux机器上完成,并完全控制。

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

我的问题是,无论我如何接近这个,脚本挂起或停在“密码:”提示。 我已经尝试了多种方法,从使用os.system和回显密码,将其作为variables传递,并使用pexpect模块。 似乎没有任何工作。

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

为了完成这个挑战,我对此绝望不已。 在IRC和我所有的编程向导朋友中,我已经询问了reddit,并且超出了echo“password”| sudo -S su,哪个用户不在sudoers文件中,所以不能工作。 当我只用echo“password”|尝试同样的事情 su我得到su:必须从terminal运行。 这是#和$提示符。

这甚至有可能吗?

问题是su和朋友直接从控制终端读取密码,而不是stdin。 解决这个问题的方法是启动你自己的“伪终端”( pty )。 在python中,你可以用pty模块做到这一点。 试一试。

编辑: python的pty模块的文档没有真正解释任何东西,所以这里是从Unix手册页为pty设备的一些上下文:

伪终端是一对字符设备,主设备和从设备。 从设备向进程提供与tty(4)中描述的相同的接口。 然而,提供tty(4)中描述的接口的所有其他设备都具有某种类型的硬件设备,相反,从设备具有通过伪终端的主半部分操作的另一个过程。 也就是说, 写在主设备上的任何东西都会作为输入提供给从设备,写在从设备上的任何东西都会作为主设备上的输入。 [强调我的]

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

 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中是一个结构或类似的))之间的区别。 玩的开心!

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