“En Cap encontramos distintas funcionalidades informativas del sistema, una de ellas permite la descarga y analisis de archivos .pcap, luego del analisis de un archivo encontramos credenciales que nos dieron acceso por FTP y SSH. Tras enumerar las capabilities del sistema logramos escalar privilegios por medio de Python.
Security Snapshot permite analizar y descargar una captura de trafico a traves de un archivo pcap, tras analizar el archivo (1.pcap) encontramos las solicitudes (de feroxbuster) que realizamos a la maquina, aunque no se muestra ningun tipo de servicio y/o puerto visitado recientemente.
Notamos que el nombre del archivo se incrementa (1.pcap) asi como la direccion (/data/1) al visitar y/o descargar el snapshot de 5 segundos, por lo que verificamos si existia algun snapshot anterior, visitamos /data/0 y encontramos que existe dicho archivo, tras analizarlo encontramos credenciales en el servicio FTP.
1
nathan:Buck3tH4TF0RM3!
User - Nathan
Utilizamos las credenciales en el servicio SSH, obtuvimos una shell y la flag user.txt.
π ~/htb/cap ❯ ssh nathan@10.10.10.245
The authenticity of host '10.10.10.245 (10.10.10.245)' can't be established.
ECDSA key fingerprint is SHA256:8TaASv/TRhdOSeq3woLxOcKrIOtDhrZJVrrE0WbzjSc.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.10.10.245' (ECDSA) to the list of known hosts.
nathan@10.10.10.245's password:
Welcome to Ubuntu 20.04.2 LTS (GNU/Linux 5.4.0-73-generic x86_64) * Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
System information as of Sat Jun 5 19:27:25 UTC 2021 System load: 0.03
Usage of /: 34.9% of 8.73GB
Memory usage: 21%
Swap usage: 0%
Processes: 228 Users logged in: 0 IPv4 address for eth0: 10.10.10.245
IPv6 address for eth0: dead:beef::250:56ff:feb9:d439
=> There are 4 zombie processes.
Last login: Thu May 27 11:21:27 2021 from 10.10.14.7
nathan@cap:~$ ls
user.txt
nathan@cap:~$ cat user.txt
dd1183750d1f8fc9ba833fbb6dc70da7
PRIVILEGE ESCALATION
Vemos en el codigo fuente un comentario que indica que existen algunos problemas de permisos con gunicorn, vemos que se utiliza python por ello, pero notamos que utiliza os.setuid(0), lo que indica que cada vez que realiza un snapshot lo hace con el usuario root.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@app.route("/capture")@limiter.limit("10 per minute")defcapture():get_lock()pcapid=get_appid()increment_appid()release_lock()path=os.path.join(app.root_path,"upload",str(pcapid)+".pcap")ip=request.remote_addr# permissions issues with gunicorn and threads. hacky solution for now.#os.setuid(0)#command = f"timeout 5 tcpdump -w {path} -i any host {ip}"command=f"""python3 -c 'import os; os.setuid(0); os.system("timeout 5 tcpdump -w {path} -i any host {ip}")'"""os.system(command)#os.setuid(1000)returnredirect("/data/"+str(pcapid))
#!/usr/bin/python3importosfromflaskimport*fromflask_limiterimportLimiterfromflask_limiter.utilimportget_remote_addressimporttempfileimportdpktfromwerkzeug.utilsimportappend_slash_redirectapp=Flask(__name__)app.config['TEMPLATES_AUTO_RELOAD']=Trueapp.secret_key=b'\x81\x02&\x18\\a0ej\x06\xec\x917y*\x04Y\x83e\xebC\xee\xab\xcf\xac;\x8dx\x8bf\xc4\x15'limiter=Limiter(app,key_func=get_remote_address,default_limits=["99999999999999999 per day","99999999999999999999 per hour"])pcapid=0lock=False@app.before_first_requestdefget_file_id():globalpcapidpath=os.path.join(app.root_path,"upload")onlyfiles=[fforfinos.listdir(path)ifos.path.isfile(os.path.join(path,f))]ints=[]forxinonlyfiles:try:ints.append(int(x.replace(".pcap","")))except:passtry:pcapid=max(ints)+1except:pcapid=0defget_appid():globalpcapidreturnpcapiddefincrement_appid():globalpcapidpcapid+=1defget_lock():globallockwhilelock:passlock=Truedefrelease_lock():globallocklock=Falsedefprocess_pcap(pcap_path):reader=dpkt.pcap.Reader(open(pcap_path,"rb"))counter=0ipcounter=0tcpcounter=0udpcounter=0forts,pktinreader:counter+=1eth=dpkt.ethernet.Ethernet(pkt)try:ip=dpkt.ip.IP(eth.data)except:continueipcounter+=1ifip.p==0:tcpcounter+=1ifip.p==dpkt.ip.IP_PROTO_UDP:udpcounter+=1data={}data['Number of Packets']=counterdata['Number of IP Packets']=ipcounterdata['Number of TCP Packets']=tcpcounterdata['Number of UDP Packets']=udpcounterreturndata@app.route("/")defindex():returnrender_template("index.html")PCAP_MAGIC_BYTES=[b"\xa1\xb2\xc3\xd4",b"\xd4\xc3\xb2\xa1",b"\x0a\x0d\x0d\x0a"]@app.route("/capture")@limiter.limit("10 per minute")defcapture():get_lock()pcapid=get_appid()increment_appid()release_lock()path=os.path.join(app.root_path,"upload",str(pcapid)+".pcap")ip=request.remote_addr# permissions issues with gunicorn and threads. hacky solution for now.#os.setuid(0)#command = f"timeout 5 tcpdump -w {path} -i any host {ip}"command=f"""python3 -c 'import os; os.setuid(0); os.system("timeout 5 tcpdump -w {path} -i any host {ip}")'"""os.system(command)#os.setuid(1000)returnredirect("/data/"+str(pcapid))@app.route("/ip")defifconfig():d=os.popen("ifconfig").read().strip()print(d)returnrender_template("index.html",rawtext=d)@app.route("/netstat")defnetstat():d=os.popen("netstat -aneop").read().strip()print(d)returnrender_template("index.html",rawtext=d)@app.route("/data")defdata():if"data"notinsession:returnredirect("/")data=session.pop("data")path=session.pop("path")returnrender_template("data.html",data=data,path=path)@app.route("/data/<id>")defdata_id(id):try:id=int(id)except:returnredirect("/")try:data=process_pcap(os.path.join(app.root_path,"upload",str(id)+".pcap"))path=str(id)+".pcap"returnrender_template("index.html",data=data,path=path)exceptExceptionase:print(e)returnredirect("/")@app.route("/download/<id>")defdownload(id):try:id=int(id)except:returnredirect("/")uploads=os.path.join(app.root_path,"upload")returnsend_from_directory(uploads,str(id)+".pcap",as_attachment=True)if__name__=="__main__":app.run("0.0.0.0",80,debug=True)
Realizamos una enumeracion de las capabilities, vemos que python se lista con la capability cap_setuid lo que nos permitiria obtener acceso privilegiado el cual utilizamos para ejecutar bash (GTFOBins - Python) , logrando obtener acceso como root y leer la flag root.txt.