Aktionen

Web-Hacking

Aus exmediawiki

Web Hacking

Inhalt


Allgemeines

zum Workshop

  • Fragen
  • Allgemeines
  • Ausprobieren

Hacking

Code oder Daten? Der Computer entscheidet

  • Allgemeines
  • Einschleusen von Code

Kommunikation im Internet

Aus der Sicht der Computer

  • Wo ist das Internet?
  • Wo ist mein Gesprächspartner?
  • Wie heißt unser Kommunikationspartner?
  • Welche Sprache sprechen wir?

Beispiele

Request - Response - Client - Server

  • Mini nc mit Python
  • Request aus Sicht des Servers
  • logdateien
  • cURL und HTTP Header

Hacking Werkzeug Browser

Traue keinem Nutzer-Input. Nirgends!

  • Response - was wissen wir?
  • Addresszeile - was können wir noch finden?
  • Parameter - was können wir eingeben?

Darkweb Shop

Everything is broken...

  • Eine von mir programmierte WebApp
  • Dort können wir Hacks testen
  • Die Anwendung ist extra unsicher Programmiert











Allgemeines

zum Workshop

Achtung

Ich habe einige Beispiele, die wir im Workshop angeschaut haben Entfernt.
Die Testumgebung war auch nur lokal während des Workshops verfügbar
Falls das Interesse besteht sich die Beispiele nochmal anzuschauen, sagt mir einfach Bescheid

Fragen:

  • Habt ihr Ideen?
  • Was wollt ihr wissen?
  • Was stellt ihr euch unter "Hacking" vor?
  • Programmiersprachen kenntnisse?
  • Was ist interessant?

Allgemeines

  • Hacken muss nicht immer technisch sein
  • Kreativ mit technologie umgehen ist Hacking. Kunst ist Hacking
  • exMedia an der KHM zu studieren ist meiner Meinung nach auch Hacking
  • Trotzdem ist das unbefugte manipulieren von Computersystemen illegal
  • Hacking hat auch seine Schattenseiten wenn es genutzt wird um Menschen zu schaden

Workshop

  • Kali Linux
  • RDP client - mit Kali System verbinden
  • WebApp - DarkWeb Shop zum testen
  • Seite ist extra unsicher programmiert, aber einiges davon gibt es auch "in echt"










Hacking

Code oder Daten? Der Computer entscheidet

  • Einschleusen von Code
  • Codendata.jpg
  • Hackiansh.jpg
  • Datacodemix.jpg
  • <"=/>






Kommunikation im Internet



