Kann man jeden Rechner hacken? (Smalltalk)

Für sonstige Unterhaltungen, welche nicht direkt mit Lazarus zu tun haben
tryunderror
Beiträge: 57
Registriert: Di 9. Okt 2012, 17:32

Kann man jeden Rechner hacken? (Smalltalk)

Beitrag von tryunderror »

Ich mache mal ein Beispiel.
Ich sende eine Email.
Nun wird das Programm den Header einlesen und den Body also den Plain Text als Kommentar nehmen. Das Lesesystem vor Ort wird nun den Kommentar also die Email lesen und einfach so kopieren bis ein EOF kommt. Und nun setze ich einfach in eine Email eine EOF oder in Code ein "End of Kommentar" und schon kann ich wenn ich Prgorammiersprache vor Ort kenne in System einsteigen. Oder ist das unlogisch?

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: Kann man jeden Rechner hacken? (Smalltalk)

Beitrag von compmgmt »

Ich denke mal es ist eher unlogisch, weil
1. wenn ein EOF kommt, höre ich ja auf zu lesen. Mein Programm bekommt den eigentlichen Code gar nicht mit.
2. Auch wenn der Code eingelesen werden würde, behandel ich die E-Mail trotzdem als Stream, StringList oder String. Da entscheide ich (der Softwareentwickler) was damit passiert.
3. Selbst wenn es trotzdem gehen würde, würdest du mit C, Java, Pascal o.ä. nicht weit kommen. Da müsstest du den Code schon in Maschinensprache (kein Assembler!) ausliefern.

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Kann man jeden Rechner hacken? (Smalltalk)

Beitrag von Warf »

Das ist ja genau die Idee hinter SQL Injection.
Sagen wir mal du hast einen Login mit Benutzerfeld und Passwortfeld, und die anmeldung geschieht über MySQL mit so einem Code:

Code: Alles auswählen

