Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为了安全而学习python,在su方面遇到问题_Python_Linux_Security - Fatal编程技术网

为了安全而学习python,在su方面遇到问题

为了安全而学习python,在su方面遇到问题,python,linux,security,Python,Linux,Security,前言:我完全知道,如果不是在测试机上,这可能是非法的。我这样做是为了学习python的安全性和渗透测试。这只能在我拥有并完全控制的linux机器上完成 我正在学习python作为我的第一种脚本语言,希望能在安全领域继续使用。在询问脚本的想法以帮助自学时,有人建议我创建一个用于用户枚举的脚本。想法很简单,从没有sudo特权的帐户中从/etc/passwd中找出用户名,并尝试使用我拥有的一个密码将其“su”输入这些帐户。一种反向蛮力,而不是单一用户的密码列表,即时通讯使用单一密码的用户列表 我的问题

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

我正在学习python作为我的第一种脚本语言,希望能在安全领域继续使用。在询问脚本的想法以帮助自学时,有人建议我创建一个用于用户枚举的脚本。想法很简单,从没有sudo特权的帐户中从/etc/passwd中找出用户名,并尝试使用我拥有的一个密码将其“su”输入这些帐户。一种反向蛮力,而不是单一用户的密码列表,即时通讯使用单一密码的用户列表

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

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

我在这件事上已经不顾一切了,只是为了完成挑战。我已经在reddit、IRC和我所有的编程向导朋友中询问过,除了echo“password”| sudo-S su(由于用户不在sudoers文件中而无法工作)之外,我的回答很差。当我用echo“password”su尝试同样的方法时,我得到su:必须从终端运行。这是一个#和$提示符


这可能吗?

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

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

编辑: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)
如果一切顺利,您应该看到:

你好,世界!
你好,世界!

由于这是一个学习练习,下面是我建议您阅读的清单:
manfork
manexecl
,以及python的
子流程
os
模块(因为您已经在运行子流程,您可能已经知道其中的一些内容)。请记住,在Unix和python中,文件描述符(只是一个数字)和
文件
对象之间的区别,后者是一个带有方法的python对象(在C中是一个结构或类似结构)。玩得开心

你需要打开一个“伪电传打字机”或Pty设备,通过它与“su…”进行通信。这对他的真正问题没有帮助,即“如何从我的代码向“su”发送密码?”。好的,对不起,我不知道如何做。我在遵循文档中的示例,但我对编程非常陌生,我遇到了一些问题,比如如何打开pty并将一些内容导入其中。很公平——python文档并没有真正解释任何内容。我添加了一个最简单的示例来帮助您继续。