Aus der Sicht der Computer

  • Wir müssen uns klar machen, dass das was der Computer sieht etwas anderes ist als das was wir sehen
  • Wie baut der Computer eine Verbindung zu einer Webseite auf?


  • 1. Wo ist das Internet?

    • Verbinduing zum lokalen Netz über Kabel oder WLAN
    • Lankabel.jpg
    • Router - der Weg nach draußen
    • Linksys BEFSR41 Router 20040321.jpg
    • Internet - Ein Netz der Netze
    • Ndn.jpg
    • Kommunikation im lokalen Netz über Mac Addressen und interne IP Addressen

    • Das Tool "arp" liefert uns die MAC Addressen und IPs des internen Netzwerks

      
          # apt-get install net-tools
          # arp -a
          DESKTOP-ABCD123.fritz.box (192.168.178.30) at 10:bf:de:ad:be:ef [ether] on enp0s3
          fritz.box (192.168.178.1) at c8:0e:de:ad:be:ef [ether] on enp0s3
          kali.fritz.box (192.168.178.103) at 08:00:de:ad:be:ef [ether] on enp0s3
          




    2. Wo sind die Gesprächspartner?

    • Unter welcher Addresse findet der Computer seine Kommunikationspartner?

    • Das Tool "ip" zeigt uns die internen IP Addressen unserer Netzwerkinterfaces

                       
      
          # ip a
          1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
          link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
          inet 127.0.0.1/8 scope host lo
              valid_lft forever preferred_lft forever
          inet6 ::1/128 scope host
              valid_lft forever preferred_lft forever
          2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
          link/ether 08:00:de:ad:be:ef brd ff:ff:ff:ff:ff:ff
          inet 192.168.178.102/24 brd 192.168.178.255 scope global enp0s3
            valid_lft forever preferred_lft forever
          inet6 fe80::a00:1234:dead:beef/64 scope link
            valid_lft forever preferred_lft forever
      
      

      von der Seite ipconfig.io können wir unsere ausgehende IP abfragen

      
          # curl ipconfig.io
          xxx.xxx.xxx.xxx
      
      


    • Mit dem Ping Tool können wir prüfen, ob ein Server erreichbar ist

    • In manchen fällen wird Ping geblockt. Es ist also nicht immer zuverlässig. Mit Ctrl+c unter Linux abbrechen. Alternativ mit dem parameter -c 4

      
          # ping khm.de                                                                                                     2 ↵
          PING khm.de (194.95.160.32) 56(84) bytes of data.
          64 bytes from www.khm.de (194.95.160.32): icmp_seq=1 ttl=56 time=35.5 ms
          64 bytes from www.khm.de (194.95.160.32): icmp_seq=2 ttl=56 time=35.5 ms
          64 bytes from www.khm.de (194.95.160.32): icmp_seq=3 ttl=56 time=35.2 ms
          ^C
          --- khm.de ping statistics ---
          3 packets transmitted, 3 received, 0% packet loss, time 2001ms
          rtt min/avg/max/mdev = 35.206/35.435/35.585/0.164 ms
      
      


      Das Tool Traceroute zeigt wie viele Knoten passiert werden bis zum Ziel

      
          # traceroute khm.de
          traceroute to khm.de (194.95.160.32), 30 hops max, 60 byte packets
           1  fritz.box (192.168.178.1)  0.611 ms  0.584 ms  0.667 ms
           2  * * *
           3  xxx.x.x.x (xxx.x.x.x)  25.533 ms  25.896 ms  26.826 ms
           4  xx.xxx.xx.xx (xx.xxx.xx.xx)  29.668 ms  29.577 ms  29.442 ms
           5  xx.xxx.xx.xxx (xx.xxx.xx.xxx)  38.220 ms xx.xxx.xx.xxx (xx.xxx.xx.xxx)  38.470 ms xx.xxx.xx.xxx (xx.xxx.xx.xxx)  38.323 ms
           6  cr-fra2-be1.x-win.dfn.de (80.81.192.222)  40.200 ms  32.868 ms  32.887 ms
           7  * * *
           8  * cr-fra2-be11.x-win.dfn.de (188.1.144.222)  39.582 ms *
           9  * * *
          10  * * *
          [ ... ]
      
      



    • Domain names sind Menschenlesbare IP Addressen
    • Der Computer schaut einfach in einer Tabelle nach, welche IP zu welchem Namen gehört

    • Mit dem Tool nslookup können wir manuell die Abfrage vornehmen

      
          # nslookup khm.de
          Server:             192.168.178.1
          Address:    192.168.178.1#53
      
          Non-authoritative answer:
          Name:       khm.de
          Address: 194.95.160.32
      
      
    • Bis hierhin erledigt unser Betriebssystem zum Glück die Arbeit


    3. Wie heißt unser Kommunikationspartner?

    • Ein Webserver ist ein Programm, dass an einem Port auf neue Nachrichten wartet
    • Ports.jpg
    • Um mit dem Webserver zu sprechen brauchen wir die richtige Port-Nummer

    • Mit dem Tool netstat können die offenen Ports unseres Systems anzeigen

      
          # netstat -tlpn
          Active Internet connections (only servers)
          Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
          tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      477/mysqld
          tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      348/sshd
          tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      851/exim4
          tcp6       0      0 :::80                   :::*                    LISTEN      17526/apache2
          tcp6       0      0 :::22                   :::*                    LISTEN      348/sshd
          tcp6       0      0 ::1:25                  :::*                    LISTEN      851/exim4
      
      


    • Die Webserver standard Ports sind 80 und 443

    • Mit dem Tool nc können wir manuell eine verbindung aufbauen. Die Option -v macht das sichtbar

      
          # nc -v 194.95.160.32 80
          Connection to 194.95.160.32 80 port [tcp/http] succeeded!
      
      




    4. Welche Sprache sprechen wir?

    • Kurzes Resumé:
      • Physische Verbindung (Kable WLAN)
      • Weg ins Internet (Lokales Netz bis Router)
      • Addresse des Servers (IP-Addresse)
      • Port (Programm wartet dort auf unsere Nachricht)
    • Damit das Programm "Webserver" auf dem Port uns versteht, müssen wir die richtige Sprache sprechen

    • Wir probieren einfach mal irgenwas aus, indem wir uns mit nc verbinden und "Hello World" eintippen. Mit Enter die Eingabe absenden

      
          # nc -v 194.95.160.32 80
          Connection to 194.95.160.32 80 port [tcp/http] succeeded!
      
          Hello World
          HTTP/1.1 400 Bad Request
          Server: nginx
          Date: Fri, 31 May 2019 22:46:40 GMT
          Content-Type: text/html
          Content-Length: 166
          Connection: close
      
          [...]
      
      


    • Die Antwort ist "Bad Request". Wir konnten scheinbar nicht verständlich sagen was wir wollen.
    • Die Sprache die der Server versteht ist HTTP
    • Um eine Webseite aufzurufen müssen wir einen sogenannten Request senden.
    • Der Webserver kann dann mit einer Response antrworten. So sieht es das Protokoll vor
    • Ein Request ist wie folgt aufgebaut:
      • Methode: GET
      • Datei: /index.html
      • Sprache+Version: HTTP/1.0
                         GET /index.html HTTP/1.0
      

    • Mit nc können wir testen ob der Websever nun anders Reagiert. Es ist nötig zwei mal Enter zu drücken um den Request abzuschicken

      
          # nc -v 194.95.160.32 80
          Connection to 194.95.160.32 80 port [tcp/http] succeeded!
      
          GET /datei HTTP/1.0
      
      
          HTTP/1.0 200 OK
          Server: nginx
          Date: Fri, 31 May 2019 22:54:27 GMT
          Content-Type: text/html
          Content-Length: 612
          Last-Modified: Tue, 04 Dec 2018 15:03:06 GMT
          Connection: keep-alive
          Keep-Alive: timeout=5
          ETag: "5c06972a-264"
          Accept-Ranges: bytes
      
          [...]
      
      


      Zusammenfassung

          -----------------
          |               |
          |   client      |
          |               |
          -----------------
                  |  |
              ==========
      
              Klick in der Anwendung                              ----->
                  Request vom Browser                             ----->
                          Kommunikations-Schicht                  ----->
                              Transportschicht                    ----->
                                  Vermittlungsschicht             ----->
                                      Sicherungsschicht           ----->
                                          Physische Übertragung   ----->
          -----------------------------------------------------------------------
                                              INTERNET
          -----------------------------------------------------------------------
              <-----                      Physische Übertragung
              <-----                    Sicherungsschicht
              <-----                  Vermittlungsschicht
              <-----              Transportschicht
              <-----          Kommunikations-Schicht
              <-----      Response vom Server
              <----- Verarbeitung vom Request
      
              __________
              |        |
              |        |
              | Server |
              |        |
              |        |
              |        |
              |________|
      
    • Ein Blick in tiefere Schichten lohnt sich beim Hacking immer!








