抓包程序mitmproxy的安装以及使用(以Windows为例)

一、介绍说明

mitmproxy是一个支持HTTP和HTTPS的抓包程序,有类似Fiddler、Charles的功能,只不过它是一个控制台的形式操作。

mitmproxy还有两个关联组件。一个是mitmdump,它是mitmproxy的命令行接口,利用它我们可以对接Python脚本,用Python实现监听后的处理。另一个是mitmweb,它是一个Web程序,通过它我们可以清楚观察mitmproxy捕获的请求。

mitmproxy的功能:

1、拦截HTTP和HTTPS请求和响应

2、保存HTTP会话并进行分析

3、模拟客户端发起请求,模拟服务器端返回响应

4、利用反向代理将流量转发给指定的服务器

5、支持Mac和linux上的透明代理

6、利用Python对HTTP请求与响应进行实时处理

mitmproxy运行与自己的PC上,在PC的8080端口运行,然后开启一个代理服务,这个服务实际上是一个HTTP/HTTPS的代理。

手机和PC在一个局域网内,设置代理是mitmproxy的代理地址,这样手机在访问互联网的时候流量数据包就会流经mitmproxy,mitmproxy再去转发这些数据包到真实的服务器,服务器返回数据包时再由mitmproxy转发回手机,这样mitmproxy就相当于起了中间人的作用,抓取到所有request和response,另外这个过程还可以对接mitmproxy,抓取到的request和response的具体内容都可以直接用python来处理,比如:得到response之后我们可以直接进行解析,然后存入数据库,这样就完成了数据的解析和存储过程。

 

二、安装以及配置

最新版本的下载地址如下:

https://mitmproxy.org/downloads/#4.0.4/

在windows平台下安装:

输入上面的下载地址下载mitmproxy-4.0.4-windows-installer.exe,下载后直接双击安装包即可安装。

注意 :在 Windows 上不支持 mitmproxy 的控制台接口,但是可以使用 mitmdump和mitmweb。

证书配置

对于mitmproxy来说,如果想要截获HTTPS请求,就需要设置证书。mitmproxy在安装后会提供一套CA证书,只要客户端信任了mitmproxy提供的证书,就可以通过mitmproxy获取HTTPS请求的具体内容,否则mitmproxy是无法解析HTTPS请求的。

首先,运行mitmdump命令产生CA证书,并在用户目录下的.mitmproxy 目录里面找到CA证书,如下图所示。

在windows平台下

点击mitmproxy-ca.p12,就会出现导入证书的引导页,如下图所示:

然后直接点击下一步即可,如果不需要设置密码,继续点击下一步。

接下来需要选择证书的存储区域,如下图所示。

这里点击第二个选项“将所有的证书都放入下列存储”,然后点击“浏览”按钮,选择证书存储位置为 受信任的根证书颁发机构”,接着点击“确
定”按钮,然后点击“下一步”按钮。

最后,如果有安全警告弹出,直接点击“是”按钮即可。这样就完成了CA证书的配置了。

在Android平台下

在Android手机上,需要将mitmproxy-ca-cert.pem文件发送到手机上,接下来点击证书会出现一个提示窗口。

这时候输入证书名称,例如:mitmproxy,然后点击确定则完成了安装。

三、mitmdump的使用

mitmdump是mitmproxy的命令行接口,同时还可以对接Python对请求进行处理,这是相对于fiddler和Charles这些工具更加方便的地方,有了它我们可以不用手动截获和分析HTTP请求和响应,只需要写好请求与响应的处理逻辑即可。它还可以实现数据的解析、存储等工作,这些过程都可以通过Python来实现。

1、我们可以使用命令启动mitmproxy,并把截获的数据保存到文件中

命令如下:

mitmdump -w outfile

其中outfile的名称任意,截获的数据都会被保存到此文件中。

还可以指定一个脚本来处理截获的数据,使用-s参数即可

mitmdump -s script.py

这里指定了当前处理脚本为script.py,它需要放置在当前命令执行的目录下。
我们可以在脚本里写入如下的代码:
 

def request(flow) : 
      flow.request.headers['User-Agent'] = 'MitmProxy' 
      print(flow.request.headers)

我们定义了 一个request ()方法,参数为 flow ,它其实是一个 HTTP Flow 对象,通过 request 属性即可获取到当前请求对象 。然后打印输出了请求的请求头,将请求头的 User-Agent 改成了MitmProxy。运行之后在手机端访问 http: //httpbin.org get 。

手机端返回结果的 Headers 实际上就是请求的 Headers, User-Agent 被修改成了 mitmproxy ,PC控制台输出了修改后Headers 内容,其 User-Agent 的内容正是 mitmproxy。所以,通过这上面三行代码我们就可以完成对请求的改写。

 print()方法输出结果可以呈现在 PC 端控制台上,可以方便地进行调试。

2、日志的输出

mitmdump提供了专门的日志输出功能,可以设定不同级别以不同颜色输出结果,我们可以把脚本修改成以下内容:

from mitmproxy import ctx 
def request(flow): 
     flow .request . headers['User-Agent'] ='mitmProxy'
     ctx.log.info(str(flow.request.headers)) 
     ctx.log.warn(str(flow.request.headers)) 
     ctx.log.error(str(flow.request.headers)) 

在这里调用了ctx模块,它有一个log功能,调用不同的输出方法就可以输出不同颜色的结果,以方便我们做调试。例如:info()方法输出的内容是白色的,warn()方法输出的内容是黄色的,error()方法输出的内容是红色的。

不同的颜色对应不同级别的输出,我们可以将不同的结果合理划分级别输出,以更直观方便地查看调试信息。

3、request的使用

我们在上面也实现了request()方法并且对Headers进行了修改。下面我们介绍下request其他常用的一些功能,如下:

from mitmproxy import ctx 
def request(flow):
    request = flow.request 
    info = ctx.log.info 
    info(request.url) 
    info(str(request.headers)) 
    info(str(request.cookies)) 
    info(request.host) 
    info(request.method) 
    info(str(request.port)) 
    info(request.scheme) 

在手机上打开百度,就可以看到pc端控制台输出了一系列的请求,在这里我们找到第一个请求。控制台打印输出了request的一些常见的属性,如URL、headers、cookies、host、method、scheme即请求链接、请求头、请求cookies、请求host、请求方法、请求端口、请求协议这些内容。

同时我们还可以对任意属性进行修改,就像最初修改headers一样,直接赋值即可,例如把请求的URL修改了,如下:‘

def request(flow): 
    url ='https://httpbin.org/get' 
    flow.request.url = url 

我们只需要用简单的脚本就可以成功把请求修改为其他的站点,通过这种方式修改和伪造请求就变得很容易。

通过这个例子我们也可以知道,有时候URL虽然是正确的,但是内容并非是正确的,我们需要进一步提高自己的安全防范意识。

所以我们能很容易地获取和修改request的任意内容,比如:可以用修改cookies、添加代理的方式来规避反爬。

4、响应的使用

对于爬虫来说,我们会更加关心响应的内容,因为response body才是爬取的结果。对于响应来说,mitmdump也提供了对应的处理接口,就是response()方法。

from mitmproxy import ctx 
def response(flow): 
    response = flow.response 
    info = ctx.log.info
    inf(str(response.status_code))
    info(str(response.headers)) 
    info(str(response.cookies)) 
    info(str(response .text)) 

在这里打印输出了响应的状态码status_code、响应头headers、cookies、响应体text这几个属性,其中最重要的是text属性也就是网页的源代码。

通过response()方法获取每个请求的响应内容,然后再进行响应的信息提取和存储,我们就可以完成数据爬取啦!


 

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,抓包程序一般是指网络抓包程序,可以通过C语言中的套接字编程实现。以下是一个简单的示例程序,可以抓取网络数据包并将其分析: ```c #include <stdio.h> #include <sys/socket.h> #include <netinet/in.h> #include <netinet/ip.h> #include <arpa/inet.h> // 定义回调函数,用于处理抓包结果 void packet_handler(u_char *args, const struct pcap_pkthdr *header, const u_char *packet) { struct iphdr *ip_header = (struct iphdr *)(packet + sizeof(struct ethhdr)); printf("Received a packet with source IP address: %s\n", inet_ntoa(*(struct in_addr *)&ip_header->saddr)); } int main() { char errbuf[PCAP_ERRBUF_SIZE]; pcap_t *handle; struct bpf_program fp; char filter_exp[] = "ip"; bpf_u_int32 mask; bpf_u_int32 net; // 打开网络设备,准备开始抓包 handle = pcap_open_live("eth0", BUFSIZ, 1, 1000, errbuf); if (handle == NULL) { fprintf(stdout, "Couldn't open device: %s\n", errbuf); return 1; } // 获取网络设备的 netmask if (pcap_lookupnet("eth0", &net, &mask, errbuf) == -1) { fprintf(stdout, "Couldn't get netmask for device %s: %s\n", "eth0", errbuf); net = 0; mask = 0; } // 编译BPF过滤器 if (pcap_compile(handle, &fp, filter_exp, 0, net) == -1) { fprintf(stdout, "Couldn't parse filter %s: %s\n", filter_exp, pcap_geterr(handle)); return 1; } // 应用BPF过滤器 if (pcap_setfilter(handle, &fp) == -1) { fprintf(stdout, "Couldn't install filter %s: %s\n", filter_exp, pcap_geterr(handle)); return 1; } // 开始抓包 pcap_loop(handle, -1, packet_handler, NULL); // 关闭网络设备 pcap_close(handle); return 0; } ``` 这段代码使用了 libpcap 库来实现网络抓包功能。在此之前,需要先确保系统已经安装了该库。 程序中的 packet_handler 函数用于处理捕获到的数据包,其中第一个参数是用户自定义的参数,在此处为NULL。第二个参数为 pcap_pkthdr 结构体,包含了收到这个数据包的时间戳和数据包的长度等信息。第三个参数是指向实际数据包的指针。 在本例中,我们只是简单地从IP报文中提取出源IP地址,并打印出来。实际应用中,可以根据具体需求对数据包进行更加复杂的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值