首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何完全在python中实现tcpflow功能(遵循tcp流)

如何完全在python中实现tcpflow功能(遵循tcp流)
EN

Stack Overflow用户
提问于 2012-01-05 21:58:06
回答 2查看 7K关注 0票数 4

我正在用python (platform is linux)编写一个工具,任务之一是捕获一个活动的tcp流,并将一个函数应用到每一行。目前我正在使用

代码语言:javascript
复制
import subprocess
proc = subprocess.Popen(['sudo','tcpflow', '-C', '-i', interface, '-p', 'src', 'host', ip],stdout=subprocess.PIPE)

for line in iter(proc.stdout.readline,''):
    do_something(line)

这很好(在/etc/sudoers中有适当的条目),但我想避免调用外部程序。

到目前为止,我已经研究了下列可能性:

  • 流盘:一个看上去很像我所需要的python工具,但是:它在内部使用侏儒,它已经有7年的历史了,看起来已经被抛弃了。我的gentoo系统没有pynids包,它附带了补丁版本的libnids,如果不做进一步的调整,我就无法编译它。
  • 替罪羊:这是一个用于python的包操作程序/库,我不确定是否支持tcp流重新组装。
  • 皮帽吡咯烷酮作为libpcap的包装器。同样,libpcap是用于数据包捕获的,在这里,我需要流重新组装,而根据这个问题,这是不可能的。

在深入研究这些库之前,我想知道某个人是否有工作代码片段(这似乎是一个相当常见的问题)。如果有人能给我正确的建议,我也很感激。

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-06 03:10:35

Jon领导了维护pynids的工作,这是最新的:http://jon.oberheide.org/pynids/

因此,这可能允许您进一步探索flowgrep。Pynids本身处理流重构,而不是elegantly.See http://monkey.org/~jose/presentations/pysniff04.d/,这是一些很好的例子。

票数 2
EN

Stack Overflow用户

发布于 2013-02-20 09:41:00

作为后续:我放弃了监视tcp层上的流的想法。相反,我用python编写了一个代理,并让我想要监视的连接( http会话)通过这个代理进行连接。结果更稳定,运行时不需要根权限。此解决方案依赖于吡咯

这将进入一个独立的程序,例如helper_proxy.py

代码语言:javascript
复制
from multiprocessing.connection import Listener
import StringIO
from httplib import HTTPResponse
import threading
import time
from miproxy.proxy import RequestInterceptorPlugin, ResponseInterceptorPlugin, AsyncMitmProxy

class FakeSocket(StringIO.StringIO):
    def makefile(self, *args, **kw):
        return self

class Interceptor(RequestInterceptorPlugin, ResponseInterceptorPlugin):
    conn = None
    def do_request(self, data):
        # do whatever you need to sent data here, I'm only interested in responses
        return data
    def do_response(self, data):
        if Interceptor.conn:   # if the listener is connected, send the response to it
            response = HTTPResponse(FakeSocket(data))
            response.begin()
            Interceptor.conn.send(response.read())
        return data

def main():
    proxy = AsyncMitmProxy()
    proxy.register_interceptor(Interceptor)
    ProxyThread = threading.Thread(target=proxy.serve_forever)
    ProxyThread.daemon=True
    ProxyThread.start()
    print "Proxy started."
    address = ('localhost', 6000)     # family is deduced to be 'AF_INET'
    listener = Listener(address, authkey='some_secret_password')
    while True:
        Interceptor.conn = listener.accept()
        print "Accepted Connection from", listener.last_accepted
        try:
            Interceptor.conn.recv()
        except: time.sleep(1)
        finally:
            Interceptor.conn.close()

if __name__ == '__main__':
    main()

python helper_proxy.py开始。这将创建一个代理,侦听端口8080上的http连接,并侦听端口6000上的另一个python程序。一旦另一个python程序在该端口上连接,助手代理将向其发送所有http回复。通过这种方式,助手代理可以继续运行,保持http连接,并且监听器可以重新启动以进行调试。

下面是侦听器的工作方式,例如listener.py

代码语言:javascript
复制
from multiprocessing.connection import Client

def main():
    address = ('localhost', 6000)
    conn = Client(address, authkey='some_secret_password')
    while True:
        print conn.recv()

if __name__ == '__main__':
    main()

这只会打印所有的回复。现在,将浏览器指向运行在端口8080上的代理,并建立要监视的http连接。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8750434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档