【问题标题】:Learning python for security, having trouble with su学习python的安全性,su遇到问题
【发布时间】:2014-01-17 06:29:14
【问题描述】:

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

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

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

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

我对此非常绝望,只是为了完成挑战。我已经在 reddit、IRC 和我所有的编程向导朋友中询问过,除了 echo "password" |sudo -S su,由于用户不在 sudoers 文件中,它无法工作,我做不到。当我只用 echo "password"| 尝试同样的事情时su 我得到 su: 必须从终端运行。这是在 # 和 $ 提示符处。

这可能吗?

【问题讨论】:

  • 您需要打开一个“伪电传”或 Pty 设备,通过它与“su…”进行通信

标签: python linux security


【解决方案1】:

问题是su 和朋友直接从进程的控制终端读取密码,而不是从标准输入。解决这个问题的方法是启动你自己的“伪终端”(pty)。在 python 中,你可以使用the pty module 来做到这一点。试试看。

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

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

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

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 中它是一个结构或诸如此类)。玩得开心!

【讨论】:

  • 好的,很抱歉,我不熟悉如何执行此操作。我正在按照文档中的示例进行操作,但是我对编程非常陌生,并且遇到了关于如何打开 pty 并仍然将某些内容导入其中的问题。
  • 很公平——python 文档并没有真正解释任何事情。我添加了一个最小的例子来帮助你。
【解决方案2】:

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

【讨论】:

  • 这对他真正的问题没有任何帮助,即“如何从我的代码中将密码发送到 'su'?”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-24
  • 2019-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多