
marco de enumeración y explotación de escalada de privilegios del kernel
# kernelpop
kernelpop es un marco de trabajo para realizar enumeración y explotación automatizada de vulnerabilidades del kernel en los siguientes sistemas operativos:
- [x] Linux
- [x] Mac
Está diseñado para ser `python`-agnóstico en cuanto a versión, lo que significa que debería funcionar tanto con `python2` como con `python3`
* por favor, házmelo saber si encuentras que no funciona
---
### ejemplo de enumeración hasta root (Linux)

---
### formas de usar
* ejecutar desde el código fuente del proyecto
```
$ git clone https://github.com/spencerdodd/kernelpop
$ cd kernelpop
$ python kernelpop.py || python3 kernelpop.py
```
* construir binario
```
$ git clone https://github.com/spencerdodd/kernelpop
$ cd kernelpop
$ ./create_executable.sh
$ ./kernelpop
```
* pasos para construir binario sin script
1. instalar `pyinstaller` (los pasos varían según el sistema de compilación)
2. `$ pyinstaller kernelpop.py --onefile`
3. `$ cp dist/kernelpop .`
ambos pasos de construcción del binario deberían crear un binario `kernelpop` en la raíz del proyecto.
---
### salida de enumeración
```
user@debian:~/Desktop/kernelpop$ python3 kernelpop.py
##########################
# welcome to kernelpop #
# #
# let's pop some kernels #
##########################
[*] grabbing distro version and release from underlying OS (linuxdebian7)
[*] grabbing kernel version from 'uname -a'
[+] kernel (Linux debian 3.2.0-4-686-pae #1 SMP Debian 3.2.41-2 i686 GNU/Linux) identified as:
[base]
type: linux
distro: linuxdebian7
version: 3.2.0-4
architecture: i686
[specific]
type: linux
distro: linuxdebian7
version: 3.2.41-2
architecture: i686
[*] matching kernel to known exploits
[+] discovered 11 possible exploits !
[[ distro kernel matched exploit available ]]
CVE20165195_32 Dirty COW race condition root priv esc for 32 bit
[[ distro kernel version vulnerable ]]
CVE20144699 Exploitable race condition in linux before 3.15.4
CVE20143153 `futex_requeue` vulnerability before 3.14.6 allows for priv esc
CVE20162384 Double free vulnerability in the `snd_usbmidi_create` (requires physical proximity)
CVE20140196 `n_tty_write` vuln before 3.14.4 allows priv esc to root
CVE20132094_semtex perf_swevent_init Local root exploit (32 bit)
CVE20176074 `dccp_rcv_state_process` in net/dccp/input.c mishandles structs and can lead to local root
CVE20132094_32 perf_swevent_init Local root exploit (32 bit)
[[ base linux kernel vulnerable ]]
CVE20144014 `chmod` restriction bypass allows users to get root before 3.14.8
CVE20177308 `packet_set_ring` in net/packet/af_packet.c can gain privileges via crafted system calls.
CVE20171000112 ip_ufo_append_data() memory corruption flaw can be exploited to gain root privileges.
```
En la salida, hay algunas categorías. Esto es lo que significa cada una
**[[ distro kernel matched exploit available ]]**
* hay un exploit de kernel coincidente específico de la versión de la distribución en el proyecto que puedes usar para explotar el kernel. Alta probabilidad de explotación exitosa.
**[[ distro kernel version vulnerable ]]**
* la versión del kernel de la distribución es vulnerable a la vulnerabilidad listada, pero no se indicó explícitamente como probada en el exploit PoC en el proyecto. La explotación sin modificación del exploit puede funcionar, pero tiene una menor probabilidad de éxito.
**[[ base linux kernel vulnerable ]]**
* se desconoce si la versión del kernel de la distribución es vulnerable a la vulnerabilidad, pero el kernel base de Linux está en el rango vulnerable para el exploit. La explotación sin modificación del exploit es poco probable o desconocida, pero aún podría funcionar.
---
### requisitos
* `python2` o `python3`
* `pyinstaller` (si quieres construir un binario)
---
# usage
```
run modes:
(default) python3 kernelpop.py
(exploit-mode) python3 kernelpop.py -e {exploit name}
(dump-source) python3 kernelpop.py -e {exploit name} -d
(uname-mode) python3 kernelpop.py -u {uname -a output}
(interactive-mode) python3 kernelpop.py -i # LEGACY option (same as uname-mode)
other:
(playground path) -p {new path}
(json output file) --digest json
```
### modo predeterminado (pasivo)
El modo `default` procesa información sobre el kernel del host y lo compara con los exploits de kernel conocidos disponibles para el programa. Luego genera una lista de vulnerabilidades potencialmente útiles y exploits adjuntos.
### modo exploit (activo)
```
-e {exploit name}
```
El modo `exploit` compila y ejecuta dinámicamente el código fuente del exploit con interacciones stdio dentro del programa. También puede capturar interrupciones de intentos detenidos prematuramente. Usa el nombre del exploit que aparece en la ejecución inicial de enumeración de `kernelpop` en el modo `default`.
* **dump-source (opción) `-d`**
* Este es un modificador para el modo `exploit`. Vuelca los archivos fuente del exploit dado a sus respectivos archivos en `PLAYGROUND_PATH` (por defecto `/tmp`). Esto es útil para modificar el código fuente del exploit en una máquina o para trabajar con exploits que requieren interacción manual o codificación fija de valores. Es especialmente útil cuando se ejecuta desde un binario, porque no tendrás acceso al código fuente del proyecto (es decir, el código fuente del exploit).
### modo uname (pasivo)
```
-u {uname -a output}
```
Esta opción te permite pasar la salida de un comando `uname -a` al programa en línea, lo que lo hace utilizable para integración en scripts automatizados o por cualquier otra razón previsible. Reemplaza al `modo interactivo`.
### modo interactivo (pasivo) [LEGACY - requerido para Mac por la salida de `uname`]
```
-i {uname -a output}
```
El modo `interactive` te permite realizar enumeración solo con la salida de un comando `uname -a`, lo que lo hace útil como una herramienta de enumeración solo del lado del host. Se ejecuta iniciando `kernelpop` con la bandera `-i` y luego pasando la salida de `uname -a` cuando se solicite. Esta es una característica heredada y reemplazada por el `modo uname`, pero sigue siendo compatible ya que `-u` no soporta la enumeración en Mac.
### ruta `PLAYGROUND`
```
-p {new PLAYGROUND_PATH dir}
```
La opción `-p` establece el valor de la variable global `PLAYGROUND_PATH`. Esta es la ubicación donde se escriben todos los archivos fuente de exploits, y donde se compilan los exploits. Por defecto, está establecida en `/tmp`. Sin embargo, puedes configurarla en cualquier directorio con este modificador en caso de que no tengas permisos de escritura en `/tmp`.
### salida digerible
```
--digest json
```
Esta opción te permite volcar los resultados de una ejecución de kernelpop a un archivo json digerible para su procesamiento posterior. Hasta ahora, solo he implementado el volcado `json`, pero trabajaré en una versión XML si se solicita.
### To Do
- [ ] añadir más exploits! (src/to_add si alguien quiere ponerse manos a la obra con algunos de estos, ¡adelante!)
- [ ] incluir niveles de parche en las comparaciones de ventanas vulnerables
- [ ] agregar forma de anular configuraciones detectadas en caso de análisis incorrecto o configuraciones adversarias
### Proceso para agregar ventanas de vulnerabilidad del kernel: [ debería escribir un scraper ]
* google: CVE-XXXX-XXXX "ubuntu"
* hacer clic en el enlace canónico (https://people.canonical.com/~ubuntu-security/cve/2016/CVE-XXXX-XXXX.html)
* hacer clic en todos los avisos vinculados en usn.ubuntu.com y analizar la información
* obtener las versiones de parche para completar las ventanas de vulnerabilidad por versión
* google: CVE-XXXX-XXXX "debian"
* enlace de security-tracker.debian.org (https://security-tracker.debian.org/tracker/CVE-XXXX-XXXX)
* extraer información de la parte inferior de la página que se relaciona con las versiones parcheadas para el cve específico
* google: CVE-XXXX-XXXX "mitre"
* enlaces a otras distribuciones para extraer información
---
### currently supported CVE's:
* `CVE-2017-1000379`
* `CVE-2017-1000373`
* `CVE-2017-1000372`
* `CVE-2017-1000371`
* `CVE-2017-1000370`
* `CVE-2017-1000367`
* `CVE-2017-1000112`
* `CVE-2017-7308`
* `CVE-2017-6074`
* `CVE-2017-5123`
* `CVE-2016-5195`
* `CVE-2016-2384`
* `CVE-2016-0728`
* `CVE-2015-1328`
* `CVE-2014-4699`
* `CVE-2014-4014`
* `CVE-2014-3153`
* `CVE-2014-0196`
* `CVE-2014-0038`
* `CVE-2013-2094`
* `CVE-2010-4347`
* `CVE-2010-2959`
* `CVE-2009-1185`
---
### exploit sources
`https://github.com/SecWiki/linux-kernel-exploits`
`http://exploit-db.com/`
`https://github.com/lucyoa/kernel-exploits`
`https://github.com/SecWiki/windows-kernel-exploits`
### fuentes históricas de distribuciones
Debian
* [debian releases](http://cdimage.debian.org/cdimage/archive/)