前言:我完全清楚,如果没有在测试机器上,这可能是非法的。我这样做是为了学习安全和渗透测试python的学习练习。这只能在我拥有并完全控制的Linux机器上完成。
我正在学习python作为我的第一个脚本语言,希望能够在安全位置使用。在询问脚本的想法以帮助自学时,有人建议我为用户枚举创建一个。想法很简单,从没有sudo权限的帐户中删除/ etc / passwd中的用户名并尝试'su '使用我拥有的一个密码进入这些帐户。一种反向蛮力,而不是一个具有密码列表的用户,我使用一个密码和一个用户列表。
我的问题是,无论我如何处理此问题,脚本都会在“密码:”提示符处挂起或停止。我尝试了多种方法,从使用os.system并回显密码,将其作为变量传递,并使用pexpect模块。似乎没什么用。
当我谷歌时,所有的建议都指向使用sudo,在这种情况下,sudo不是一个有效的选项,因为我有权访问的用户,没有sudo权限。
我对此非常绝望,只是为了完成挑战。我已经在IRC和我的所有编程向导朋友中询问了reddit,并且超出了回显“密码”| sudo -S su,由于用户不在sudoers文件中而无法工作,我很快就会出现问题。当我用echo“password”|尝试同样的事情时我得到su:必须从终端运行。这是#和$提示符。
这甚至可能吗?
答案 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 fork
,man execl
和python的subprocess
和os
模块(因为你已经运行子进程,你可能已经知道了一些)。请记住,在Unix和python中,文件描述符(只是一个数字)和file
对象之间存在差异,这是一个带有方法的python对象(在C中它是结构等)。玩得开心!
答案 1 :(得分:-1)
如果你只是想这样做学习,你可以使用自己伪造的passwd文件轻松构建一个假环境。您可以使用一些内置的python加密方法来生成密码。这有利于正确的测试用例,你知道你在寻找什么以及你应该在哪里成功或失败。