# 任务目标
使用 proxychain 代理主机 A 中的二进制程序 binary.exe 所有流量,并将其转发到中间人服务器 B,在 B 中使用透明代理模式,截获 binary.exe 实际与远程服务器通信的所有流量数据。
# 使用 proxychain 代理流量
-
找到目前运行的相关进程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16# 查找相关用户,并进行切换
cat /etc/passwd
sudo -i -u username
# 列出所有进程
ps aux
# 列出特定用户的进程
ps -u username
# 列出指定pid的具体命令
ps -p <PID> -o cmd ww
# htop也可以辅助查看进程信息
sudo apt-get install htop
htop找到 userA 运行的进程 binary.exe
1
74887 userA /var/lib/xxx/binary.exe
-
使用 socks5 代理
SOCKS5 代理是一个通用代理协议,它可以处理任何类型的流量,包括 TCP 和 UDP。因此,SOCKS5 可以代理 HTTP、HTTPS、FTP、SMTP 等各种协议。 其工作在会话层(OSI 模型第 5 层)
使用 A、B 两台机器进行代理转发,其中 A 为本地主机,ip 为 1.1.1.1,B 为中间人服务器,ip 为 2.2.2.2
机器 A:
-
下载 proxychains
1
2sudo apt update
sudo apt install proxychains4 -
配置 proxychains 的 socks5 代理,编辑
/etc/proxychains4.conf
文件1
2# 最后一行添加代理
socks5 2.2.2.2 8080proxychain 将代理 socks5 协议,并将所有的 socks5 流量转发到 2.2.2.2:8080。
-
复制 B 中的 mitm 自签名证书(下载 mitmproxy 后,自签名证书存储在~/.mitmproxy/ 中),更新到系统证书库
1
2
3
4
5scp B:/xxx/.mitmproxy/mitmproxy-ca-cert.pem ./mitmproxy-ca-cert.pem
# 添加到系统证书中,ubuntu中需要更改后缀为.crt
sudo cp ./mitmproxy-ca-cert.pem /usr/local/share/ca-certificates/mitmproxy.crt
# 更新证书
sudo update-ca-certificates -
开启 proxychain 代理,监控相关程序
1
sudo -u [username] proxychains4 yourcmd
监控程序的流量会被转发到 2.2.2.2:8080 端口
机器 B:
-
下载 mitmproxy
1
pip install mitmproxy
下载成功会得到三个工具
mitmproxy
、mitmweb
、mitmdump
-
使用 mitmdump 开启 MITM 透明代理,并记录流量
1
mitmdump -p 8080 --mode socks5 -w ./data.mdump --set block_global=false
-p
指定监听的端口号--mode
指定代理模式,这里选 socks5-w
监听流量存储位置--set block_global=false
监听来自其他主机转发的流量,所以这里设置为 false,允许处理非本地流量
-
# 同一台机器中进行流量代理
-
安装修改 proxychain
1
2
3sudo apt-get install proxychains4
vi /etc/proxychains.conf在文件最后一行添加 socks5 代理
1
socks5 127.0.0.1 7888
-
启动 mitmproxy 透明代理
1
mitmdump -p 7888 --mode socks5 -w ./data.mdump
-
启动 proxychain 代理转发
1
proxychains4 cmd
# 监控结果查看
-
使用 mitmweb 查看
1
2打开中间人工具的网页UI,导入指定文件查看
mitmweb -
编写解析脚本
python 解析脚本
parse-mitm.py
示例1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20from mitmproxy.io import FlowReader
from mitmproxy import http
from mitmproxy import ctx
import sys
def parse_dump(file_path):
with open(file_path, "rb") as f:
reader = FlowReader(f)
for flow in reader.stream():
if isinstance(flow, http.HTTPFlow):
print(f"Request URL: {flow.request.pretty_url}")
print(f"Request Headers: {flow.request.headers}")
print(f"Request Body: {flow.request.text}")
print(f"Response Status Code: {flow.response.status_code}")
print(f"Response Headers: {flow.response.headers}")
print(f"Response Body: {flow.response.text}")
print("-" * 50)
file = sys.argv[1]
parse_dump(file)执行脚本
1
python3 parse-mitm.py data.py
Mostly I just kill time," he said, "and it dies hard."
——Raymond Chandler 《The Long Goodbye》
我大抵只是消磨时间,时间却过的很慢。
——钱德勒《漫长的告别》