Beispiele

Request - Response - Client - Server



    1. Mini nc mit Python

    • Die genutzte Funktion von dem Tool nc können wir relativ einfach nachbauen:

    • Wir nutzen die "Socket" Bibliothek von Python

      
      import socket
      try:
          s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      
          """
          AF_INET is an address family that is used to designate the type of addresses that your socket can communicate with (in this case, Internet Protocol v4 addresses).
          When you create a socket, you have to specify its address family, and then you can only use addresses of that type with the socket.
          The Linux kernel, for example, supports 29 other address families such as UNIX (AF_UNIX) sockets and IPX (AF_IPX), and also communications with IRDA and Bluetooth (AF_IRDA and AF_BLUETOOTH, but it is doubtful you'll use these at such a low level).
          For the most part, sticking with AF_INET for socket programming over a network is the safest option. There is also AF_INET6 for Internet Protocol v6 addresses.
      
          SOCK_STREAM means that it is a TCP socket.
          SOCK_DGRAM means that it is a UDP socket.
          """
      
      except socket.error as err:
          print "socket creation failed with error %s" %(err)
      
      port = 80
      host_ip = "194.95.160.32"
      
      s.connect((host_ip, port))
      
      s.sendall("GET / HTTP/1.1\r\n\r\n")
      
      """
      \r\n=carriage return (CR) and line feed (LF) (Zeilenumbruch)
      HTTP/1.1 defines the sequence CR LF as the end-of-line marker for all protocol elements except the entity-body
      https://tools.ietf.org/html/rfc2616
      """
      
      print s.recv(1024)
      s.close()
      
      


    2. Request aus Sicht des Servers

    • Python3 bringt ein Modul für einen sehr kleinen aber funktionalen Webserver mit
    • Wir müssen in ein Verzeichnis wechseln, dass wir "online" stellen wollen
    • Alle Dateien in dem Verzeichnis können nun z.B. über den Browser abgerufen werden
    • So kann jeder im lokalen Netzwerk Dateien teilen. Man braucht nur die IP-Addresse, den Port und den Dateinamen

    • Simple HTTP Server Modul von Python

      
          # python3 -m http.server 1337
          Serving HTTP on 0.0.0.0 port 1337 ...
      
          192.168.178.30 - - [05/Jun/2019 23:24:38] "GET / HTTP/1.1" 200 -
          192.168.178.30 - - [05/Jun/2019 23:24:38] code 404, message File not found
          192.168.178.30 - - [05/Jun/2019 23:24:38] "GET /favicon.ico HTTP/1.1" 404 -
      
      
      


    3. Logdateien

    • Server speichern alle Anfragen in Logdateien
    • Teilweise "komische" Anfragen
    • Wir können sehen, dass die Seite ständig von Bots aufgerufen wird.
    • Auffällig sind aber vor allem die Anfragen auf /wp-admin.php und /admin/

    • Ein Auszug der Logdaten von meinem gemieteten Webspace

      
          111.202.101.0 - - [05/Jun/2019:00:17:54 +0200] "GET /robots.txt HTTP/1.1" 404 289 "-" "Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)"
          111.202.101.0 - - [05/Jun/2019:00:17:54 +0200] "GET / HTTP/1.1" 200 163 "-" "Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)"
          193.70.34.0 - - [05/Jun/2019:01:53:01 +0200] "GET /connectors/system/phpthumb.php HTTP/1.1" 404 310 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
          157.55.39.0 - - [05/Jun/2019:02:07:40 +0200] "GET /robots.txt HTTP/1.1" 404 285 "-" "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)"
          207.46.13.0 - - [05/Jun/2019:02:07:42 +0200] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)"
          79.137.20.0 - - [05/Jun/2019:02:24:32 +0200] "GET /wp-login.php HTTP/1.1" 404 287 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0"
          178.32.136.0 - - [05/Jun/2019:04:14:12 +0200] "GET /wp-login.php HTTP/1.1" 404 287 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0"
          157.55.39.0 - - [05/Jun/2019:04:59:02 +0200] "GET /robots.txt HTTP/1.1" 404 285 "-" "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)"
          66.249.76.0 - - [05/Jun/2019:08:20:57 +0200] "GET /robots.txt HTTP/1.1" 404 290 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
          66.249.76.0 - - [05/Jun/2019:08:49:26 +0200] "GET /robots.txt HTTP/1.1" 404 285 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
          66.249.76.0 - - [05/Jun/2019:08:49:26 +0200] "GET /ads.txt HTTP/1.1" 404 282 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
          58.250.125.0 - - [05/Jun/2019:09:12:15 +0200] "GET /robots.txt HTTP/1.1" 404 285 "-" "Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)"
          58.250.125.0 - - [05/Jun/2019:09:12:16 +0200] "GET / HTTP/1.1" 200 178 "-" "Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)"
          209.17.96.0 - - [05/Jun/2019:10:18:40 +0200] "GET / HTTP/1.1" 200 163 "-" "Mozilla/5.0 (compatible; Nimbostratus-Bot/v1.3.2; http://cloudsystemnetworks.com)"
          209.17.97.0 - - [05/Jun/2019:11:57:04 +0200] "GET / HTTP/1.1" 403 292 "-" "Mozilla/5.0 (compatible; Nimbostratus-Bot/v1.3.2; http://cloudsystemnetworks.com)"
          218.30.103.0 - - [05/Jun/2019:12:10:50 +0200] "GET /robots.txt HTTP/1.1" 404 285 "-" "Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)"
          218.30.103.0 - - [05/Jun/2019:12:10:50 +0200] "GET / HTTP/1.1" 200 178 "-" "Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)"
          145.239.123.0 - - [05/Jun/2019:14:55:53 +0200] "GET /wp-login.php HTTP/1.1" 404 287 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0"
          185.234.217.0 - - [05/Jun/2019:16:37:16 +0200] "GET /wp-login.php HTTP/1.1" 404 287 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
          185.234.217.0 - - [05/Jun/2019:16:37:16 +0200] "GET //wp-login.php HTTP/1.1" 404 287 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
          34.221.67.0 - - [05/Jun/2019:18:40:57 +0200] "GET / HTTP/1.1" 200 178 "-" "Go-http-client/1.1"
          123.126.113.0 - - [05/Jun/2019:20:16:08 +0200] "GET /robots.txt HTTP/1.1" 404 289 "-" "Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)"
          123.126.113.0 - - [05/Jun/2019:20:16:08 +0200] "GET / HTTP/1.1" 200 163 "-" "Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)"
      
      




    4. cURL und HTTP Header

    • Schauen wir uns mal weitere Daten an, die bei der Kommunikation über HTTP gesendet werden
    • Dafür nutzen wir curl
    • Die Option -v ist für den "verbose"-Modus. So können wir einen Detaillierteren Output bekommen

    • Das Tool "cURL" ist ein Tool um Requests zu senden und Responses zu empfangen. Es hat sehr umpfangreiche Funktionen

      
          # curl -v khm.de
          dass das tool etwas ausgereifte ist erkennt man schon daran, dass es den domain namen selbst auflösen kann
          die option -v ist für verbose. so können wir einen genaueren output bekommen
          *   Trying 194.95.160.32...
          * TCP_NODELAY set
          * Expire in 200 ms for 4 (transfer 0x56414fdeddd0)
          * Connected to khm.de (194.95.160.32) port 80 (#0)
          > GET / HTTP/1.1
          > Host: khm.de
          > User-Agent: curl/7.64.0
          > Accept: */*
          >
          < HTTP/1.1 301 Moved Permanently
          < Server: nginx
          < Date: Fri, 31 May 2019 22:59:05 GMT
          < Content-Type: text/html
          < Content-Length: 178
          < Connection: keep-alive
          < Keep-Alive: timeout=5
          < Location: https://www.khm.de/
          <
      
          [...]
      
          * Connection #0 to host khm.de left intact
      
      
    • Die Header mit > sendet curl. Die mit < empfangen wir
    • Eine neue Antwort der Servers: Moved Permanently
    • Wo wurde es hin verschoben? Location:

    • Abfragen der neuen Location "https://www.khm.de" mit curl

      
          # curl -v https://www.khm.de
          * Rebuilt URL to: https://www.khm.de/
          *   Trying 194.95.160.32...
          * TCP_NODELAY set
          * Connected to www.khm.de (194.95.160.32) port 443 (#0)
          * ALPN, offering h2
          * ALPN, offering http/1.1
          * Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
          * successfully set certificate verify locations:
          *   CAfile: /etc/ssl/certs/ca-certificates.crt
            CApath: /etc/ssl/certs
          * TLSv1.2 (OUT), TLS header, Certificate Status (22):
          * TLSv1.2 (OUT), TLS handshake, Client hello (1):
          * TLSv1.2 (IN), TLS handshake, Server hello (2):
          * TLSv1.2 (IN), TLS handshake, Certificate (11):
          * TLSv1.2 (IN), TLS handshake, Server key exchange (12):
          * TLSv1.2 (IN), TLS handshake, Server finished (14):
          * TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
          * TLSv1.2 (OUT), TLS change cipher, Client hello (1):
          * TLSv1.2 (OUT), TLS handshake, Finished (20):
          * TLSv1.2 (IN), TLS change cipher, Client hello (1):
          * TLSv1.2 (IN), TLS handshake, Finished (20):
          * SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
          * ALPN, server accepted to use http/1.1
          * Server certificate:
          *  subject: CN=www.khm.de
          *  start date: Jun  1 02:32:22 2019 GMT
          *  expire date: Aug 30 02:32:22 2019 GMT
          *  subjectAltName: host "www.khm.de" matched cert's "www.khm.de"
          *  issuer: C=US; O=Let's Encrypt; CN=Let's Encrypt Authority X3
          *  SSL certificate verify ok.
          > GET / HTTP/1.1
          > Host: www.khm.de
          > User-Agent: curl/7.52.1
          > Accept: */*
          >
          < HTTP/1.1 302 Found
          < Server: nginx
          < Date: Wed, 05 Jun 2019 21:43:47 GMT
          < Content-Type: text/html; charset=UTF-8
          < Content-Length: 0
          < Connection: keep-alive
          < Keep-Alive: timeout=5
          < X-Powered-By: PHP/5.6.40
          < Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
          < X-Accel-Expires: 3600
          < Last-Modified: Wed, 05 Jun 2019 23:00:36 GMT
          < Location: /home/
          < X-XSS-Protection: 1; mode=block
          < X-Content-Type-Options: nosniff
          < X-Frame-Options: DENY
          < X-Download-Options: noopen
          < Access-Control-Allow-Origin: *
          < Access-Control-Allow-Methods: GET,POST,OPTIONS
          < X-Cache-Status: HIT
          <
          * Curl_http_done: called premature == 0
          * Connection #0 to host www.khm.de left intact
      
      
    • Der Server schläggt uns erneut vor an einer anderen Stelle zu suchen: /home/

    • Abfragen der neuen Location "https://www.khm.de/home/" mit curl

      
          # curl -v https://www.khm.de/home/
      *   Trying 194.95.160.32...
      * TCP_NODELAY set
      * Connected to www.khm.de (194.95.160.32) port 443 (#0)
      * ALPN, offering h2
      * ALPN, offering http/1.1
      * Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
      * successfully set certificate verify locations:
      *   CAfile: /etc/ssl/certs/ca-certificates.crt
        CApath: /etc/ssl/certs
      * TLSv1.2 (OUT), TLS header, Certificate Status (22):
      * TLSv1.2 (OUT), TLS handshake, Client hello (1):
      * TLSv1.2 (IN), TLS handshake, Server hello (2):
      * TLSv1.2 (IN), TLS handshake, Certificate (11):
      * TLSv1.2 (IN), TLS handshake, Server key exchange (12):
      * TLSv1.2 (IN), TLS handshake, Server finished (14):
      * TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
      * TLSv1.2 (OUT), TLS change cipher, Client hello (1):
      * TLSv1.2 (OUT), TLS handshake, Finished (20):
      * TLSv1.2 (IN), TLS change cipher, Client hello (1):
      * TLSv1.2 (IN), TLS handshake, Finished (20):
      * SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
      * ALPN, server accepted to use http/1.1
      * Server certificate:
      *  subject: CN=www.khm.de
      *  start date: Jun  1 02:32:22 2019 GMT
      *  expire date: Aug 30 02:32:22 2019 GMT
      *  subjectAltName: host "www.khm.de" matched cert's "www.khm.de"
      *  issuer: C=US; O=Let's Encrypt; CN=Let's Encrypt Authority X3
      *  SSL certificate verify ok.
      > GET /home/ HTTP/1.1
      > Host: www.khm.de
      > User-Agent: curl/7.52.1
      > Accept: */*
      >
      < HTTP/1.1 200 OK
      < Server: nginx
      < Date: Wed, 05 Jun 2019 21:47:48 GMT
      < Content-Type: text/html; charset=utf-8
      < Transfer-Encoding: chunked
      < Connection: keep-alive
      < Keep-Alive: timeout=5
      < X-Powered-By: PHP/5.6.40
      < Cache-Control: public, max-age=1800
      < X-Accel-Expires: 86400
      < Last-Modified: Wed, 05 Jun 2019 23:00:36 GMT
      < X-cellms-content-version: 226
      < X-XSS-Protection: 1; mode=block
      < X-Content-Type-Options: nosniff
      < X-Frame-Options: DENY
      < X-Download-Options: noopen
      < Access-Control-Allow-Origin: *
      < Access-Control-Allow-Methods: GET,POST,OPTIONS
      < X-Cache-Status: HIT
      <
      
      [...]
      
      
    • 200 OK - und jede Menge Quellcode der Website...








Hacking Werkzeug Browser

Traue keinem Nutzer-Input. Nirgends!



    1. Response - was wissen wir?

    • Schauen wir uns mal eine Seite im Browser an
    • Im Browser rufen wir die Seiten prinzipiell genau sp auf, wie wir es eben mit den tools gemacht haben
    • Es gibt eine Addresszeile wo wir den Namen und die gewünschte Datei eingeben können
    • Nur weil die Seiten uns gerne auf den vorgegebnenen Pfaden halten wollen heißt das nciht, dass wir uns daran halten müssen.
    • Manchmal bekommen wir auch unerwartete Anworten, wenn wir etwas unerwartetes fragen
    • 
          khm.de
          https://www.khm.de/home/asd
      
          exmediawiki.khm.de
          https://exmediawiki.khm.de/exmediawiki/asd
      
                      
    • Im 2. Fall liefert uns der Error gleich Informationen zum Webserver und Betriebssystem
    • Die Infos können für echte Hacker durchaus interessant sein. Einfach mal googlen evtl. zusammen mit dem Wort "exploit"
    • es lohnt sich allerdings nicht nur den Pfad zur Datei zu manipulieren sondern auch alle anderen Möglichkeiten. Das allseits beliebte "www" vor einer Seite ist eine sogenannte Subdomain und wir können ja mal schauen, ob es noch andere gibt "exmediawiki" ist ja schon mal eine. Oder wir lassen es einfach ganz weg:
    • 
          https://khm.de/home/
      
                      
    • Es gibt eine Zertifikatswarnung, da der Name im Zertifikat nicht mit der vollständigen Domain übereinstimmt Das ist ein potentielles risiko, da in anderen Fällen eine Verbindung dadurch angreifbar werden könnte. Angriffe auf die Kryptographie sind jedoch eher selten und erfordern sehr spezielle Umstände
    • Aber schauen wir uns erstmal weiter um
    • Was wir nicht vernachlässigen sollten ist ein Blick in den HTML Code
    • HTML - HEAD definiert Regeln wie der Body dargestellt wird. Body - zeigt den Inhalt

      
          <!DOCTYPE html>
      
          <head>
              <style>
              a {
                  color: red;
              }
              </stlye>
              <meta>
          </head>
      
          <body>
              <div>
                  <p></p>
                  <a></a>
                  <img>
                  <a><a/>
                  <ul>
                      <li></li>
                      <li></li>
                  </ul>
              </div>
          </body>
      
          </hmtl>
      
      
    • HTML Attribute geben dem Code etwas dynamik
    • 
      
      alt     Specifies an alternative text for an image, when the image cannot be displayed
      disabled        Specifies that an input element should be disabled
      href    Specifies the URL (web address) for a link
      id      Specifies a unique id for an element
      src     Specifies the URL (web address) for an image
      style   Specifies an inline CSS style for an element
      title   Specifies extra information about an element (displayed as a tool tip)
      
      
      
      
      <body>
      <div id="test">
      <p style="color:red">red?</p>
      <a href="https://khm.de"></a>
      <img src="cool.jpg" alt="cool" width="50%">
      <ul>
          <li title="I'm a tooltip">hello</li>
          <li id="li2">test</li>
      </ul>
      </div>
      </body>
      
      
    • Javascript wird in unserem Browser ausgeführt
    • Das bedeutet: wir haben die volle Kontrolle, was das Javascript macht. Wir müssen es nicht das tun lassen, was die Programmiererin will
    • Wir können den Sourcecode komplett sehen
    • 
      <script>
      let beispiel = "yellow";
      document.body.style.backgroundColor = beispiel;
      </script>
      
      <button onclick="myFunction()">Click me</button>
      
      <script>
      function myFunction()
      {
          let beispiel = "red";
          document.body.style.backgroundColor = beispiel;
      }
      </script>
      
          


    • Firefox und Chrome bieten "Entwicklertools" zum untersuchen von Webseiten an (F12)
    • Der Head Bereich ist besonders interessant, wenn eigenes Javascript geladen wird
    • Im Body Bereich lohnt es sich nach Kommentaren oder versteckten Feldern zu suchen


    • 2. Addresszeile - was können noch finden?

      • Wir können sehr viel an der Addresse manipulieren und probieren, aber dass wir so zufällig etwas finden ist eher unwahrscheinlich. Zum Glück gibt es dafür auch entsprechende Tools, die einfach der Reihe nach bekannte Dateien ausprobieren
      • Wenn der Sever den Status 200 OK zurückgibt wissen wir, dass es die Datei geben muss. So kann zu Beispiel folgendes gefunden werden
      • Manchmal ist es aber auch viel einfacher, da ein Hacker erstmal manuell die "Low hanging Fruits" ausprobiert.
      • Ein Beipsiel wäre "/admin" an die Addresse zu hängen. Das kann sogar in meinen Logdateien beobachtet werden. Mit etwas glück kommen wir auf eine Login-Seite...
      • An diesem Punkt müssen wir aber stoppen. Aus ethischen und rechtlichen Gründen
      • Wir können aber mit dem login der Testumgebung weitermachen


      3. Parameter - was können wir eingeben?

      • Der nächste Schritt ist sich die Funktionalittäten genauer anzuschauen.
      • Wir sollten uns ungefähr vorstellen können, was die Webanwendung überhaupt kann. Ein Onlinebanking wird sich in seiner Funktionalität von einem Blog zumindest in einigen Punkten unterscheiden
      • Zuerst sollten wir uns also einen Überblick üpber die Funkltionen verschaffen, indem wir einfach mal ausprobielen, können wir etwas eingeben? Gibt es buttons usw.?
      • Was genau können wir eingeben? Was passiert mit unserer Eingabe?
      • Da wir leider oft nicht genau sagen können, was genau der Server mit unseren Daten macht, müssen wir durch sogenanntes Reverse egineering versuchen die Funktionen möglichst umfassend zu rekonstruieren.
      • Reverse Engineering bedeutet durch die Eingabe von vielen Test-Daten das Verhalten eines Programms herauszufinden
      • Hacker versuchen an allen möglichen Punkten Code einzuschleusen
      • Die Vermischung von Code und Daten


      4. Cookies

      • Cookies sind kleine Text-Dateien, die eine Seite auf unserem Computer ablegt
      • In der Regel werden sie vom Browser gespeichert und verwaltet.
      • Sie gehören jeweils zu einer bestimmten Website und werden bei einem Request an die Seite mitgeschickt
      • Durch Session-Cookies kann die Webapp den Nutzer über verschiedene Seiten hinweg verfolgen
      • Andere Daten wie z.B. die Einkäufe im Einkaufswagen können ebenfalls in Cookies beim Nutzer gespeicher werden
      • Wenn der Server die Cookies verarbeitet können wir versuchen das verhalten durch manipulierte Cookies zu ändern







      • Darkweb Shop

        Everything is broken...



          1. Ersten login überwinden

          • Javascript Source Code


          2. Zweiten login überwinden

          • User Enumeration


          3. Open Redirect Vulnerability

          • Redirect nach dem Login
          • Beispiel Redirect auf: http://<meine ip>/rdr/login.php


          4. Cross Site Scripting

          • Führe Code im Browser deiner Opfer aus
          • Beispiel XSS Angriff


          5. Debug Parameter

          • debug=true


          6. Hidden Directorys

          • Debug? Admin? WTF?


          7. Ping Tool

          • Jede seriöse Seite braucht ein Ping-Tool
          • Beispiel RCE Angriff


          8. Session Stealing

          • Gib dich als anderer User aus


          9. Upload Shell

          • PHP Code hochladen


          10. File Inclusion

          • RFI & LFI
                       



          DANKE!