为了安全性学习python,在使用su时遇到问题

2024-10-03 13:30:51 发布

您现在位置:Python中文网/ 问答频道 /正文

前言:我完全知道,如果不是在试验机上,这可能是非法的。我这样做是为了学习python的安全性和渗透性测试。这只能在我拥有并完全控制的linux机器上完成。在

我正在学习python作为我的第一种脚本语言,希望能在安全性方面得到应用。在询问脚本的想法来帮助我自学时,有人建议我为用户创建一个脚本枚举想法很简单,从一个没有sudo特权的帐户中找出/etc/passwd中的用户名,并尝试使用我拥有的一个密码“su”进入这些帐户。这是一种逆向蛮力,Im使用一个带有用户列表的密码,而不是一个拥有密码列表的用户。在

我的问题是,无论我如何处理这个问题,脚本在“Password:”提示符处挂起或停止。我尝试了多种方法,从操作系统将密码作为变量传入,并使用pexpect模块。似乎什么都没用。在

当我搜索它时,所有的建议都指向使用sudo,在这个场景中,sudo不是一个有效的选项,因为我有权访问的用户没有sudo特权。在

我已经不顾一切了,只是为了完成挑战。我问过reddit,在IRC和我所有编程向导的朋友,除了echo“password”| sudo-su之外,它不能工作,因为用户不在sudoers文件中,我就来不及了。当我尝试同样的事情只是回显“密码”| su我得到su:必须从终端运行。这是在#和$提示符处。在

这有可能吗?在


Tags: 用户脚本机器密码列表linuxsudo帐户
2条回答

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

问题是su和朋友直接从进程的控制终端读取密码,而不是从stdin读取。解决这个问题的方法是启动您自己的“伪终端”(pty)。在python中,可以使用the ^{} module来实现这一点。试试看。在

编辑:python的pty模块的文档并没有真正解释任何东西,因此下面是pty设备的Unix手册页中的一些上下文:

A pseudo terminal is a pair of character devices, a master device and a slave device. The slave device provides to a process an interface identical to that described in tty(4). However, whereas all other devices which provide the interface described in tty(4) have a hardware device of some sort behind them, the slave device has, instead, another process manipulating it through the master half of the pseudo terminal. That is, anything written on the master device is given to the slave device as input and anything written on the slave device is presented as input on the master device. [emphasis mine]

让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)

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

^{pr2}$

由于这是一个学习练习,我建议您阅读以下内容:man forkman execl,以及python的subprocess和{}模块(因为您已经在运行子进程,所以您可能已经知道了其中的一些内容)。请记住,在Unix和python中,文件描述符(它只是一个数字)和file对象之间的区别,后者是一个带有方法的python对象(在C中是一个结构或类似的)。玩得高兴!在

相关问题 更多 >