lokale HTML Code Injection (z.B. via .DLL Injection)

Dieses Thema im Forum "Sicherheit & Datenschutz" wurde erstellt von dreamax, 4. Oktober 2010 .

  1. 4. Oktober 2010
    Abend,

    Keine Ahnung ob das besser in der Programmier Bereich oder hier rein passt..
    Jedenfalls suche ich paar Info's zur lokalen HTML Code injection/manipulation (also in einen laufenden Browser), z.B. durch DLL Injection, RAM Manipulation etc.. am liebsten waere mir nen sourcecode (egal welche sprache) zur injection in IE und FF.

    Danke,
    dreamax
     
  2. 5. Oktober 2010
    AW: lokale HTML Code Injection (z.B. via .DLL Injection)

    Das einfachste wäre wahrscheinlich die Daten abzufangen bevor der Browser sie verarbeitet und dann anzupassen.

    Internet -> PC -> Dein_Programm -> Firefox / IE

    Das Programm würde dann beispielsweise direkt jedes:

    Code:
    <title>*</title>
    mit

    Code:
    <title>Manipuliert</title>
    ersetzen, bevor es zum Browser gelangt. Firefox bspw. hat eine Proxy Unterstützung die man dafür missbrauchen könnte.
     
  3. 5. Oktober 2010
    AW: lokale HTML Code Injection (z.B. via .DLL Injection)


    Ein HTTP Proxy habe ich genau darfuer schon Programmiert (weil ich wie dem Thread zu entnehmen selber "zu bloed" fuer "html injection" bin), allerdings ist das mir eigentlich zu unsauber. ;(
     
  4. 5. Oktober 2010
    AW: lokale HTML Code Injection (z.B. via .DLL Injection)

    Das ist meiner Meinung nach sehr sauber, wenn man es richtig macht. DLL-Injection wird schnell heuristisch erkannt und macht auch bei Firewalls oft Probleme. Du musst es nur schaffen "heimlich" die Proxy-Einstellungen zu überschreiben.

    Ich weis jedoch nicht was du machen willst, also kann ich auch keinen (aus meiner Sicht) best geeigneten Lösungsweg vorschlagen.


    //EDIT:

    Hab mir einfach mal irgendein python-HTTP-Proxy-Script gegriffen und entsprechend modifiziert.
    1) Encoding hab ich provisorisch verhindert, da ich grad net so viel Zeit habe (-> manche Seiten melden illegal request)
    2) Der Regex ist durchaus verbesserungswürdig (dient auch nur zur Veranschaulichung)
    3) Das ganze ist noch sehr instabil.
    4) Auf WEB.DE - E-Mail-Adresse kostenlos, FreeMail, De-Mail & Nachrichten kann man gut sehen, dass es funktioniert.
    5) Viel Spaß beim weiter basteln, egal wer
    Spoiler
    Code:
    # -*- coding: cp1252 -*-
    # <PythonProxy.py>
    #
    #Copyright (c) <2009> <Fábio Domingues - fnds3000 in gmail.com>
    #
    #Permission is hereby granted, free of charge, to any person
    #obtaining a copy of this software and associated documentation
    #files (the "Software"), to deal in the Software without
    #restriction, including without limitation the rights to use,
    #copy, modify, merge, publish, distribute, sublicense, and/or sell
    #copies of the Software, and to permit persons to whom the
    #Software is furnished to do so, subject to the following
    #conditions:
    #
    #The above copyright notice and this permission notice shall be
    #included in all copies or substantial portions of the Software.
    #
    #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
    #EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
    #OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
    #NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
    #HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
    #WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
    #FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
    #OTHER DEALINGS IN THE SOFTWARE.
    
    
    import socket, thread, select, re
    
    
    __version__ = '0.1.0 Draft 1'
    BUFLEN = 8192
    VERSION = 'Python Proxy/' + __version__
    HTTPVER = 'HTTP/1.1'
    
    
    class ConnectionHandler:
     def __init__(self, connection, address, timeout):
     self.client = connection
     self.client_buffer = ''
     self.timeout = timeout
     self.method, self.path, self.protocol = self.get_base_header()
     if self.method == 'CONNECT':
     self.method_CONNECT()
     elif self.method in ('OPTIONS', 'GET', 'HEAD', 'POST', 'PUT',
     'DELETE', 'TRACE'):
     self.method_others()
     self.client.close()
     self.target.close()
    
    
     def get_base_header(self):
     print self.client_buffer
     while 1:
     self.client_buffer += self.client.recv(BUFLEN)
     end = self.client_buffer.find('\n')
     if end != -1:
     break
     print '%s' % self.client_buffer[:end]#debug
     data = (self.client_buffer[:end + 1]).split()
     self.client_buffer = self.client_buffer[end + 1:]
     print self.client_buffer
     self.client_buffer = self.client_buffer.replace("Accept-Encoding: gzip,deflate", "") #Encoding provisorisch verhindern, grad keine Lust da rumzubasteln
     return data
    
    
     def method_CONNECT(self):
     self._connect_target(self.path)
     self.client.send(HTTPVER + ' 200 Connection established\n' + 
     'Proxy-agent: %s\n\n' % VERSION)
     self.client_buffer = ''
     self._read_write() 
    
    
     def method_others(self):
     self.path = self.path[7:]
     i = self.path.find('/')
     host = self.path[:i] 
     path = self.path[i:]
     self._connect_target(host)
     self.target.send('%s %s %s\n' % (self.method, path, self.protocol) + 
     self.client_buffer)
    
     self.client_buffer = ''
     self._read_write()
    
    
     def _connect_target(self, host):
     i = host.find(':')
     if i != -1:
     port = int(host[i + 1:])
     host = host[:i]
     else:
     port = 80
     (soc_family, _, _, _, address) = socket.getaddrinfo(host, port)[0]
     self.target = socket.socket(soc_family)
     self.target.connect(address)
    
    
     def _read_write(self):
     time_out_max = self.timeout / 3
     socs = [self.client, self.target]
     count = 0
     while 1:
     count += 1
     (recv, _, error) = select.select(socs, [], socs, 3)
     if error:
     break
     if recv:
     for in_ in recv:
     data = in_.recv(BUFLEN)
     if in_ is self.client:
     out = self.target
     else:
     out = self.client
     if data:
     data = self._manipulate_content(data) #Daten vor dem Rücksenden manipulieren
     out.send(data)
     count = 0
     if count == time_out_max:
     break
     
     def _manipulate_content(self, data):
     
     #Beispiel: alle Image-Tags ersetzen:
     
     
     restr = '(<)(img)(\\s+)(src)(=)(".*?")' #Matcht: <img src="*"
     rg = re.compile(restr, re.IGNORECASE | re.DOTALL) #Ausdruck compilen
     
     return rg.sub('<img src="http://board.raidrush.ws/images/misc/images/rr_head.png"',data) #Jedes Bild durch raid-rush logo ersetzen
     
     
     
     
    
    def start_server(host='localhost', port=8080, IPv6=False, timeout=60,
     handler=ConnectionHandler):
     if IPv6 == True:
     soc_type = socket.AF_INET6
     else:
     soc_type = socket.AF_INET
     soc = socket.socket(soc_type)
     soc.bind((host, port))
     print "Serving on %s:%d." % (host, port)#debug
     soc.listen(0)
     while 1:
     thread.start_new_thread(handler, soc.accept() + (timeout,))
    
    
    if __name__ == '__main__':
     start_server()
    
     
  5. 5. Oktober 2010
    AW: lokale HTML Code Injection (z.B. via .DLL Injection)

    Wenn du eigenen Code via dll einsetzen willst, musst du das aber browserspezifisch umsetzen. Ein größeres Update von Firefox könnte die Funktion dann ebenfalls außer Kraft setzen.
    Ansonsten such dir ne 3rd-Party DLL im Firefox-Ordner, die sowieso niemals geupdated wird, schau dir die exports an (zB mit dependy walker) und schreib nen wrapper dafür. Dann kannst du die original dll einfach umbennen und deine gefakte dll einsetzen (welche beim start die original dll in den Speicher lädt und die exportierten funktionen weiterleitet).
    Somit brauchst du keinen Loader, der die DLL zur Laufzeit injiziert sondern Firefox (oder irgendein anderer Browser) erledigt das selbst. Möchte mal sehen, welche Firewall da Alarm schlagen soll...

    Wenn dein Code erstmal im Hostprozess läuft, musst du weitersehen, wie du am besten vorgehst. Entweder die funktionen für den datenaustausch hooken oder rausfinden wo der HTML Code im RAM abgespeichert wird. Im Fall von Firefox wärs wohl das einfachste, sich mal den Quellcode anzuschauen. Nehmen wir an es gibt eine Funktion (vereinfacht) sethtmlcode(tabid,code), übernimm die structur und mach nen call auf die addresse.
     
  6. 5. Oktober 2010
    AW: lokale HTML Code Injection (z.B. via .DLL Injection)

    Schau dir doch meinen SFT Hook an?

    Funktioniert mit allen Browsern egal welche version...
     
  7. 5. Oktober 2010
    AW: lokale HTML Code Injection (z.B. via .DLL Injection)

    @Alex²: Wie gesagt, ich habe das selbe (halt in C) bereits programmiert (firewall/virenscanner ist kein Problem, sind "meine" Systeme)

    @N0S: Stimmt, werd ich wohl dann mal machen.. danke!
     
  8. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.