【问题标题】:How would I go about writing a Linux TTY sniffer?我将如何编写 Linux TTY 嗅探器?
【发布时间】:2010-04-16 19:40:57
【问题描述】:

出于教育目的(不是任何人都应该关心这种练习背后的动机),我想编写一个可以读取/写入备用 ttys/ptys 的程序。我读过papers(从 1990 年代开始),但不能使用他们在现代 Linux/glibc 上使用的实现

我希望过去有人对此进行过研究(过去不是太远),或者至少阅读了与此相关的文档,他们可以提供,这将进一步启发我。

我还想知道(考虑到 Linux 没有流的事实)这个练习是否必须通过可加载的内核模块 [lkm] 来完成。

我有很多问题,并且可能对允许实现此类目标的一些基本意识形态存在误解,有人可以帮忙吗? :)

【问题讨论】:

  • @SjB alienate 是正确的,这是一个不同的问题 - 在那个问题中,OP 正在尝试使用低级套接字(称为原始套接字,因为缺少应用程序层)来嗅探网络流量。在这里,OP 正在尝试从字符设备中读取。

标签: c linux sniffing tty


【解决方案1】:

Phrack 文章中的 linspy.c 代码是一个 Linux 内核模块。它不会针对现代内核进行编译,因为内部内核接口经常更改。

但是,它使用的基本方法是可靠的(尽管它完全缺少在 SMP 环境中正确性所需的锁定),并且通过应用足够的肘部润滑脂,您应该能够将其移植到针对最新内核进行编译。

【讨论】:

  • @caf 然后我会重新阅读它,并尝试重新实现它。谢谢。
【解决方案2】:
function spy() {
    ptsnum=`ps awfux | grep pt[s]\/"$1" | awk '/bas[h]/{print $2}'` ;
    /usr/bin/strace -s 1000 -t -f -p $ptsnum 2>&1 3>&1 \
    | grep -Poi 'write(...\"[[:print:]]{1,2}\"[.][.][.][,]..)' ;
}

[436] klikevil@epiphany ~ $ w

    09:36:43 up 12:06,  6 users,  load average: 0.46, 0.29, 0.20
    USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT

    klikevil pts/0    75.125.126.8     23:05    2:19m 10:33   0.18s cmd
    klikevil pts/1    75.125.126.8     00:18    6:50m  0.06s  0.04s sshd: klikevil [priv]
    klikevil tty7     :0               09:02   17:07m  2:02   0.32s x-session-manager
    klikevil pts/2    :0.0             09:03    3:30   0.08s  0.08s bash
    klikevil pts/3    :0.0             09:03    0.00s  0.76s  0.00s w
    klikevil pts/4    :0.0             09:06    3:13   0.46s  0.00s /bin/sh /usr/bin/thunder


[437] klikevil@epiphany ~ $ spy 2
write(2, "e"..., 1)
write(2, "c"..., 1)

write(2, "h"..., 1)
write(2, "o"..., 1)
write(2, " "..., 1)
write(2, "s"..., 1)
write(2, "u"..., 1)
write(2, "p"..., 1)
write(2, " "..., 1)
write(2, "d"..., 1)
write(2, "o"..., 1)

write(2, "g"..., 1)
write(2, "\n"..., 1)
^C

如果您不介意通过一堆换行符进行排序,似乎工作得很好。至于 TTY..tail -f /dev/vcsa1-6

杰西卡

【讨论】:

  • A 尝试修复您的格式(bbcode 或 html 标记在此处不起作用)如果不需要请投诉,我将恢复编辑。
  • 没问题,我提交的变量的反引号也没有;应该是:ptsnum=`ps awfux | grep pt[s]\/"$1" | awk '/bas[h]/{print $2}'`
【解决方案3】:

我两次通过 ssh 进入远程 linux 机器,生成 /dev/pts/0 和 /dev/pts/1。从 0 开始,我可以打开 1 进行读取,从而窃取用户输入到 1 的所有内容。如果我想让他们看到他们的输入,我必须将其写回 /dev/pts/1。当然,他们的输入永远不会进入他们的 shell,所以我必须在我的最后(在 0 上)创建一个 shell 进程并将他们的输入通过管道传输,然后将 shell 传回 1。

这一切对我来说都很棒。在这一切进行的同时,我可以在任何我喜欢的地方保存在此过程中读取和写入的所有数据。

当然,除非您是 root 用户或正在窥探您拥有的会话,否则您不能这样做,但您只是出于教育目的,对吧?

【讨论】:

  • 我认为我想这样做并不重要,这样我就可以对回答我问题的人无礼。无论如何,您的回答对我没有帮助,谢谢。
  • 简单地用 cat 和两个伪 tty (guake) 进行了尝试:看起来这种方法不可靠,因为存在竞争条件:有时 cat 抓取输入,但有时是“原始”过程。
猜你喜欢
  • 2014-01-22
  • 1970-01-01
  • 2011-02-23
  • 2014-04-08
  • 1970-01-01
  • 1970-01-01
  • 2010-10-20
  • 2011-09-02
  • 1970-01-01
相关资源
最近更新 更多