'Select * From Users where Username = ''' + UName + ''' And Password = ''' + PW + ''''

und dann steht in UName z.B.
dann wird die Abfrage -- sehen, was in SQL ein Kommentar ist, und damit wird die Passwortabfrage übersprungen.

Das funktioniert allerdings nur weil MySQL interpreteiert ist, und man dem Interpreter diese Information übergeben kann.
Bei einem Kompilierten Programm wie es z.B. der FPC erzeugt sieht das etwas anders aus. Normalerweise wird der Programmcode nicht dynamisch generiert sondern bleibt von anfang bis ende des Programms gleich. Somit kannst du keinen kaputten Programmcode injezieren.

Um dein Mailbeispiel zu nehmen. Die Daten die der Email client bekommt ist ein Text. Dann wird ein Parser auf den Text losgelassen welcher den Text analysieren soll. Dieser parser kann aber keinen Programmcode ausführen, weshalb komplett unabhängig was in dem Text steht ist dein System sicher. Der Text liegt im Speicher ja ganz wo anders als der Code.

Was es allerdings oft gibt sind Buffer overflows welche sicherheitslücken darstellen können. Denn grade bei Netwerkprotokollen werden sehr oft Statische Arrays genommen, da das dynamische erzeugen von Speicherplatz super viel Zeit in anspruch nimmt. Diese Arrays haben dann so zu sagen die Maximalgröße.
Stell dir mal ein Protokoll vor welches 2 Informationen überträgt, zu erst eine Längeninformation X, und danach ein Text der X zeichen hat. Der reciever könnte dann solch einen code haben

Code: Alles auswählen

Len: Integer;
Content: Array[0..1024] of Byte;
EventHandler: procedure (Content: PByte; Len: Integer);
...
Stream.Read(len, SizeOf(Integer));
Stream.Read(Content, len);
EventHandler(Content, len);

Wenn du nun als längeninformation 1032 übergibst und in den Text am ende eine Addresse zu einer bekannte funktion steht, so kann es passieren (wenn der Compiler die Variablen direkt hintereinander erzeugt) das die Bytes nach Byte 1023 in EventHandler geschrieben werden. Danach springt der Computer zu dem Code an addresse die in Eventhandler steht. Somit kann ein Angreifer also an jede Beliebige stelle im Code springen. Wenn da z.B. die Addresse von Content drin steht und als Content Assembly code übermittelt wurde, kann der Angreifer tatsächlich eigenen Code ausführen.

Das ist dann aber eine Sicherheitslücke die mit einem einfachen if len < 1024 abgefangen werden kann

tryunderror
Beiträge: 57
Registriert: Di 9. Okt 2012, 17:32

Re: Kann man jeden Rechner hacken? (Smalltalk)

Beitrag von tryunderror »

Ich gehe einen Schritt zurück.
Ist das ok?
*
Wie wird "normal" gehackt.

Rechner erwartet Druckerbefehl,
der sieht ca so aus 01010111110101110000.
RICHTIG wäre vor der Ausführung
zu checken
ist
01010111110101110000
ein Druckerbefehl oder eine Zahl?
RICHTIG wäre das bei jeder (!) Dateneingabe zu checken.

Wenn ich nun BS richtig verstehe, werden solche "vergessenen" Abfragen zum Hacken genutzt.

Oder?

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Kann man jeden Rechner hacken? (Smalltalk)

Beitrag von Warf »

Nun beim Hacken versuchst du ein Programm dazu zu bringen etwas zu tun was du möchtest, was in der eigentlichen Funktionsweise des Programms nicht vorgesehen ist. Dabei kommt es natürlich drauf an was man machen möchte. Z.B. du möchtest einen HTTP-server einfach nur lahm legen. Der HTTP server wurde sehr naiv implementiert und liest so lange characters aus der Eingabe bis ein Doppeltes Zeilenende kommt (Nach HTTP/1.1 ist das als ende eines Requests definiert):

Code: Alles auswählen

while true do
begin
  TCPSocket.Read(c, sizeof(char));
  if c = #13 then
  begin
    if LastCharWasLf then
      break;
    else
    begin
      ContentLines.Add(CurrentLine);
      LastCharWasLf := True;
    end;
  end
  else
  begin
    LastCharWasLf := False;
    CurrentLine += c;
  end;
end;


Wenn sich der Client an den HTTP/1.1 Standard hält ist das auch absolut kein Problem. Wenn du jetzt allerdings eine Anfrage sendest die kein Doppeltes LineFeed am ende hat wird dieser Server sich in einer Endlosschleife aufhängen und gleichzeitig den String Currentline immer weiter vergrößern bis der Ram voll ist. Mach das ein paar mal und der Server würde abschmieren.
Man könnte das ganze allerdings ganz einfach so fixen:

Code: Alles auswählen

while TCPSocket.Read(c, sizeof(char)) = sizeof(char) do
begin
  if c = #13 then
  begin
    if LastCharWasLf then
      break;
    else
    begin
      ContentLines.Add(CurrentLine);
      LastCharWasLf := True;
    end;
  end
  else
  begin
    LastCharWasLf := False;
    CurrentLine += c;
  end;
end;


Da viel Serversoftware in C geschrieben ist und C sehr schnell sehr unübersichtlich wird kommen solche kleinen Fehler öfter vor als man denken sollte.

Die tolle Sicherheitslücke Heartbleed welche vor nicht allzulanger Zeit entdeckt wurde kam über eine Buffer underflow zustande. Bei dem Heartbeat Protokoll sendet der Client eine Nachricht und die Größe, der Server echot dann diese Nachricht.
Auf der serverseitig wurde das so gemacht: Lese Input ein, kopiere aus diesem eingelesenem Buffer N Bytes und sende sie zurück. Das Problem war aber, wenn N größer war als die Nachricht selbst wurden bytes kopiert die gar nicht im dafür vorgesehen Buffer lagen, sondern es wurden Bytes kopiert die im Speicher hintendran lagen. Diese Bytes können dabei wichtige Informationen enthalten, und so kommt der Hacker an Informationen die eigentlich rein auf serverseite liegen sollten

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Kann man jeden Rechner hacken? (Smalltalk)

Beitrag von m.fuchs »

Warf hat geschrieben:Die tolle Sicherheitslücke Heartbleed welche vor nicht allzulanger Zeit entdeckt wurde...

Dazu immer wieder gut ist diese Erklärung der Lücke: https://xkcd.com/1354/
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

tryunderror
Beiträge: 57
Registriert: Di 9. Okt 2012, 17:32

Re: Kann man jeden Rechner hacken? (Smalltalk)

Beitrag von tryunderror »

Ich gehe noch einen Schritt tiefer.

Assembler

jump 23232323

Der Interpreter weiss wegen der Position
jump ist ein Befehl auch wenn es nur 0 und 1 zeigt
23232323 ist eine Adresse wenn es nur 0 und 1 zeigt weil der Befehl so definiert ist.

So nimmt ein Rechner
Daten an
und Befehle
wenn ich da reinpfusche kann ich doch den Rechner übernehmen?

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Kann man jeden Rechner hacken? (Smalltalk)

Beitrag von Warf »

tryunderror hat geschrieben:Ich gehe noch einen Schritt tiefer.

Assembler

jump 23232323

Der Interpreter weiss wegen der Position
jump ist ein Befehl auch wenn es nur 0 und 1 zeigt
23232323 ist eine Adresse wenn es nur 0 und 1 zeigt weil der Befehl so definiert ist.

So nimmt ein Rechner
Daten an
und Befehle
wenn ich da reinpfusche kann ich doch den Rechner übernehmen?


Ja klar. Es gibt viele solcher Qngriffsmöglichkeiten. Aber du hast bereits gesagt "wenn ich da reinpfuschen kann". Das reinpfuschen benötigt meistens einen bereits vorhandenen Exploit. Da kommen sicherheitslücken ins Spiel. Genauso wie oben zum Thema MySQL injection gibt es z.T. die Möglichkeit Programme auszunutzen. Java und Flash waren früher Kandidaten dafür, weshalb Flash bis heute als große Sicherheits schwachstelle gilt (zurrecht). Sehr anfällig dafür ist BPF, eine Programmiersprache um Netzwerkinputs auf spezieller hardware zu parsen, ohne sie über den langsamen Kernel laufen zu lassen (denn moderne Netwerkanbindungen können die geschwindigkeit des Linuxkernels bei weiten übertreffen, da benötigt man dann spezielle hardware). Wenn du jetzt ein exploit auf dem zielrechner installiert hast, der den Code einer BPF anwendung verändern kann, kannst du einfach deinen eigenen Code laden. Und da BPF außerhalb des einflussgebietes des Kernels liegt, kannst du alles machen was du willst.

Aber das ist Schritt 2, schritt 1 ist erst mal den exploit auf den rechner zu bekommen. Manchmal ist es einfach, wenn z.B. nicht regelmäßig updates gemacht werden, kann z.B. ne alte Java oder Flash version als exploit verwendet werden, aber normalerweise geht das nicht so mir nichts dir nichts.
Das Problem ist halt, wenn ich zugriff auf den PC habe, dann kann ich mir Zugriff auf den PC verschaffen. Der erste schritt ist also zunächst einmal sich Zugriff zu verschaffen (also teil zugriff), und mit diesem Zugriff sich dann Vollzugriff zu verschaffen. Der erste Teil ist dabei das schwere, der zweite (also das was du ansprichst) ist dann kinderleicht.

Außerdem, 1. der "Interpreter" heißt eigentlich CPU (den Namen sollte man sich merken, der ist wichtig wenn es um PC's geht). 2. Diese einsen und nullen heißen Zahlen, bzw. Datenwörter, 1,0 ist lediglich die repräsentation. Jeder der versucht damit wirklich zu rechnen betrachtet die Zahlen die dargestellt werden, nicht den bitstring.

Diese Technik mit den Addressen gleich befehle wird sogar gerne verwendet. Der Apollo Guidance Computer (der im Apollo Programm verwendet wurde) hat als jump befehl einfach die Addresse selbst genommen. Wenn in einem Register also 12 Stand, konnte das entweder die Zahl 12 sein, oder der Befehl Springe an Adresse 12.

MitjaStachowiak
Lazarusforum e. V.
Beiträge: 394
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: Kann man jeden Rechner hacken? (Smalltalk)

Beitrag von MitjaStachowiak »

Hy, also man unterscheidet zwischen Von-Neumann-Architekturen und Havard-Architekturen. Bei ersteren gibt es gemeinsamen (Arbeits)speicher für Daten und Programm. Bei Havard zwei verschiedene Speicher. Moderne Rechner sind für gewöhnlich virtuelle Harvard-Architekturen: Der L1-Cache für Instruktionen und Daten ist verschieden. Ein Exploit muss nun die sogenannte "Data Execution Prevention" umgehen. Diese sorgt für eine Trennung von Instruktions-Speicherbereichen und Daten. Man kann also nicht einfach seinen Programmcode in eine Datei schreiben und hoffen, dass der durch einen Buffer-Overflow direkt ausgeführt wird. Man kann zumeist nur die Anwendung dazu bringen ihren eigenen Code in nicht-beabsichtigter Reihenfolge auszuführen (Code Reuse Attacke). Dabei versucht man dann einen in der Anwendung enthaltenen Befehl zur Umwandlung von Daten in Instruktionsspeicher so zu nutzen, dass er den Exploit-Code ausfürbar macht.

So habe ich das in Erinnerung...

Es gehört also schon eine Portion Wissen und Können dazu, ein Exploit in einem Daten-Format einzubauen.

tryunderror
Beiträge: 57
Registriert: Di 9. Okt 2012, 17:32

Re: Kann man jeden Rechner hacken? (Smalltalk)

Beitrag von tryunderror »

" Das reinpfuschen benötigt meistens einen bereits vorhandenen Exploit."

Sorry ich verstehe nicht.
Ich will doch den Exploit anlegen. Und ich nutze die Schwäche der Programmiersprache aus.
***
Laiengerücht ich bin da ohne Ahnung:
Der Bundestag ging doch deswegen so leicht hacken, weil die PHP und noch unsicherere Tools nutzen, teilweise nicht mal kompiliert. Was sagt Ihr als Profis dazu?

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Kann man jeden Rechner hacken? (Smalltalk)

Beitrag von Warf »

tryunderror hat geschrieben:" Das reinpfuschen benötigt meistens einen bereits vorhandenen Exploit."

Sorry ich verstehe nicht.
Ich will doch den Exploit anlegen. Und ich nutze die Schwäche der Programmiersprache aus.
***
Laiengerücht ich bin da ohne Ahnung:
Der Bundestag ging doch deswegen so leicht hacken, weil die PHP und noch unsicherere Tools nutzen, teilweise nicht mal kompiliert. Was sagt Ihr als Profis dazu?


Es gibt ganze Bücher über PHP script sicherheitslücken. Sagen wir es einfach mal so, PHP macht es einem echt einfach unsicheren, oder schlicht weg kaputten, Code zu schreiben. Deshalb ist PHP mittlerweile auch recht verpöhnt. Aber zu dem was du nicht verstehst, oftmals ist eine Sicherheitslücke nur lokal verfügbar. Man muss also bereits schon ein Programm auf dem Zielrechner installiert haben (ein so genanntes Exploit), welches diese Sicherheitslücke für dich ausnutzt. z.B. letzes(vorletzes?) Jahr gab es ja das leak, dass die CIA und NSA software hat um mit einem SAMSUNG fernseher leute auszuspionieren. Um diesen Hack aber zu verwenden musste das programm zunächst per USB auf den Fernseher geladen werden.

Ein tolles beispiel dafür ist auch Meltdown und Spectre. Schau dir diesen Code an, z.B. in einer Shop software:

Code: Alles auswählen

if Password = Account.Password then
  CreditKarte := Account.GetCCInformation;
  BucheAb(CreditKarte, Betrag);
end;

Wenn das passwort korrekt ist, wird die kreditkarteninformation geladen. Moderne CPU's, um schneller zu sein, warten nicht darauf ob die if abfrage korrekt ist, sondern beginnen schonmal den inhalt auszuführen und in den Cache zu laden. Wenn die if abfrage falsch ist, macht die CPU an einer anderen stelle weiter, aber die daten stehen im Cache. Wenn man jetzt an den Cache ran kommt, dann kommt man an die Kreditkarteninformationen, ohne dafür das passwort zu kennen.

Bei Spectre und Meltdown wird genau das ausgenutzt. Dafür benötigt man nur ein Programm auf dem Zielrechner, um den Cache zu testen. Das konnte bislang ganz einfach über Javascript gemacht werden. Man musste nur die falsche website öffnen schon war man betroffen. Gefixt wurde das, indem man bei javascript engines die Zeitmessung etwas unscharf gemacht hat (da der cache test durch zeitmessung gemacht wurde). Die sicherheitslücke gibt es zwar immernoch, aber jetzt ist es deutlich schwerer ein Exploit auf den Rechner zu bekommen um sie auszunutzen. Wenn der Nutzer nicht grade eine Java Webapp lädt, bleibt eigentlich nur übrig das der Nutzer ein programm mit doppelklick ausführen muss. Wenn man aber ein exploit auf dem PC installiert bekommt, kann man damit an hoch sensitive daten kommen, zu denen man sonst keinen zugriff hat

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: Kann man jeden Rechner hacken? (Smalltalk)

Beitrag von compmgmt »

Warf hat geschrieben:Bei Spectre und Meltdown wird genau das ausgenutzt. Dafür benötigt man nur ein Programm auf dem Zielrechner, um den Cache zu testen. Das konnte bislang ganz einfach über Javascript gemacht werden. Man musste nur die falsche website öffnen schon war man betroffen.
Und deswegen hat man uMatrix oder NoScript :D

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

MitjaStachowiak
Lazarusforum e. V.
Beiträge: 394
Registriert: Sa 15. Mai 2010, 13:46
CPU-Target: 64 bit
Kontaktdaten:

Re: Kann man jeden Rechner hacken? (Smalltalk)

Beitrag von MitjaStachowiak »

*Grübel* Die Lücke bei Meltdown war doch, dass man den Cache zunächst einmal lesen konnte. Aber Mit Javascript kann man doch gar nicht uninitialisierte Werte lesen, oder geht das ggf. über die Latenzen?

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Kann man jeden Rechner hacken? (Smalltalk)

Beitrag von Warf »

MitjaStachowiak hat geschrieben:*Grübel* Die Lücke bei Meltdown war doch, dass man den Cache zunächst einmal lesen konnte. Aber Mit Javascript kann man doch gar nicht uninitialisierte Werte lesen, oder geht das ggf. über die Latenzen?


Hier ist ein Artikel dazu wie Spectre und Meltdown über Javascript verwendet werden können: https://react-etc.net/entry/exploiting-speculative-execution-meltdown-spectre-via-javascript

tryunderror
Beiträge: 57
Registriert: Di 9. Okt 2012, 17:32

Re: Kann man jeden Rechner hacken? (Smalltalk)

Beitrag von tryunderror »

Ich will nochmal auf den Startgedanken. Danke für Diskussion.
Ich lese als Mailserver eine Email
und dann verabeitet die Adresse und so weiter.
Dann lese ich Body und als PHP Programm (oder c++ etc) lese ich Body als Kommentar.
Nun kommt EOF
und das manipuliere ich indem ich es in den Body platziere.
Wie kann mich nun ein System abwehren?

Antworten